面试官第六问:redis集群有哪些解决方案知道吗?
答:单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力就需要搭建主从集群,实现读写分离。一般都是一主多从,主节点负责写数据,从节点负责读数据。
追问:能说一下主从同步的流程吗?
全量同步:
一,从节点请求主节点同步数据。
二,主节点判断是否是第1次请求,是第1次就与从节点同步版本信息。
三,主节点执行bgsave生成rdb文件后发送给从节点去执行。
四,在rdb生成执行期间,主节点会以命令的方式记录到缓冲区。(一个日志文件)
五,把生成之后的命令日志文件发送给从节点进行同步。
增量同步:
一,从节点请求主节点同步数据。
二,主节点判断是否是第1次请求,是就与从节点发布版本信息由从节点存储。 不是第一次就获取从节点的offset值,
三,主节点从命令日志中获取offset值之后的数据,发送给从节点进行数据同步。
在redis中提供的集群方案一共有三种
*主从复制
*哨兵模式
*分片集群
在这三个面试集群的问题中,同时也会面试一些其余的面试题:
主从复制:单节点redis的并发能力是有上限的,要进一步提高redis的并发能力,就需要搭建主从集群,实现读写分离
在主从复制的过程中,由主节点主要负责客户端的写操作,从节点来进行从操作。因为redis的读操作远远多于写操作,所以从节点可以帮主节点分担很大压力。但是,每当主节点进行写操作的时候,务必要对从节点进行数据同步。
那么如何进行数据同步呢?
主从数据同步原理:
主从全量同步:
用RDB文件来进行同步,当发送RDB文件之后主节点又有新的写操作时,会书写一个repl_baklog日志来记录RDB期间的所有命令(操作9),把这份日志最后发送给从节点,从节点读取日志执行接收到的命令,来保证消息的同步。
如何判断从节点是否是第一次同步?
当主从节点不是第一次同步的时候时,他们之间的数据同步是通过那个日志文件来进行同步的。不需要再去传输RDB文件。那么,从节点又该怎么判断它需要执行多少命令才能同步数据呢?
在解决这两个问题前我们需要了解两个概念:
Replication_id:
简称repplid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的repild,slave则会继承master节点的replid
offset:
偏移量,随着记录在repl_baklog中的数据增多而逐渐增大,slave完成同步时也会记录当前同步的offset。如果slave的offset小于master'的offset,说明slave的数据落后于master,需要更新。
故我们可以解答问题一:
在slave执行replicaoof命令建立连接时,会把自己的replid的数据发送给Master。然后Master会判断自己的replid的是否和sleeve的replalid的一致。如果数据不一致,则是第一次同步。返回Master的数据版本信息交由sleeve保存。
由此我们可以解答问题二:
我们已Offset表达了节点数据的偏移量,故我们可以用主节点的偏移量减去从节点的偏移量所得的差值来表示从节点需要同步的数据量和范围。假设主节点的偏移量是80,从节点的偏移量是50,那么数据同步需要同步范围,在80到50之间的数据即可。
主从增量同步(Slave重启或后期数据变化)
主节点判断数据是否一致。如果不一致,则是第一次,返回主节点上的数据交给slave从节点,由从节点保存版本信息。
如果数据一致则返回Continue,主角点去rap_baklog中获取offset后的数据,发送给从节点同步数据。