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()