本文基于 MongoDB 4.0 介绍如何搭建 shard 集群服务, 环境如下表所示:
1, 创建相关目录
在三个节点分别创建以下目录:
- [root@hdp06 ~]# mkdir -p /data/mongo/{
- config,router,shard
- }
- [root@hdp06 ~]# mkdir -p /data/mongo/config/{
- data,logs
- }
- [root@hdp06 ~]# mkdir -p /data/mongo/router/logs
- [root@hdp06 ~]# mkdir -p /data/mongo/shard/{
- data,logs
- }
- [root@hdp06 ~]# mkdir -p /data/mongo/shard/data/{
- shard1,shard2,shard3
- }
- [root@hdp06 ~]# chown -R mongod:mongod /data
2, 配置 Configsvr 服务
2.1 创建配置文件
- [root@hdp06 ~]# vi /data/mongo/config/MongoDB.config
- net:
- bindIp: 0.0.0.0
- port: 27017
- processManagement:
- fork: "true"
- replication:
- replSetName: configRS
- sharding:
- clusterRole: configsvr
- storage:
- dbPath: /data/mongo/config/data
- systemLog:
- destination: file
- path: /data/mongo/config/logs/MongoDB.log
2.2 同步配置文件
- [root@hdp06 ~]# scp /data/mongo/config/MongoDB.config hdp07:/data/mongo/config
- [root@hdp06 ~]# scp /data/mongo/config/MongoDB.config hdp08:/data/mongo/config
2.3 启动 configsvr 服务
- [root@hdp06 ~]# mongod -f /data/mongo/config/MongoDB.config
- [root@hdp07 ~]# mongod -f /data/mongo/config/MongoDB.config
- [root@hdp08 ~]# mongod -f /data/mongo/config/MongoDB.config
2.4 初始化集群
在一个节点上执行集群初始化操作:
- [root@hdp06 ~]# mongo
- >rs.initiate(
- {
- _id: "configRS",
- configsvr: true,
- members: [
- { _id : 0, host : "hdp06.thinkjoy.tt:27017" },
- { _id : 1, host : "hdp07.thinkjoy.tt:27017" },
- { _id : 2, host : "hdp08.thinkjoy.tt:27017" }
- ]
- }
- )
-- 输出结果如下
- {
- "ok" : 1,
- "operationTime" : Timestamp(1534816254, 1),
- "$gleStats" : {
- "lastOpTime" : Timestamp(1534816254, 1),
- "electionId" : ObjectId("000000000000000000000000")
- },
- "lastCommittedOpTime" : Timestamp(0, 0),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534816254, 1),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
-- 其他节点验证
- [root@hdp07 ~]# mongo
- ......
- configRS:SECONDARY> rs.status()
- {
- "set" : "configRS",
- "date" : ISODate("2018-08-21T01:52:59.734Z"),
- "myState" : 2,
- "term" : NumberLong(1),
- "syncingTo" : "hdp06.thinkjoy.tt:27017",
- "syncSourceHost" : "hdp06.thinkjoy.tt:27017",
- "syncSourceId" : 0,
- "configsvr" : true,
- "heartbeatIntervalMillis" : NumberLong(2000),
- "optimes" : {
- "lastCommittedOpTime" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "readConcernMajorityOpTime" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "appliedOpTime" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "durableOpTime" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- }
- },
- "lastStableCheckpointTimestamp" : Timestamp(1534816327, 1),
- "members" : [
- {
- "_id" : 0,
- "name" : "hdp06.thinkjoy.tt:27017",
- "health" : 1,
- "state" : 1,
- "stateStr" : "PRIMARY",
- "uptime" : 115,
- "optime" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "optimeDurable" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "optimeDate" : ISODate("2018-08-21T01:52:44Z"),
- "optimeDurableDate" : ISODate("2018-08-21T01:52:44Z"),
- "lastHeartbeat" : ISODate("2018-08-21T01:52:57.945Z"),
- "lastHeartbeatRecv" : ISODate("2018-08-21T01:52:59.093Z"),
- "pingMs" : NumberLong(0),
- "lastHeartbeatMessage" : "",
- "syncingTo" : "",
- "syncSourceHost" : "",
- "syncSourceId" : -1,
- "infoMessage" : "",
- "electionTime" : Timestamp(1534816265, 1),
- "electionDate" : ISODate("2018-08-21T01:51:05Z"),
- "configVersion" : 1
- },
- {
- "_id" : 1,
- "name" : "hdp07.thinkjoy.tt:27017",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 320,
- "optime" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "optimeDate" : ISODate("2018-08-21T01:52:44Z"),
- "syncingTo" : "hdp06.thinkjoy.tt:27017",
- "syncSourceHost" : "hdp06.thinkjoy.tt:27017",
- "syncSourceId" : 0,
- "infoMessage" : "",
- "configVersion" : 1,
- "self" : true,
- "lastHeartbeatMessage" : ""
- },
- {
- "_id" : 2,
- "name" : "hdp08.thinkjoy.tt:27017",
- "health" : 1,
- "state" : 2,
- "stateStr" : "SECONDARY",
- "uptime" : 115,
- "optime" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "optimeDurable" : {
- "ts" : Timestamp(1534816364, 1),
- "t" : NumberLong(1)
- },
- "optimeDate" : ISODate("2018-08-21T01:52:44Z"),
- "optimeDurableDate" : ISODate("2018-08-21T01:52:44Z"),
- "lastHeartbeat" : ISODate("2018-08-21T01:52:57.945Z"),
- "lastHeartbeatRecv" : ISODate("2018-08-21T01:52:57.944Z"),
- "pingMs" : NumberLong(0),
- "lastHeartbeatMessage" : "",
- "syncingTo" : "hdp06.thinkjoy.tt:27017",
- "syncSourceHost" : "hdp06.thinkjoy.tt:27017",
- "syncSourceId" : 0,
- "infoMessage" : "",
- "configVersion" : 1
- }
- ],
- "ok" : 1,
- "operationTime" : Timestamp(1534816364, 1),
- "$gleStats" : {
- "lastOpTime" : Timestamp(0, 0),
- "electionId" : ObjectId("000000000000000000000000")
- },
- "lastCommittedOpTime" : Timestamp(1534816364, 1),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534816364, 1),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
3, 配置 Sharded 服务
3.1 创建配置文件
- root@hdp06 ~]# vi /data/mongo/shard/data/shard1/mongod.shard1
- net:
- bindIp: 0.0.0.0
- port: 27019
- processManagement:
- fork: "true"
- replication:
- replSetName: myShard_1
- sharding:
- clusterRole: shardsvr
- storage:
- dbPath: /data/mongo/shard/data/shard1
- systemLog:
- destination: file
- path: /data/mongo/shard/logs/shard1/mongodbs1.log
- [root@hdp06 ~]# vi /data/mongo/shard/data/shard2/mongod.shard2
- net:
- bindIp: 0.0.0.0
- port: 27020
- processManagement:
- fork: "true"
- replication:
- replSetName: myShard_2
- sharding:
- clusterRole: shardsvr
- storage:
- dbPath: /data/mongo/shard/data/shard2
- systemLog:
- destination: file
- path: /data/mongo/shard/logs/shard2/mongodbs2.log
- [root@hdp06 ~]# vi /data/mongo/shard/data/shard3/mongod.shard3
- net:
- bindIp: 0.0.0.0
- port: 27021
- processManagement:
- fork: "true"
- replication:
- replSetName: myShard_3
- sharding:
- clusterRole: shardsvr
- storage:
- dbPath: /data/mongo/shard/data/shard3
- systemLog:
- destination: file
- path: /data/mongo/shard/logs/shard3/mongodbs3.log
3.2 同步配置文件
- [root@hdp06 ~]# scp -r /data/mongo/shard/data/* hdp07:/data/mongo/shard/data/
- [root@hdp06 ~]# scp -r /data/mongo/shard/data/* hdp08:/data/mongo/shard/data/
3.3 启动 sharded 服务
- [root@hdp06 ~]# mongod -f /data/mongo/shard/data/shard1/mongod.shard1
- [root@hdp06 ~]# mongod -f /data/mongo/shard/data/shard2/mongod.shard2
- [root@hdp06 ~]# mongod -f /data/mongo/shard/data/shard3/mongod.shard3
- [root@hdp07 ~]# mongod -f /data/mongo/shard/data/shard1/mongod.shard1
- [root@hdp07 ~]# mongod -f /data/mongo/shard/data/shard2/mongod.shard2
- [root@hdp07 ~]# mongod -f /data/mongo/shard/data/shard3/mongod.shard3
- [root@hdp08 ~]# mongod -f /data/mongo/shard/data/shard1/mongod.shard1
- [root@hdp08 ~]# mongod -f /data/mongo/shard/data/shard2/mongod.shard2
- [root@hdp08 ~]# mongod -f /data/mongo/shard/data/shard3/mongod.shard3
3.4 初始化 sharded 服务
在任意一个节点执行初始化服务.
- [root@hdp06 ~]# mongod --port 27019
- > rs.initiate({_id:"myShard_1",members:[{_id:1,host:"hdp06.thinkjoy.tt:27019",priority:2},{_id:2,host:"hdp07.thinkjoy.tt:27019"},{_id:3,host:"hdp08.thinkjoy.tt:27019"}]})
- {
- "ok" : 1,
- "operationTime" : Timestamp(1534818896, 1),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534818896, 1),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
- [root@hdp06 ~]# mongod --port 27020
- > rs.initiate({_id:"myShard_2",members:[{_id:1,host:"hdp06.thinkjoy.tt:27020",priority:2},{_id:2,host:"hdp07.thinkjoy.tt:27020"},{_id:3,host:"hdp08.thinkjoy.tt:27020"}]})
- {
- "operationTime" : Timestamp(1534818908, 2),
- "ok" : 0,
- "errmsg" : "already initialized",
- "code" : 23,
- "codeName" : "AlreadyInitialized",
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534818908, 2),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
- [root@hdp06 ~]# mongod --port 27021
- > rs.initiate({_id:"myShard_3",members:[{_id:1,host:"hdp06.thinkjoy.tt:27021",priority:2},{_id:2,host:"hdp07.thinkjoy.tt:27021"},{_id:3,host:"hdp08.thinkjoy.tt:27021"}]})
- {
- "operationTime" : Timestamp(1534818928, 1),
- "ok" : 0,
- "errmsg" : "already initialized",
- "code" : 23,
- "codeName" : "AlreadyInitialized",
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534818928, 1),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
4, 配置 Mongos 服务
- [root@hdp06 ~]# vi /data/mongo/router/mongod.router
- net:
- bindIp: 0.0.0.0
- port: 27018
- processManagement:
- fork: "true"
- sharding:
- configDB: configRS/hdp06.thinkjoy.tt:27017,hdp07.thinkjoy.tt:27017,hdp08.thinkjoy.tt:27017
- systemLog:
- destination: file
- path: /data/mongo/router/logs/mongo_router.log
- [root@hdp06 ~]# scp /data/mongo/router/mongod.router hdp07:/data/mongo/router
- [root@hdp06 ~]# scp /data/mongo/router/mongod.router hdp08:/data/mongo/router
- [root@hdp06 ~]# mongos -f /data/mongo/router/mongod.router
- [root@hdp07 ~]# mongos -f /data/mongo/router/mongod.router
- [root@hdp08 ~]# mongos -f /data/mongo/router/mongod.router
配置分片, 将主片添加至集群, 如下:
- [root@hdp06 ~]# mongo --port 27018
- mongos> show dbs
- admin 0.000GB
- config 0.000GB
- mongos> use admin
- switched to db admin
- mongos> db.runCommand({"addShard":"myShard_1/hdp06.thinkjoy.tt:27019" ,"maxsize":1024})
- {
- "shardAdded" : "myShard_1",
- "ok" : 1,
- "operationTime" : Timestamp(1534819816, 6),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534819816, 6),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
- mongos> db.runCommand({"addShard":"myShard_2/hdp06.thinkjoy.tt:27020" ,"maxsize":1024})
- {
- "shardAdded" : "myShard_2",
- "ok" : 1,
- "operationTime" : Timestamp(1534819823, 5),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534819823, 5),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
- mongos> db.runCommand({"addShard":"myShard_3/hdp06.thinkjoy.tt:27021" ,"maxsize":1024})
- {
- "shardAdded" : "myShard_3",
- "ok" : 1,
- "operationTime" : Timestamp(1534819830, 5),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534819830, 5),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
Shard cluster 状态查询:
- mongos> sh.status()
- --- Sharding Status ---
- sharding version: {
- "_id" : 1,
- "minCompatibleVersion" : 5,
- "currentVersion" : 6,
- "clusterId" : ObjectId("5b7b700b1cfaf6f26d2d0284")
- }
- shards:
- { "_id" : "myShard_1", "host" : "myShard_1/hdp06.thinkjoy.tt:27019,hdp07.thinkjoy.tt:27019,hdp08.thinkjoy.tt:27019", "state" : 1 }
- { "_id" : "myShard_2", "host" : "myShard_2/hdp06.thinkjoy.tt:27020,hdp07.thinkjoy.tt:27020,hdp08.thinkjoy.tt:27020", "state" : 1 }
- { "_id" : "myShard_3", "host" : "myShard_3/hdp06.thinkjoy.tt:27021,hdp07.thinkjoy.tt:27021,hdp08.thinkjoy.tt:27021", "state" : 1 }
- active mongoses:
- "4.0.1" : 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" : "MyDB", "primary" : "myShard_2", "partitioned" : true, "version" : { "uuid" : UUID("202a1d72-aa92-403d-a2a6-c7c3aa273323"), "lastMod" : 1 } }
- MyDB.chapter
- shard key: { "id" : 1, "subjectId" : 1 }
- unique: false
- balancing: true
- chunks:
- myShard_2 1
- { "id" : { "$minKey" : 1 }, "subjectId" : { "$minKey" : 1 } } -->> { "id" : { "$maxKey" : 1 }, "subjectId" : { "$maxKey" : 1 } } on : myShard_2 Timestamp(1, 0)
- MyDB.question_knowledge_basic_id
- shard key: { "knowledge_basic_id" : 1, "question_id" : 1 }
- unique: false
- balancing: true
- chunks:
- myShard_2 1
- {
- "knowledge_basic_id" : { "$minKey" : 1 },
- "question_id" : { "$minKey" : 1 }
- } -->> {
- "knowledge_basic_id" : { "$maxKey" : 1 },
- "question_id" : { "$maxKey" : 1 }
- } on : myShard_2 Timestamp(1, 0)
- { "_id" : "config", "primary" : "config", "partitioned" : true }
- config.system.sessions
- shard key: { "_id" : 1 }
- unique: false
- balancing: true
- chunks:
- myShard_1 1
- { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : myShard_1 Timestamp(1, 0)
5, 对库启用分片
这里创建了一个 mydb 库, 使用以下命令对其启用分片功能.
- mongos>sh.enableSharding("MyDB")
- {
- "ok" : 1,
- "operationTime" : Timestamp(1534837173, 2214),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1534837173, 2408),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
下面对 mydb 的 chapter 启用分片技术:
-- 创建一个索引
- mongos> use MyDB
- switched to db MyDB
- mongos> db.chapter.createIndex({
- "id" : 1,"subjectId" : 1
- },{
- "name" : "new_idx"
- })
-- 对表进行分片
- mongos> sh.shardCollection('MyDB.chapter',{id:1,subjectId:1})
- {
- "collectionsharded" : "MyDB.chapter",
- "collectionUUID" : UUID("a5f3b95c-ced6-4ae5-82d8-06d36176cbef"),
- "ok" : 1,
- "operationTime" : Timestamp(1535077873, 13),
- "$clusterTime" : {
- "clusterTime" : Timestamp(1535077873, 13),
- "signature" : {
- "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
- "keyId" : NumberLong(0)
- }
- }
- }
6,Shard 集群监控
针对 MongoDB 的监控除了使用第三方软件外, 强烈推荐是官方提供的 Ops Manager, 如下图所示:
来源: http://www.linuxidc.com/Linux/2018-11/155583.htm