共计 11164 个字符,预计需要花费 28 分钟才能阅读完成。
本文基于 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,如下图所示:
:
正文完
星哥玩云-微信公众号