在前面的文章中,Redis 采用主从备份,会带来两个问题:
1、当 Master 出现故障后,需要手动将 Slave 晋升为 Master;
2、Twemproxy 配置文件中所使用的是 Master 节点,这是因为只有 Master 才具备写能力,所有的 Slave 只能读。结果可能导致:当 Slave 晋升为 Master,必须手动修改配置文件中 Master ip/port。
一、配置 Redis
本次测试仍采用之前的两台 Debian 虚拟机,各自部署两台 Redis 实例。
主机名称 | IP地址 | 描述 |
---|---|---|
server01 | 192.168.255.128 | Master:192.168.255.128:7000,Slave_01:192.168.255.128:7001 |
server02 | 192.168.177.128 | Slave_02:192.168.177.128:7003,Slave_03:192.168.177.128:7004 |
修改 Master 节点配置文件:
bind 192.168.255.128
port 7000
daemonize yes
logfile "/root/redis_cluster/redis_7000/redis_7000.log"
dbfilename dump_7000.rdb
masterauth www.wave.com
requirepass www.wave.com
以 Slave_01 为例,修改 Slave 节点配置文件:
bind 192.168.255.128
port 7001
daemonize yes
logfile "/root/redis_cluster/redis_7001/redis_7001.log"
dbfilename dump_7001.rdb
replicaof 192.168.255.128 7000
masterauth www.wave.com
requirepass www.wave.com
启动所有 Redis 节点 ,并验证:
验证主从关系:
二、配置 Sentinel
Sentinel 集群至少使用三个节点,这是因为 Sentinel 在启动故障转移(failover)时需要满足两个条件:
- 确定 Master 不可用的 Sentinel 数量必须大于等于 quorum;
- 大多数的 Sentinel 之间必须可以通信(大多数的意思是两台就是2,三台也是2,五台就是3)。这里通信目的是,选举出由谁来执行 failover 操作。
这就是为什么不推荐使用两台 Sentinel 做哨兵。因为如果其中一台 Sentinel 宕掉后,即使 quorum 设置的是1,第二个条件始终无法满足。
由于测试条件限制,测试在两台 Debian 虚拟机部署三台 Sentinel 实例。
主机名称 | IP地址 | 描述 |
---|---|---|
server01 | 192.168.255.128 | Sentinel_01:192.168.255.128:26379,Sentinel_02:192.168.255.128:26380 |
server02 | 192.168.177.128 | Sentinel_03:192.168.177.128:26381 |
三台 Sentinel 节点配置类似,只需更改 port 即可。以 Sentinel_01 为例:
port 26379
daemonize yes
logfile "sentinel_26379.log"
dir /root/redis_cluster/sentinel_26379
sentinel monitor mymaster 192.168.255.128 7000 2
sentinel auth-pass mymaster www.wave.com
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
注:
1、sentinel monitor <master-name> <ip> <port> <quorum>
Sentinel 定期监控的 Master Redis 信息。
master-name:Master 节点的名;
ip/port:Master 节点的地址;
quorum:判定 Master 节点最终不可达所需要的票数,一般建议设置为 Sentinel 节点数的一半加1。同时还与 Sentinel 节点的领导者选举有关,即至少要有 max(quorum,num(sentinels)/2+1)个 Sentinel 节点参与选举,才能选出领导者 Sentinel,从而完成故障转移。
2、sentinel auth-pass <master-name> <password>
Redis 节点的验证密码。
3、sentinel down-after-milliseconds <master-name> <milliseconds>
每个 Sentinel 节点定期发送 ping 命令来判断 Redis 节点和其余 Sentinel 节点是否可达。若在 down-after-milliseconds 时间内,没有收到有效回复,则判定节点不可达。单位:毫秒。
4、sentinel parallel-syncs <master-name> <numreplicas>
当 Sentinel 节点集合对主节点故障判定达成一致时,Sentinel 领导者节点会执行故障转移,选出新的主节点,原来的从节点会向新的主节点发起复制操作。parallel-syncs 用来限制在一次故障转移之后,每次向新的主节点发起复制操作的从节点个数。如果这个参数配置的比较大,那么会存在多个从节点同时向新的主节点发起复制操作,尽管复制操作通常不会阻塞主节点,但是同时向主节点发起复制,必然会对主节点所在的机器造成一定的网络和磁盘 IO 开销。
5、sentinel failover-timeout <master-name> <milliseconds>
failover-timeout 超时时间,作用于故障转移的各个阶段:
a)选出合适从节点;
b)晋升选出的从节点为主节点;
c)命令其余从节点复制新的主节点;
d)等待原主节点恢复后命令它去复制新的主节点。
启动所有 Sentinel 节点:
./redis-sentinel_26379 ./sentinel.conf
./redis-sentinel_26380 ./sentinel.conf
./redis-sentinel_26381 ./sentinel.conf
问题:
若 Sentinel 启动失败,提示:no such master with specified name,
是因为相关配置项位置不对,应该放到“sentinel monitor <master-name> <ip> <port> <quorum>”后面。
验证 Sentinel 状态:
./redis-cli -h 192.168.255.128 -p 26380 -a www.wave.com info Sentinel
可查看 Master 地址、Slave 节点数、Sentinel节点数。
三、Twemproxy + Sentinel 配置
Twemproxy 整合 Sentinel 的途径之一就是,一旦 Sentinel 执行故障转移并选举出新的 Master 节点,能自动更新 Twemproxy 配置并重启。
- 将 Twemproxy 与 Sentinel_01 整合,并修改 Sentinel_01 的配置项:
其中 reconfig.sh 用于自动更新 Twemproxy 配置文件中的 Master 信息:sentinel client-reconfig-script mymaster /root/twemproxy/reconfig.sh
#! /bin/bash
monitor_name="$1"
master_old_ip="$4"
master_old_port="$5"
master_new_ip="$6"
master_new_port="$7"
#twemproxy_name=$(echo $monitor_name | awk -F'_' '{print $1"_"$2}')
twemproxy_name=redis_master
twemproxy_bin="/root/twemproxy/nutcracker"
twemproxy_conf="/root/twemproxy/conf/${twemproxy_name}.conf"
twemproxy_pid="/root/twemproxy/${twemproxy_name}.pid"
twemproxy_log="/root/twemproxy/${twemproxy_name}.log"
twemproxy_cmd="${twemproxy_bin} -c ${twemproxy_conf} -p ${twemproxy_pid} -o ${twemproxy_log} -d"
sed -i "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" ${twemproxy_conf}
ps -ef |grep "${twemproxy_cmd}" |grep -v grep |awk '{print $2}'|xargs kill
${twemproxy_cmd}
sleep 1
ps -ef |grep "${twemproxy_cmd}" |grep -v grep
其中,Sentinel 在执行 reconfig.sh 前7个参数格式大致如下:
- 修改 Twemproxy 启动命令 start.sh
#! /bin/bash
#./nutcracker -c ./conf/redis_master.conf -p ./redis_master.pid -o ./redis_master.log -d
/root/twemproxy/nutcracker -c /root/twemproxy/conf/redis_master.conf -p /root/twemproxy/redis_master.pid -o /root/twemproxy/redis_master.log -d
四、测试
-
启动所有 Redis 与 Sentinel 节点
此时,Master 为 192.168.177.128:7003。 -
修改 Twemproxy 配置文件中 Master 信息并启动 Twemproxy。
-
kill Master 进程
可见,192.168.177.128:7004 被选举为 Master。 -
检查 Twemproxy 配置文件,确认 Master 信息是否变更。
-
确认 Twemproxy 是否已重启
四、smitty
smitty 是一款用 go 语言编写的、为了使 Twemproxy 能和 Redis Sentinel 一起工作的代理工具,目的是在 Redis 节点出现故障后扩展 Twemproxy 的 HA 能力。
它能够持续监控 Master 切换事件,当事件发生时,会自动更新 Twemproxy 配置文件并重启 Twemproxy。
github 地址:https://github.com/areina/smitty
但 github 上标注:目前还不能应用到生产环境。