MongoDB4.0搭建分散式叢集
搭建之前先了解一下MongoDB分片群集主要有如下三個元件:
- Shard:分片伺服器,用於儲存實際的資料塊,實際生產環境中一個shard server 角色可以由幾臺伺服器組成一個Peplica Set 承擔,防止主機單點故障。
- Config Server:配置伺服器,儲存了整個分片群集的配置資訊,其中包括chunk資訊。
- Routers:前端路由,客戶端由此接入,且讓整個群集看上去像單一資料庫,前端應用可以透明使用。
系統環境
Centos7.5、MongoDB4.0.2、關閉防火牆。
IP | 路由服務埠 | 配置服務埠 | 分片1埠 | 分片2埠 | 分片3埠 |
10.211.55.3 | 27017 | 27018 | 27001 | 27002 | 27003 |
10.211.55.4 | 27017 | 27018 | 27001 | 27002 | 27003 |
10.211.55.5 | 27017 | 27018 | 27001 | 27002 | 27003 |
三臺機器的配置服務(27018)形成複製集,分片1、2、3也在各機器都部署一個例項,它們之間形成複製集,客戶端直接連線3個路由服務與之互動,配置服務和分片服務對客戶端是透明的。
伺服器的安裝及配置(3臺伺服器執行相同操作)
1、下載解壓MongoDB
解壓到/home/mongodb,設定環境變數:
export PATH=$PATH:/home/mongodb/bin
儲存後執行:
srouce /etc/profile
2、建立路由、配置、分片等的相關目錄與檔案
啟動配置檔案存放的資料夾:mkdir -p /home/mongodb/conf 配置服務資料存放目錄:mkdir -p /home/mongodb/data/config 分片1服務資料存放目錄:mkdir -p /home/mongodb/data/shard1 分片2服務資料存放目錄:mkdir -p /home/mongodb/data/shard2 分片3服務資料存放目錄:mkdir -p /home/mongodb/data/shard3 配置服務日誌存放檔案:mkdir -p /home/mongodb/log/config.log 路由服務日誌存放檔案:mkdir -p /home/mongodb/log/mongos.log 分片1服務日誌存放檔案:mkdir -p /home/mongodb/log/shard1.log 分片2服務日誌存放檔案:mkdir -p /home/mongodb/log/shard2.log 分片3服務日誌存放檔案:mkdir -p /home/mongodb/log/shard3.log
配置伺服器部署(3臺伺服器執行相同操作)
1、在/home/mongodb/conf目錄建立config.conf:
dbpath=/home/mongodb/data/config
logpath=/home/mongodb/log/config.log
port=27018
logappend=true
fork=true
maxConns=5000
#複製集名稱
replSet=configs
#置引數為true
configsvr=true
#允許任意機器連線
bind_ip=0.0.0.0
2、配置複製集
分別啟動三臺伺服器的配置服務:
mongod -f /home/mongodb/conf/config.conf
連線mongo,只需在任意一臺機器執行即可:
mongo --host 10.211.55.3 --port 27018
切換資料庫:
use admin
初始化複製集:
rs.initiate({_id:"configs",members:[{_id:0,host:"10.211.55.3:27018"},{_id:1,host:"10.211.55.4:27018"}, {_id:2,host:"10.211.55.5:27018"}]})
其中_id:"configs"的configs是上面config.conf配置檔案裡的複製集名稱,把三臺伺服器的配置服務組成複製集。
檢視狀態:
rs.status()
等幾十秒左右,執行上面的命令檢視狀態,三臺機器的配置服務就已形成複製集,其中1臺為PRIMARY,其他2臺為SECONDARY。
分片服務部署(3臺伺服器執行相同操作)
1、在/home/mongodb/conf目錄建立shard1.conf、shard2.conf、shard3.conf,內容如下:
dbpath=/home/mongodb/data/shard1 #其他2個分片對應修改為shard2、shard3資料夾
logpath=/home/mongodb/log/shard1.log #其他2個分片對應修改為shard2.log、shard3.log
port=27001 #其他2個分片對應修改為27002、27003
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
replSet=shard1 #其他2個分片對應修改為shard2、shard3
bind_ip=0.0.0.0
埠分別是27001、27002、27003,分別對應shard1.conf、shard2.conf、shard3.conf。
還有資料存放目錄、日誌檔案這幾個地方都需要對應修改。
在3臺機器的相同埠形成一個分片的複製集,由於3臺機器都需要這3個檔案,所以根據這9個配置檔案分別啟動分片服務:
mongod -f /home/mongodb/conf/shard{1/2/3}.conf
2、將分片配置為複製集
連線mongo,只需在任意一臺機器執行即可:
mongo --host 10.211.55.3 --port 27001 //這裡以shard1為例,其他兩個分片則再需對應連線到27002、27003的埠進行操作即可
切換資料庫:
use admin
初始化複製集:
rs.initiate({_id:"shard1",members:[{_id:0,host:"10.211.55.3:27001"},{_id:1,host:"10.211.55.4:27001"},{_id:2,host:"10.211.55.5:27001"}]})
以上是基於分片1來操作,同理,其他2個分片也要連到各自的埠來執行一遍上述的操作,讓3個分片各自形成1主2從的複製集,注意埠及仲裁節點的問題即可,操作完成後3個分片都啟動完成,並完成複製集模式。
路由服務部署(3臺伺服器執行相同操作)
1、在/home/mongodb/conf目錄建立mongos.conf,內容如下:
logpath=/home/mongodb/log/mongos.log
logappend = true
port = 27017
fork = true
configdb = configs/10.211.55.3:27018,10.211.55.4:27018,10.211.55.5:27018
maxConns=20000
bind_ip=0.0.0.0
2、啟動mongos
分別在三臺伺服器啟動:
mongos -f /home/mongodb/conf/mongos.conf
3、啟動分片功能
連線mongo:
mongo --host 10.211.55.3 --port 27017
切換資料庫:
use admin
新增分片,只需在一臺機器執行即可:
sh.addShard("shard1/10.211.55.3:27001,10.211.55.4:27001,10.211.55.5:27001")
sh.addShard("shard2/10.211.55.3:27002,10.211.55.4:27002,10.211.55.5:27002")
sh.addShard("shard3/10.211.55.3:27003,10.211.55.4:27003,10.211.55.5:27003")
檢視叢集狀態:
sh.status()
4、實現分片功能
設定分片chunk大小
use config
db.setting.save({"_id":"chunksize","value":1}) # 設定塊大小為1M是方便實驗,不然需要插入海量資料
5、模擬寫入資料
use calon
for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} #模擬往calon資料庫的user表寫入5萬資料
7、啟用資料庫分片
sh.enableSharding("calon")
8、建立索引,對錶進行分片
db.user.createIndex({"id":1}) # 以"id"作為索引
sh.shardCollection(calon.user",{"id":1}) # 根據"id"對user表進行分片
sh.status() # 檢視分片情況
到此,MongoDB分散式叢集就搭建完畢。