本文来自我的微信公众号 哪儿来的moon 知乎排版稀碎啊。。。。。。
--------------------------------------------------------------------------------------------
本文约:2000字 预计阅读时间:5分钟
1 前言
现在已经到了国庆的末尾了,大家这个国庆过的怎么样?是否已经顺利地从家中返航?
当你看到这篇文章的时候,就知道moon要来提醒你学习了!多看看自己的钱包 ,是不是感觉学习的动力满满呢?
趁着你们玩的这几天,moon又将这篇redis cluster集群的文章肝了出来,是不是很感动呢,来吧,学起~
2 正文
cluster集群模式简介
在redis3.0版本中支持了cluster集群部署的方式,这种集群部署的方式能自动将数据进行分片,每个master上放一部分数据,提供了内置的高可用服务,即使某个master挂了,服务还可以正常地提供,我们先来看张图:
上图就是一个最简单的
cluster集群的架构图
使用cluster集群模式,只需要将每个数据库节点的cluster-enabled配置选项打开即可,但是每个cluster集群至少要保证有3个主数据库才能正常运行。
cluster集群模式是怎么存放数据的?
一个cluster集群中总共有16384个节点,集群会将这16384个节点平均分配给每个节点,当然,我这里的节点指的是每个主节点,就如同下图:
我们先聊聊键是如何和16384个插槽做关联的:
redis将每个redis的键的键名有效部分使用CRC16算法计算出散列值,然后与16384取余数,这样的就可以使每个键能够尽量的均匀分布在16384个插槽中。
我们再来说说插槽是如何和节点做关联的:
①插槽之前没有被分配过,现在想分配给指定节点
②插槽之前被分配过,现在想移动指定节点
第一种情况可以通过cluster add slot s 命令来实现
第二种情况的原理相对麻烦一点,但是redis也提供的便捷的方式去操作,我们可以使用redis-trib.rb去实现
如何获取与插槽对应的节点
当客户端向redis集群中的任意一个节点发送命令后,该节点都会判断当前键的信息是否存在于当前节点:
如果存在,那么就会像单机的reids一样执行命令。
如果不存在,就会返回一个move重定向请求,告诉客户端负责该数据的节点是哪一个,然后客户端会向该节点发送命令再次请求获取数据
新节点的加入
需要通过cluster meet命令来实现:
cluster meet ip port
ip port 是我们已运行的redis集群中任意一个节点的地址和端口号,新节点在客户端输入命令后,会与命令中的节点进行握手,握手后,命令中的集群节点会将这个新节点的信息分享给集群中的每一个节点。
故障恢复
判断故障的逻辑其实与哨兵模式有点类似,在集群中,每个节点都会定期的向其他节点发送ping命令,通过有没有收到回复来判断其他节点是否已经下线。
如果长时间没有回复,那么发起ping命令的节点就会认为目标节点疑似下线,也可以和哨兵一样称作主观下线,当然也需要集群中一定数量的节点都认为该节点下线才可以,我们来说说具体过程:
①当A节点发现目标节点疑似下线,就会向集群中的其他节点散播消息,其他节点就会向目标节点发送命令,判断目标节点是否下线 ②如果集群中半数以上的节点都认为目标节点下线,就会对目标节点标记为下线,从而告诉其他节点,让目标节点在整个集群中都下线
之后当B已经下线,那么B的slave就会开始选举,选择是哪个slave升级为master,继续提供服务,这个过程和哨兵的过程基本相同,这里就不在赘述的,不知道的小伙伴可以传送学完redis的三种集群部署后,工资又涨了1000!!<2.哨兵模式>
如何提高redis的读写能力
这个问题也是我们之前抛出来的问题,我们放一张图大家就会很容易明白了:
提高写能力只需要横向扩容我们的master节点
提高读能力只需要横向扩容slave就好了
3 结语
在国庆的尾巴和大家聊完了redis部署方式的最终篇-cluster部署,也解决了之前我们留下的问题
下一篇文章我会和大家聊聊redis的事务和mysql的事务到底有什么不一样
我们下期见,记得点赞哦~~
往期回顾
●<redis>学完redis的三种集群部署后,工资又涨了1000!!<2.哨兵模式>
●<redis>学完redis的三种集群部署后,工资又涨了1000!!<1.主从复制>
●<设计模式>内存屏障?cpu级别的优化,你真的懂单例了吗???
●<redis>现在居然还有不知道持久化的......出门右拐不送!!!!