博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019/08/15 数据库分片的概念及mongodb sharding的实现(04)~1
阅读量:3925 次
发布时间:2019-05-23

本文共 5005 字,大约阅读时间需要 16 分钟。

在这里插入图片描述

对于副本集核心的两个工具,oplog,heatbeat
副本集至少需要三个节点,其中一个节点纯粹做仲裁

现在尝试用三个节点部署副本集,node1,2,3 ,172.。7、8、9

先把刚才的mongodb服务停掉在这里插入图片描述在这里插入图片描述

副本集名字至关重要,决定每个节点加入到到底哪个副本集
在这里插入图片描述
**有多个mongodb节点,副本集可能不止一个,所以区别是哪个副本集的只有replset,类似集群名称 **在这里插入图片描述
副本集的索引预取,none 不取任何索引,id only(每个collection默认就有id字段,id是作为collection中的主键的,这是由mongodb自行维护的),只取id,定义也没关系,只在从节点有效
all
在这里插入图片描述在这里插入图片描述
加上replset就代表要加入副本集,启动会加oplog
在这里插入图片描述
重启,进入mongod的shell接口,现在还不知道谁是主节点,没做初始化在这里插入图片描述
先把文件复制到其他两个节点上在这里插入图片描述
在其他节点上先安装包在这里插入图片描述在这里插入图片描述创建数据目录在这里插入图片描述在这里插入图片描述
把主机的配置文件复制到其他节点上在这里插入图片描述
直接启动服务在这里插入图片描述在这里插入图片描述
创建副本集以后,相关命令是rs开头在这里插入图片描述在这里插入图片描述
获取副本集当前状态信息在这里插入图片描述
把当前副本做初始化在这里插入图片描述
指定的配置文件对当前副本做初始化在这里插入图片描述
获取当前rs的配置信息,null表示我们没有做初始化在这里插入图片描述
提示你需要做初始化在这里插入图片描述
使用initiate做初始化在这里插入图片描述
members是显示所有副本集的成员信息,是一个列表,列表里有文档描述相关节点的状态
id节点的标识符,name对应节点名称,health健康状态,statstr状态字串,primary主节点,second从节点
uptime运行时长,optime最近一次oplog操作的时间戳,electiontime 选举时间,electiondatae 选举日期,self,是否是当前节点

添加节点进来,可以指定主机或者object,可以给一大串stat信息也可以给个地址

在这里插入图片描述
添加主机只需要指定ip+端口
在这里插入图片描述在这里插入图片描述
starkup 2表示去追赶主节点了
在这里插入图片描述
追赶成功了就显示secondary在这里插入图片描述
到node2上看看,testdb就有了在这里插入图片描述
不是主节点,也没有slave=ok不让查询,从节点默认不让查
运行下面选项即可
在这里插入图片描述在这里插入图片描述在这里插入图片描述
主节点有了,用ping的方式传送心跳信息,1s
在这里插入图片描述
查看node2节点是否是主节点,第二节点实现了slave ok了,就可以使用查询在这里插入图片描述
获取第一个数据在这里插入图片描述
加入第三个节点在这里插入图片描述在这里插入图片描述
已经成为secondary在这里插入图片描述
试试查询在这里插入图片描述
conf显示配置信息,version随着你的改变会增加,写操作不能在从节点上执行在这里插入图片描述
在主节点上生成一个新的数据库试试在这里插入图片描述
在从节点查询试试在这里插入图片描述
在从节点上是不允许插入的在这里插入图片描述
conf显示当前配置信息
members列表
在这里插入图片描述https://docs.mongodb.com/manual/reference/replica-configuration/{
_id: ,
version: ,
protocolVersion: ,
writeConcernMajorityJournalDefault: ,
configsvr: ,
members: [
{
_id: ,
host: ,
arbiterOnly: , 当前是否是仲裁节点
buildIndexes: , 是否去构建索引
hidden: ,是不是一个隐藏节点
priority: , 被选举的优先级
tags: , 当前文档标识
slaveDelay: , 延迟复制的从节点
votes:
},
],
settings: {
chainingAllowed : , 是否做链接式轮循
heartbeatIntervalMillis : ,
heartbeatTimeoutSecs: ,获取心跳信息的超时时间
electionTimeoutMillis : ,
catchUpTimeoutMillis : ,
getLastErrorModes : ,获取最近一次错误信息的方式
getLastErrorDefaults : , 获取最新一次的错误信息
replicaSetId:
}
}
在这里插入图片描述
就是保存在local.system,replset下的id在这里插入图片描述
members有很多属性
n.host设定它的主机名
在这里插入图片描述
设定是否是仲裁节点的在这里插入图片描述
支持链式复制的。一个从节点可以指向另外的从节点在这里插入图片描述
一般副本集replicaset将会使用写操作,得到最后的错误状态信息,一般使用默认在这里插入图片描述
偶尔进行手动设定在这里插入图片描述

现在把主节点宕机,从节点找不到主的,10s会找出新的主在这里插入图片描述

