什么是集群
为了系统的可靠性或扩大系统资源,我们一般会通过多台机器来共享资源、分担费用、共用信道设备及服务等。
Redis 有哪几种集群模式
Redis 场景的集群模式有:主从模式,哨兵模式,cluster 模式。
什么是主从集群
通过搭建多台 redis 主机,两者间存储相同的数据,从而分散单主机下的请求压力。
优点:
- 高可靠性:一方面采用主从机架构,当主机宕机时,能手动将从机顶替主机,防止系统崩溃。另一方面,多台机器都会进行相应的数据持久化操作,从而备份多份数据。
- 读写分离策略:从节点可以扩展主库节点的读能力,有效应对大并发量的读操作。
缺点:
- 故障恢复发杂:因为没有哨兵去检测主机从机之间的状态并处理故障转移,所以我们得要去开发监控程序,当主机宕机时能及时通知我们并手动去切换主从节点。
- 主库的写能力收到单机的限制。
- 系统的存储能力收到单机的限制。
- 主从同步时是通过网络进行传输,难免会出现一些错误,即使有了很多的检错手段,但还是会出现个节点间数据不一致的问题。
怎么实现主从复制
理论部分
主从复制有两个阶段:初始化阶段和运行阶段。
- 初始化阶段:
- 从服务器启动;
- 从服务器连接到主机,发送 SYNC 命令;
- 主服务器收到 SYNC 命令后,开始执行 BGSAVE 命令,保持当前快照并生成 RDB 文件,同时在此过程中用缓存区记录下这段时间的执行命令,防止数据丢失;
- 主服务器执行完 BGSAVE 后,向从服务器发送快照文件,并且也在缓存区记录下这个时期执行的命令;
- 从服务器收到快照文件后,丢失所有旧数据,重写载入收到的快照;
- 主服务器快照发送完毕后旧向从服务器发送缓存区里记录下的命令;
- 从服务器完成快照的输入,开始接收命令请求,执行来自主服务器缓冲区的写命令。
- 运行阶段:
- 主服务器每执行一个命令,就会向从服务器发送相同的命令,这个也叫做增量更新。
实操部分
|
|
|
|
如果传输的过程中数据丢失了,Redis 会怎样保证数据的可靠性?
从 Redis2.8 开始,就支持了主从复制的断点续传。master 和 slave 都保存一个 replica offset,里面记录了当前数据的偏移量。slave 会定期的向 master 发送此偏移量,并和自己的偏移量比较,从而知道了 slave 是否还差一些数据,并将数据发送过去。
同理,当传输过程中数据丢失时,slave 也只保存了丢失前的偏移量,等一段时间后会自动跟 master 比较当前的偏移量。
在主从模式下,明明一个键过期了,为什么还可能会读到?
因为 Redis 的从库是无法主从区删除已过期的 key。它的实现策略是通过主库去判断该 key 是否过期,若过期,则删除并且向 Slave 发出删除 key 的指令。又由于 Redis 的主库键过期是采用惰性删除的策略(前文有讲),所以,当读从库时,并不会触发过期判断的策略,从而不删除键。
解决方法:
编写一段程序,定期通过 Scan 扫库。扫库的作用是访问 master 里所有的 key,这样就会触发所有 key 的过期检测,从而删除过期的 key。但这样也会极大降低性能。 使用 Redis3.2 以上的版本,因为其新增了一个特性来解决这个问题。增加了 key 是否过期以及对主从库的判断,如果 key 已过期,当前访问的Master则返回 null;当前访问的是从库,且执行的是只读命令也返回 null。源码如下: