MongoDB集群分片部署
MongoDB中使用分片集群結構分布:
三個主要組件:
- Shard:
用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾台機器組個一個replica set承擔,防止主機單點故障
- Config Server:
mongod實例,存儲了整個 ClusterMetadata,其中包括 chunk資訊。
- Query Routers:
前端路由,客戶端由此接入,且讓整個集群看上去像單一資料庫,前端應用可以透明使用。
Shard 分片服,實例存儲實際數據:
一個片區應該分布在不同機器上,片區採用副本集模式
副本集(replica set): 分為三個節點,主服,備服,仲裁服。在實際部署時,為了避免單點故障,同一個副本集中的成員,應該部署在不同主機上。
啟動命令:
mongod –replSet=rs-test1 –dbpath=/data/mongodb/mongodb-4.4.2/shard1/db27017/ –port=27017 –logpath=/data/mongodb/mongodb-4.4.2/shard1/db27017/mongo.log –bind_ip=0.0.0.0 —shardsvr –fork
mongod –replSet=rs-test1 –dbpath=/data/mongodb/mongodb-4.4.2/shard1/db27018/ –port=27018 –logpath=/data/mongodb/mongodb-4.4.2/shard1/db27018/mongo.log –bind_ip=0.0.0.0 –shardsvr –fork
mongod –replSet=rs-test1 –dbpath=/data/mongodb/mongodb-4.4.2/shard1/db27019/ –port=27019 –logpath=/data/mongodb/mongodb-4.4.2/shard1/db27019/mongo.log –bind_ip=0.0.0.0 –shardsvr –fork
初始化:
mongo 127.0.0.1:27019
cfg={_id:”rs-test1″, members:[{_id:0, host:’127.0.0.1:27017′, arbiterOnly:true},{_id:1, host:’127.0.0.1:27018′, priority:2},{_id:2, host:’127.0.0.1:27019′, priority:1}]};
rs.initiate(cfg);
//查看副本集狀態
rs.status()
ConfigServer 配置服
存儲集群所有節點、分片數據路由資訊。默認需要配置3個Config Server節點。
這裡也應該是副本集模式,測試使用一個實例
mongod –replSet=rs-test-conf –dbpath=/data/mongodb/mongodb-4.4.2/dbconfig/ –port=27020 –logpath=/data/mongodb/mongodb-4.4.2/dbconfig/mongo.log –bind_ip=0.0.0.0 –fork —configsvr
初始化:
mongo 127.0.0.1:27020
cfg={_id:”rs-test-conf”, members:[{_id:0, host:’127.0.0.1:27020′, priority:2}]};
rs.initiate(cfg);
Mongos 路由
提供對外應用訪問,所有操作均通過mongos執行。一般有多個mongos節點。數據遷移和數據自動平衡。
部署多個mongos實例可支援高可用性和可擴展性。一個常見的模式是在每個應用程式伺服器上部署一個 mongos實例。
在每個應用伺服器上部署一個 mongos實例可以減少應用程式和mongos之間的網路延遲。
另外,也可以在專用主機上部署 mongos實例。大型部署適用,因為它使客戶端應用程式伺服器的數量與mongos節點的數量脫鉤,可以更好地控制mongod實例服務的連接數。
mongos –port 27030 —configdb=rs-test-conf/127.0.0.1:27020 –logpath=/data/mongodb/mongodb-4.4.2/route.log –bind_ip=0.0.0.0 –fork
添加分片:
mongo 127.0.0.1:27030
use admin;
sh.addShard(“rs-test1/127.0.0.1:27017”);
sh.addShard(“rs-test1/127.0.0.1:27018”);
sh.addShard(“rs-test1/127.0.0.1:27019”);
查看狀態:
sh.status()