Redis + Twemproxy(四)之 Sentinel 集群

在前面的文章中,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 的配置项:
    sentinel client-reconfig-script mymaster /root/twemproxy/reconfig.sh
    
    其中 reconfig.sh 用于自动更新 Twemproxy 配置文件中的 Master 信息:
#! /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 上标注:目前还不能应用到生产环境。
在这里插入图片描述

发布了112 篇原创文章 · 获赞 22 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u010601662/article/details/104715711