分片集群
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个分片的集群
步骤:
配置第一个 分片集群(1主2从-复制集):
1. 创建数据目录 : 准备给两个复制集使用,每个复制集有三个实例 ,共 6 个数据节点
mkdir -p /data/shard1 /data/shard1second1 /data/shard1second2 /data/shard2 /data/shard2second1 /data/shard2second2
2. 创建日志文件,共6 个文件
touch /data/shard1/mongod.log /data/shard1second1/mongod.log /data/shard1second2/mongod.log /data/shard2/mongod.log /data/shard2second1/mongod.log /data/shard2second2/mongod.log
3. 启动第一个 mongod 分片实例( 一共三个实例)
mongod —bind_ip 0.0.0.0 —replSet shard1 —dbpath /data/shard1 —logpath /data/shard1/mongod.log —port 27010 —fork —shardsvr
mongod —bind_ip 0.0.0.0 —replSet shard1 —dbpath /data/shard1second1 —logpath /data/shard1second1/mongod.log —port 27011 —fork —shardsvr
mongod —bind_ip 0.0.0.0 —replSet shard1 —dbpath /data/shard1second2 —logpath /data/shard1second2/mongod.log —port 27012 —fork —shardsvr
4. 第一个分片的mongod 实例都启动好了后,配置1主2从-复制集
rs.initiate(
{_id:"shard1",
"members":[
{"_id":0,"host":"192.168.109.200:27010"},
{"_id":1,"host":"192.168.109.200:27011"},
{"_id":2,"host":"192.168.109.200:27012"}
]
});
等待集群选举
5. 查看状态
rs.status();
配置第二个分片集群,操作和上面的一样,但这里先配置第二个分片集群,先让整个集群只有一个分片,让整个集群跑起来后在后面再添加另外一个分片集群来测试动态扩容
配置Config 复制集:一共三个实例
1. 创建数据目录:
mkdir -p /data/config /data/configsecond1 /data/configsecond2
2. 创建日志文件
touch /data/config/mongod.log /data/configsecond1/mongod.log /data/configsecond2/mongod.log
3. 启动配置复制集
mongod —bind_ip 0.0.0.0 —replSet config —dbpath /data/config —logpath /data/config/mongod.log —port 37010 —fork —configsvr
mongod —bind_ip 0.0.0.0 —replSet config —dbpath /data/configsecond1 —logpath /data/configsecond1/mongod.log —port 37011 —fork —configsvr
mongod —bind_ip 0.0.0.0 —replSet config —dbpath /data/configsecond2 —logpath /data/configsecond2/mongod.log —port 37012 —fork —configsvr
4. 配置复制集进行初始化
rs.initiate(
{_id:"config",
"members":[
{"_id":0,"host":"192.168.109.200:37010"},
{"_id":1,"host":"192.168.109.200:37011"},
{"_id":2,"host":"192.168.109.200:37012"}
]
});
配置mongs 路由节点
1. 启动mongos 实例,需要指定配置服务器的地址列表
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 本地直连
执行脚本
sh.addShard(“shard1/111.229.189.98:27010,111.229.189.98:27011,111.229.189.98:27012”);
查看分片状态:
sh.status();
mongos 可以用同样的方式,创建多个
创建分片表:
1. MongoDB的分片时基于集合的,就算有分片集群不等于数据会自动分片,需要显示分片表
首先需要 启用数据库分片
sh.enableSharding(“库名”);
如:
sh.enableSharding(“order”);
sh.shardCollection(“库名.集合名”,{_id: “hashed”});
sh.shardCollection(“order.account”,{_id: “hashed”});
添加一组数据
for( var i =0;i<100; i++){
db.productdesc.insert({i:i});
}
动态扩容
创建第二个复制集来实现分片
mongod —bind_ip 0.0.0.0 —replSet shard2 —dbpath /data/shard2 —logpath /data/shard2/mongod.log —port 27013 —fork —shardsvr
mongod —bind_ip 0.0.0.0 —replSet shard2 —dbpath /data/shard2second1 —logpath /data/shard2second1/mongod.log —port 27014 —fork —shardsvr
mongod —bind_ip 0.0.0.0 —replSet shard2 —dbpath /data/shard2second2 —logpath /data/shard2second2/mongod.log —port 27015 —fork —shardsvr
初始化复制集
rs.initiate(
{_id:"shard2",
"members":[
{"_id":0,"host":"111.229.189.98:27013"},
{"_id":1,"host":"111.229.189.98:27014"},
{"_id":2,"host":"111.229.189.98:27015"}
]
});
加入到集群分片
mongo --port 4000
sh.addShard("shard2/111.229.189.98:27013,111.229.189.98:27014,111.229.189.98:27015");