一、redis集群方案比较

主从哨兵模式
redis3.0之前的版本实现集群一般采用的方案是借助哨兵sentinel工具来监控master节点的状态,如果master主节点异常,则会做主从切换,将一台slave机器作为master。哨兵的配置稍微复杂,并且性能和高可用方面表现一般,主从切换瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外服务,没办法支持很高的并发。并且这单个主节点内存不宜设置过大,否则会导致持久化文件过大,影响数据恢复和主从同步。

高可用集群模式
redis集群是一个由多个主从节点群组成的分布式服务器群,具有复制、高可用、分片等特性。Redis集群不需要哨兵也能完成主从切换和故障转移。redis集群具有水平扩展的特性。redis集群的性能和高可用性优于哨兵模式,而且配置相对简单。

二、Redis高可用集群搭建

redis集群至少需要3个master节点,搭建3个master节点,并且每个主节点配置一个从节点,这样就有6个redis实例。搭建步骤如下:

1. 在每台服务器的/usr/local下创建文件夹redis-cluster用于存放集群配置文件(1)mkdir -p /usr/local/redis-cluster(2)mkdir 8081 8082 8083 8084 8085 80862. 把redis.conf复制到上面的文件夹中并修改一下内容(1) daemonize yes(2)port 8081(端口号分别设置)(3)pidfile /var/run/redis_8081.pid # 把pid进程号写入pidfile配置的文件(4)dir /usr/local/redis‐cluster/8081/(指定数据文件存放位置,必须要指定不同的目录位置,不然会
丢失数据)(5)cluster‐enabled yes(启动集群模式)(6)cluster‐config‐file nodes‐8081.conf(集群节点信息文件,这里808x最好和port对应上)(7)cluster‐node‐timeout 10000(8)# bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通
过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)(9)protected‐mode no (关闭保护模式)(10)appendonly yes(11)如果要设置密码需要增加如下配置:requirepass xxxxx(设置redis访问密码)masterauth xxxxx(设置集群节点间访问密码,跟上面一致)3. 分别启动6个redis实例,并验证是否启动成功(1)/usr/local/redis‐5.0.3/src/redis‐server /usr/local/redis‐cluster/808*/redis.conf(2)ps ‐ef | grep redis 查看是否启动成功4. 用redis‐cli创建整个redis集群# 执行这条命令需要确认三台机器之间的redis实例要能相互访问,可以先简单把所有机器防火墙关掉,如果不
关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W)# 关闭防火墙# systemctl stop firewalld # 临时关闭防火墙# systemctl disable firewalld # 禁止开机启动(1)/usr/local/redis-5.0.3/src/redis-cli -a password --cluster create --cluster-replicas 192.168.10.10:8081 192.168.10.10:8082 192.168.10.10:8083 192.168.10.10:8084 192.168.10.10:8085 192.168.10.10:80865. 验证集群(1)连接任意一个客户端 ./redis-cli -c -h -p (-a访问服务端密码 -c表示集群模式,指定ip和端口号)如:/usr/local/redis‐5.0.3/src/redis‐cli ‐a password ‐c ‐h 192.168.10.10 ‐p 808*(2)进行验证 命令:cluster info(查看集群信息),cluster node(查看节点信息)(3)数据操作验证(4)关闭集群需要逐个关闭redis客户端

三、集群原理分析

Redis Cluster将所有数据划分为16384个槽位(slots),每个节点负责其中一部分槽位,槽位对应的数据存放在对应的节点中。
槽位定位算法
类一致性hash算法
Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。
redis cluster节点之间的通信机制
redis cluster之间采用gossip协议进行通信,维护集群的数据信息(集群节点信息,主从角色,节点数量,节点槽位等)
判断节点故障超时时长
当经常发生网络波动,导致节点暂时不可连接,但很快又恢复正常,如果没有设置这个故障超时时长,会导致主从频繁切换。需要在配置文件中配置 cluster-­node­-timeout ,当某个节点持续断连时长超过这个设置值时,系统才会判定节点故障,再进行主从切换
redis集群选举原理
当slave发现master出现故障时,便需要广播选举信息,期待成为新的master节点。

  1. slave发现master变为FAIL
  2. 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息
  3. 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
  4. 尝试failover的slave收集master返回的FAILOVER_AUTH_ACK
  5. slave收到超过半数master的ack后变成新Master
  6. slave广播Pong消息通知其他集群节点
    其他master主节点选举时,采取先到先选,也就是收到需要选举的从节点广播的信息,只响应第一个收到的;如果两个从节点收到的票数一样,则进行下一轮选举,并且为了避免这种情况的发生,redis采取了延时计算。

