Redis集群
主从架构
最简单的redis集群架构,采用主从架构实现读写分离(主节点写,从节点读),从而支撑高并发读。
主从复制原理
\
总的来说,redis主从复制策略为:当主从服务器刚建立连接的时候,进行全量同步;全量复制结束后,进行增量复制。当然,如果有需要,slave 在任何时候都可以发起全量同步。
全量复制
Redis全量复制一般发生在Slave初始化阶段,这时Slave会将Master上的所有数据都复制一份,步骤如下:
- slave服务器连接到master服务器,便开始进行数据同步,发送psync命令;
- master服务器收到psync命令之后,开始执行bgsave命令生成RDB快照文件并使用缓存区记录此后执行的所有写命令;
- master服务器bgsave执行完之后,就会向所有Slava服务器发送快照文件,并在发送期间继续在缓冲区内记录被执行的写命令;
- slave服务器收到RDB快照文件后,会将接收到的数据写入磁盘,然后清空所有旧数据,在从本地磁盘载入收到的快照到内存中,同时基于旧的数据版本对外提供服务;
- master服务器发送完RDB快照文件之后,便开始向slave服务器发送缓冲区中的写命令;
- slave服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
- 如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF。
增量复制
Redis的增量复制是指在初始化的全量复制并开始正常工作之后,master服务器将发生的写操作同步到slave服务器的过程,增量复制的过程主要是master服务器每执行一个写命令就会向slave服务器发送相同的写命令,slave服务器接收并执行收到的写命令。
断点续传
当master-slave网络连接断掉后,slave重新连接master时,会触发全量复制,但是从2.8版本开始,slave与master能够在网络连接断开重连后,只从中断处继续进行复制,而不必重新同步,这就是所谓的断点续传。
断点续传的实现依赖psync命令,Redis可以检测出它所连接的服务器是否支持psync命令,不支持则使用sync命令。master服务器收到slave发送的psync命令后,会根据自身的情况做出对应的处理,可能是FULLRESYNC runid offset触发全量复制,也可能是CONTINUE触发增量复制。
具体流程如下:
- master服务器在内存缓冲区中给每个slave服务器都维护了一份同步备份日志(in-memory backlog),缓存最近一段时间的数据,默认大小1m,如果超过这个大小就会清理掉。
- 同时,master 和 slave 服务器都维护了一个复制偏移量(replication offset)和 master线程ID(master run id),每个slave服务器在跟master服务器进行同步时都会携带master run id 和 最后一次同步的复制偏移量offset,通过offset可以知道主从之间的数据不一致的情况。
- 当连接断开时,slave服务器会重新连接上master服务器,然后请求继续复制。假如主从服务器的两个master run id相同,并且指定的偏移量offset在同步备份日志中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步,因为主运行id不保存在磁盘中,如果从服务器重启的话就只能进行完全同步了。
无磁盘化复制
在前面全量复制的过程中,master会将数据保存在磁盘的rdb文件中然后发送给slave服务器,但如果master上的磁盘空间有限或者是使用比较低速的磁盘,这种操作会给master服务器带来较大的压力,那怎么办呢?在Redis2.8之后,可以通过无盘复制来达到目的,由master直接开启一个socket,在内存中创建RDB文件,再将rdb文件发送给slave服务器,不使用磁盘作为中间存储。
无盘复制一般应用在磁盘空间有限但是网络状态良好的情况下。
哨兵模式
通过sentinel集群(自身高可用)提供对redis master-slave集群的高可用保障。
Cluster模式
redis cluster没有使用一致性hash算法,而是采用slot的理念实现。将请求经由CRC16校验后对16384取模来决定发送到的槽位(对应特定节点),接收到请求的节点会将查询请求发送到正确的节点上执行。
优点:
- 无中心架构,支持动态扩容,对业务透明
- 具备Sentinel的监控和自动Failover(故障转移)能力
- 客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- 高性能,客户端直连redis服务,免去了proxy代理的损耗
缺点:
- 运维复杂,数据迁移需要人工干预
- 只能使用0号数据库
- 不支持批量操作(pipeline管道操作)
- 分布式逻辑和存储模块耦合等
注意:
- Redis集群写操作丢失:Redis并不能保证数据的强一致性,集群在特定的条件下可能会丢失写操作
- Redis集群之间复制方式为:异步复制(所以无法保证强一致)
- Redis集群最大节点个数是:16384个
- Redis集群如何选择数据库:Redis集群目前无法做数据库选择,默认在0数据库