Redis高可用
高可用HA(High Availability)是系统架构中必须考虑的因素之一,是指通过各种架构设计方式和方法提高系统的可用性(减少系统不能提供服务的时间)。
为了避免系统单点故障,一般都是通过部署多台机器来提供服务实现系统的高可用
Redis高可用的三种模式:主从模式、哨兵模式、集群模式
主从模式
redis提供了Redis提供了复制(replication)功能,当一台redis数据库中的数据发生了变化,这个变化会被自动的同步到其他的redis机器上去。
redis使用多节点部署时,这些节点会被分成两类,一类是主节点(master节点),一类是从节点(slave节点)。一般主节点可以进行读、写操作,而从节点只能进行读操作(读写分离)。同时由于主节点可以写,数据会发生变化,当主节点的数据发生变化时,会将变化的数据同步给从节点,这样从节点的数据就可以和主节点的数据保持一致了。一个主节点可以有多个从节点,但是一个从节点会只会有一个主节点,也就是所谓的一主多从结构。
优点:
- 支持主从复制,可以读写分离
- slave节可以接受其他slave节点的连接和同步请求,分担master节点的同步压力
- master节点以非阻塞方式为slave节点提供同步服务,同步期间不影响客户端请求
缺点:
- 主从节点数据一样,资源占用较多
- 不具备自动容错和恢复功能,任何节点的宕机都会导致请求失败,需要等待机器重启或请求方切换连接的节点
- master节点宕机,若宕机前有数据未能及时同步到从机,会导致主从数据不一致的问题
- 多个slave节点宕机后需要避免同时重启导致master节点io压力剧增而宕机
- 对于在线扩容的支持不友好
哨兵模式
主从模式下,master节点宕机后需要手动切换其他节点为master节点,人工干预费时费力而且会导致短时的服务不可用。
Redis提供了哨兵命令redis-sentinel
。哨兵是一个独立的进程,通过向所有节点发送探测请求并判断响应来监测节点健康状态。当哨兵监测到master节点宕机后,会自动选举master并将剩余其他slave节点指向新的master。
为了避免误探测,哨兵可以有多个,超过阈值数量的哨兵都探测到master节点宕机时才会选举新的master节点。一般为了便于选举决策,哨兵的数量应设置为奇数。
优点:
- 哨兵模式基于主从模式,因此哨兵模式继承了主从模式所有优点;
- 主从可以自动切换,系统可用性更高
缺点:
- 各节点数据一致,内存资源占用高
- 对于在线扩容的支持不友好
集群模式
redis集群模式下,各个节点通过哈希槽分配数据,每个节点上存储的数据都是不一样的。节点之间通过集群总线进行通信,集群成为一个整体,客户端访问任意一个节点等同于访问整个集群。当客户端操作的key没有分配到连接的node上时,Redis会返回转向指令,指向正确的node,这有点儿像浏览器页面的302 redirect跳转。
优点:
- 采用去中心化思想,数据按照slot存储在多个节点上,节点之间数据共享,可动态调整数据分配;
- 可扩展性高,能够线性扩展1000多个节点,动态添加和删除节点都比较方便;
- 高可用,部分节点不可用不影响整个集群;
- 支持增加slave节点做备用节点,实现故障自动转移,节点间通过gossip协议交换状态进行投票选举master
缺点:
- gossip协议在集群节点数量过多时,节点之间不间断的ping/pong通讯占用了大量的网络资源;
- 节点的动态扩缩容无法实现完全自动化,需要人工介入数据迁移
- 数据同步迁移操作导致节点处于短时阻塞状态