MongoDB分片集群部署

一、环境说明

1、我们prod环境MongoDB的集群架构是做的分片集群的部署,但是目前我们没有分片,即所有数据都在一个分片上,后期如果数量大,需要分配,集群随时可以分片,对业务方透明
2、各个角色的部署情况

角色 IP 端口 复制集名称
mongos 172.21.244.101,172.21.244.102,172.21.244.94 27000
config server 172.21.244.101,172.21.244.102,172.21.244.94 27100 repl_configsvr
存储节点(shard) 172.21.244.101,172.21.244.102,172.21.244.94 27101 shard1

3、MongoDB版本

mongos> db.version()
4.0.4-62-g7e345a7

二、基础信息准备

0、系统优化


echo "never" >/sys/kernel/mm/transparent_hugepage/enabled
echo "never" >/sys/kernel/mm/transparent_hugepage/defrag

1、下载MongoDB二进制文件

cd /chj/app
wget ops.chehejia.com:9090/pkg/chj_mongodb_4.0.4.tar.gz
tar -zxvf chj_mongodb_4.0.4.tar.gz

2、相关目录建立

#建立base目录
mkdir /chj/data/mongodb/chj_db
#把MongoDB二进制文件移动到base目录下的bin文件夹
mv chj_mongodb_4.0.4/bin /chj/data/mongodb/chj_db/bin
#建立认证文件目录
mkdir /chj/data/mongodb/chj_db/auth
#建立配置文件目录
mkdir /chj/data/mongodb/chj_db/conf
#建立config server的data和日志目录
mkdir /chj/data/mongodb/chj_db/config/data -p
mkdir /chj/data/mongodb/chj_db/config/log
#建立mongos的日志目录
mkdir /chj/data/mongodb/chj_db/mongos/log -p
#建立数据节点data和日志目录
mkdir /chj/data/mongodb/chj_db/shard1/data -p
mkdir /chj/data/mongodb/chj_db/shard1/log

3、相关配置文件编写
A、mongos的配置文件编写

vim /chj/data/mongodb/chj_db/conf/mongos.conf
systemLog:
  destination: file
  logAppend: true
  path: /chj/data/mongodb/chj_db/mongos/log/mongos.log

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /chj/data/mongodb/chj_db/mongos/log/mongos.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27000
  bindIpAll: true
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: true
    pathPrefix: /chj/data/mongodb/chj_db/mongos/log
    filePermissions: 0700

security:
  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key
#  authorization: enabled

#replication:

sharding:
  configDB: repl_configsvr/172.21.244.101:27100,172.21.244.102:27100,172.21.244.94:27100

B、config server的配置文件编写

vim /chj/data/mongodb/chj_db/conf/config.conf
systemLog:
  destination: file
  logAppend: true
  path: /chj/data/mongodb/chj_db/config/log/congigsrv.log

storage:
  dbPath: /chj/data/mongodb/chj_db/config/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      directoryForIndexes: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /chj/data/mongodb/chj_db/config/log/configsrv.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27100
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  #bindIpAll: true
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: true
    pathPrefix: /chj/data/mongodb/chj_db/config/data
    filePermissions: 0700

security:
  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key
  authorization: enabled

replication:
  replSetName: repl_configsvr
sharding:
  clusterRole: configsvr

C、存储节点的配置文件编写

vim /chj/data/mongodb/chj_db/conf/shard1.conf
systemLog:
  destination: file
  logAppend: true
  path: /chj/data/mongodb/chj_db/shard1/log/shard1.log

storage:
  dbPath: /chj/data/mongodb/chj_db/shard1/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      directoryForIndexes: true

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /chj/data/mongodb/chj_db/shard1/log/shard1.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27101
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  #bindIpAll: true
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: true
    pathPrefix: /chj/data/mongodb/chj_db/shard1/data
    filePermissions: 0700

security:
  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key
  authorization: enabled

replication:
  replSetName: shard1
sharding:
  clusterRole: shardsvr

4、生产key认证文件

echo "chj123456" >/chj/data/mongodb/chj_db/auth/keyfile.key
#设置文件的权限为400,不然服务无法启动
chmod 400 /chj/data/mongodb/chj_db/auth/keyfile.key

三、集群初始化
1、启动 config server 服务

/chj/data/mongodb/chj_db/bin/mongod -f /chj/data/mongodb/chj_db/conf/config.conf
2、初始化config server集群

