主从
主从同步原理
1.全量同步
1.从节点刚连接到主节点时,主动请求数据同步
2.主节点判断是否是第一次同步,如果是,就返回主节点的数据版本信息
3.随后,主节点执行bgsave,生成RDB文件,并发送给从节点
4.这个过程中以及随后产生的全部命令都会记录到repl_baklog这个缓冲区中,然后一点一点的同步给从节点,这样就保证了主从节点数据的一致性
2.部分同步
当master和slave断开重连后,一般都会对整份数据进行复制。但从redis2.8版本开始,redis改用可以支
持部分数据复制的命令PSYNC去master同步数据,slave与master能够在网络连接断开重连后只进行部分数据复制(断点续传)。
master会在其内存中创建一个复制数据用的缓存队列,缓存最近一段时间的数据,master和它所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master
继续进行未完成的复制,从所记录的数据下标开始。如果master进程id变化了,或者从节点数据下标offset太旧,已经不在master的缓存队列里了,那么将会进行一次全量数据的复制。
主从优缺点
优点
1.冗余备份数据
2.读写分离,提高服务器性能
缺点
一旦Master节点由于故障不能提供服务,需要人工将Slave节点晋升为Master节点
哨兵
选主节点规则
主要是看各个节点的打分情况,打分规则分为 从库优先级、从库复制进度、从库ID号。只要有一轮,某个从库得分最高,则选举它为主库。
1.从库优先级,主要是考虑到不同的机器可能配置不一样,配置高的机器,优先级高一些,通过slave-priority 来配置
2.从库复制进度,主要是看slave_repl_offset 的值大小,值越大表示已经同步的数据越多,得分越高。
3.从库ID号,每个Redis 实例启动时,都会生成一个 ID,在优先级和复制进度相同的条件下,ID号最小的从库分数最高,会被选为新主库。
哨兵模式脑裂导致数据丢失
脑裂 也就是说,某个 Master 所在机器突然脱离了正常的网络,跟其他 slave 机器不能连接,但是实际上 master 还运行着。此时哨兵可能就会认为 master 宕机了,然后开启选举,将其他 slave 切换成了 master。这个时候,集群里就会有两个 Master ,也就是所谓的脑裂。此时虽然某个 slave 被切换成了 master,但是可能 client 还没来得及切换到新的 master,还继续向旧 master 写数据。造成数据丢失。
解决脑裂问题
min-slaves-to-write 1
min-slaves-max-lag 10
如上两个配置:要求至少有 1 个 slave,数据复制和同步的延迟不能超过 10 秒,如果超过 1 个 slave,数据复制和同步的延迟都超过了 10 秒钟,那么这个时候,master 就不会再接收任何请求了。
哨兵模式的优缺点
优点
哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。主从可以自动切换,系统更健壮,可用性更高。
缺点
具有主从模式的缺点,每台机器上的数据是一样的,内存的可用性较低。
还要多维护一套哨兵模式,实现起来也变的更加复杂增加维护成本。
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
集群
哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,并且不好在线扩容。因此,Reids Cluster集群(切片集群的实现方案)应运而生,它在Redis3.0加入的,实现了Redis的分布式存储。对数据进行分片,也就是说每台Redis节点上存储不同的内容,来解决在线扩容的问题。并且,它可以保存大量数据,即分散数据到各个Redis实例,还提供复制和故障转移的功能。