Redis的复制功能创建多个与主服务器具有相同数据库的从服务器,当主服务器因某种原因不可用(宕机、网络异常等情况),为了维持系统正常运转会将正常服务器代替为不可用的服务器的操作,一般被称为故障转移(failover)。
因为Redis支持主从复制特性,所以我们利用这一特性手动的对不可用服务器进行故障转移,假设现在有一个主服务器127.0.0.1:6379(简称6379),还有127.0.0.1:6380(简称6380)、127.0.0.1:6381(简称6381)两台从服务器。假设6379因为故障导致不可用,此时我们可以向6380发送命令 replicaof no one,将它转换为主服务器,然后向另一个服务器6381发送命令replicaof 127.0.0.1 6380,让它去复制新的主服务器6380,这样就能重新建立起一个能正常运转的主从服务器连接,这种方式的缺点在于当主从服务器数量多时不易管理。为了提供主从服务器的可用性Redis为用户提供了Sentinel工具,Redis Sentinel可以用过心跳检测的方式监视多个主服务器以及它们属下的所有从服务器,并在主服务器不可用时自动进行故障转移。Redis Sentinel提供如下功能:
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
1.启动Sentinel
Redis Sentinel的程序文件名为redis-sentinel,它通常与Redis服务器位于同一个文件夹(在Redis安装包下的src文件夹中)。因为用户想要在配置文件中指定想要被Sentinel监控的主服务器,并且Sentinel也需要在配置文件中写入信息以记录从主服务器的状态,所以用户在启动Sentinel时必须传入一个可写的配置文件作为参数(如果配置文件不是可写的,那么Sentinel将放弃启动并报告一个错误),例如: ```git //sentinel启动方式1,/etc/sentinel.conf为sentinel脚本的路径 redis-sentinel /etc/sentinel.conf
//sentinel启动方式2,启动redis服务器时指定sentinel参数 redis-server /etc/sentinel.conf —sentinel
一个Sentinel配置文件至少包含如下选项:
```git
sentinel monitor <master-name> <ip> <port> <quorum>
master-name用于指定主服务器的名称,这个名称在执行各种Sentinel操作时经常会用到。ip和port用于指定主服务器的ip和端口号。quorum参数用于指定判断这个主服务器下线所需的Sentinel数量,假设quorum为2则表示主服务器判断为失效需要2个Sentinel同意(只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。如果要监视多个主服务器可以指定多条sentinel monitor选项。
下面将介绍Redis的复制功能搭建主从复制(一主两从),并使用Sentinel监视主服务器。
########################## 主从复制搭建 #########################
# (1).拷贝2份Redis默认配置文件,文件位于的源码包根目录的redis.conf,假设拷贝后的文件名为redis-my01.conf,redis-my02.conf
# (2).分别编辑redis-my01.conf、redis-my02.conf,将它们的port分别修改为6380、6381
# (3).依次指定配置文件启动一主两从服务,启动后使用redis-cli连接
# (3-1).进入源码根目录,指定redis配置文件启动主服务,使用redis-cli连接redis-server
./src/redis-server redis.conf
./src/redis-cli -h 172.16.178.128 -p 6379 -a 123456
# (3-2).再打开一个终端,启动从服务器1,步骤与上一步是一样的
./src/redis-server redis-my01.conf
./src/redis-cli -h 172.16.178.128 -p 6380 -a 123456
# (3-3).再打开一个终端,启动从服务器2,步骤与上一步是一样的
./src/redis-server redis-my02.conf
./src/redis-cli -h 172.16.178.128 -p 6381 -a 123456
# (4).在从服务器cli执行replicaof命令进行主从复制,replicaof语法为: replicaof 主服务器的host 主服务器的port
#(4-1).在172.16.178.128:6380客户端执行 replicaof 172.16.178.128 6379
#(4-1).在172.16.178.128:6381客户端执行 replicaof 172.16.178.128 6379
# (5).因为主服务器设置了密码(否则你会发生主从复制不生效),所以需要设置一个 slave 对 master 进行验证,如果要在当前运行的实例上进行验证操作,执行以下命令即可;如果想永久设置则可以在从服务器的配置文件设置。
config set masterauth 123456
# (6).验证主从复制是否搭建成功,首先在主服务器(6379端口)存储一个key,然后在从服务器获取这个key,如果key存在则说明主从复制成功了。也可以通过role命令查看主从关系信息。
########################## Sentinel搭建 #########################
(1).新建名为sentinel-my.conf的文件作为配置Sentinel的配置文件,sentinel-my.conf内容如下:
sentinel monitor master_node localhost 6379 1
说明:master_node为Sentinel所监控服务器的名称,localhost为监控服务器的host,6379为监控服务器的端口,1表示判断服务器失效需要1个Sentinel节点。
(2).通过sentinel程序指定sentinel配置文件,例如:./src/redis-sentinel sentinel-my.conf
Sentinel监视一个主服务器之后,就会去获取被监视主服务器的从服务器名单,并根据名单对各个从服务器进行监视,整个过程是自动的,所以只要监视主服务器即可,主服务器的从服务器由Sentinel自动获取并监视。除此之外,Sentinel还会对每个被监视的服务器实施心跳检测,并记录各个服务器的在线状态、响应速度等信息,当Sentinel发现被监视的主服务器不可用时,它就会开始对不可用的主服务器进行故障转移。假设此时杀死主服务器进程(效果如下图),Sentinel自动对6379主服务器进行故障转移,切换主服务器到6381这服务器。
假设把6379这台服务器重新启动,发现Sentinel将6379设置为当前主服务器(6381)的从服务器了,效果如下图:
1.1 redis-server 与 redis-sentinel之间的关系
redis-sentinel实际上就是一个运行在特殊模式下的Redis server,所以用户也可以通过命令 redis-server sentinel.conf —sentinel去启动一个Sentinel,这里的—sentinel用于指定Redis server进入sentinel模式,从而变成Redis Sentinel而不是普通的Redis server。
1.2 处理重新上线的旧主服务器
Sentinel对不可用的主服务器进行故障转移后,仍继续会对不可用的主服务器进行心跳检测,当这个服务器重新上线时,Sentinel会将它设置为当前主服务器的从服务器。
1.3 设置从服务器的优先级
用户可以通过replica-priorty配置选项来设置各个从服务器的优先级,优先级较高的从服务器在Sentinel选择新主服务器时会优先被选择。replica-priorty的默认值为100,这个值越小优先级越高,如果replica-priorty的值为0表示从服务器永远不会被选举为主服务器。通过优先级的设置可以尽可能的将性能好的机器设置为主服务器。
1.4 新主服务器的选举规则
当Sentinel在多个从服务器中选择其中一个作为新主服务器时,首先会根据以下规则从候选名单剔除不符条件的从服务器:
- 否决所有已经下线以及长时间没有回复心跳检测的疑似已下线从服务器。
- 否决所有长时间没有与主服务器通信,数据状态为过时的从服务器。
- 否决所有优先级为0的从服务器。
然后根据以下规则,在剩余的从服务器候选名单中选举出新的主服务器:
- 优先级最高的从服务器获胜。
- 如果优先级最高的从服务器具有两个或以上,那么复制偏移量最大的那台服务器获胜。
- 如果符合上述两个条件的从服务器有两个或以上,那么选举出它们当中运行ID最小的那一个。运行ID是服务器启动时自动生成的随机ID,这规则可以确保条件完全相同的多个从服务器最终得到一个有序的比较结果。