让自己临时链接不上去在这里插入图片描述在这里插入图片描述
现在第二个从是主的
在这里插入图片描述
选举新的主节点考虑的因素有很多,包括优先级,以及oplog大小,
保存范围是140s
在这里插入图片描述
第一个事件产生时间,最后的产生时间
now 当前时间
在这里插入图片描述
从节点的时间应该跟主节点一致在这里插入图片描述
副本集支持失效转移,默认每隔两S给其他节点发送心跳信息,通告自己处于健康状态
health=1表示健康
在这里插入图片描述在这里插入图片描述
随便找个节点下线,其他节点10s没有收到心跳信息在这里插入图片描述
状态为0在这里插入图片描述
再次启动在这里插入图片描述
应该health为1

影响选举的条件:

心跳信息
优先级(优先级一样就看其他条件,0没有被选举权,一个节点优先级过高,也可以触发选举重新上台)
optime(某成员节点,最近一次应用于本地oplog,条目的时间戳,比其他节点慢的不可能成为主的,因为成为主的其他节点等于多数据了)成为主节点的optime一定是最新的
网络链接(一旦发生分区以后,拥有票数多,超过法定票数一半的的一方,继续使用副本集的一方,票数多的重新选取主节点)
网络分区,主节点离线,副节点分为多个网络部分,任何部分需要通过法定票数来选主节点和网路链接概念相同

选举机制:(能够触发选举的条件)

新副本集初始化时
从节点联系不到主节点时
主节点"下台"时
(主节点下台,会关闭副本集写请求,保证数据一致)
主节点收到stepdown()命令时,下台
某从节点有更高的优先级且已经满足成主节点其他所有条件
主节点无法联系导副本集的"多数方"
在这里插入图片描述在这里插入图片描述
如果1的节点计算机性能较好,期望它优先成为主节点
现在把2的节点优先级变高
设置个cfg变量先保存当前配置
在这里插入图片描述
通过cfg来设置在这里插入图片描述
需要生效,重新配置,读取刚才的配置,提示你的操作必须在主节点在这里插入图片描述在这里插入图片描述
已经改变 了在这里插入图片描述想让第三个节点成为仲裁节点在这里插入图片描述
直接被加进来就是仲裁节点
或者修改为仲裁节点
在这里插入图片描述在这里插入图片描述
现在把第三个节点设定为仅仲裁的节点在这里插入图片描述
应该是节点已经复制导数据,不允许这么做在这里插入图片描述
只能先移除这个节点
在这里插入图片描述
这个方法可以查看每个从节点是否落后于主节点在这里插入图片描述
在指定时间范围内,不允许一个节点选举成为主的,冻结在这里插入图片描述

mongodb的分片功能

(单个节点IO出现瓶颈,CPU,Memory,IO)把数据放在多个节点来实现,把数据切块每个放一部分数据
mysql也支持分片的:(Gizzard,HiveDB,my sql proxy+HSACLE,Hibernate,Shard,Pyshards,需要借助外部工具实现)
sharding,mongodb自动实现分片
在这里插入图片描述
分片架构在这里插入图片描述
有三个组件,router(相当于框架,mongos,2个是为了做冗余的)用户请求都到mongos,把用户请求路由到合适的分片上来执行,

分片中的架构角色有三个,

mongos:router
config server 元数据服务器,存储集群元数据的
shard 各分片节点,mongod节点 ,也称mongod实例,负责将用户请求的数据或响应给客户端的

mogilfs的客户端是自己联系各存储节点的,先去找trunk,trunk告诉它哪个节点有,客户端再去找节点

每个shard就是个复制集,每个shard至少有三个节点,config server也需要三个节点(不然挂了,整个集群挂了)

要借助zookeeper,能实现选举机制,并决定最终谁是主节点的,通常用来分布式节点的协调,zookeeper可以自行内部构成三个节点自动选举的
router 要高可用,可以用keepalived
在这里插入图片描述
shard主要目的就是让数据分散在多个shard上的,较大的数据即切割成片,一个collection会被切割成大小固定的块,类似raid,可以按照64M块来分一个个节点上,config server按照索引来分配数据,比如0-20的放1,20-40的放2.如果0-20的人过多,第一个节点存储的块就多,就缩减索引,比如1节点改成0-15的,2 节点改成15-30的。所以每一次数据均衡可能全局都要动的
(mysql的分片框架也是在某个表上以某个字段为例,在这个索引当作分片的元数据,而后大数据切割成trunk,把trunk平均分配到其他节点上去)

config server是放的元数据,但是不能对所有的数据字段进行索引,所以构建索引的时候,只是对有限的几个字段做索引,真正分片的时候就是根据你的索引来分片,索引判断告诉config server有几个shard节点,索引尝试把索引每个数据开始做平均分隔,平均完以后,做shard ABCD,分隔以后,把原始数据分隔成trunk,而后存储到shard节点,

索引有索引类型,不太的索引类型,分法是不一样的

