1. 程式人生 > >redis sentinel的指令碼機制及實現twemproxy主從自動切換

redis sentinel的指令碼機制及實現twemproxy主從自動切換

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配置檔案,