redis sentinel + keepalived
keepalived配置
global_defs { router_id REIDS_ROUTE } vrrp_instance check_redis { script "/uc/bin/redis_check_status.sh" interval 4 weight 5 fall 3 rise 2 } vrrp_instance VI_REDIS_ROUTE { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.2.99 } # track_script { # check_redis # } # notify_master # notify_slave # notify_fault # notify_stop }
redis_check_status.sh
1 #!/bin/bash 2 REDIS_PASSWD="test" 3 REDIS_HOME="/usr/local/redis" 4 CHECK_STATUS=`$REDIS_HOME/bin/redis-cli -a $REDIS_PASSWD PING` 5 6 if [ $CHECK_STATUS = "PONG" ] 7 then 8 echo $CHECK_STATUS 9 exit 0 10 else 11 echo $CHECK_STATUS 12 service keepalived stop 13 exit 1 14 fi
redis的keepalive判断逻辑

redis的keepalive判断代码
keepalived_state.py
1 #!/usr/bin/env python3 2 """ 3 该脚本需要配置到定时任务中,执行间隔视sentinel.conf 配置文件中sentinel failover-timeout而定,如sentinel.conf 4 中配置是10000,即10s,则定时任务最好每10秒执行一次,配置如下 5 * * * * * /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 6 * * * * * sleep 10 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 7 * * * * * sleep 20 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 8 * * * * * sleep 30 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 9 * * * * * sleep 40 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 10 * * * * * sleep 50 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 11 """ 12 import sys 13 import os 14 import shlex 15 import datetime 16 import time 17 18 vip = "172.16.2.99/24" ##keealived 的虚拟ip地址,从keepalived.conf中配置项virtual_ipaddress中配置 19 eth = "eth0" ##服务器配置该vip的以太网卡名称 20 redis_home = "/usr/local/redis" ##redis安装路径 21 redis_passwd = "test" ## redis密码 22 redis_status_flag = "PONG" ##用于判断redis存活状态 23 redis_role_flag = "master" ##用于判断redis的角色是master还是slave 24 redis_keepalived_log_path = '/'.join([redis_home,"var","logs","Redis_keepalived_status.log"]) ##日志输出路径 25 26 #通过传入执行命令,获取执行结果 27 def get_cmd_data_result(cmd): 28 data = cmd.readlines() 29 if len(data) == 0: 30 result = data 31 if len(data) == 1: 32 result = shlex.split(data[0]) 33 return result 34 35 #通过输入虚拟IP(vip)地址,判断该IP是否已经配置在服务器上 36 def get_vip_addr_info(ip): 37 cmd_data = os.popen("/sbin/ip addr list | grep " + ip) 38 result_list = get_cmd_data_result(cmd_data) 39 return result_list 40 41 #设置虚拟IP(vip)地址到该服务器上 42 def set_vip_addr(ip): 43 os.popen("/sbin/ip addr add " + ip + " dev " + eth) 44 45 #删除该服务器上已经配置了的虚拟IP(vip)地址 46 def del_vip_addr(ip): 47 os.popen("/sbin/ip addr del " + ip + " dev " + eth) 48 49 #通过执行shell命令获取redis存活状态 50 def get_redis_status(cmd): 51 cmd_data = os.popen(redis_home + "/bin/redis-cli " + "-a " + redis_passwd + " " + cmd ) 52 result = get_cmd_data_result(cmd_data) 53 if len(result) == 0: 54 result_list = [] 55 if len(result) == 1: 56 result_list = result 57 return result_list 58 59 #通过执行shell命令获取redis服务器的角色名称 60 def get_redis_role(cmd): 61 cmd_data = os.popen(redis_home + "/bin/redis-cli " + "-a " + redis_passwd + " " + cmd + "|" + "grep " + "role" ) 62 result = get_cmd_data_result(cmd_data) 63 if len(result) == 0: 64 result_list = [] 65 if len(result) == 1: 66 result_list = result[0].split(":")[1] 67 return result_list 68 69 #写入日志 70 def file_write(data,file): 71 with open(file,'a+') as f: 72 f.write(data + "\n") 73 74 current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 75 redis_status = get_redis_status("PING") 76 redis_role = get_redis_role("INFO") 77 redis_vip_info = get_vip_addr_info(vip) 78 #print(redis_status) 79 #print(redis_role) 80 #print(redis_vip_info) 81 redis_info = ["Redis server is avaliable!","Redis server is not running!", 82 "there is a virtual ip address(172.16.2.99) on Redis server!","there is not virtual ip address(172.16.2.99) on Redis server!", 83 "Redis server is on master mode!","Redis server is on slave mode!"] 84 85 if redis_status_flag in redis_status: ##判断redis是否存活,如果存活,再判断redis的角色是master还是slave 86 file_write(' '.join([current_time,redis_info[0]]),redis_keepalived_log_path) ## 如果存活,打印存活信息 87 if redis_role == redis_role_flag: ##判断redis角色为master 88 file_write(' '.join([current_time,redis_info[4]]),redis_keepalived_log_path) ##打印当前redis角色名称:master 89 if vip in redis_vip_info: ##判断该服务器是否配置了VIP 90 file_write(' '.join([current_time,redis_info[2]]),redis_keepalived_log_path) ##如果配置了VIP,打印存在vip信息 91 else: 92 file_write(' '.join([current_time,redis_info[3]]),redis_keepalived_log_path) ##没有配置vip,打印不存在vip的信息 93 set_vip_addr(vip) #给该服务器配置vip(因为该redis的角色是master,所以必须配置vip映射到该master服务器上) 94 else: ##该服务器的redis角色为slave 95 file_write(' '.join([current_time,redis_info[5]]),redis_keepalived_log_path) ##打印slave角色信息到指定文件 96 if vip in redis_vip_info:##redis角色为slave但是已经配置了vip 97 file_write(' '.join([current_time,redis_info[2]]),redis_keepalived_log_path) ## 打印vip信息到指定文件 98 del_vip_addr(vip) 99 else: ##redis角色为slave,没有配置vip 100 file_write(' '.join([current_time,redis_info[3]]),redis_keepalived_log_path) ## 打印vip信息到指定文件 101 102 else: ##redis服务处于宕机状态 103 file_write(' '.join([current_time,redis_info[1]]),redis_keepalived_log_path) ##打印宕机状态到指定文件 104 if vip in get_vip_addr_info(vip):##判断该服务器配置了vip 105 file_write(' '.join([current_time,redis_info[2]]),redis_keepalived_log_path) ## 打印vip信息到指定文件 106 del_vip_addr(vip) 107 else:##该服务没有配置vip 108 file_write(' '.join([current_time,redis_info[3]]),redis_keepalived_log_path) ## 打印vip信息到指定文件
配置定时任务
该定时任务第10秒执行“keepalived_state.py”脚本
1 * * * * * /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 2 * * * * * sleep 10 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 3 * * * * * sleep 20 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 4 * * * * * sleep 30 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 5 * * * * * sleep 40 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null 6 * * * * * sleep 50 && /usr/local/python3/bin/python3 /uc/bin/keepalived_state.py 2>&1 /dev/null
每天更新一点点,温习一点点点,进步一点点
浙公网安备 33010602011771号