集群
一、在主从数据库建立时如何保证主从数据一致?
- 主数据库在运行情况,建立从数据库时,会向主数据库发送sync
- 主数据库收到后生成RDB快照(2.8.18版本引入无硬盘复制,直接将RDB通过网络发给从数据库,而不是之前将快照存在硬盘上)
- 同时缓存生成快照期间执行的命令
- 从数据库收到主数据库发来的RDB与缓存进行数据同步
- 同步过程中会响应客户端的命令,可以通过设置在这个阶段回复错误
二、主从数据库之间连接断开如何恢复?
- redis2.6及之前采用复制初始化
- 2.8版本采用了增量数据传输
- 从数据库会存储主数据库的ID,当数据库重启会产生另一个唯一ID
- 主数据库每给从数据库发送一条命令,则把该命令放在积压队列里,并记录队列中的存放的命令的偏移量范围
- 从数据库接收到命令会记录下偏移量
- 重连后,主数据库接收到从数据库的psync(主数据库ID+记录的命令偏移量)
- 主数据库ID确认没错后,再根据命令偏移量是否在积压队列的偏移量范围内,在范围内则增量传输,不然复制初始化
三、对于网络分区导致的主从数据库不一致问题,redis提供了怎么样的复制策略?
- 采用乐观复制策略
- 提供了两个配置选项,分别是最少从数据库连接数、最长失去从数据库连接时间
- 当从数据连接数大于最少时才能写入主数据库
四、哨兵了解吗?
- 监控主从数据库与其他哨兵的存活情况
- 每10s向主从数据库发送info命令(获取主从数据库ID、复制信息等)
- 每2s向主从数据库的_sentinel_:hello频道发送自身的信息(地址、端口号、ID、配置版本、主数据库地址、端口号、ID、配置版本)
- 每1s对主从数据库和其他哨兵发ping命令
- ping后一定时间未回复,则判断为主观下线
- 当一定数量的哨兵都认为主数据库主观下线后,判断为客观下线
- 这时需要由领头哨兵来执行故障恢复
- 当哨兵发现主数据库下线后,会让其他哨兵选举自己作为领头哨兵
- 若其他哨兵没有选举过别的哨兵则会支持当前哨兵
- 当前哨兵得到超过一半的哨兵支持时,成为领头哨兵
- 但可能出现哪个哨兵都没有超过半数票的情况,则每个哨兵随机时间后再进行拉票
- 选取从数据库中的一个充当主数据库
- 根据优先级选取
- 优先级相同,根据偏移量的大小进行选取,偏移量越大说明数据越完整
- 上面一样,则选取ID最小的
五、redis集群时,是怎样知道该去访问哪个实例的?
- 客户端向任一节点发送数据库键命令
- 节点计算键属于哪个槽
- 判断该槽是否由当前节点处理
- 是则处理,否则给客户端一个MOVED错误的信息
- 客户端根据这个错误信息发送给正确的节点