mongodb4.0.2分片集群部署
- 2019 年 10 月 4 日
- 筆記
mongodb4.0.2分片集群部署
2018年11月14日 11:05:50 Full Stack Developer 閱讀數 331
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/cron_zzx/article/details/84060221
一、分片集群簡介
在之前有說過關於MongoDB的複製集,複製集主要用來實現自動故障轉移從而達到高可用的目的,然而,隨著業務規模的增長和時間的推移,業務數據量會越來越大,當前業務數據可能只有幾百GB不到,一台DB伺服器足以搞定所有的工作,而一旦業務數據量擴充大幾個TB幾百個TB時,就會產生一台伺服器無法存儲的情況,此時,需要將數據按照一定的規則分配到不同的伺服器進行存儲、查詢等,即為分片集群。分片集群要做到的事情就是數據分散式存儲。
集群組建示意圖:

MongoDB分片群集主要有如下三個組件:
- Shard:分片伺服器,用於存儲實際的數據塊,實際生產環境中一個shard server 角色可以由幾台伺服器組成一個Peplica Set 承擔,防止主機單點故障。
- Config Server:配置伺服器,主要是記錄shard的配置資訊(元資訊metadata),如數據存儲目錄,日誌目錄,埠號,是否開啟了journal等資訊,其中包括chunk資訊。為了保證config伺服器的可用性,也做了複製集處理,注意,一旦配置伺服器無法使用,則整個集群就不能使用了,一般是獨立的三台伺服器實現冗餘備份,這三台可能每一台是獨立的複製集架構。
- Routers:前端路由,負責數據的分片寫入。客戶端由此接入,且讓整個群集看上去像單一資料庫,前端應用可以透明使用。應用程式通過驅動程式直接連接router,router啟動時從配置伺服器複製集中讀取shared資訊,然後將數據實際寫入或讀取(路由)到具體的shard中。
二、集群部署
環境準備:
mongodb4.0.2壓縮包官網地址 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.2.tgz
mongo1:192.168.247.141 shard1:27001 shard2:27002 shard3:27003 configs:27018 mongos:27017
mongo2:192.168.247.142 shard1:27001 shard2:27002 shard3:27003 configs:27018 mongos:27017
mongo3:192.168.247.143 shard1:27001 shard2:27002 shard3:27003 configs:27018 mongos:27017
說明:
1、啟動順序:configs---》shard(1,2,3)---》mongos
2、configs和shard1、shard2、shard3由mongod啟動和管理,mongos:27017 由mongos啟動管理。
部署(在mongo1上安裝,然後將安裝目錄拷貝到其他主機):
tar -xf mongodb-linux-x86_64-4.0.2.tgz mkdir /usr/local/mongo mv mongodb-linux-x86_64-4.0.2/* /usr/local/mongo/ echo 'export PATH=$PATH:/usr/local/mongo/bin' >> /etc/profile source /etc/profile cd /usr/local/mongo/ mkdir conf log mkdir -p data/config mkdir -p data/shard1 mkdir -p data/shard2 mkdir -p data/shard3 touch log/config.log touch log/mongos.log touch log/shard1.log touch log/shard2.log touch log/shard3.log touch conf/config.conf touch conf/mongos.conf touch conf/shard1.conf touch conf/shard2.conf touch conf/shard3.conf vim conf/config.conf
-
dbpath=/usr/local/mongo/data/config -
logpath=/usr/local/mongo/log/config.log -
port=27018 -
logappend=true -
fork=true -
maxConns=5000 -
#複製集名稱 -
replSet=configs -
#置參數為true -
configsvr=true -
#允許任意機器連接 -
bind_ip=0.0.0.0
vim conf/shard1.conf
-
dbpath=/usr/local/mongo/data/shard1 #其他2個分片對應修改為shard2、shard3文件夾 -
logpath=/usr/local/mongo/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
vim conf/shard2.conf
-
dbpath=/usr/local/mongo/data/shard2 -
logpath=/usr/local/mongo/log/shard2.log -
port=27002 -
logappend=true -
fork=true -
maxConns=5000 -
storageEngine=mmapv1 -
shardsvr=true -
replSet=shard2 -
bind_ip=0.0.0.0
vim conf/shard3.conf
-
dbpath=/usr/local/mongo/data/shard3 -
logpath=/usr/local/mongo/log/shard3.log -
port=27003 -
logappend=true -
fork=true -
maxConns=5000 -
storageEngine=mmapv1 -
shardsvr=true -
replSet=shard3 -
bind_ip=0.0.0.0
vim conf/mongos.conf
-
systemLog: -
destination: file -
logAppend: true -
path: /usr/local/mongo/log/mongos.log -
processManagement: -
fork: true -
# pidFilePath: /var/log/nginx/mongodbmongos.pid -
# network interfaces -
net: -
port: 27017 -
bindIp: 0.0.0.0 -
#監聽的配置伺服器,只能有1個或者3個 configs為配置伺服器的副本集名字 -
sharding: -
configDB: configs/mongo1:27018,mongo2:27018,mongo3:27018
scp /usr/local/mongo/* mongo2:/usr/local/mongo/
scp /usr/local/mongo/* mongo3:/usr/local/mongo/
啟動服務(所有主機):
啟動配置伺服器副本集:mongod -f /usr/local/mongo/conf/config.conf
mongo --port 27018
配置副本集:
-
config = { -
_id : "configs", -
members : [ -
{_id : 0, host : "192.168.247.141:27018" }, -
{_id : 1, host : "192.168.247.142:27018" }, -
{_id : 2, host : "192.168.247.143:27018" } -
] -
}
初始化命令: rs.initiate(config);
rs.status()
啟動3個分片副本集:
mongod -f /usr/local/mongo/conf/shard1.conf mongo --port 27001
配置副本集:
-
config = { -
_id : "shard1", -
members : [ -
{_id : 0, host : "192.168.247.141:27001" }, -
{_id : 1, host : "192.168.247.142:27001" }, -
{_id : 2, host : "192.168.247.143:27001" } -
] -
}
mongod -f /usr/local/mongo/conf/shard2.conf mongo --port 27002
配置副本集:
-
config = { -
_id : "shard2", -
members : [ -
{_id : 0, host : "192.168.247.141:27002" }, -
{_id : 1, host : "192.168.247.142:27002" }, -
{_id : 2, host : "192.168.247.143:27002" } -
] -
}
mongod -f /usr/local/mongo/conf/shard3.conf
mongo --port 27003
配置副本集:
-
config = { -
_id : "shard3", -
members : [ -
{_id : 0, host : "192.168.247.141:27003" }, -
{_id : 1, host : "192.168.247.142:27003" }, -
{_id : 2, host : "192.168.247.143:27003" } -
] -
}
啟動路由伺服器副本集:
mongos -f /usr/local/mongo/conf/mongos.conf
mongo --port 27017
啟用分片(只需在任意一台執行即可):
use admin
sh.addShard("shard1/192.168.247.141:27001,192.168.247.142:27001,192.168.247.143:27001") sh.addShard("shard2/192.168.247.141:27002,192.168.247.142:27002,192.168.247.143:27002") sh.addShard("shard3/192.168.247.141:27003,192.168.247.142:27003,192.168.247.143:27003")
----------------------------------------------------------
分片功能測試:
設置分片chunk大小
use config db.setting.save({"_id":"chunksize","value":1}) # 設置塊大小為1M是方便實驗,不然需要插入海量數據
模擬寫入數據
use mytest for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"zzx"+i})} #模擬往mytest資料庫的user表寫入5萬數據
7、啟用資料庫分片
sh.enableSharding("mytest")
8、創建索引,對錶進行分片
db.user.createIndex({"id":1}) # 以"id"作為索引 sh.shardCollection(mytest.user",{"id":1}) # 根據"id"對user表進行分片 sh.status() # 查看分片情況
到此,MongoDB分散式集群就搭建完畢。