主从复制模式
当我们单台redis节点故障时,我们可以使用AOF+RDB进行数据的恢复, 但是如果节点的磁盘出现了问题,那么丢失数据问题将不可避免。
因此我们将Redis数据库复制多份部署在不同的服务器,Redis提供了复制功能,当一台数据库节点更新后,会将数据同步到其他数据节点。
主从模式中有两种数据库
主数据库:主数据库可以进行读写操作。
从数据库:从数据只能进行读操作。
一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。当写操作发生时主数据库会将数据同步给从数据库。
总结:
引入主从复制机制的目的有两个
一个是读写分离,分担 "master" 的读写压力
一个是方便做容灾恢复
主从复制原理:
1、从服务器启动时,向主服务器发送请求。
2、主服务器接收到请求时会开始创建一个RDB快照文件,并对此时接受的命令进行缓存
3、RDB文件建立好后发送给从服务器,从服务器接受后开始写入新数据。
4、主服务器发送完RDB快照会将缓存指令发送给从服务器,进行新的数据同步,从服务器接收到开始写入。
5、之后每当从服务器接收到一个命令,都会同步给从服务器。
上述的同步方式,在同步时,slave和master都是非阻塞的方式进行的,此时master仍可查询、更新数据,而slave节点依旧可以返回之前的数据(不一定,根据参数配置,也可能返回正在同步的提示)。
并且,Slave可以接受其他Slave的连接和同步请求,可以有效分担master的同步压力。
主从复制模式的优缺点:
优点
1、主从复制可以分担单节点读写压力,将读压力分担一部分给从节点。
2、防止单节点磁盘故障数据丢失。
缺点:
1、主从复制如果主节点宕机,需要手动进行节点切换。才能恢复服务。
2、如果一次启动过多从节点,那么主节点会开始进行多台全量数据同步,可能造成主节点宕机
3、在线扩容较难
4、如果主节点宕机,此时部分数据未进行同步并切换了主节点,那么重启后会造成数据不同步的问题。
哨兵模式
主从模式当主节点故障时需要手动进行故障切换,因此引入了哨兵模式,通过哨兵来监控redis主节点服务的可用性
原理:
哨兵进程会不断的向所有redis节点发送命令,当主节点故障无法响应哨兵的请求时,会将从节点切换为主节点。
哨兵切换步骤:
1、哨兵每秒钟向集群中所有的哨兵、主节点、从节点发送ping命令
2、当主节点无法响应时,会被当前哨兵标记为主观下线,
3、当有足够数量的哨兵标记此节点处于主观下线状态,则被标记为客观下线。
4、此是哨兵会向此主节点的所有从节点发送info命令,获取信息,进行选举更换主节点。
当没有足够的哨兵认为主节点主观下线,那么该节点的主观下线状态将被移除。并且如果主节点响应了哨兵的请求,那么仍然会移除此节点的主观下线状态。
优点:
1、所有主从复制的优点都有,因为是从主从模式衍生而来。
2、哨兵模式可以自动进行故障主节点切换
缺点:
1、难以在线扩容
集群模式:
集群模式是使每台redis节点都存储部分数据。提升了redis的扩展能力
Redis的集群模式使用了哈希槽位的概念,Redis集群中总共有16384个槽位,对每个key进行计算后决定放入那个槽位,这种结构非常适合添加删除节点,当增加节点时,将之前节点中各分出一部分给新加槽位。当删除节点时,将此节点的槽位分给其他几个节点即可。
集群模式还支持主从复制,一个主节点可以挂载多个从节点,当一个主节点宕机时,从节点就会被启用。
如何判断主节点宕机,集群模式并没有哨兵来判断,而是通过其他主节点与某个节点A的ping-pong通讯来判断,当超过半数的主节点与A通信超时,那么A会被认为下线,启用他的从节点。
当无可用节点时,那么根据Redis的配置可能会造成部分数据访问不到或者Redis服务不可用。
优点:
1、极大降低了redis扩容难度
2、支持了故障自动切换和主从复制的优点
缺点:
1、所有节点需要进行ping-pong,虽然进行了优化,但是仍有大量的网络开销