超簡單mongodb 4.2分片集羣搭建指南


本文以三臺虛擬機爲例搭建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分片集羣構建完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章