Redis集群

1、数据主从复制原理与实现

1.1 保存主节点信息        

        主客户端向从服务器发送slaveof(replicaof): 从服务器将主机ip和端口保存到redisServer的masterhost和masterport

        从服务器将向发送SLAVEOF命令的客户端返回OK,表示复制指令被接收,实际上复制工作是在OK返回之后进行。

1.2 建立socket连接

slaver与master建立socket连接
slaver关联文件事件处理器
该处理器接收RDB文件 (全量复制)、接收Master传播来的写命令 (增量复制)

1.3 发送ping pong命令
1.4 权限认证
1.5 数据同步

1.5.1 实现方式

1、Redis 2.8之后使用PSYNC命令,具备完整重同步和部分重同步模式。
2、Redis 的主从同步,分为全量同步和增量同步。只有从机第一次连接上主机是全量同步断线重连有可能触发全量同步也有可能是增量同步 (master 判断 runid 是否一致)。

Redis集群_第1张图片

 1.5.2 全量同步

Redis 的全量同步过程主要分三个阶段:
1、同步快照阶段: Master创建并发送快照RDB给Slave,Slave 载入并解析快照。Master 同时将此阶段所产生的新的写命令存储到缓冲区。
2、同步写缓冲阶段: Master 向 slave 同步存储在缓冲区的写操作命令。
3、同步增量阶段: Master 向 slave 同步写操作命令。

1.5.3数据副本之间如何保证数据一致性?

Redis提供了主从模式,保证数据副本的一致性,主从库之间采用的是读写分离的方式

  • 读操作:主库、从库都可以接受并处理
  • 写操作:主库接受写,将修改的数据同步给从库。

1.5.4 主从从模式

上面我们知道在第一次主从连接的时候,对于主库来说比较耗时的操作就是第一次生成RDB文件和传输RDB文件,前者需要fork出线程进行处理,会影响主库的整体处理速度,而后者传输RDB文件,因为针对的是全量的数据,所以这个操作非常耗费网络带宽。那么有没有其他方式可以缓解主库的这种操作,解决方案就是主从从模式,
主从从模式说白了就是,当有较多的从库实例,不需要从主库建立和主库的数据复制连接,使用一个从库进行数据复制。

Redis集群_第2张图片

1.5.5 主从网络间断,数据复制如何处理

当出现主从网络断开的情况下,数据需要保证复制的一致性,如何做,在2.8版本之前是进行全量复制,而之后采用了增量复制。
具体原理是,当主从库断开连接后,主库会将写命令写入到replication buffer 中,同时也写到repl_backing_buff 缓冲区中。
repl_backing_buff 是一个环形缓冲区,主库会记录自己写的位置,从库会记录自己读的位置。
刚开始的时候,主从库位置是一样的,当主库接受的写命令越来越多就会增加偏移量,maser_repl_offset,而从库读取同步的数据也会进行相应的移动,slave_repl_offset。正常情况下,两个基本相当。

Redis集群_第3张图片

 repl_backlog_buffer的使用
主从库连接恢复之后,从库首先会给主库发送psync命令,并把自己的slave_repl_offset发送给主库,主库判断和自己的差距,将没有同步的数据进行同步。

Redis集群_第4张图片

注意点:因为repl_backlog_buffer是一个环形缓冲区,当缓冲区写满之后,主库就会覆盖之前写入的数据,而这部分数据如果从库米有来得急进行同步,那就会可能造成数据丢失。一把来说,我们需要将repl_backlog_size 参数设置的比较大一倍。还有一种方式是通过切片集群来解决,具体等后边在详解。

1.5.6 总结

        Redis数据复制,具体的方式全量复制、基于长连接的复制、增量复制三种模式。第一次都是使用全量复制,之后就可以基于长连接模式,如果出现网络断开、抖动等情况,就需要增量复制。虽然复制模式的读写分离可以避免数据之间的不一致,但是主库如果出现故障,没有办法提供服务。写一篇我们介绍下主从故障之后,哨兵机制。

2、哨兵模式下副本节点升级成主

哨兵节点监控的主节点ip 被修改,redis.conf被修改,从节点变主节点,replicaceof

你可能感兴趣的:(redis,数据库,缓存)