MongoDB分片集群

发布于:2025-05-17 ⋅ 阅读:(21) ⋅ 点赞:(0)

1. 什么是分片?

将数据水平拆分到不同的服务器上

2. 为什么要使用分片集群

数据量突破单机瓶颈,数据量大,恢复很慢,不利于数据管理
并发量突破单机性能瓶颈

MongoDB 分片集群由一下几部分组成

分片集群角色:

路由节点:mongos, 提供集群单一入口,转发应用端请求,选择合适的数据节点进行读写,合
并多个数据节点的返回。无状态,建议 mongos节点集群部署以提供高可用性。客户请求应发给
mongos,而不是 分片服务器,当查询包含分片片键时,mongos将查询发送到指定分片,否
则,mongos将查询发送到所有分片,并汇总所有查询结果。
配置节点: 就是普通的mongod进程, 建议以复制集部署,提供高可用
提供集群元数据存储分片数据分布的数据。主节点故障时,配置服务器进入只读模式,
只读模式下,数据段分裂和集群平衡都不可执行。整个复制集故障时,分片集群不可用
数据节点:以复制集为单位,横向扩展最大1024分片,分片之间数据不重复,所有数据在一起才可以完整工作。

分片键

可以是单个字段, 也可以是复合字段

1. 范围分片

比如 key 的值 从 min - max
可以把数据进行范围分片

2. hash 分片

通过 hash(key ) 进行数据分段

片键值用来将集合中的文档划分为数据段,片键必须对应一个索引或索引前缀(单键、复合键),可
以使用片键的值 或者片键值的哈希值进行分片

选择片键

1. 片键值的范围更广(可以使用复合片键扩大范围)
2. 片键值的分布更平衡(可使用复合片键平衡分布)
3. 片键值不要单向增大、减小(可使用哈希片键)

数据段的分裂

当数据段尺寸过大,或者包含过多文档时,触发数据段分裂,只有新增、更新文档时才可能自动触
发数据段分裂,数据段分裂通过更新元数据来实现

集群的平衡

后台运行的平衡器负责监视和调整集群的平衡,当最大和最小分片之间的数据段数量相差过大时触

集群中添加或移除分片时也会触发

MongoDB分片集群特点

1.应用全透明
2.数据自动均衡
3.动态扩容,无需下线

搭建集群环境:
搭建一个2个分片的集群

配置第一个 分片集群:

. 创建数据目录 : 准备给两个复制集使用,每个复制集有三个实例 ,共 6 个数据节点
1 mkdir ‐p /data/shard1 /data/shard1second1 /data/shard1second2 /data/shard2 /da
ta/shard2second1 /data/shard2second2
2. 创建日志文件,共6 个文件
1 touch /data/shard1/mongod.log /data/shard1second1/mongod.log /data/shard1secon
d2/mongod.log /data/shard2/mongod.log /data/shard2second1/mongod.log /data/shard2
second2/mongod.log
3. 启动第一个 mongod 分片实例( 一共三个实例)
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet shard1 ‐‐dbpath /data/shard1 ‐‐logpath /dat
a/shard1/mongod.log ‐‐port 27010 ‐‐fork ‐‐shardsvr
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet shard1 ‐‐dbpath /data/shard1second1 ‐‐logpa
th /data/shard1second1/mongod.log ‐‐port 27011 ‐‐fork ‐‐shardsvr
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet shard1 ‐‐dbpath /data/shard1second2 ‐‐logpa
th /data/shard1second2/mongod.log ‐‐port 27012 ‐‐fork ‐‐shardsvr
4. 第一个分片的mongod 实例都启动好了后,将其加入到复制集中
1 rs.initiate(
2 {_id:"shard1",
3 "members":[
4 {"_id":0,"host":"192.168.109.200:27010"},
5 {"_id":1,"host":"192.168.109.200:27011"},
6 {"_id":2,"host":"192.168.109.200:27012"}
7 ]
8 });
等待集群选举
5. 查看状态
1 rs.status();

配置Config 复制集:一共三个实例

1. 创建数据目录:
1 mkdir ‐p /data/config /data/configsecond1 /data/configsecond2
2. 创建日志文件
1 touch /data/config/mongod.log /data/configsecond1/mongod.log /data/configsecon
d2/mongod.log
3. 启动配置复制集
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet config ‐‐dbpath /data/config ‐‐logpath /dat
a/config/mongod.log ‐‐port 37010 ‐‐fork ‐‐configsvr
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet config ‐‐dbpath /data/configsecond1 ‐‐logpa
th /data/configsecond1/mongod.log ‐‐port 37011 ‐‐fork ‐‐configsvr
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet config ‐‐dbpath /data/configsecond2 ‐‐logpa
th /data/configsecond2/mongod.log ‐‐port 37012 ‐‐fork ‐‐configsvr
4. 配置复制集进行初始化
1 rs.initiate(
2 {_id:"config",
3 "members":[
4 {"_id":0,"host":"192.168.109.200:37010"},
5 {"_id":1,"host":"192.168.109.200:37011"},
6 {"_id":2,"host":"192.168.109.200:37012"}
7 ]
8 });

配置mongs 路由节点

1. 启动mongos 实例,需要指定配置服务器的地址列表
1 mongos ‐‐bind_ip 0.0.0.0 ‐‐logpath /data/mongos/mongos.log ‐‐port 4000 ‐‐fork
‐‐configdb config/111.229.189.98:37010,111.229.189.98:37011,111.229.189.98:37012
其中 configdb 为配置服务器的地址列表
2. 连接到mongos中,并添加分片
直接通过mongo shell 客户端进行连接
mongo --port 4000 本地直连
执行脚本
1 sh.addShard("shard1/111.229.189.98:27010,111.229.189.98:27011,111.229.189.98:2
7012");
查看分片状态:
1 sh.status();
mongos 可以用同样的方式,创建多个

创建分片表:

1. MongoDB的分片时基于集合的,就算有分片集群不等于数据会自动分片,需要显示分片表
首先需要 启用数据库分片
sh.enableSharding("库名");
如:
sh.enableSharding("order");
sh.shardCollection("库名.集合名",{_id: "hashed"});
sh.shardCollection("order.account",{_id: "hashed"});
添加一组数据
1 for( var i =0;i<100; i++){
2 db.productdesc.insert({i:i});
3 }
动态扩容
创建第二个复制集来实现分片
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet shard2 ‐‐dbpath /data/shard2 ‐‐logpath /dat
a/shard2/mongod.log ‐‐port 27013 ‐‐fork ‐‐shardsvr
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet shard2 ‐‐dbpath /data/shard2second1 ‐‐logpa
th /data/shard2second1/mongod.log ‐‐port 27014 ‐‐fork ‐‐shardsvr
1 mongod ‐‐bind_ip 0.0.0.0 ‐‐replSet shard2 ‐‐dbpath /data/shard2second2 ‐‐logpa
th /data/shard2second2/mongod.log ‐‐port 27015 ‐‐fork ‐‐shardsvr

初始化复制集

1 rs.initiate(
2 {_id:"shard2",
3 "members":[
4 {"_id":0,"host":"111.229.189.98:27013"},
5 {"_id":1,"host":"111.229.189.98:27014"},
6 {"_id":2,"host":"111.229.189.98:27015"}
7 ]
8 });

加入到集群分片

1 mongo ‐‐port 4000
2 sh.addShard("shard2/111.229.189.98:27013,111.229.189.98:27014,111.229.189.98:2
7015");

注意:前面有数据了, 再分配分片键会报错


网站公告

今日签到

点亮在社区的每一天
去签到