一 前期準備
1.1 組件說明
MongoDB分片羣集包含如下組件:
shard:每一個分片是分片數據的子集。從MongoDB 3.6開始,必須將分片部署爲副本集。
mongos:mongos充當查詢路由器,提供客戶端應用程序和分片集羣之間的接口。
config servers:配置服務器存儲羣集的元數據和配置設置。從MongoDB 3.4開始,必須將配置服務器部署爲副本集(CSRS)。
注意:mongos不需建立複製集,config不需指定主副節點及仲裁節點,可是要建立複製集。
1.2 組件規劃
本實驗基於生產環境考慮,組件規劃以下:
將Config Server部署爲3成員副本集;
將每一個Shard部署爲3成員副本集,總共部署三個shard;
部署兩個mongos路由器。
提示:部署多個mongos路由器支持高可用性和可伸縮性。常見的模式是mongos在每一個應用程序服務器上放置一個,能夠減小應用程序和路由器之間的網絡延遲。
也能夠將mongos路由器放在專用主機上,經過用於大型規模部署。由於它將客戶端應用程序服務器的數量與mongos實例數量分離。這樣能夠更好地控制mongod實例所服務的鏈接數。
注意:mongos路由器部署的數量沒有限制。可是,因爲mongos路由器常常與Config Server通訊,所以在增長路由器數量時會密切監視配置服務器性能。若是發現性能降低,那麼能夠適當限制mongos路由器部署的數量。
MongoDB角色
|
服務器一
mongo01
|
服務器二
mongo02
|
服務器三
mongo03
|
服務器四
mongo04
|
服務器五
mongo05
|
mongos
|
|
|
|
172.24.8.74:27017
|
172.24.8.75:27017
|
config server
|
172.24.8.71:20001
主節點
|
172.24.8.72:20001
副節點
|
172.24.8.73:20001
仲裁節點
|
|
|
shard server 1
|
172.24.8.71:20002
主節點
|
172.24.8.72:20002
副節點
|
172.24.8.73:20002
仲裁節點
|
|
|
shard server 2
|
172.24.8.71:20003
仲裁節點
|
172.24.8.72:20003
主節點
|
172.24.8.73:20003
副節點
|
|
|
shard server 3
|
172.24.8.71:20004
副節點
|
172.24.8.72:20004
仲裁節點
|
172.24.8.73:20004
主節點
|
|
|
提示:爲保證高可用,任何一臺物理服務器不該該存在多個主。
1.3 其餘準備
NTP同步;
關閉SELinux;
關閉防火牆或放通相應規則;
添加以下解析至全部節點:
1 [root@localhost ~]# vi /etc/hosts #追加以下解析
2 172.24.8.71 mongo01
3 172.24.8.72 mongo02
4 172.24.8.73 mongo03
5 172.24.8.74 mongo04
6 172.24.8.75 mongo05
二 MongoDB安裝
2.1 下載tar包
1 [root@mongo01 ~]# yum -y install libcurl openssl #安裝依賴包
2 [root@mongo01 ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.9.tgz
2.2 解壓MongoDB包
1 [root@mongo01 ~]# tar -zxvf mongodb-linux-x86_64-rhel70-4.0.9.tgz
2 [root@mongo01 ~]# mv mongodb-linux-x86_64-rhel70-4.0.9 /usr/local/mongodb
3 [root@mongo01 ~]# useradd mongod -s /bin/false -c mongod
4 [root@mongo01 ~]# chown -R mongod:mongod /usr/local/mongodb/
2.3 添加PATH路徑
1 [root@mongo01 ~]# echo "export PATH=/usr/local/mongodb/bin::$PATH" >> .bashrc
提示:2.1——2.3須要在全部節點進行操做。
2.4 配置key
1 [root@mongo01 ~]# mkdir -p /etc/mongo
2 [root@mongo01 ~]# openssl rand -base64 100 > /etc/mongo/mongo.key
3 [root@mongo01 ~]# chown -R mongod:mongod /etc/mongo
4 [root@mongo01 ~]# chmod 600 /etc/mongo/mongo.key
5 [root@mongo01 ~]# scp -r /etc/mongo root@mongo02:/etc/
6 [root@mongo01 ~]# scp -r /etc/mongo root@mongo03:/etc/
7 [root@mongo01 ~]# scp -r /etc/mongo root@mongo04:/etc/
8 [root@mongo01 ~]# scp -r /etc/mongo root@mongo05:/etc/
9 [root@mongo02 ~]# chown -R mongod:mongod /etc/mongo
10 [root@mongo03 ~]# chown -R mongod:mongod /etc/mongo
11 [root@mongo04 ~]# chown -R mongod:mongod /etc/mongo
12 [root@mongo05 ~]# chown -R mongod:mongod /etc/mongo
2.5 建立MongoDB相關目錄
1 [root@mongo01 ~]# mkdir -p /var/log/mongodb #日誌目錄
2 [root@mongo01 ~]# mkdir -p /var/run/mongodb #pid目錄
3 [root@mongo01 ~]# mkdir -p /var/lib/mongodb/config #config server存儲目錄
4 [root@mongo01 ~]# mkdir -p /var/lib/mongodb/shard{1,2,3} #shard server存儲目錄
5 [root@mongo01 ~]# chown -R mongod:mongod /var/log/mongodb
6 [root@mongo01 ~]# chown -R mongod:mongod /var/run/mongodb
7 [root@mongo01 ~]# chown -R mongod:mongod /var/lib/mongodb
注意:經過下載tar包形式安裝,未建立默認的MongoDB目錄及用戶,須要如上所示手動建立並受權便可。
以上操做須要在mongo0一、mongo0二、mongo03,即全部config server節點操做。
三 配置config server
3.1 服務器一配置
1 [root@mongo01 ~]# cat << EOF > /etc/mongo/config.conf
2 systemLog:
3 destination: file
4 logAppend: true
5 path: /var/log/mongodb/config.log
6
7 storage:
8 dbPath: /var/lib/mongodb/config
9 journal:
10 enabled: true
11 wiredTiger:
12 engineConfig:
13 directoryForIndexes: true
14
15 processManagement:
16 fork: true
17 pidFilePath: /var/run/mongodb/config.pid
18 timeZoneInfo: /usr/share/zoneinfo
19
20 net:
21 port: 20001
22 bindIp: 0.0.0.0
23 maxIncomingConnections: 500
24
25 security:
26 keyFile: /etc/mongo/mongo.key
27 authorization: enabled
28
29 replication:
30 replSetName: configs
31
32 sharding:
33 clusterRole: configsvr
34 EOF
35 [root@mongo01 ~]# scp -r /etc/mongo/config.conf root@mongo02:/etc/mongo/config.conf
36 [root@mongo01 ~]# scp -r /etc/mongo/config.conf root@mongo03:/etc/mongo/config.conf
3.2 啓動mongod
1 [root@mongo01 ~]# mongod --config /etc/mongo/config.conf
2 [root@mongo02 ~]# mongod --config /etc/mongo/config.conf
3 [root@mongo03 ~]# mongod --config /etc/mongo/config.conf
3.3 初始化configsrv副本集羣
1 [root@mongodb01 ~]# mongo --port 20001
2 > config = { _id: "configs", members: [
3 {_id: 0, host: "172.24.8.71:20001"},
4 {_id: 1, host: "172.24.8.72:20001"},
5 {_id: 2, host: "172.24.8.73:20001"}]
6 }
參數解釋:
"_id": 副本集的名稱
"members": 副本集的服務器列表
"_id": 服務器的惟一ID
"host": 服務器主機
"priority": 是優先級,默認爲1,優先級0爲被動節點,不能成爲活躍節點。優先級不爲0則按照有大到小選出活躍節點。
"arbiterOnly": 仲裁節點,只參與投票,不接收數據,也不能成爲活躍節點。
3.4 初始化副本集
1 > rs.initiate(config) #初始化集羣
2 my_rep1:PRIMARY> rs.status() #查看集羣狀態
四 配置shard server 1
4.1 服務器一配置
1 [root@mongo01 ~]# cat << EOF > /etc/mongo/shard1.conf
2 systemLog:
3 destination: file
4 logAppend: true
5 path: /var/log/mongodb/shard1.log
6
7 storage:
8 dbPath: /var/lib/mongodb/shard1
9 journal:
10 enabled: true
11 wiredTiger:
12 engineConfig:
13 directoryForIndexes: true
14
15 processManagement:
16 fork: true
17 pidFilePath: /var/run/mongodb/shard1.pid
18 timeZoneInfo: /usr/share/zoneinfo
19
20 net:
21 port: 20002
22 bindIp: 0.0.0.0
23 maxIncomingConnections: 500
24
25 security:
26 keyFile: /etc/mongo/mongo.key
27 authorization: enabled
28
29 replication:
30 replSetName: shard1
31
32 sharding:
33 clusterRole: shardsvr
34 EOF
35 [root@mongo01 ~]# scp -r /etc/mongo/shard1.conf root@mongo02:/etc/mongo/shard1.conf
36 [root@mongo01 ~]# scp -r /etc/mongo/shard1.conf root@mongo03:/etc/mongo/shard1.conf
4.2 啓動mongod
1 [root@mongo01 ~]# mongod --config /etc/mongo/shard1.conf
2 [root@mongo02 ~]# mongod --config /etc/mongo/shard1.conf
3 [root@mongo03 ~]# mongod --config /etc/mongo/shard1.conf
4.3 初始化configsrv副本集羣
1 [root@mongodb01 ~]# mongo --port 20002
2 > config = { _id: "shard1", members: [
3 {_id: 0, host: "172.24.8.71:20002",priority:2},
4 {_id: 1, host: "172.24.8.72:20002",priority:1},
5 {_id: 2, host: "172.24.8.73:20002",arbiterOnly:true}]
6 }
4.4 初始化副本集
1 > rs.initiate(config) #初始化集羣
2 my_rep1:PRIMARY> rs.status() #查看集羣狀態
五 配置shard server 2
5.1 服務器一配置
1 [root@mongo01 ~]# cat << EOF > /etc/mongo/shard2.conf
2 systemLog:
3 destination: file
4 logAppend: true
5 path: /var/log/mongodb/shard2.log
6
7 storage:
8 dbPath: /var/lib/mongodb/shard2
9 journal:
10 enabled: true
11 wiredTiger:
12 engineConfig:
13 directoryForIndexes: true
14
15 processManagement:
16 fork: true
17 pidFilePath: /var/run/mongodb/shard2.pid
18 timeZoneInfo: /usr/share/zoneinfo
19
20 net:
21 port: 20003
22 bindIp: 0.0.0.0
23 maxIncomingConnections: 500
24
25 security:
26 keyFile: /etc/mongo/mongo.key
27 authorization: enabled
28
29 replication:
30 replSetName: shard2
31
32 sharding:
33 clusterRole: shardsvr
34 EOF
35 [root@mongo01 ~]# scp -r /etc/mongo/shard2.conf root@mongo02:/etc/mongo/shard2.conf
36 [root@mongo01 ~]# scp -r /etc/mongo/shard2.conf root@mongo03:/etc/mongo/shard2.conf
5.2 啓動mongod
1 [root@mongo01 ~]# mongod --config /etc/mongo/shard2.conf
2 [root@mongo02 ~]# mongod --config /etc/mongo/shard2.conf
3 [root@mongo03 ~]# mongod --config /etc/mongo/shard2.conf
5.3 初始化configsrv副本集羣
1 [root@mongodb02 ~]# mongo --port 20003
2 > config = { _id: "shard2", members: [
3 {_id: 0, host: "172.24.8.71:20003",arbiterOnly:true},
4 {_id: 1, host: "172.24.8.72:20003",priority:2},
5 {_id: 2, host: "172.24.8.73:20003",priority:1}]
6 }
提示:若是選擇在預先規劃爲仲裁節點的服務器上建立複製集會報錯,須要在非仲裁節點建立。
5.4 初始化副本集
1 > rs.initiate(config) #初始化集羣
2 my_rep1:PRIMARY> rs.status() #查看集羣狀態
六 配置shard server 3
6.1 服務器一配置
1 [root@mongo01 ~]# cat << EOF > /etc/mongo/shard3.conf
2 systemLog:
3 destination: file
4 logAppend: true
5 path: /var/log/mongodb/shard3.log
6
7 storage:
8 dbPath: /var/lib/mongodb/shard3
9 journal:
10 enabled: true
11 wiredTiger:
12 engineConfig:
13 directoryForIndexes: true
14
15 processManagement:
16 fork: true
17 pidFilePath: /var/run/mongodb/shard3.pid
18 timeZoneInfo: /usr/share/zoneinfo
19
20 net:
21 port: 20004
22 bindIp: 0.0.0.0
23 maxIncomingConnections: 500
24
25 security:
26 keyFile: /etc/mongo/mongo.key
27 authorization: enabled
28
29 replication:
30 replSetName: shard3
31
32 sharding:
33 clusterRole: shardsvr
34 EOF
35 [root@mongo01 ~]# scp -r /etc/mongo/shard3.conf root@mongo02:/etc/mongo/shard3.conf
36 [root@mongo01 ~]# scp -r /etc/mongo/shard3.conf root@mongo03:/etc/mongo/shard3.conf
6.2 啓動mongod
1 [root@mongo01 ~]# mongod --config /etc/mongo/shard3.conf
2 [root@mongo02 ~]# mongod --config /etc/mongo/shard3.conf
3 [root@mongo03 ~]# mongod --config /etc/mongo/shard3.conf
6.3 初始化configsrv副本集羣
1 [root@mongodb01 ~]# mongo --port 20004
2 > config = { _id: "shard3", members: [
3 {_id: 0, host: "172.24.8.71:20004",priority:1},
4 {_id: 1, host: "172.24.8.72:20004",arbiterOnly:true},
5 {_id: 2, host: "172.24.8.73:20004",priority:2}]
6 }
提示:若是選擇在預先規劃爲仲裁節點的服務器上建立複製集會報錯,須要在非仲裁節點建立。
6.4 初始化副本集
1 > rs.initiate(config) #初始化集羣
2 my_rep1:PRIMARY> rs.status() #查看集羣狀態
七 配置mongos路由節點
7.1 建立MongoDB相關目錄
1 [root@mongo04 ~]# mkdir -p /var/log/mongodb #日誌目錄
2 [root@mongo04 ~]# mkdir -p /var/run/mongodb #pid目錄
3 [root@mongo04 ~]# chown -R mongod:mongod /var/log/mongodb
4 [root@mongo04 ~]# chown -R mongod:mongod /var/run/mongodb
注意:經過下載tar包形式安裝,未建立默認的MongoDB目錄及用戶,須要如上所示手動建立並受權便可。
以上操做須要在mongo0四、mongo05即全部mongos server節點操做。
7.2 服務器四配置
1 [root@mongo04 ~]# cat << EOF > /etc/mongo/mongos.conf
2 systemLog:
3 destination: file
4 logAppend: true
5 path: /var/log/mongodb/mongos.log
6
7 processManagement:
8 fork: true
9 pidFilePath: /var/run/mongodb/mongos.pid
10 timeZoneInfo: /usr/share/zoneinfo
11
12 net:
13 port: 27017
14 bindIp: 0.0.0.0
15 maxIncomingConnections: 2000
16
17 security:
18 keyFile: /etc/mongo/mongo.key
19 # authorization: enabled
20
21 sharding:
22 configDB: configs/172.24.8.71:20001,172.24.8.72:20001,172.24.8.73:20001
23 EOF
24 [root@mongo04 ~]# scp -r /etc/mongo/mongos.conf root@mongo05:/etc/mongo/mongos.conf
7.3 啓動mongos
1 [root@mongo04 ~]# mongos --config /etc/mongo/mongos.conf
2 [root@mongo05 ~]# mongos --config /etc/mongo/mongos.conf
7.4 建立管理員用戶
1 [root@mongodb04 ~]# mongo --port 27017
2 mongos> use admin #進入admin數據庫
3 mongos> db.createUser({ user: "admin", pwd: "admin", roles: [{ role: "_system", db: "admin" }] })
4 mongos> db.createUser({"user":"root","pwd":"root","roles":["root"]})
5 mongos> db.auth("admin", "admin") #驗證建立結果
6 1
提示:以上爲建議項,建議建立一個管理員用於內部管理MongoDB。
mongodb中的用戶是基於身份role的,該管理員帳戶的 role是 userAdminAnyDatabase。 ‘userAdmin’表明用戶管理身份,’AnyDatabase’ 表明能夠管理任何數據庫。
db.auth()能夠驗證 用戶。
1 mongos> db.getUsers()
2 mongos> db.system.users.find().pretty() #查看全局全部帳戶
提示:mongo shell 可經過.pretty() 對輸出進行JSON格式化,以便提升輸出的可讀性。
八 開啓分片功能
8.1 啓用分片功能
1 [root@mongo04 ~]# mongo --port 27017 -u admin -p admin
2 mongos> use amdin
3 mongos> sh.addShard("shard1/172.24.8.71:20002,172.24.8.72:20002,172.24.8.73:20002")
4 mongos> sh.addShard("shard2/172.24.8.71:20003,172.24.8.72:20003,172.24.8.73:20003")
1 mongos> sh.status() #查看分片集羣狀態
8.2 設置分片chunk大小
1 mongos> use config
2 mongos> db.settings.save({"_id":"chunksize","value":1}) #設置分片大小爲1M便於測試
8.3 模擬數據寫入
1 mongos> use mydb #建立用於模擬的數據庫
2 mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
3 #模擬寫入5W條數據到user集合
4 WriteResult({ "nInserted" : 1 }) #輸出
8.4 啓用數據庫分片
1 mongos> sh.enableSharding("mydb")
8.5 建立索引
1 mongos> db.user.createIndex({"id": 1})
8.6 啓用表分片
1 mongos> sh.shardCollection("mydb.user",{"id": 1})
8.7 查看分片狀況
8.8 手動添加第三個分片
1 mongos> sh.addShard("shard3/172.24.8.71:20004,172.24.8.72:20004,172.24.8.73:20004")
8.9 再次觀察分片狀況
提示:當分片有變更時,服務器會對數據進行從新分片(均衡),當你再次移除一個分片服務器,此時又會對數據再次進行分片處理。
相關參考:
https://blog.51cto.com/bigboss/2160311
https://blog.51cto.com/13643643/2148825