有一个常见的问题,Redis是如何实现高可用的?
(1) 如何实现高可用
在分布式环境中,有可能出现某台机器挂了,为了保障高可用,首先要提高服务的分区容错性,一般都会通过冗余来实现。
Redis主从是冗余的一种体现。
Redis的高可用是通过主从
、哨兵
来保障的。在主库挂了以后,哨兵
可以把流量切到从库
,让从库顶上去,来保障服务可用。
那就有一个问题了,顶上去的从库的数据和主库数据一样吗?还有Redis是如何实现主从数据同步的?
(2) Redis主从数据同步
Redis多个副本(主库和从库)之间的数据如何保持一致呢?
数据读写操作可以发给所有的实例吗?
(2.1) 新增数据是如何保存到Redis副本
Redis是通过读写分离的方式,通过主从库模式来保障多个副本数据一致。 (MySQL、Kafka也是类似)
为什么要采用读写分离的方式呢?
set key v1
set key v2
如果允许所有副本接收写操作(新增 修改 删除),数据在这多个副本可能就不一致了(分别是 v1 和 v2)。
如果必须保障新增的数据在多个副本上一致,就要涉及到加锁
、实例间协商是否完成修改
等一系列操作,但这会带来巨额的开销,当然是不太能接受的。
(2.2) Redis主从库模式
Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。
读操作:主库、从库都可以接收;
写操作:首先到主库执行,然后,主库将写操作同步给从库。
(2.3) Redis主从数据同步流程
从原理上来说,Redis 的主从数据同步主要包括了全量复制
、增量复制
和长连接同步
三种情况。
全量复制
传输 RDB 文件;增量复制
传输主从断连期间的命令;长连接同步
则是把主节点正常收到的请求传输给从节点。