Redis sentinel哨兵集群
Redis sentinel哨兵集群
sentinel(sen/te/nou)
redis哨兵集群
作用:可以實現類似mysql的mha的相關操作,實時監(jiān)控redis各個數據庫的運行情況,并且在主庫停止運行時,可以實現自動的故障轉移,是實現redis高可用的基礎
實現過程:
1、哨兵節(jié)點會定期監(jiān)控整個redis數據節(jié)點運行情況
2、當發(fā)現主節(jié)點宕機時,哨兵之間會通過選舉,選出一個領導節(jié)點來進行故障轉移操作
3、在從節(jié)點列表中選出一個節(jié)點作為新的主節(jié)點,方法如下:
(1)過濾:“不健康”(主觀下線、斷線)、在規(guī)定時間(5秒)內沒有回復Sentinel節(jié)點ping響應,則不會選為新的主節(jié)點,因為這個從節(jié)點可能已經宕機或者性能較差響應速度慢
(2)選擇slave-priority(從優(yōu)先級)最高的從節(jié)點列表(數字越小優(yōu)先級越高),如果存在則返回,不存在則繼續(xù)。
(3)選擇復制偏移量最大的從節(jié)點,也就是看那個從庫數據最新
(4)選擇runid最小的從節(jié)點,因為runid每次都會隨著重啟而改變,所以相當于隨機選擇
4、領導者節(jié)點會對第一步選出來的從節(jié)點執(zhí)行slaveof no one命令,使其成為主
5、領導者節(jié)點會向剩余的從節(jié)點發(fā)送命令,讓他們成為新主的從節(jié)點
6、Sentinel節(jié)點集合會將原來的主節(jié)點更新為從節(jié)點并保持這對其關注,當其恢復后命令它去復制新的主節(jié)點。
實現原理:
sentiel哨兵集群其主要原理就是通過三個定時任務進行實時的監(jiān)控,從而判斷各個節(jié)點是否正常
主觀下線:表示sentinel自己對主節(jié)點宕機的判定
當一個sentinel通過ping命令對主節(jié)做心跳檢測,如果sentinel沒有收到有效回復,那么該sentinel節(jié)點就會主觀的認為該主節(jié)點已經停掉了,從而標記為主觀下線,因為只有一個sentinel判定節(jié)點停止,所以會存在誤判斷的可能。
客觀下線:表示多個sentinel在交流后一致判定主節(jié)點宕機
當標記為主觀下線后,sentinel會加快廣播包的發(fā)送頻率,當同一頻道內的其他sentinel收到后,也會給主節(jié)點發(fā)送心跳包檢測,當超過一半的sentinel都判定主節(jié)點宕機后,那么他們會統(tǒng)一的將主節(jié)點標記為客觀下線
領導這選舉:因為有多個sentinel,如果說讓其都去執(zhí)行故障轉移操作,則會出現沖突,所以會通過領導者算法,而選舉出執(zhí)行故障轉移的sentinel節(jié)點,讓其單獨執(zhí)行故障轉移,大體思路如下:
(1)每個在線的Sentinel節(jié)點都有資格成為領導者,當他確認主節(jié)點主觀下線時,會向其他Sentinel節(jié)點發(fā)送sentinel is-master-down-by-addr命令,要求將自己設置為領導者。
(2)收到命令的節(jié)點,如果沒有同意過其他節(jié)點的請求,則會同意該請求,否則拒絕。
(3)如果某一個節(jié)點的票數已經大于等于max(quorum,num(sentinels)/2+1),那么它將成為領導者
(4)如果此過程沒有選舉出領導者,將進入下一次選舉
從以上過程可以推斷出,最先發(fā)現主節(jié)點宕機的sentinel節(jié)點,將最有可能成為領導者
哨兵只能實現redis的故障轉移,并不能實現高可用,高可用可以配合keepalive實現,在設置優(yōu)先級的時候注意,redis中優(yōu)先級數字越小優(yōu)先級越高,keepalived中優(yōu)先級數字越大優(yōu)先級越高
Redis哨兵集群及keepalived部署
==Redis哨兵集群及keepalived部署=
主redis:192.168.40.11
從redis:192.168.40.12 192.168.40.13
192.168.40.11和192.168.40.12做keepalived高可用
=環(huán)境部署
systemctl stop firewalld
setenforce 0
yum -y install gcc gcc-c++
===安裝redis=
tar -xf redis-4.0.9.tar.gz
cd redis-4.0.9/
make
cd src/
#其中redis-server是服務端程序,redis-cli是客戶端程序,redis.conf是redis的配置文件,redis-benchmark是redis的壓力測試工具,
mkdir -p /usr/local/redis
cp -p redis-server redis-cli redis-benchmark /usr/local/redis/
cp /root/redis-4.0.9/redis.conf /usr/local/redis/
cd /usr/local/redis/
ln -s /usr/local/redis/redis-cli /usr/bin/redis
修改所有服務器的redis配置文件
#將redis監(jiān)聽的網卡IP改成自身對外監(jiān)聽的網卡IP地址
sed -i "/^bind 127.0.0.1 / s / 127.0.0.1 / / s/127.0.0.1/ /s/127.0.0.1/(ifconfig ens32 | awk 'NR2 {print $2}’)/g" /usr/local/redis/redis.conf
#關閉redis的保護模式,類似linux的安全機制,所以必須關閉
sed -i ‘/protected-mode/s/yes/no/g’ /usr/local/redis/redis.conf
#開啟redis后臺守護進程模式,否則redis會在前臺運行
sed -i ‘/daemonize/s/no/yes/g’ /usr/local/redis/redis.conf
#設置redis密碼
sed -i ‘/requirepass/s/foobared/123123/g’ /usr/local/redis/redis.conf
#將redis密碼那一行得注釋去掉
sed -i ‘/requirepass 123123/s/^#//g’ /usr/local/redis/redis.conf
#修改日志文件存放路徑及名稱
sed -i ‘/logfile/s@""@"/var/log/redis.log"@g’ /usr/local/redis/redis.conf
#修改redis最大使用內存,需要小于主機內存或等于主機內存,可使用free -m查詢主機內存
sed -i ‘/maxmemory /s//500MB/g’ /usr/local/redis/redis.conf
sed -i ‘/maxmemory 500MB/s/^#//g’ /usr/local/redis/redis.conf
=主庫生成redis啟動腳本
cat <>/etc/init.d/redis
#!/bin/sh
chkconfig: 2345 80 90
description: Start and Stop redis
#PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/redis-server
REDIS_CLI=/usr/local/redis/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/usr/local/redis/redis.conf"
AUTH=“123123”
LISTEN_IP=$(netstat -utpln |grep redis-server |awk ‘{print $4}’|awk -F’:’ ‘{print $1}’ |uniq)
case “$1” in
start)
if [ -f $PIDFILE ]
then
echo “$PIDFILE exists, process is already running or crashed”
else
echo “Starting Redis server…”
$EXEC $CONF
fi
if [ “$?”=“0” ]
then
echo “Redis is running…”
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo “$PIDFILE does not exist, process is not running”
else
PID=$(cat $PIDFILE)
echo “Stopping …”
$REDIS_CLI -h $LISTEN_IP -p $REDISPORT -a $AUTH SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo “Waiting for Redis to shutdown …”
sleep 1
done
echo “Redis stopped”
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo “Usage: /etc/init.d/redis {start|stop|restart|force-reload}” >&2
exit 1
esac
END
chmod +x /etc/init.d/redis
======配置主從復制
=======主庫配置文件優(yōu)化
#如果redis作為緩存使用,可以不使用該優(yōu)化,具體可根據實際情況選擇
#設置slave節(jié)點的數量,如果slave節(jié)點數量少于此值,那么master節(jié)點將停止客戶端的一切寫請求,從而保證至少有一臺從庫和自己的數據時完全一致的
sed -i ‘/# min-slaves-to-write/ s/2/1/g’ redis.conf
sed -i ‘/# min-slaves-to-write/ s/#//g’ redis.conf
#master與slave之間同步數據的延遲時間,若超過此時間,master節(jié)點將停止客戶端的一切寫操作
sed -i ‘/# min-slaves-max-lag 10/ s/#//g’ redis.conf
#指定連接mater的密碼,因為在后續(xù)的故障轉移過程中,master作為從時,sentine不會自動生成新主的密碼,整個架構中他們的密碼是相同的,所以在這里我們提前指定好密碼,方便后續(xù)故障轉移后,原主庫能夠實現主從復制
sed -i ‘/masterauth/ s/# masterauth /masterauth 123123/g’ /usr/local/redis/redis.conf
====修改所有從庫配置文件=
#指定主庫IP及端口號
sed -i ‘/# slaveof/ s/# slaveof /slaveof 192.168.40.11 6379/g’ /usr/local/redis/redis.conf
#指定連接mater的密碼
sed -i ‘/masterauth/ s/# masterauth /masterauth 123123/g’ /usr/local/redis/redis.conf
以上全部配置好后,啟動redis,通過info replication查看主從復制是否正常=
======配置redis sentinel(配置在從庫上,或配置在架構中的所有redis上)=
cd /root/redis-4.0.9/
cp src/redis-sentinel /usr/local/redis/
cp sentinel.conf /usr/local/redis/
==編輯sentinel.conf配置文件
vim /usr/local/redis/sentinel.conf
#dG將文件中的所有內容刪掉,改成以下內容
port 26379 #指定sentinel端口號
dir “/var/redis/data” #指定sentinel日志存放目錄
sentinel monitor kgc 192.168.40.11 6379 1 #指定主庫信息,kgc表示給主庫起了個名字,后面可以調用這個名字,后面是主庫的IP及對應的redis監(jiān)聽端口,1表示當有多少個哨兵認為master失效時,master才算真正失效
sentinel down-after-milliseconds kgc 3000 #指定master失效時間,當在規(guī)定時間內,master沒有回應sentinel時,則會標記為主觀下線,單位毫秒,默認為3秒
sentinel auth-pass kgc 123123 #指定連接主庫和從庫時的密碼,在設置主從復制時,應該將主庫和從庫的密碼設置為相同
sentinel parallel-syncs kgc 1 #指定當故障轉移完成之后,最多有多少個slave同時對新的master進行同步,數字越小,完成故障轉移時間越長,如果數字過大,則會造成多臺slave因為數據同步而無法對外提供服務
sentinel failover-timeout kgc 180000 #故障轉移的超時時間,單位毫秒,如果在規(guī)定時間內沒有完成故障轉移,則重新連接
protected-mode no #關閉保護模式,必須要關閉,否則可能會造成無法故障轉移
daemonize yes #以守護進程方式啟動
=啟動哨兵模式==
mkdir -p /var/redis/data
/usr/local/redis/redis-sentinel /usr/local/redis/sentinel.conf
netstat -anpt |grep 26379
#登錄redis sentinel,通過info sentinel可以查看哨兵的相關信息
redis -h 192.168.40.13 -p 26379 -a 123123
=測試故障轉移==
#停掉主庫,然后登錄任意從庫,通過info replication查看主從復制信息,查看主庫是否發(fā)生變化
#啟動舊主redis并登錄,查看主從復制信息,看自己是否成為從庫
#在新主創(chuàng)建一個鍵,測試舊主是否能查看到,從而確定主從同步是否正常
#恢復原始狀態(tài),使舊主依然作為主庫,用于配置后續(xù)的keepalived高可用
(1)關閉sentinel
(2)關閉所有redis
(3)修改配置文件中的slaveof
(4)修改sentinel配置文件中的主從信息
=配置keepalived高可用
====修改redis優(yōu)先級,從而在后續(xù)配置高可用時可以使vip準確的漂移
#當恢復原始狀態(tài)完成后,不要啟動redis及sentinel,執(zhí)行以下操作
#修改主庫優(yōu)先級,注意數字越低,級別越高
sed -i ‘/slave-priority/ s/100/98/g’ /usr/local/redis/redis.conf
#修改192.168.40.12優(yōu)先級
sed -i ‘/slave-priority/ s/100/99/g’ /usr/local/redis/redis.conf
安裝keepalived=
yum -y install keepalived
====修改主keepalived主配置文件=
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id redis1
}
vrrp_script redis { #調用腳本監(jiān)控模塊
script /opt/redis.sh #監(jiān)控腳本存放位置及名稱
interval 3 #健康檢查時間
}
vrrp_instance VI_1 {
state SLAVE
interface ens32
virtual_router_id 51
priority 100
advert_int 1
nopreempt #不搶占參數
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #調用腳本監(jiān)控模塊
redis
}
virtual_ipaddress { #設置VIP
192.168.40.150
}
}
========修改從keepalived主配置文件=
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id redis2
}
vrrp_script redis { #調用腳本監(jiān)控模塊
script /opt/redis.sh #監(jiān)控腳本存放位置及名稱
interval 3 #健康檢查時間
}
vrrp_instance VI_1 {
state SLAVE
interface ens32
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #調用腳本監(jiān)控模塊
redis
}
virtual_ipaddress { #設置VIP
192.168.40.150
}
}
===生成監(jiān)控腳本
====生成方式一
vim /opt/redis.sh
#!/bin/bash
IP=$(ifconfig ens32 |awk ‘NR==2 {print $2}’)
/usr/local/redis/redis-cli -h $IP -p 6379 -a 123123 -c info replication &> /dev/null
if [ $? -eq 1 ]
then
systemctl stop keepalived
else
exit 0
fi
==生成方式二
cat <> /opt/redis.sh
#!/bin/bash
IP=$(ifconfig ens32 |awk 'NR2 {print $2}’)
/usr/local/redis/redis-cli -h $IP -p 6379 -a 123123 -c info replication &> /dev/null
if [ $? -eq 1 ]
then
systemctl stop keepalived
else
exit 0
fi
EOF
=修改所有redis主配置文件中的bind IP地址=====
#由于后續(xù)需要通過VIP來實現高可用,如果bind參數依然設置為自身IP,那么則會造成redis只能實現VIP漂移,而VIP卻沒有實質作用,無法通過VIP來實現登錄數據庫,解決辦法如下
#將bind參數中的IP地址改為0.0.0.0,表示監(jiān)聽任意IP
bind 0.0.0.0
修改所有從庫的slaveof========
#將所有slaveof改為主庫IP地址
slaveof 192.168.40.11 6379
修改sentinel.conf配置文件==
#將其中master的IP地址改為主庫IP地址
sentinel monitor kgc 192.168.40.11 6379 1
=最終測試====
1、先啟動主庫,然后再依次啟動所有從庫
2、啟動keeplived
3、啟動sentinel
4、查看主庫是否有VIP
5、通過-c選項,使用info replication查看主從復制狀態(tài)
6、關閉主庫
7、在備份庫上查看VIP是否漂移到這邊
8、修復損壞的主庫,并查看VIP是否會被搶回來,如果不搶則表示高可用配置正確
9、在所有庫上通過-c選項,使用info replication查看主從復制狀態(tài)
redis -h 192.168.40.13 -p 6379 -a 123123 -c info replication
總結
以上是生活随笔為你收集整理的Redis sentinel哨兵集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坐标系转换简介
- 下一篇: PC电脑桌面小白块图标恢复图标代码