MongoDB分片集群

648 阅读3分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

分片集群架构

服务器1服务器2服务器3
Primary1 (第一套副本集)Second1Second1
Primary2(第二套副本集)Second2Second2
Config1 (配置节点)Config1Config1
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把这条直线划分为更短的不

重叠的片段,并称之为 数据块 ,每个数据块包含了片键在一定范围内的数据.

在使用片键做范围划分的系统中,拥有”相近”片键的文档很可能存储在同一个数据块中,因此也会存储在同