lmgsanm

每天学习一点,每天进步一点点…… Tomorrow is another beatifull day

导航

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

 

 

 

posted on 2018-08-15 08:56  lmgsanm  阅读(416)  评论(0)    收藏  举报