本文记载学习《Redis规划与结束》一书中第三部分关于主从复制、Sentinel、集群的知识总结及了解。

一、主从复制

单节点布置,一旦节点发生缺陷,就会导致服务不可用,主-从集群就是为了处理这类问题,前进可用性,一同经过主从进行读写缓存是什么意思分别,能够减少主库的读压力。

主从复制包括全量复制、依据长链接的指监控系统令传达、增量复制。

当从节点实施slaveof ip port后,建立主从关系后,会进行第一次全量复制缓存视频兼并,如下:

1、第一监控次全量同步,master节点翻开bgsave子进程来创建全量数组公式R二进制亡者列车DB,并发送给从节点,;

2、从节点接收到监控器什么牌子最好清晰度高主节点的RDB文件,根除本地数据后加载RDB文件;

2、指令传监控家用远程手机达,全量同步的过程中发生的写指令会缓存在复制缓冲区(replica数组排序tion buffer),主节点将复制缓冲区内的redis面试题写指令发给从节点实施。

主从节点网络断开-增量复制

在2监控怎样装置.8版别之前,主从节点网数组和链表的差异络断开后会进行全量复制,功率低下。

从2.8初步,网络断开后从头联接,主从节点会进行增量复制。

当主从节点断开联接后,从头联接上后,会依据主从节点的偏移量从repl_backlog_buffer缓冲区获取写指令进行增量同步。

Redis主从复制、Sentinel、集群总结

全量复制为什么用RDB,不必AOF?

1、RDB文件内容是经过紧缩的redis数据结构二进缓存视频兼并制数据,而AOF文件记载的是每一次写操作的指令,写操作越多文件会变得redis数据结构很大,其中还包括许多对同一个key的屡次冗余操作,运用RDB文件传输相对AOF文件会减少网络耗费;

2、从库经过RDB快照加载数据要快,AOF要逐条实施指令;

二、岗兵机制

岗兵节点是一个特别的Redis实例,特别在于一般Redis节点比较,指令集不同,岗兵节点不能实施数据操作指令数组排序,能够实施PING,INFO等指二进制令。岗兵集群的作用是用来监控Redis集数组函数的使用方法群,对发生缺陷的数组排序master节点能进行缺陷搬运,保证高可用。

岗兵节点会与悉数Redis主-从节点创建两个联接,一个是订阅_sentinel:hello频道;一个是指令联接。

片面下线 vs 客观下线

岗兵会每隔一秒向Redis节点(主、从)发送ping指令,redis数据结构依据节点的照顾分为:

  • 有用照顾:在规则的时间(经过down-after-milredis集群liseconds设置)内,照顾+PONG、-LOADING、-MASTERDOWN,即为有用照顾
  • 无效照顾:除了上面三种照顾或在规则的时间内未照顾,即为无效照顾

假定未无效照顾,则会被岗兵符号为片面下线。

当岗兵将一个数组c语言主节点判别为片面下线后,为了承认该节点是否为客监控怎样连接手机观下线,会向其他监控这一节点的岗兵进行问询,发送is-master-down-by-addr指令,当收到悉数的回复中,有大于等数组指针于quonum个岗兵判别此主节点为片面下线,缓存是什么意思即可判别此主节点为客观下线。

Redis主从复制、Sentinel、集群总结

在断定主节点为客观下线后,岗兵集群会数组指针推举领头的岗兵(经过Raft算法推举,此处不翻开),领头的岗兵随后进行缺陷搬运。

三、集群

Redis节点经过clus缓存ter meet指令结束节点间握手,建立联接。建立联接后,节点间会守时彼此发送ping/pong指令,交流数数组指针据信息(节点信息、情况等)。

每个Redis节点都有一个clusterNode来保存节点信缓存视频在手机哪里找息,当节点参与集群中时会有个clusterState结构来保存集群的信息情况,如下图所示:

Redis主从复制、Sentinel、集群总结

节点间经过cluster meet指令,在联接过程中会去更新clusterState中的nodes信息。

集群的整个数据库被rediscover分为16384个槽,每个节点担任的槽能够经过cluster addslots来进行指使。在clusterNode结构中特色slots记载节点担任哪些槽:

struct clusterNode {
unsigned char slots[16384/8二进制亡者列车];
int numslots;
}

一同,clusterState结构里会存16384个槽的指使信息,如下:

struct clusterState {
clusterNode *slots[16384];
}

经过clusterState的slots能够经过O(1)时间找到某个槽对应的节点。

在集群中实施指令

在集群环境下,客户端向某节点发送数据库指令时数组初始化,会首要核算key归于哪个槽,假定槽对应的指使是当时节点,会实施指令;假定槽对应的目标数组和链表的差异不是当时节点,会回来MOVED给客户端,并回来槽对应指使的节点信息,后再次实施指令。

核算key归于哪个槽:CRC16(key) & 16383

为什么是16384个槽?

  • 节点之间检测情况,发送的数据里包括节点的分槽信息数组slots[16383/8],假定槽太多会导致每次传输的数据包增大,因为节点间的检测时很一再的,会影响传输功率,简略形成网络堵塞

  • 一般来说Redis的集群节点数不主张超过1000个,缓存视频16384个槽位足够用

四、参阅

  • 《Redis规划与结束》

  • www.cnblogs.com/二进制转化为十进制rjzheng/p/1…