高可用:常见于分布式系统,指通过系统设计使能够提供服务的时间达到较高值。
若系统能一直运行,则可用性为100%。
Redis为了高可用,提供了三种保障机制。
在Redis中,可以通过
slaveof命令让一个Redis服务复制另一个Redis服务,我们称呼被复制的服务器为"主服务器",对主服务器进行复制的称为"从服务器"。
复制分为两部分:同步与命令传播。
心跳检测:命令传播阶段,从服务器每秒一次向主服务器发送特定的命令,检测当前网络连接状态以及命令是否丢失等。
完整同步用来处理初次将主服务器数据同步到从服务器中,步骤如下:
sync命令请求同步数据。sync后执行bgsave,生成RDB文件,同时将生成文件期间收到的写命令存入一个缓冲区中。至此,完整同步部分就完成了。此后,主服务器通过命令传播实时更新从服务器的状态。
部分同步用于从服务器断线后重新复制数据的情况。
psync代替sync,解决了之前版本部分重同步低效的问题。复制偏移量
主从服务器各自维护一个复制偏移量:主服务器发送N字节数据时,就将自己的复制偏移量加N;从服务器收到N字节数据时,就将自己的复制偏移量加N。
如果发生断线,则从服务器只需要复制自身偏移量之后的数据即可。
复制积压缓冲区
复制积压缓冲区是主服务器维护的一个FIFO队列,默认大小为1MB,队列中保存着命令和对应的偏移量。
服务器运行ID
Redis服务器在启动时自动生成40个十六进制字符组成的随机运行ID。
从服务器在初次复制主服务器时,会将主服务器的运行ID保存下来。
优点:
缺点:
哨兵(Sentinel)是一个分布式架构,包含一个或多个哨兵实例,可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器。
哨兵实例本质上是利用
redis-centinel+配置文件启动的特殊类型Redis服务器,不存储数据,只支持部分Redis命令。不同哨兵之间可以进行信息交互。
每个哨兵以每秒一次的频率向主、从服务器发送PING命令,通过回复来判断对应服务器是否在线。「监控」
若距离上一次收到有效响应的时间超出配置文件中的down-after-milliseconds ,则哨兵可以主观判定该服务器下线。
注:PING的有效回复包括"+PONG"、“-LOADING”、“-MASTERDOWN”
当一个哨兵主观判定某个主服务器下线后,它会向同样监视该主服务器的其它哨兵询问,看它们是否也主观认为该服务器下线。
如果接收到一定数量的"已下线"判断,Sentinel就会将该主服务器判定为**“客观下线”,这样做可以尽可能防止误判**。
注:具体需要多少个"已下线"判断由每个哨兵的配置文件决定,该数量被保存在哨兵实例的
quorum成员变量中。
从监视该下线主服务器的哨兵中选出一个领头哨兵,由领头哨兵选出优先级最高的从服务器,让它作为新的主服务器。若优先级相同,则选出运行ID最小的,即创建时间最早的。「故障转移」
注:服务器优先级可以通过配置文件中的
replica-priority设置,值越小,优先级越高。
如果原先的主服务器重新上线,那么它会成为现在这个新主服务器的从服务器。
优点:
缺点:
集群(Cluster):通过分片来进行数据共享,提供复制和故障转移功能。
一个集群通常由多个节点组成,每个节点相互独立,节点内有一个主机和多个从机。
注:启动集群节点客户端需要-c选项,如redis-cli -c -p xxxx
启动节点
集群的每个节点都是一个Redis服务器,启动该服务器前需要将配置文件的cluster-enabled选项置为yes。
连接节点
集群的每个节点都是一个clusterNode结构,节点之间通过CLUSTER MEET ip:port命令进行连接。以节点A连接节点B为例:
clusterNode结构,同时向节点B发送一个MEET消息。clusterNode结构,同时向节点A发送一个PONG消息。指派槽位(分片)
集群的整个数据库被分为16384个槽(slot),而用户需要在指定客户端下通过CLUSTER ADDSLOTS slot [slot1 slot2 ...]进行槽的分配,例如:使用CLUSTER ADDSLOTS 0 1 2 3 ... 5000将槽0~5000分配给客户端连接的那个节点服务器。每个节点负责了哪些槽最终都会被同步到集群的各个节点中,存储在每个节点的clusterNode *slots[16384]数组中。
插入到数据库中的键通过CRC校验和计算一个0~16383之间数,从而确定它的槽,计算公式为slot=CRC16(key)&16383。
复制与故障转移
集群中的节点可以通过CLUSTER REPLICATE <节点运行时id>将当前节点设置为id对应节点的从节点,实现主从复制。
集群中的每个节点都扮演了哨兵的角色。当某个节点疑似下线时,它们通过投票的方式判断该节点是否客观下线,如果是,则进行故障转移,选取新的从机作为节点的主机。
优点:
缺点: