文章目錄
本文以三臺虛擬機爲例搭建mongodb分片集羣實驗環境。由於config節點和mongos路由節點爲單實例方式,所以現網部署不推薦此方式部署,僅供參考。
現網部署應考慮config節點和mongos路由節點的高可用。
1.部署環境:
三臺虛擬機
硬件配置:16核CPU 32GB內存 200GB硬盤
軟件配置:
centos 6.9
mongodb 4.2.0
2.集羣結構
計劃創建三個分片,每個分片採用一主一副一仲裁構建副本集,搭建一個config實例和一個mongos路由實例。建議:config實例和mongos路由實例可部署多個,構建高可用模式。
3.前期準備:
虛擬機時間同步:
yum install ntpdate -y
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #轉換時區
ntpdate -u ntp.ntsc.ac.cn #從國家授時中心同步系統時間
配置hosts(可選)
/etc/hosts追加服務器ip信息
172.28.81.229 mongo-shard1
172.28.81.228 mongo-shard2
172.28.81.226 mongo-shard3
防火牆開啓相應端口
每臺服務器防火牆開啓2200~22004端口
下載包
官網選擇合適的操作系統版本下載tgz包
https://www.mongodb.com/download-center/community
示例安裝:mongodb-linux-x86_64-rhel62-4.2.3.tgz
4.創建副本集
副本集節點之間通信需要祕鑰認證,生成祕鑰和配置過程見章節8,此處可以按文章所述繼續操作,如果啓動副本集後,日誌報錯connection refused,各節點遲遲沒有通信成功,極大可能是沒有配置祕鑰認證機制導致的。
爲每個分片創建副本集節點實例,每個分片有兩個副本和一個仲裁者節點。
創建副本集的數據存儲位置:
mkdir /home/data/shard1
mkdir /home/data/shard2
mkdir /home/data/shard3
副本集節點實例配置參考:
本示例在/home/config中創建各mongo實例的配置文件。shard1.conf參考:
storage:
#mongodb數據存儲位置
dbPath: /home/data/shard1
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
# 存儲引擎使用的內存大小
cacheSizeGB: 6
# 爲true,索引和collection信息將保存在dbPath下
directoryForIndexes: true
# 日誌配置
systemLog:
destination: file
logAppend: true
path: /home/logs/shard1.log
# network interfaces
net:
#監聽端口
port: 22000
# 允許所有連接
bindIp: 0.0.0.0
# how the process runs
processManagement:
fork: true
pidFilePath: /home/pid/shard1
timeZoneInfo: /usr/share/zoneinfo
#一個複製集中的所有實例replSetName相同
replication:
oplogSizeMB: 7000
replSetName: shard1
sharding:
clusterRole: shardsvr
在各虛擬機分別創建shard1.conf,shard2.conf,shard3.conf
啓動mongo副本集
命令示例:
./mongod -f config/shard1.conf
./mongod -f config/shard2.conf
./mongod -f config/shard3.conf
在其他虛擬機啓動所有副本集實例。
副本集節點初始化腳本:
創建副本集初始化腳本shard1.js,shard2.js,shard3.js
shard1.js:
cfg={_id:"shard1", members:[{_id:0, host:'172.28.81.229:22000', arbiterOnly:true},{_id:1, host:'172.28.81.228:22000', priority:2},{_id:2, host:'172.28.81.226:22000', priority:1}]};
rs.initiate(cfg);
shard2.js:
cfg={_id:"shard2", members:[{_id:0, host:'172.28.81.229:22001', priority:2},{_id:1, host:'172.28.81.228:22001', arbiterOnly:true},{_id:2, host:'172.28.81.226:22001', priority:1}]};
rs.initiate(cfg);
shard3.js:
cfg={_id:"shard3", members:[{_id:0, host:'172.28.81.229:22002', priority:1},{_id:1, host:'172.28.81.228:22002', priority:2},{_id:2, host:'172.28.81.226:22002', arbiterOnly:true}]};
rs.initiate(cfg);
初始化副本集:
請在非仲裁者實例執行上述js腳本
./mongo 127.0.0.1:22000/admin shard1.js
./mongo 127.0.0.1:22001/admin shard2.js
./mongo 127.0.0.1:22002/admin shard3.js
在mongo控制檯查看各副本集創建狀態:
rs.status()
更多副本集操作:
https://www.cnblogs.com/xibuhaohao/p/11320218.html
5.創建mongo分片集羣的config節點(用於保存分片的元數據)
config節點必須是副本集模式,否則在啓動mongos路由節點時會啓動失敗,示例副本集只包含一個mongo實例,也可創建多個mongo實例的副本集。
config實例配置參考:
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
# 存儲引擎使用的內存大小
cacheSizeGB: 2
# 爲true,索引和collection信息將保存在dbPath下
directoryForIndexes: true
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /home/logs/config.log
net:
port: 22003
# 允許所有連接
bindIp: 0.0.0.0
processManagement:
fork: true
pidFilePath: /home/pid/config
timeZoneInfo: /usr/share/zoneinfo
sharding:
#分片角色是config節點用於保存各分片的元數據
clusterRole: configsvr
replication:
oplogSizeMB: 7000
replSetName: config
啓動config實例節點:
./mongod -f config/config.js
創建config單節點副本集
config節點副本集初始化腳本:
config.js:
cfg={_id:"config", members:[{_id:0, host:'172.28.81.229:22003', priority:2}]};
rs.initiate(cfg);
初始化
./mongo 127.0.0.1:22003 config.js
6.創建mongo分片集羣mongos路由實例
mongos是整個分片集羣的讀寫入口,也是客戶端進行交互的入口,本示例創建一個單節點,也可創建多個節點,分擔讀寫壓力。
添加mongos路由實例配置
systemLog:
destination: file
logAppend: true
path: /home/logs/mongos.log
# network interfaces
net:
port: 22004
# 允許所有連接
bindIp: 0.0.0.0
# how the process runs
processManagement:
fork: true
sharding:
configDB: config/172.28.81.229:22003
啓動mongos路由實例
本次安裝僅啓動一個
./mongod -f config/router.conf
7.添加分片
打開mongos路由實例mongo控制檯:
./mongo 127.0.0.1:22004
執行命令,添加分片:
use admin;
sh.addShard("shard1/172.28.81.229:22000");
sh.addShard("shard1/172.28.81.228:22000");
sh.addShard("shard1/172.28.81.226:22000");
sh.addShard("shard2/172.28.81.229:22001");
sh.addShard("shard2/172.28.81.228:22001");
sh.addShard("shard2/172.28.81.226:22001");
sh.addShard("shard3/172.28.81.229:22002");
sh.addShard("shard3/172.28.81.228:22002");
sh.addShard("shard3/172.28.81.226:22002");
查看分片狀態
sh.status()
移除分片(可選)
db.runCommand({removeshard:"shard1/172.28.81.229:22002"});
驗證分片
進入mongos控制檯
use config;
db.shards.find();
8.mongo分片集羣添加祕鑰認證
生成祕鑰文件
openssl rand 700 -base64 > /home/config/mongodb.keyfile
chmod 600 /home/config/mongodb.keyfile
將祕鑰拷貝到其他服務器:
scp /home/config/mongodb.keyfile [email protected]:/home/config/
scp /home/config/mongodb.keyfile [email protected]:/home/config/
在每個實例的配置文件中追加配置項
security:
keyFile: /home/config/mongodb.keyfile
添加用戶
啓動所有實例。
打開mongos控制檯:
use admin
db.createUser({user:"family",pwd:"l79bv2PA",roles:["root"]})
db.auth("family","l79bv2PA");
以認證方式登錄mongo分片集羣
進入mongos控制檯:
./mongo 127.0.0.1:22004 -ufamily -pl79bv2PA --authenticationDatabase=admin
mongodb分片集羣構建完成