IP | mongos | config | share-1 | share-2 |
---|---|---|---|---|
192.168.8.3 | 27017 | 27019 | 27010 | 27011 |
192.168.8.4 | 27017 | 27019 | 27010 | 27011 |
192.168.8.5 | 27017 | 27019 | 27010 | 27011 |
1.下载安装mongodb
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.19.tgz
tar xf mongodb-linux-x86_64-rhel70-4.4.19.tgz -C /data && mv /data/mongodb-linux-x86_64-rhel70-4.4.19/ /data/mongodb_install
2. 创建工作目录
mkdir /data/mongodb/{shard1,shard2,configsvr,mongos}/{db,log,conf} -p
3.启动config
mongod -f /data/mongodb/configsvr/conf/configsvr.conf
配置文件:configsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/configsvr/log/configsvr.log
storage:
dbPath: /data/mongodb/configsvr/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/configsvr/configsvr.pid
net:
port: 27019
bindIp: 0.0.0.0
replication:
replSetName: config
sharding:
clusterRole: configsvr
初始化config
mongo --port 27019
rs.initiate(
{
_id: "config",
members: [
{ _id : 0, host : "192.168.8.3:27019" },
{ _id : 1, host : "192.168.8.4:27019" },
{ _id : 2, host : "192.168.8.5:27019" }
]
}
)
4.启动share1分片进程
mongod -f /data/mongodb/shard1/conf/shard1.conf
配置文件:shard1.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shard1/log/shard1.log
storage:
dbPath: /data/mongodb/shard1/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/shard1/shard1.pid
net:
port: 27010
bindIp: 0.0.0.0
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
初始化副本集
mongo --port 27010
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "192.168.8.3:27010" },
{ _id : 1, host : "192.168.8.4:27010" },
{ _id : 2, host : "192.168.8.5:27010" }
]
}
)
查看副本集状态
shard1:SECONDARY> rs.status()
{
"set" : "shard1",
"date" : ISODate("2023-03-15T09:43:11.820Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1678873390, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1678873390, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"appliedOpTime" : {
"ts" : Timestamp(1678873390, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1678873390, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1678873360, 4),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2023-03-15T09:42:40.139Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1678873350, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2023-03-15T09:42:40.161Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2023-03-15T09:42:40.689Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.8.3:27010",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 521,
"optime" : {
"ts" : Timestamp(1678873390, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-03-15T09:43:10Z"),
"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1678873360, 1),
"electionDate" : ISODate("2023-03-15T09:42:40Z"),
"configVersion" : 1,
"configTerm" : -1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.8.4:27010",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 41,
"optime" : {
"ts" : Timestamp(1678873380, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1678873380, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-03-15T09:43:00Z"),
"optimeDurableDate" : ISODate("2023-03-15T09:43:00Z"),
"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"lastHeartbeat" : ISODate("2023-03-15T09:43:10.160Z"),
"lastHeartbeatRecv" : ISODate("2023-03-15T09:43:10.690Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.8.3:27010",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : -1
},
{
"_id" : 2,
"name" : "192.168.8.5:27010",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 41,
"optime" : {
"ts" : Timestamp(1678873380, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1678873380, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-03-15T09:43:00Z"),
"optimeDurableDate" : ISODate("2023-03-15T09:43:00Z"),
"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
"lastHeartbeat" : ISODate("2023-03-15T09:43:10.165Z"),
"lastHeartbeatRecv" : ISODate("2023-03-15T09:43:11.656Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "192.168.8.4:27010",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : -1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1678873390, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1678873390, 1)
}
shard1:PRIMARY>
5.启动mongos
mongos -f /data/mongodb/mongos/conf/mongos.conf
配置文件:mongos.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongos/log/mongos.log
processManagement:
fork: true
pidFilePath: /data/mongodb/mongos/mongos.pid
net:
port: 27017
bindIp: 0.0.0.0
sharding:
configDB: config/192.168.8.3:27019,192.168.8.4:27019,192.168.8.5:27019
加入第一个分片
mongo --port 27017
mongos> sh.addShard( "shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010")
{
"shardAdded" : "shard1",
"ok" : 1,
"operationTime" : Timestamp(1678874879, 6),
"$clusterTime" : {
"clusterTime" : Timestamp(1678874879, 6),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
查看分片状态
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("6411968a502e5b96b4848a9c")
}
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010", "state" : 1 }
active mongoses:
"4.4.19" : 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" : "config", "primary" : "config", "partitioned" : true }
为了使集合支持分片,需要先开启database的分片功能
mongos> sh.enableSharding("market_test")
{
"ok" : 1,
"operationTime" : Timestamp(1678875165, 3),
"$clusterTime" : {
"clusterTime" : Timestamp(1678875165, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
执行shardCollection命令,对集合执行分片初始化
mongos> sh.shardCollection("market_test.emp",{_id: 'hashed'})
{
"collectionsharded" : "market_test.emp",
"collectionUUID" : UUID("e69e4e2a-c246-4a94-9095-fb1797c1405c"),
"ok" : 1,
"operationTime" : Timestamp(1678875275, 8),
"$clusterTime" : {
"clusterTime" : Timestamp(1678875275, 8),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
查看分片状态
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("6411968a502e5b96b4848a9c")
}
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010", "state" : 1 }
active mongoses:
"4.4.19" : 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" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
shard1 1024
too many chunks to print, use verbose if you want to force print
{ "_id" : "market_test", "primary" : "shard1", "partitioned" : true, "version" : { "uuid" : UUID("161e6787-dae1-4a6f-af46-f368cb0997f5"), "lastMod" : 1 } }
market_test.emp
shard key: { "_id" : "hashed" }
unique: false
balancing: true
chunks:
shard1 2
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : NumberLong(0) } on : shard1 Timestamp(1, 0)
{ "_id" : NumberLong(0) } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 1)
mongos>
插入数据测试
mongos>use market_test
for (var i =0; i < 10000; i++) {
db.emp.insert({i: i});
}
mongos> db.emp.find().count()
10000
查询数据分布
mongos> db.emp.getShardDistribution()
Shard shard1 at shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010
data : 322KiB docs : 10000 chunks : 2
estimated data per chunk : 161KiB
estimated docs per chunk : 5000
Totals
data : 322KiB docs : 10000 chunks : 2
Shard shard1 contains 100% data, 100% docs in cluster, avg obj size on shard : 33B
6.创建第二个分片
mongod -f /data/mongodb/shard2/conf/shard2.conf
配置文件:shard2.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shard2/log/shard1.log
storage:
dbPath: /data/mongodb/shard2/db
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /data/mongodb/shard2/shard1.pid
net:
port: 27011
bindIp: 0.0.0.0
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
初始化复制集
mongo --port 27011
rs.initiate(
{
_id: "shard2",
members: [
{ _id : 0, host : "192.168.8.3:27011" },
{ _id : 1, host : "192.168.8.4:27011" },
{ _id : 2, host : "192.168.8.5:27011" }
]
}
)
mongos加入第二个分片
mongo --port 27017
mongos> sh.addShard( "shard2/192.168.8.3:27011,192.168.8.4:27011,192.168.8.5:27011")
{
"shardAdded" : "shard2",
"ok" : 1,
"operationTime" : Timestamp(1678876049, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1678876049, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
查看数据分片信息,数据分布在两个分片上
mongos> use market_test
mongos> db.emp.getShardDistribution()
Shard shard1 at shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010
data : 322KiB docs : 10000 chunks : 1
estimated data per chunk : 322KiB
estimated docs per chunk : 10000
Shard shard2 at shard2/192.168.8.3:27011,192.168.8.4:27011,192.168.8.5:27011
data : 160KiB docs : 4967 chunks : 1
estimated data per chunk : 160KiB
estimated docs per chunk : 4967
Totals
data : 482KiB docs : 14967 chunks : 2
Shard shard1 contains 66.81% data, 66.81% docs in cluster, avg obj size on shard : 33B
Shard shard2 contains 33.18% data, 33.18% docs in cluster, avg obj size on shard : 33B
7.开启用户认证
[root@master-1 mongos]# mongo --port 27017
mongos> use admin
switched to db admin
mongos> db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
创建keyfile文件
mkdir /data/mongodb/keyfile
openssl rand -base64 756 > /data/mongodb/keyfile/keyfile
chmod 600 /data/keyfile/keyfile
scp /data/mongodb/keyfile/keyfile 192.168.8.4:/data/mongodb/keyfile/
scp /data/mongodb/keyfile/keyfile 192.168.8.5:/data/mongodb/keyfile/
停止所有mongo进程
[root@master-3 data]# ps -ef | grep mongo
[root@master-3 data]# kill 进程号
修改配置文件,添加认证,在每个配置文件里添加配置 config 和shard 添加
security:
keyFile: /data/mongodb/keyfile/keyfile
authorization: enabled
mongos 添加
security:
keyFile: /data/mongodb/keyfile/keyfile
8.重新启动mongodb集群,mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos
mongod -f /data/mongodb/configsvr/conf/configsvr.conf
mongod -f /data/mongodb/shard1/conf/shard1.conf
mongod -f /data/mongodb/shard2/conf/shard2.conf
mongos -f /data/mongodb/mongos/conf/mongos.conf
9.登录验证
[root@master-1 conf]# mongo --port 27017
mongos> show dbs;
mongos> use admin
switched to db admin
mongos> db.auth("root","123456")
mongos> show dbs;
admin 0.000GB
config 0.003GB
market_test 0.001GB