Redis sentinel哨兵集群
Redis sentinel哨兵集群
sentinel(sen/te/nou)
redis哨兵集群
作用:可以實(shí)現(xiàn)類似mysql的mha的相關(guān)操作,實(shí)時(shí)監(jiān)控redis各個(gè)數(shù)據(jù)庫的運(yùn)行情況,并且在主庫停止運(yùn)行時(shí),可以實(shí)現(xiàn)自動(dòng)的故障轉(zhuǎn)移,是實(shí)現(xiàn)redis高可用的基礎(chǔ)
實(shí)現(xiàn)過程:
1、哨兵節(jié)點(diǎn)會(huì)定期監(jiān)控整個(gè)redis數(shù)據(jù)節(jié)點(diǎn)運(yùn)行情況
2、當(dāng)發(fā)現(xiàn)主節(jié)點(diǎn)宕機(jī)時(shí),哨兵之間會(huì)通過選舉,選出一個(gè)領(lǐng)導(dǎo)節(jié)點(diǎn)來進(jìn)行故障轉(zhuǎn)移操作
3、在從節(jié)點(diǎn)列表中選出一個(gè)節(jié)點(diǎn)作為新的主節(jié)點(diǎn),方法如下:
(1)過濾:“不健康”(主觀下線、斷線)、在規(guī)定時(shí)間(5秒)內(nèi)沒有回復(fù)Sentinel節(jié)點(diǎn)ping響應(yīng),則不會(huì)選為新的主節(jié)點(diǎn),因?yàn)檫@個(gè)從節(jié)點(diǎn)可能已經(jīng)宕機(jī)或者性能較差響應(yīng)速度慢
(2)選擇slave-priority(從優(yōu)先級(jí))最高的從節(jié)點(diǎn)列表(數(shù)字越小優(yōu)先級(jí)越高),如果存在則返回,不存在則繼續(xù)。
(3)選擇復(fù)制偏移量最大的從節(jié)點(diǎn),也就是看那個(gè)從庫數(shù)據(jù)最新
(4)選擇runid最小的從節(jié)點(diǎn),因?yàn)閞unid每次都會(huì)隨著重啟而改變,所以相當(dāng)于隨機(jī)選擇
4、領(lǐng)導(dǎo)者節(jié)點(diǎn)會(huì)對(duì)第一步選出來的從節(jié)點(diǎn)執(zhí)行slaveof no one命令,使其成為主
5、領(lǐng)導(dǎo)者節(jié)點(diǎn)會(huì)向剩余的從節(jié)點(diǎn)發(fā)送命令,讓他們成為新主的從節(jié)點(diǎn)
6、Sentinel節(jié)點(diǎn)集合會(huì)將原來的主節(jié)點(diǎn)更新為從節(jié)點(diǎn)并保持這對(duì)其關(guān)注,當(dāng)其恢復(fù)后命令它去復(fù)制新的主節(jié)點(diǎn)。
實(shí)現(xiàn)原理:
sentiel哨兵集群其主要原理就是通過三個(gè)定時(shí)任務(wù)進(jìn)行實(shí)時(shí)的監(jiān)控,從而判斷各個(gè)節(jié)點(diǎn)是否正常
主觀下線:表示sentinel自己對(duì)主節(jié)點(diǎn)宕機(jī)的判定
當(dāng)一個(gè)sentinel通過ping命令對(duì)主節(jié)做心跳檢測,如果sentinel沒有收到有效回復(fù),那么該sentinel節(jié)點(diǎn)就會(huì)主觀的認(rèn)為該主節(jié)點(diǎn)已經(jīng)停掉了,從而標(biāo)記為主觀下線,因?yàn)橹挥幸粋€(gè)sentinel判定節(jié)點(diǎn)停止,所以會(huì)存在誤判斷的可能。
客觀下線:表示多個(gè)sentinel在交流后一致判定主節(jié)點(diǎn)宕機(jī)
當(dāng)標(biāo)記為主觀下線后,sentinel會(huì)加快廣播包的發(fā)送頻率,當(dāng)同一頻道內(nèi)的其他sentinel收到后,也會(huì)給主節(jié)點(diǎn)發(fā)送心跳包檢測,當(dāng)超過一半的sentinel都判定主節(jié)點(diǎn)宕機(jī)后,那么他們會(huì)統(tǒng)一的將主節(jié)點(diǎn)標(biāo)記為客觀下線
領(lǐng)導(dǎo)這選舉:因?yàn)橛卸鄠€(gè)sentinel,如果說讓其都去執(zhí)行故障轉(zhuǎn)移操作,則會(huì)出現(xiàn)沖突,所以會(huì)通過領(lǐng)導(dǎo)者算法,而選舉出執(zhí)行故障轉(zhuǎn)移的sentinel節(jié)點(diǎn),讓其單獨(dú)執(zhí)行故障轉(zhuǎn)移,大體思路如下:
(1)每個(gè)在線的Sentinel節(jié)點(diǎn)都有資格成為領(lǐng)導(dǎo)者,當(dāng)他確認(rèn)主節(jié)點(diǎn)主觀下線時(shí),會(huì)向其他Sentinel節(jié)點(diǎn)發(fā)送sentinel is-master-down-by-addr命令,要求將自己設(shè)置為領(lǐng)導(dǎo)者。
(2)收到命令的節(jié)點(diǎn),如果沒有同意過其他節(jié)點(diǎn)的請求,則會(huì)同意該請求,否則拒絕。
(3)如果某一個(gè)節(jié)點(diǎn)的票數(shù)已經(jīng)大于等于max(quorum,num(sentinels)/2+1),那么它將成為領(lǐng)導(dǎo)者
(4)如果此過程沒有選舉出領(lǐng)導(dǎo)者,將進(jìn)入下一次選舉
從以上過程可以推斷出,最先發(fā)現(xiàn)主節(jié)點(diǎn)宕機(jī)的sentinel節(jié)點(diǎn),將最有可能成為領(lǐng)導(dǎo)者
哨兵只能實(shí)現(xiàn)redis的故障轉(zhuǎn)移,并不能實(shí)現(xiàn)高可用,高可用可以配合keepalive實(shí)現(xiàn),在設(shè)置優(yōu)先級(jí)的時(shí)候注意,redis中優(yōu)先級(jí)數(shù)字越小優(yōu)先級(jí)越高,keepalived中優(yōu)先級(jí)數(shù)字越大優(yōu)先級(jí)越高
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是服務(wù)端程序,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
修改所有服務(wù)器的redis配置文件
#將redis監(jiān)聽的網(wǎng)卡IP改成自身對(duì)外監(jiān)聽的網(wǎng)卡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
#關(guān)閉redis的保護(hù)模式,類似linux的安全機(jī)制,所以必須關(guān)閉
sed -i ‘/protected-mode/s/yes/no/g’ /usr/local/redis/redis.conf
#開啟redis后臺(tái)守護(hù)進(jìn)程模式,否則redis會(huì)在前臺(tái)運(yùn)行
sed -i ‘/daemonize/s/no/yes/g’ /usr/local/redis/redis.conf
#設(shè)置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最大使用內(nèi)存,需要小于主機(jī)內(nèi)存或等于主機(jī)內(nèi)存,可使用free -m查詢主機(jī)內(nèi)存
sed -i ‘/maxmemory /s//500MB/g’ /usr/local/redis/redis.conf
sed -i ‘/maxmemory 500MB/s/^#//g’ /usr/local/redis/redis.conf
=主庫生成redis啟動(dòng)腳本
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
======配置主從復(fù)制
=======主庫配置文件優(yōu)化
#如果redis作為緩存使用,可以不使用該優(yōu)化,具體可根據(jù)實(shí)際情況選擇
#設(shè)置slave節(jié)點(diǎn)的數(shù)量,如果slave節(jié)點(diǎn)數(shù)量少于此值,那么master節(jié)點(diǎn)將停止客戶端的一切寫請求,從而保證至少有一臺(tái)從庫和自己的數(shù)據(jù)時(shí)完全一致的
sed -i ‘/# min-slaves-to-write/ s/2/1/g’ redis.conf
sed -i ‘/# min-slaves-to-write/ s/#//g’ redis.conf
#master與slave之間同步數(shù)據(jù)的延遲時(shí)間,若超過此時(shí)間,master節(jié)點(diǎn)將停止客戶端的一切寫操作
sed -i ‘/# min-slaves-max-lag 10/ s/#//g’ redis.conf
#指定連接mater的密碼,因?yàn)樵诤罄m(xù)的故障轉(zhuǎn)移過程中,master作為從時(shí),sentine不會(huì)自動(dòng)生成新主的密碼,整個(gè)架構(gòu)中他們的密碼是相同的,所以在這里我們提前指定好密碼,方便后續(xù)故障轉(zhuǎn)移后,原主庫能夠?qū)崿F(xiàn)主從復(fù)制
sed -i ‘/masterauth/ s/# masterauth /masterauth 123123/g’ /usr/local/redis/redis.conf
====修改所有從庫配置文件=
#指定主庫IP及端口號(hào)
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
以上全部配置好后,啟動(dòng)redis,通過info replication查看主從復(fù)制是否正常=
======配置redis sentinel(配置在從庫上,或配置在架構(gòu)中的所有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將文件中的所有內(nèi)容刪掉,改成以下內(nèi)容
port 26379 #指定sentinel端口號(hào)
dir “/var/redis/data” #指定sentinel日志存放目錄
sentinel monitor kgc 192.168.40.11 6379 1 #指定主庫信息,kgc表示給主庫起了個(gè)名字,后面可以調(diào)用這個(gè)名字,后面是主庫的IP及對(duì)應(yīng)的redis監(jiān)聽端口,1表示當(dāng)有多少個(gè)哨兵認(rèn)為master失效時(shí),master才算真正失效
sentinel down-after-milliseconds kgc 3000 #指定master失效時(shí)間,當(dāng)在規(guī)定時(shí)間內(nèi),master沒有回應(yīng)sentinel時(shí),則會(huì)標(biāo)記為主觀下線,單位毫秒,默認(rèn)為3秒
sentinel auth-pass kgc 123123 #指定連接主庫和從庫時(shí)的密碼,在設(shè)置主從復(fù)制時(shí),應(yīng)該將主庫和從庫的密碼設(shè)置為相同
sentinel parallel-syncs kgc 1 #指定當(dāng)故障轉(zhuǎn)移完成之后,最多有多少個(gè)slave同時(shí)對(duì)新的master進(jìn)行同步,數(shù)字越小,完成故障轉(zhuǎn)移時(shí)間越長,如果數(shù)字過大,則會(huì)造成多臺(tái)slave因?yàn)閿?shù)據(jù)同步而無法對(duì)外提供服務(wù)
sentinel failover-timeout kgc 180000 #故障轉(zhuǎn)移的超時(shí)時(shí)間,單位毫秒,如果在規(guī)定時(shí)間內(nèi)沒有完成故障轉(zhuǎn)移,則重新連接
protected-mode no #關(guān)閉保護(hù)模式,必須要關(guān)閉,否則可能會(huì)造成無法故障轉(zhuǎn)移
daemonize yes #以守護(hù)進(jìn)程方式啟動(dòng)
=啟動(dòng)哨兵模式==
mkdir -p /var/redis/data
/usr/local/redis/redis-sentinel /usr/local/redis/sentinel.conf
netstat -anpt |grep 26379
#登錄redis sentinel,通過info sentinel可以查看哨兵的相關(guān)信息
redis -h 192.168.40.13 -p 26379 -a 123123
=測試故障轉(zhuǎn)移==
#停掉主庫,然后登錄任意從庫,通過info replication查看主從復(fù)制信息,查看主庫是否發(fā)生變化
#啟動(dòng)舊主redis并登錄,查看主從復(fù)制信息,看自己是否成為從庫
#在新主創(chuàng)建一個(gè)鍵,測試舊主是否能查看到,從而確定主從同步是否正常
#恢復(fù)原始狀態(tài),使舊主依然作為主庫,用于配置后續(xù)的keepalived高可用
(1)關(guān)閉sentinel
(2)關(guān)閉所有redis
(3)修改配置文件中的slaveof
(4)修改sentinel配置文件中的主從信息
=配置keepalived高可用
====修改redis優(yōu)先級(jí),從而在后續(xù)配置高可用時(shí)可以使vip準(zhǔn)確的漂移
#當(dāng)恢復(fù)原始狀態(tài)完成后,不要啟動(dòng)redis及sentinel,執(zhí)行以下操作
#修改主庫優(yōu)先級(jí),注意數(shù)字越低,級(jí)別越高
sed -i ‘/slave-priority/ s/100/98/g’ /usr/local/redis/redis.conf
#修改192.168.40.12優(yōu)先級(jí)
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 { #調(diào)用腳本監(jiān)控模塊
script /opt/redis.sh #監(jiān)控腳本存放位置及名稱
interval 3 #健康檢查時(shí)間
}
vrrp_instance VI_1 {
state SLAVE
interface ens32
virtual_router_id 51
priority 100
advert_int 1
nopreempt #不搶占參數(shù)
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #調(diào)用腳本監(jiān)控模塊
redis
}
virtual_ipaddress { #設(shè)置VIP
192.168.40.150
}
}
========修改從keepalived主配置文件=
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id redis2
}
vrrp_script redis { #調(diào)用腳本監(jiān)控模塊
script /opt/redis.sh #監(jiān)控腳本存放位置及名稱
interval 3 #健康檢查時(shí)間
}
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 { #調(diào)用腳本監(jiān)控模塊
redis
}
virtual_ipaddress { #設(shè)置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來實(shí)現(xiàn)高可用,如果bind參數(shù)依然設(shè)置為自身IP,那么則會(huì)造成redis只能實(shí)現(xiàn)VIP漂移,而VIP卻沒有實(shí)質(zhì)作用,無法通過VIP來實(shí)現(xiàn)登錄數(shù)據(jù)庫,解決辦法如下
#將bind參數(shù)中的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、先啟動(dòng)主庫,然后再依次啟動(dòng)所有從庫
2、啟動(dòng)keeplived
3、啟動(dòng)sentinel
4、查看主庫是否有VIP
5、通過-c選項(xiàng),使用info replication查看主從復(fù)制狀態(tài)
6、關(guān)閉主庫
7、在備份庫上查看VIP是否漂移到這邊
8、修復(fù)損壞的主庫,并查看VIP是否會(huì)被搶回來,如果不搶則表示高可用配置正確
9、在所有庫上通過-c選項(xiàng),使用info replication查看主從復(fù)制狀態(tài)
redis -h 192.168.40.13 -p 6379 -a 123123 -c info replication
總結(jié)
以上是生活随笔為你收集整理的Redis sentinel哨兵集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坐标系转换简介
- 下一篇: 详解SQL Server中创建数据仓库已