#登录其中一个config server节点
/chj/data/mongodb/chj_db/bin/mongo --port 27100
#配置集群
config = { _id:"repl_configsvr",members:[ {_id:0,host:"172.21.244.101:27100"}, {_id:1,host:"172.21.244.102:27100"}, {_id:2,host:"172.21.244.94:27100"}] }
#初始化集群
rs.initiate(config)
PS:
结果输出如下,说明集群初始化成功,可以通过rs.status()命令查看集群状态
{
        "ok" : 1,
        "$gleStats" : {
                "lastOpTime" : Timestamp(1557538260, 1),
                "electionId" : ObjectId("000000000000000000000000")
        },
        "lastCommittedOpTime" : Timestamp(0, 0)
}

3、启动存储节点服务

/chj/data/mongodb/chj_db/bin/mongod -f /chj/data/mongodb/chj_db/conf/shard1.conf
4、初始化存储集群

#登录你希望是主节点的服务器
/chj/data/mongodb/chj_db/bin/mongo --port 27101
#配置集群
config = { _id:"shard1",members:[ {_id:0,host:"172.21.244.101:27101"}, {_id:1,host:"172.21.244.102:27101"},{_id:2,host:"172.21.244.94:27101",arbiterOnly:true}] }
#初始化集群
rs.initiate(config)
PS:
结果输出如下,说明集群初始化成功,可以通过rs.status()命令查看集群状态
{ "ok" : 1 }

5、添加存储集群的管理账号

登录主节点
/chj/data/mongodb/chj_db/bin/mongo --port 27101
use admin
db.createUser(
{
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)

6、启动mongos 服务

/chj/data/mongodb/chj_db/bin/mongos -f /chj/data/mongodb/chj_db/conf/mongos.conf
7、添加config server的管理账号

登录任意一个mongos节点
/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.createUser(
{
user: "root",
pwd: "123456",
roles: [ { role: "root", db: "admin" } ]
}
)

8、把存储节点添加到mongos


登录任意一个mongos节点(如果是在上一步的窗口,需要退出重新登录)
/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.auth(‘root‘,‘123456‘)
#添加分片
sh.addShard(‘shard1/172.21.244.101:27101,172.21.244.102:27101,172.21.244.94:27101‘)
#查看分片状态
sh.status()

四、交付业务方
1、建立应用账号

登录任意一个mongos节点
/chj/data/mongodb/chj_db/bin/mongo --port 27000
use admin
db.auth(‘root‘,‘123456‘)
#切到业务数据库
use chj_db
#建立读写账号
db.createUser(
{
   user: "chj_db_rw",
   pwd: "123456",
   roles: [
      { role: "readWrite", db: "chj_db" },
      { role: "dbOwner", db: "chj_db" }
   ]
}
)
#建立只读账号(根据业务需求确认是否需要)
db.createUser(
{
user: "chj_db_r",
pwd: "123456",
roles: [ { role: "read", db: "chj_db" } ]
}
)

2、交付开发人员信息

连接地址:172.21.244.101:27000,172.21.244.102:27000,172.21.244.94:27000
库名:chj_db
账号:chj_db_rw
密码:123456

五、数据库启用分片

如果后期业务量大,需要开启分片,配置如下

#指定需要分片的数据库
mongos> sh.enableSharding("chj_db")
{
        "ok" : 1,
        "operationTime" : Timestamp(1557546835, 3),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1557546835, 3),
                "signature" : {
                        "hash" : BinData(0,"bkrrr8Kxrr9j9udrDc/hURHld38="),
                        "keyId" : NumberLong("6689575940508352541")
                }
        }
}
#在chj_db数据库和users集合中创建了name和age为升序的片键
mongos> sh.shardCollection("chj_db.users",{name:1,age:1})
{
        "collectionsharded" : "chj_db.users",
        "collectionUUID" : UUID("59c0b99f-efff-4132-b489-f6c7e3d98f42"),
        "ok" : 1,
        "operationTime" : Timestamp(1557546861, 12),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1557546861, 12),
                "signature" : {
                        "hash" : BinData(0,"UBB1A/YODnmXwG5eAhgNLcKVzug="),
                        "keyId" : NumberLong("6689575940508352541")
                }
        }
}
#查看分片情况
mongos> sh.status()
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("5cd625e0da695346d740f749")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/172.21.244.101:27101,172.21.244.102:27101",  "state" : 1 }
  active mongoses:
        "4.0.4-62-g7e345a7" : 3
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours:
                No recent migrations
  databases:
        {  "_id" : "chj_db",  "primary" : "shard1",  "partitioned" : true,  "version" : {  "uuid" : UUID("82088bc7-7b98-4033-843d-7058d8d959f6"),  "lastMod" : 1 } }
                chj_db.users
                        shard key: { "name" : 1, "age" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard1  1
                        { "name" : { "$minKey" : 1 }, "age" : { "$minKey" : 1 } } -->> { "name" : { "$maxKey" : 1 }, "age" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 0)
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard1  1
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 0)

