一:复制
-
主要命令是SLAVEOF命令,在从服务器上面使用 SLAVE IP PORT,则可以配置主从关系
-
旧版复制功能,分为同步(sync)和命令传播(command propagate)。
同步操作为:(1)从服务器向主服务器发送SYNC命令,(2)主服务器收到SYNC执行BGSAVE命令,在后台生成RDB文件,并使用缓冲区记录现在执行的写命令,(3)主服务器BGSAVE执行完成之后,将RDB文件发送给从服务器,从服务器接收到之后,载入RDB文件,(4)主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行。
命令传播为:主要还是主服务器发送命令至从服务器。
缺陷:当从服务器断开之后,重新发送SYNC命令,主服务器生成RDB文件时,会将从服务器中已有的数据继续写进去,做法很低效。
-
新版复制功能,使用PSYNC命令代替SYNC命令执行复制时的同步操作。PSYNC分为完全重同步和部分重同步,完全重同步只发生在初次复制,部分重同步(偏移量,复制积压缓冲区,服务器运行ID)处理断线后复制。
偏移量:部分重同步需要记录主从两台服务器上面的复制偏移量,偏移量以字节来记录。
复制积压缓冲区:主服务器会将最近执行的命令记录在复制积压缓冲区,短暂的从服务器断开,可以直接将缓冲区数据同步过去,不用同步RDB文件。
服务器运行ID:另外为了从服务器分辨是否为上一次同步的主服务器,在第一次同步时会生成40位ID同步给从服务器。
-
心跳检测,从服务器默认1次/s的频率向主服务器发送命令,可以实现检测主从网络连接,实现min-slaves选项,检测命令丢失。
redis中有min-slaves-to-write和min-slaves-max-log两个选项,可以防止在服务器不安全的情况下执行写命令,例如前者为3,后者为10,那么在从服务器小于3个,或者延迟大于等于10秒,拒绝写命令。
二:sentinel
- 哨兵模式,主要是用于监控主从服务器之间,健康状态,当主服务器下线超过配置的时间之后,就是选举一个新的子节点作为新的主服务器,在此时sentinel还会继续监控下线的主服务器,当以前的主服务器重新上线之后,会作为新的主服务器的从服务器。启动命令为,redis-sentinel /path/*/sentinel.conf或者redis-server /path/*/sentinel.conf --sentinel。
- 哨兵模式是运行在特殊模式下的redis服务,和普通模式使用的命令表不同,所以能够使用的命令不同。没有SET,DEL,FLUSHDB,MULTI,WATCH,EVAL,以及RDB,AOF命令。
- sentinel会读入用户指定的配置文件,为每个要被监视的服务器创建实例结构,创建命令连接和订阅连接,命令连接是向服务器发送命令请求,订阅连接用于接收指定频道消息。
- sentinel通过INFO命令获得服务器属下所有从服务器的地址信息,为这些从服务器创建相应的实例结构,以及连向这些从服务器的命令连接和订阅连接。
- 一般情况,sentinel以每十秒一次的频率向被监视的主服务器和从服务器发送INFO命令,从服务器下线时,或者正在故障转移时,会变为一秒一次。
- sentinel以每秒一次的频率向实例(主服务器,从服务器,其他sentinel)发送PING命令,并根据实例对PING的回复来判断实例是否在线,当在指定时长连续向sentinel发送无效回复时,会将此实例判断为主观下线。
- 当判断为主观下线之后,会向其他sentinel询问是否同意下线状态。当收集到足够的下线投票之后,会将此服务器判断为客观下线,并发起故障转移。
三:集群
-
集群是redis提供的分布式数据库方案,通过分片来进行数据共享,并提供复制和故障转移功能,主要特点有:节点,槽指派,命令执行,重新分片,转向,故障转移,消息。
-
节点:集群中由多个节点组成,连接节点可以使用命令CLUSTER MEET,格式为CLUSTER MEET ,使用CLUSTER NODES可以查看当前集群中所有节点。启动节点是选择cluster-enabled配置选项是否为yes,如果不是yes,则为普通的redis服务器。
-
槽指派:集群通过分片方式保存数据库中键值对,整个数据库被分为16381(2的14次方),可以通过CLUSTER ADDLOTS 可以将多个槽指派给对应节点。每个节点除了记录自己分派的槽,也记录其他节点分派的槽。
-
每个节点接到一个命令请求之后,会先检查处理的键是否自己负责,如果不是则返回一个MOVED错误,其携带着负责这个槽的节点。
格式为MOVED :
-
重新分片:重新分片可以在线执行,分片过程中,集群不需要下线,并且源节点和目标节点都可以继续处理命令请求,重新分片由redis集群管理软件redis-trib执行,主要过程为,1.目标节点准备导入slot键值对,2.源节点准备迁移slot键值对,3.将slot指派给目标节点,4.完成分片
-
ASK错误,当节点A正在迁移槽i到节点B的时候,节点A没有在自己数据库中找到i,则会向客户端返回ASK错误,指引客户端到节点B查找。
-
MOVED错误是槽的负责权已经从一个节点转移到另一个节点,ASK错误是两个节点在迁移槽的过程中使用的一种临时措施。
-
故障转移:集群中节点分为主节点和从节点,主节点处理槽,从节点复制主节点,当主节点故障时,从节点成为主节点,当以前主节点恢复时,成为新节点的从节点。主节点选取使用raft算法实现。
-
故障检测:集群中每个节点都会定期向集群中其他节点发送PING消息,接收到的节点返回PONG消息,各个节点之间互相发送消息,来检测节点。
-
集群中节点通过发送消息来进行通信,常见的消息包括MEET(发送CLUSTER MEET命令时使用),PING(集群中节点默认每秒就从已知节点列表中随机选5个节点发送检测),PONG(接收到MEET和PING时做回复),PUBLISH(当节点接收到PUBLISH命令时发送这个消息),FAIL(当节点判断另一个节点进入FAIL状态时,会广播一个FAIL消息)五种。