BTREE是一种排序索引,是一个连续的区间
根据业务模型选择(一个方针,分片以后,写要离散,读集中)
基于范围进行分片:
range
基于列表切片
list列表,离散值(省份)
基于hash切片
hash
在这里插入图片描述在这里插入图片描述
hash值来切片,按照键给所有分片取模,分散存放,为了避免写热区,离散就比较有用,把id号进行hash计算对取模
计算以后落在分片,有效的把热点数据分散了
在这里插入图片描述
通过搜索引擎把mongodb中的所有数据读出来,再根据搜索引擎重新去构建索引,由搜索引擎来进行搜索在这里插入图片描述
对于的索引叫切片键,常用的方式就三种,hash,列表,范围,对mysql还是mongodb都是适用的,要根据业务模型,尽可能做到读集中,不要只针对一个索引做切片,做了第一个可以考虑第二个在这里插入图片描述
生产中,mongos只用两个节点就够了,config server有三个节点,每个shard应该是副本集有三个节点
先把节点停了在这里插入图片描述在这里插入图片描述在这里插入图片描述
现在把每个节点上的数据都清理掉在这里插入图片描述在这里插入图片描述在这里插入图片描述
任何做集群,节点之间的时间必须同步,再启动一个节点node4,把安装包复制给node4在这里插入图片描述在这里插入图片描述在这里插入图片描述
先去配置config server在这里插入图片描述在这里插入图片描述
dbpath还要存放元数据
configsvr=true
在这里插入图片描述
把原来的目录安装,端口应该监听再27017上在这里插入图片描述
如果端口部是27019采取下面操作在这里插入图片描述在这里插入图片描述
安装mongos程序在这里插入图片描述
只需要告诉config服务器在哪里,可以是逗号隔开的三个configserver在这里插入图片描述在这里插入图片描述在这里插入图片描述
mongos监听在27017上在这里插入图片描述
现在可以连接到mongos上在这里插入图片描述在这里插入图片描述
查看当前shard信息在这里插入图片描述
把两个shard节点加进来即可在这里插入图片描述
没有副本,把副本集去掉在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
先添加第一个shard,端口默认的是不用指明,修改需要指明在这里插入图片描述在这里插入图片描述
启用在某个db上
shard需要指明对哪个collection做切割,一个库并非所有表都需要做shard,指明对哪个collection做shard

做shard就需要先配置shard,然后启动shard(enablesharding),然后指明对哪个数据库做shard,再指明对哪个collection做shard,基于哪个索引shard

需要先创建好做切片键的索引
在这里插入图片描述
把另外的节点添加上去在这里插入图片描述再testdb上 启动shard功能,status会显示你的testdb已经支持shard
databases表示支持的shard功能的数据库有哪些
在这里插入图片描述
主shard是谁,
在这里插入图片描述
一旦在数据库启用shard功能以后,一个库内并非所有的collection都需要分片的,不做分片的collection都在0001上,做了分片的可能在0001和0000分散存放

基于年龄做分片,基于范围做分片

指明哪个collection做分片
在这里插入图片描述
必须指明数据库在这里插入图片描述
最大值1最小值1都在shard00001上在这里插入图片描述
添加一些数据看看在这里插入图片描述
找个地方查询是否有数据在这里插入图片描述
0000有一个trunk,00001有2个,每个trunk默认64M在这里插入图片描述
现在就有点不均衡在这里插入图片描述
可以手动移动trunk到哪里去
在这里插入图片描述
现在就均衡了
在这里插入图片描述
列出所有的shard在这里插入图片描述
等于sh.status()
在这里插入图片描述
均衡器此时没有工作,需要做均衡时才启动在这里插入图片描述
查看balance状态
在这里插入图片描述
是否让balance自动均衡在这里插入图片描述
对整个影响不大的情况下,是可以把均衡关掉的

转载地址:http://bjkgn.baihongyu.com/

你可能感兴趣的文章
生态和能力是国内自研操作系统发展的关键
查看>>
银河麒麟V10入选2020中国十大科技新闻
查看>>
Amazing 2020
查看>>
代码改变世界,也改变了我
查看>>
2021,未来可期
查看>>
阿星Plus:基于abp vNext开源一个博客网站
查看>>
写给自己,2020的年终总结
查看>>
Flash 生命终止,HTML5能否完美替代?
查看>>
ML.NET生成器带来了许多错误修复和增强功能以及新功能
查看>>
微信适配国产操作系统:原生支持 Linux
查看>>
我的2020年终总结:新的角色,新的开始
查看>>
C# 9 新特性 —— 增强的模式匹配
查看>>
ASP.NET Core Controller与IOC的羁绊
查看>>
如何实现 ASP.NET Core WebApi 的版本化
查看>>
探索 .Net Core 的 SourceLink
查看>>
AgileConfig-如何使用AgileConfig.Client读取配置
查看>>
【gRPC】 在.Net core中使用gRPC
查看>>
整合.NET WebAPI和 Vuejs——在.NET单体应用中使用 Vuejs 和 ElementUI
查看>>
“既然计划没有变化快,那制订计划还有个卵用啊!”
查看>>
C#实现网页加载后将页面截取成长图片
查看>>