在有一定规模的系统中,引入缓存是必须的。目前,redis已经成为分布式缓存领域事实上的霸主,其他的如memcached等则逐渐的退出了历史舞台。redis已如此重要,如果在系统中仍然以单点的形式存在,那么一旦发生故障,轻则可导致数据库压力倍增,重则让系统崩溃,产生重大损失。为了避免单点故障,提高可用性,redis提供了主从复制的集群模式。
主从复制模式是一种基本的集群模式。集群中包含两种角色,主节点和从节点。它通过把数据从主节点复制到从节点的方式,实现集群中所有节点都拥有同一份数据。
1、主从复制集群的结构
在主从复制模式中,集群的主从节点的结构通常有两种。
一种是从节点全部从主节点同步数据。结构如下图:
这个结构的优点是:所有从节点都从主节点同步数据,步调基本一致,延迟较少。但缺点也很明显,就是主节点的压力较大。
另外一种结构是只有少量的从节点直接从主节点同步数据,其他的从节点从从节点同步数据,形成一种级联结构,结构如下图:
这种结构的优缺点基本与前一种结构相反,主节点由于只有一个从节点,所以压力较小,但同时,只有主节点的直接从节点的数据同步延迟较小,其他的从节点,越往后,延迟越大。当然,这里也有其他的变种,比如如图中的红色虚线表示的,其他从节点直接作为第一个从节点的从节点。
2、主从复制的过程
redis的主从复制支持两种方式,全量复制和增量复制。
全量复制
全量复制一般发生在从节点的初始化节点,此时从节点没有数据,需要从主节点同步全部数据。过程如下:
(1)从(节点)服务器连接主(节点)服务器,发送SYNC命令
(2)主服务器收到SYNC命令后,执行BGSAVE命令生成RDB快照文件并使用缓冲区记录随后的所有写命令
(3)主服务器执行BGSAVE完成后,向所有从服务器发送RDB快照文件(每次生成磁盘文件,效率较低,在2.8以后做了优化,可以不生成文件),并继续记录所有的写命令
(4)从服务器收到RDB快照文件后,清除所有旧数据,载入快照中的新数据
(5)主服务器在快照文件发送完成后,向所有从服务器发送缓冲区中的写命令
(6)从服务器完成RDB快照的载入后,开始接收命令请求,并同时接收来自主服务器的写命令
时序图如下:
全量同步有一些缺点:
(1)同步的数据量大,性能影响比较大。在初次同步的时候是必要的,但是有些时候则有点多余,比如从服务器开启了持久化,因某种原因停机重启。
(2)有一个隐含的重大隐患,比如主服务器没有开启持久化,由于某种原因重启,此时主服务器没有数据,从服务器重连上来后,要开启同步,可能导致从服务器的所有数据被清空。
所以需要一种只同步少量数据的机制,那就是增量同步。
增量同步
过程如下:
(1)从服务器连接主服务器,发送PSYNC命令,带上主服务器的runid(机器标识)和offset(数据偏移量)
(2)主服务器验证runid和offset是否有效,无效则开启全量同步,有效则从offset处同步增量数据
3、主从复制的优缺点
主从复制有如下优点:
(1)配置简单,易于实现(2)实现数据备份和冗余,提高数据可靠性(3)实现读写分离,提高系统性能
但也有如下缺点:
(1)在主节点发生故障时,只能手动切换,故障恢复时间长,必须借助其他手段完成自动切换
(2)所有的写操作都在主节点上,主节点的压力大,会成为性能瓶颈
(3)所有节点都保持同一份数据,不能进行数据分片,单机容量即为整个集群的容量
4、主从复制的使用场景
(1)数据备份和恢复:通过从节点备份主节点的数据,实现数据备份。
(2)读写分离:主节点承担写操作或部分读操作,从节点执行读操作,减轻主节点压力,提高系统性能
(3)提高可扩展性:在不影响主节点的情况下,通过增加从节点来扩展系统的读取能力。
5、总结
主从复制模式适合数据备份和恢复、读写分离和平滑扩展等场景,但在主节点故障时需要手动切换,不能自动实现故障转移,我们以后在讲到哨兵(sentinel)模式的时候,会发现可以用sentinal来实现这一点,从而实现更高的可用性。