原文地址:https://blog.51cto.com/navyaijm/2392829

时间: 2024-10-10 15:18:55

MongoDB分片集群部署的相关文章

使用HAProxy作为MongoDB分片集群mongos负载均衡

MongoDB分片集群的入口mongos自身没有failover机制.官方建议是将mongos和应用服务器部署在一起,多个应用服务器就要部署多个mongos实例,这样很是不方便.还可以使用LVS或者HAProxy来实现多个mongos的failover机制,但是一定要注意使用client affinity即客户端关联特性. global     chroot      /data/app_platform/haproxy/share/      log         127.0.0.1 loc

MongoDB 分片集群实战

背景 在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种: 垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU.更大的内存.更大容量的磁盘,此种方法虽然成本很高,但是实现比较简单,维护起来也比较方便. 水平扩展:通过使用更多配置一般的服务器来共同承担工作负载,此种方法很灵活,可以根据工作负载的大小动态增减服务器的数量,但是实现比较复杂,得有专门的人员来运维. Databases for MongoDB 试用 IBM Cloud 上提

mongoDB(三) mongoDB分片集群

mongoDB分片集群 介绍 解决数据分片,防止数据丢失生产环境需要擦用分片+副本集的部署方式 组成部分 route: 提供入口,不存储数据 configserver: 存储元数据信息,建议使用副本集 shardserver: 数据存储服务,存储真正数据, 也许要使用副本集 依赖关系 当数据插入时,需要从configsrv知道数据要插入哪个shardsrv分片 当用户获取数据时,需要从configsrv知道数据存储在哪个shardsrv分片 集群搭建 使用同一份mongodb二进制文件 修改对应

Bugsnag的MongoDB分片集群使用经验

Bugsnag是一家为移动应用开发者提供实时的Bug追踪及检测服务的创业公司,Bugsnag已经使用MongoDB存储超过TB级的文档数据.从Bugsnag的第一个版本开始他们就使用MongoDB存储业务数据.近日,Bugsnag的工程师Simon Maynard在博客上分享了他们的MongoDB分片集群经验,并开源了几个他们常使用的脚本. 带标签的分片(Tag Aware Sharding) 带标签的分片是MongoDB 2.2版本中引入的新特性,此特性支持人为控制数据的分片方式,从而使数据存

mongodb分片集群突然停电造成一些错误,分片无法启动

今天突然停电使mongodb分片集群造成这种错误,暂时不知道怎么解决,如果 有人知道请回复我 ,现在把记录下来,等后期处理. Fri Aug  8 10:49:52.165 [initandlisten] connection accepted from 172.16.0.115:59542 #2 (2 connections now open)Fri Aug  8 10:49:52.954 [initandlisten] connection accepted from 172.16.0.10

MongoDB分片集群还原

从mongodb 3.0开始,mongorestore还原的时候,需要一个运行着的实例.早期的版本没有这个要求. 1.为每个分片部署一个复制集 (1)复制集中的每个成员启动一个mongod mongod --dbpath /mdb/data/s11 --logpath /mdb/mlog/s11.log --fork --port 27017 --replSet s1 --smallfiles & mongod --dbpath /mdb/data/s12 --logpath /mdb/mlog

MongoDB分片集群机制及原理

1. MongoDB常见的部署架构 * 单机版 * 复制集 * 分片集群 2. 为什么要使用分片集群 * 数据容量日益增大,访问性能日渐下降,怎么破? * 新品上线异常火爆,如何支撑更多用户并发? * 单库已有10TB数据,恢复需要1-2天,如何加速? * 地理分布数据 3. 分片如何解决问题? 银行交易表单内10亿笔资料超负荷运转,交易号 0-1,000,000,000 把数据分成两两半,放到两个库里. 交易号:0-500,000,000 交易号:500,000,001-1,000,000,0

MongoDB分片集群配置实例

环境: windows操作系统 mongodb 3.4社区版 目标: 配置包含两个分片一个配置服务器的分片集群.其中每一个分片和一个配置服务器都被配置为一个单独的副本集.如下图所示: 注:每一个分片都应该被配置在一个单独的服务器设备上.方便起见,本文在同一台机器通过不同端口模拟不同服务器上的组件,实现分片集群的配置.(生产环境的配置与此相同,只需使用自己的主机名.端口.路径等即可). 下图为本文配置的分片集群架构,其中的任意节点(副本集节点和分片节点)都是可扩展的. 1.分别为config se

[ MongoDB ] 分片集群及测试

分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据. 为什么使用分片? 1. 复制所有的写入操作到主节点    2. 延迟的敏感数据会在主节点查询    3. 单个副本集限制在12个节点    4. 当请求量巨大时会出现内存不足.    5. 本地磁盘不足    6. 垂