版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36666651/article/details/82883373
redis sentinel 脚本机制
1).sentinel notification-script
通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
# 配置示例:
sentinel notification-script mymaster /var/redis/notify.sh
2).sentinel client-reconfig-script
当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。以下参数将会在调用脚本时传给脚本:
<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
目前总是“failover”,是“leader”或者“observer”中的一个。参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的。这个脚本应该是通用的,能被多次调用,不是针对性的。
# 配置示例:
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
实现twemproxy自动进行主从切换
根据redis sentinel的脚本机制,我们可以配置 client-reconfig-script脚本,当redis进行主从切换后,执行脚本进行相应步骤,达到切换效果。
脚本执行内容:
- 1、获取原始master的ip和port、新master的ip和port、集群的master-name
- 2、修改twemproxy的配置文件
- 3、关闭twemproxy
- 4、使用新的配置文件启动twemproxy
脚本示例:
#!/bin/bash
### sentinel 触发执行此脚本时,会默认传递几个参数过来
### <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
monitor_name="$1"
master_old_ip="$4"
master_old_port="$5"
master_new_ip="$6"
master_new_port="$7"
# 这里通过获取 master-group-name 来修改 twemproxy 的配置文件,这里定的一点规范而已
# 因为我测试只挂了一个节点在后面,所以直接使twemproxy的配置等文件与sentinel的master-name相同即可
# 正常情况下后面应该有多个分片集群,集群名可以使用mymaster_1等方式,然后进行对应截取来获取文件名称等,方式多种
twemproxy_name="$1" ##注意
twemproxy_home="/home/redis-test/twemproxy"
twemproxy_bin=$twemproxy_home"/sbin/nutcracker"
twemproxy_conf=$twemproxy_home"/conf/${twemproxy_name}.yml"
twemproxy_pid=$twemproxy_home"/pids/${twemproxy_name}.pid"
twemproxy_log=$twemproxy_home"/logs/${twemproxy_name}.log"
twemproxy_cmd="${twemproxy_bin} -c ${twemproxy_conf} -p ${twemproxy_pid} -o ${twemproxy_log} -d"
## 使用sed命令将新的master 端口和ip 替换掉 twemproxy 配置文件中旧的master 信息
sed -i "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" ${twemproxy_conf}
## kill 掉根据旧配置文件启动的nutcracker 进程 ,并重新启动
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
测试
- 1、首先启动redis主从集群
- 2、启动redis哨兵集群,配置文件加入client-reconf-script参数配置:
sentinel client-reconfig-script mymaster /usr/local/redis/twemproxy-reconfig.sh
- 3、启动twemproxy
/home/redis-test/twemproxy/sbin/nutcracker -c /home/redis-test/twemproxy/conf/mymaster.yml -p /home/redis-test/twemproxy/pids/mymaster.pid -o /home/redis-test/twemproxy/logs/mymaster.log -d
- 4、挂掉某个redis的master节点,看客户端是否可以访问,查看twemproxy配置文件,