四、其他问题

  1. 集群脑裂问题
    脑裂问题:如果现在主节点1由于网络波动被从节点认定为Fail,从节点选举产生新的主节点2,但实际上主节点1还是可以进行数据存放,这时候就产生了两个主节点;在网络分区恢复后,其中一个主节点会变为从节点,从而在通信未恢复的时间里对主节点存放的数据,将会丢失。
    过半机制:min‐replicas‐to‐write 1
    //写数据成功最少同步的slave数量,这个数量可以模仿大于半数机制配置,比如集群总共三个节点可以配置1,加上leader就是2,超过了半数
    加上这个配置,存放数据时需要至少min‐replicas‐to‐write 1个slave同步成功才是数据存放成功。这个配置会影响集群的可用性。

  2. 集群是否完整才能对外提供服务?
    当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用,如果为yes则集群不可用。

  3. Redis集群为什么至少需要3个节点,并且master节点数推荐为奇数个?
    至少需要3个节点是因为主从切换过程中,选举时至少需要过半数的master支持才能选举出新的master节点。推荐奇数个节点是为了节省机器资源,比如:4个节点,此时最多只能挂1个节点,挂2个节点的话无法进行选举;3个节点时,也只允许挂1个节点。所以奇数个master节点数主要是从节省机器资源的角度出发。

redis高可用集群相关推荐

  1. 【❤️万字长文总结❤️】一篇学会Redis高可用✔集群✔搭建详细教程

    大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点:今天总结一下Redis集群高可用的搭建流程 [惊喜推荐+优质资源 ...

  2. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  3. docker搭建redis高可用集群

    目标:docker搭建redis高可用集群 1.架构:六个redis容器,三主三从,主从复制,主机宕机从机自动替代 2.网络架构设计:设计一个专属redis的docker网络 docker netwo ...

  4. 部署Redis高可用集群

    目录 部署Redis高可用集群 Redis集群环境 拓扑结构 IP地址 环境准备 工作原理 创建Redis集群 部署管理主机 redis-trib.rb脚本 redis服务器开启集群功能 管理主机创建 ...

  5. redis 04:Redis高可用集群

    文章目录 一.Redis集群方案比较 二.Redis高可用集群搭建 三.Java操作redis集群 四.Redis集群原理分析 五.集群伸缩 5.1 集群扩展 5.1 缩容集群 六.总结 以下参考了图 ...

  6. 采用 redis主从 + 哨兵(sentinel) + vip漂移搭建一套redis高可用集群

    一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...

  7. redis高可用集群搭建

    上篇博客记录了哨兵模式的集群搭建,今天搭建高可用的redis集群以及两种集群架构的对比. 搭建集群(参考redis官方文档) 1.在redis目录中创建cluster目录,cluster下分别创建存放 ...

  8. 基于 Docker 的 Redis 高可用集群搭建(redis-sentinel)

    前言   之前介绍了用docker来搭建redis主从环境,但这只是对数据添加了从库备份(主从复制),当主库down掉的时候,从库是不会自动升级为主库的,也就是说,该redis主从集群并非是高可用的. ...

  9. Redis高可用集群部署和集群扩展

    文章目录 一.前言 二.集群配置 2.1 说明 2.2 配置 2.3 启动redis 2.4 集群操作 2.5 验证集群 2.5.1 springboot配置文件 2.5.2 代码测试 2.5.3 集 ...

最新文章

  1. 安利 10 个 Intellij IDEA 实用插件
  2. udhcp server端源码分析1--文件组织结构
  3. 通过Kubernetes安全高效管理边缘节点,ACK@Edge年度重磅发布
  4. JavaEE的13种核心技术
  5. 无向图缩点:tarjan点双与边双缩点(模板)
  6. Selenium对多浏览器的支持
  7. PHP的time函数返回时间不正确
  8. OpenCV-Python入门教程7-PyQt编写GUI界面
  9. WGestures鼠标手势快捷手势介绍
  10. java集合了类面试题_一些集合类面试题,说不定你就会遇到
  11. AsyncResult使用场景
  12. 智能优化算法——布谷鸟搜索算法原理(附代码)
  13. CLRC66301国产替代,国产首颗全协议NFC芯片,可兼容A卡,B卡,F卡,15693卡,KK量级出货。
  14. Markdown文档编写规则:标题
  15. 分组统计之facet
  16. SpringBoot系列之对Excel报表的校验提示
  17. GitHub 上值得收藏的 100 个精选前端项目!
  18. CDN是什么?CDN的作用
  19. 探索 SwiftUI 基本手势
  20. SRM 475 DIV1 900

热门文章

  1. html特效 wpf,利用WPF实现一个简单的文字粒子闪烁动画特效
  2. @所有面试者!重要问题:HR问我的职业规划,我应该暴露自己野心吗?
  3. HTML标签属性大全(开发人员必备)
  4. 利用mysql实现分页
  5. hdu 3591 多重背包+完全背包练习题
  6. linux用命令强制关闭进程,Linux如何使用kill命令强制终止进程
  7. php 定义变量为什么前面加一个美元($)符号呢
  8. java web html 的th是什么意思呢?
  9. python迷你停车管理系统_停车管理系统课程设计
  10. 铜板街“行稳致远”的背后逻辑 | 一点财经