这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
分片集群架构
| 服务器1 | 服务器2 | 服务器3 |
|---|---|---|
| Primary1 (第一套副本集) | Second1 | Second1 |
| Primary2(第二套副本集) | Second2 | Second2 |
| Config1 (配置节点) | Config1 | Config1 |
| Mongs (路由节点) |
前置条件
27010:第一个副本集 shard1
27012:第二套副本集 shard2
27012:配置节点 config
27017:路由节点 mongos
配置分片
启动副本集流程:
3台虚拟机分别执行(启动副本集节点)
mongod --auth --bind_ip 0.0.0.0 --keyFile /root/app/data/keyfile/keyfile --replSet shard1 --dbpath /root/app/data/shard1 --logpath /root/app/data/shard1/mongod.log --port 27010 --fork --shardsvr --wiredTigerCacheSizeGB 1
//初始化副本 (由3个独立节点合成一个副本集命令)
rs.initiate({_id:"shard1","members":[{"_id":0,"host":"172.16.77.10:27010"},{"_id":1,"host":"172.16.77.11:27010"},{"_id":2,"host":"172.16.77.12:27010"}]});
可以看到 3个节点分别在3台服务器上 77.11 /77.10 /77.12 这将拥有如下特色
- 副本集拥有即时同步数据的能力,数据会同步到3台服务器
- 从节点挂掉无影响,主节点挂掉一个心跳会选出新的主节点,当只剩一个节点工作则无法完成选举,从而没有主节点,但是会保留数据
- 还有一个非技术向问题就是,多服务部署,会方便记录启动信息 例如目前3台服务器每个都启动 27010,27011,27012 第一台服务器启动27017 ,一共10个节点。如果部署单台则情况是:27010—27019,不易维护
创建/启动 config
mongod --bind_ip 0.0.0.0 --replSet config --dbpath /root/app/data/config --logpath /root/app/data/config/mongod.log --port 27011 --fork --configsvr --wiredTigerCacheSizeGB 1
//添加配置
rs.initiate({_id:"config","members":[{"_id":0,"host":"172.16.77.10:27011"},{"_id":1,"host":"172.16.77.11:27011"},{"_id":2,"host":"172.16.77.12:27011"}]})
//config server
mongo --host 172.16.77.10:27011
链接mongos
mongos --bind_ip 0.0.0.0 --logpath /root/app/data/mongos/mongos.log --port 27017 --fork --configdb config/172.16.77.10:27011,172.16.77.11:27011,172.16.77.12:27011
#连接到mongos
mongo --host 172.16.77.10:27017
#添加分片
sh.addShard("shard1/172.16.77.10:27010,172.16.77.11:27010,172.16.77.12:27010");
添加分片成功后,springboot直连
spring:
data:
mongodb:
uri: mongodb://172.16.77.10:27017/foo
拓展复制集 shrard2
mongod --bind_ip 0.0.0.0 --replSet shard2 --dbpath /root/app/data/shard2 --logpath /root/app/data/shard2/mongod.log --port 27012 --fork --shardsvr --wiredTigerCacheSizeGB 1
初始化最新的副本集
mongo --host 172.16.77.10:27012
rs.initiate({_id:"shard2","members":[{"_id":0,"host":"172.16.77.10:27012"},{"_id":1,"host":"172.16.77.11:27012"},{"_id":2,"host":"172.16.77.12:27012"}]});
增加第二个分片
mongo --host 172.16.77.10:27017sh.addShard("shard2/172.16.77.10:27012,172.16.77.11:27012,172.16.77.12:27012");
指定策略
添加成功之后,可以指定分片键
sh.shardCollection(namespace, key, unique)
哈希策略
对于 基于哈希的分片 ,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块.
在使用基于哈希分片的系统中,拥有”相近”片键的文档 很可能不会 存储在同一个数据块中,因此数据的分
离性更好一些.
范围策略
对于 基于范围的分片 ,MongoDB按照片键的范围把数据分成不同部分.假设有一个数字的片键:想象一个
从负无穷到正无穷的直线,每一个片键的值都在直线上画了一个点.MongoDB把这条直线划分为更短的不
重叠的片段,并称之为 数据块 ,每个数据块包含了片键在一定范围内的数据.
在使用片键做范围划分的系统中,拥有”相近”片键的文档很可能存储在同一个数据块中,因此也会存储在同