组件学习

Redis集群和高可用

2019-02-09  本文已影响61人  黄靠谱

概述

Redis集群方案历史上有3个版本:Sentinel版本、Sentinel+Proxy版本,Cluster版本

  1. Sentinel版本:一主N从,由Sentinel做监控和主从切换
  2. Sentinel+Proxy版本:N主M从,Proxy负责做分片计算
  3. Cluster的方案(Redis 3.0以后开始支持),Cluster比较牛逼,Proxy(key映射分片)和Sentinel(主从切换)的功能都自己做了

Sentinel模型

image

如图所示,有一个虚拟IP (VIP),Sentinel会指定一个Node为Master,并且让VIP指向该Node,从而实现主从切换
Sentinel的作用有三个:

  1. 监控:Sentinel 会不断的检查主服务器和从服务器是否正常运行。
  2. 通知:当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
  3. 自动故障转移:当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点,并且将其他的从节点指向新的主节点。

缺陷:

  1. 主从切换的过程中会丢数据(因为Master 和Slave的数据不能100%同步)
  2. Redis只能单点写,不能水平扩容,集群中只能有一个master

Cluster特性(Redis 3.0以上版本支持)

  1. 1个集群支持多Master(分片),每个Master支持多Slave,Cluster自己负责主从切换
  2. Cluster支持一定的容错性,只要过半Master工作,整个Redis集群就可用
  3. 根据公式HASH_SLOT=CRC16(key) mod 16384 计算出Slot,再计算出映射到哪个分片上,然后Redis会去相应的节点进行操作
  4. 可以通过hashTag,让某几个key保存在同一个slot上,因为做Slot分配的时候,只计算 {keyHead}KeyTail 括号里面的keyHead,比如 {foo}Lion ,{foo}dear,只有在一个Node上,才能确保事务
  5. 客户端与Redis节点直连,不需要中间Proxy层,直接连接任意一个Master节点
  6. Cluster支持热扩展,从集群中新增或者删除一个分片,不需要重启,会自动重新分配Slot到对应的分片上

集群的原理

弱一致性

  1. 不保证强一致性:默认主从复制是异步执行的
    A结点写成功后直接返回客户端OK,再通知各个Slave一起同步,如果A确认了客户端的写操作,然后A挂了,那么A1结点成为Master,但是丢失了新的内容
  2. Cluster通过引入node timeout,来解决网络分区的不一致问题,如果一个集群感知一个Node timeout了,会从集群中剔除这个节点,那么这个节点就不会再分配到新的请求。另外,如果一个Node在timeout的时间无法与过半的Master通讯,自己也进入error状态,停止对正在当前的Client服务,拒绝写的请求

Cluster和Sentinel的区别

参考文档

sentinel集群的配置
https://www.cnblogs.com/LiZhiW/p/4851631.html

官网的配置集群的文档说明
https://redis.io/topics/cluster-tutorial

中文版的集群配置说明
https://www.cnblogs.com/cjsblog/p/9048545.html

孤独烟大佬的博客讲集群的
https://mp.weixin.qq.com/s/8H-Hd169s5Hlwn5F2ec25A

上一篇 下一篇

猜你喜欢

热点阅读