千家信息网

MongoDB分片集群部署

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,一、环境说明1、我们prod环境MongoDB的集群架构是做的分片集群的部署,但是目前我们没有分片,即所有数据都在一个分片上,后期如果数量大,需要分配,集群随时可以分片,对业务方透明2、各个角色的部署
千家信息网最后更新 2025年01月22日MongoDB分片集群部署

一、环境说明

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

角色IP端口复制集名称
mongos172.21.244.101,172.21.244.102,172.21.244.9427000
config server172.21.244.101,172.21.244.102,172.21.244.9427100repl_configsvr
存储节点(shard)172.21.244.101,172.21.244.102,172.21.244.9427101shard1

3、MongoDB版本

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

二、基础信息准备

0、系统优化

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

1、下载MongoDB二进制文件

cd /chj/appwget ops.chehejia.com:9090/pkg/chj_mongodb_4.0.4.tar.gztar -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 -pmkdir /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 -pmkdir /chj/data/mongodb/chj_db/shard1/log

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

vim /chj/data/mongodb/chj_db/conf/mongos.confsystemLog:  destination: file  logAppend: true  path: /chj/data/mongodb/chj_db/mongos/log/mongos.logprocessManagement:  fork: true  # fork and run in background  pidFilePath: /chj/data/mongodb/chj_db/mongos/log/mongos.pid  # location of pidfile  timeZoneInfo: /usr/share/zoneinfonet:  port: 27000  bindIpAll: true  maxIncomingConnections: 1000  unixDomainSocket:    enabled: true    pathPrefix: /chj/data/mongodb/chj_db/mongos/log    filePermissions: 0700security:  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.confsystemLog:  destination: file  logAppend: true  path: /chj/data/mongodb/chj_db/config/log/congigsrv.logstorage:  dbPath: /chj/data/mongodb/chj_db/config/data  journal:    enabled: true  wiredTiger:    engineConfig:      directoryForIndexes: trueprocessManagement:  fork: true  # fork and run in background  pidFilePath: /chj/data/mongodb/chj_db/config/log/configsrv.pid  # location of pidfile  timeZoneInfo: /usr/share/zoneinfonet:  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: 0700security:  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key  authorization: enabledreplication:  replSetName: repl_configsvrsharding:  clusterRole: configsvr

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

vim /chj/data/mongodb/chj_db/conf/shard1.confsystemLog:  destination: file  logAppend: true  path: /chj/data/mongodb/chj_db/shard1/log/shard1.logstorage:  dbPath: /chj/data/mongodb/chj_db/shard1/data  journal:    enabled: true  wiredTiger:    engineConfig:      directoryForIndexes: trueprocessManagement:  fork: true  # fork and run in background  pidFilePath: /chj/data/mongodb/chj_db/shard1/log/shard1.pid  # location of pidfile  timeZoneInfo: /usr/share/zoneinfonet:  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: 0700security:  keyFile: /chj/data/mongodb/chj_db/auth/keyfile.key  authorization: enabledreplication:  replSetName: shard1sharding:  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 27101use admindb.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 27000use admindb.createUser({user: "root",pwd: "123456",roles: [ { role: "root", db: "admin" } ]})

8、把存储节点添加到mongos

登录任意一个mongos节点(如果是在上一步的窗口,需要退出重新登录)/chj/data/mongodb/chj_db/bin/mongo --port 27000use admindb.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 27000use admindb.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)
0