redis主从复制和集群实现原理

redis主从复制
redis主从配置比较简单,基本就是在从节点配置文件加上:slaveof 192.168.33.130 6379
主要是经过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,而后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。
redis复制过程以下:
一、slave server启动链接到master server以后,salve server主动发送SYNC命令给master server
二、master server接受SYNC命令以后,判断,是否有正在进行内存快照的子进程,若是有,则等待其结束,不然,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server
三、master server子进程进程作数据快照时,父进程能够继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中
四、slave server 接收内存快照文件以后,清空内存数据,根据接收的快照文件,重建内存表数据结构
五、master server把快照文件发送完毕以后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server作相同处理,保存数据一致性
六、master server 后续接收的数据,都会经过步骤1创建的链接,把数据发送到slave server
须要注意:slave server若是由于网络或其余缘由断与master server的链接,当slave server从新链接时,须要从新获取master server的内存快照文件,slave server的数据会自动所有清空,而后再从新创建内存表,这样会让slave server 启动恢复服务比较慢,同时也给master server带来较大压力,能够看出redis的复制没有增量复制的概念,这是redis主从复制的一个主要弊端,在实际环境中,尽可能规避中途增长从库
redis2.8以前不支持增量,到2.8以后就支持增量了!


redis cluster(集群)
redis集群配置参考个人博文: http://blog.csdn.net/nuli888/article/details/52134117
3.0以后的功能,至少须要3(Master)+3(Slave)才能创建集群,是无中心的分布式存储架构,能够在多个节点之间进行数据共享,解决了Redis高可用、可扩展等问题。

redis集群提供了如下两个好处
一、将数据自动切分(split)到多个节点
二、当集群中的某一个节点故障时,redis还能够继续处理客户端的请求。
一个 redis 集群包含 16384 个哈希槽(hash slot),数据库中的每一个数据都属于这16384个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪一个槽。集群中的每个节点负责处理一部分哈希槽。
集群中的主从复制
集群中的每一个节点都有1个至N个复制品,其中一个为主节点,其他的为从节点,若是主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工做。这样集群就不会由于一个主节点的下线而没法正常工做
注意:
一、若是某一个主节点和他全部的从节点都下线的话,redis集群就会中止工做了。redis集群不保证数据的强一致性,在特定的状况下,redis集群会丢失已经被执行过的写命令
二、使用异步复制(asynchronous replication)是redis 集群可能会丢失写命令的其中一个缘由,有时候因为网络缘由,若是网络断开时间太长,redis集群就会启用新的主节点,以前发给主节点的数据就会丢失。
redis