@[toc]
前言
本文主要記錄了阿里云Linux環(huán)境下Redis哨兵模式的搭建過程呛踊,記錄搭建的一些過程砾淌,下次可以少走彎路,快速搭建谭网。本文搭建的是一主兩從三哨兵的模式汪厨,是通過一臺阿里云服務(wù)器的不同的端口號來模擬不同機(jī)器上的搭建。
介紹
sentinel(哨兵模式)
sentinel愉择,中文名是哨兵劫乱。哨兵是 Redis 集群架構(gòu)中非常重要的一個(gè)組件,主要有以下功能:
- 集群監(jiān)控:負(fù)責(zé)監(jiān)控 redis master 和 slave 進(jìn)程是否正常工作
- 消息通知:如果某個(gè) redis 實(shí)例有故障锥涕,那么哨兵負(fù)責(zé)發(fā)送消息作為報(bào)警通知給管理員
- 故障轉(zhuǎn)移:如果 master node 掛掉了衷戈,通過選舉從slave node上產(chǎn)生新的master node
- 配置中心:如果故障轉(zhuǎn)移發(fā)生了,通知 client 客戶端新的 master 地址
哨兵用于實(shí)現(xiàn) redis 集群的高可用层坠,本身也是分布式的殖妇,作為一個(gè)哨兵集群去運(yùn)行,互相協(xié)同工作
核心概念
- 哨兵至少需要 3 個(gè)實(shí)例窿春,來保證自己的健壯性
- redis主從+哨兵的模式拉一,不保證數(shù)據(jù)零丟失的,只能保證redis 集群的高可用性
環(huán)境
- Linux version 4.18.0-80.11.2.el8_0.x86_64(Red Hat 8.2.1-3)
- redis-5.0.7.tar.gz
架構(gòu)圖
一主兩從三哨兵架構(gòu)圖
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);"
src="https://img-blog.csdnimg.cn/2020081519522430.png">
<div style="color:orange; border-bottom: 1px solid #d9d9d9;
display: inline-block;
color: #999;
padding: 2px;">一主兩從三哨兵架構(gòu)圖</div>
</center>
步驟
環(huán)境準(zhǔn)備
關(guān)于redis的單機(jī)下載旧乞、安裝蔚润,請參考之前的博客:redis基礎(chǔ)以及ubuntu16.04環(huán)境下搭建,比較簡單尺栖,這里就不重復(fù)描述了嫡纠。
-
我們將原來的redis-5.0.7又復(fù)制了兩份,作為它的從節(jié)點(diǎn),如下:
-
修改端口號:我們分別進(jìn)入redis-R1除盏,redis-R2目錄下修改它的redis.conf文件叉橱,將其端口號分別修改為6389、6399
-
啟動redis:src/redis-server redis.conf者蠕,這時(shí)候我們就可以看見啟動了3個(gè)redis窃祝,這相當(dāng)于在三臺機(jī)器上啟動redis。
主節(jié)點(diǎn)配置
修改redis.conf配置文件踱侣,步驟如下:
- 編輯redis.conf修改粪小,綁定ip為服務(wù)器內(nèi)網(wǎng)ip地址,做綁定抡句,本文ip都是一樣的探膊,端口號不一樣。
bind 172.19.210.221
- 保護(hù)模式修改為否待榔,允許遠(yuǎn)程連接
protected-mode no
- 設(shè)置密碼
requirepass "keweizhou"
- 主庫密碼與當(dāng)前庫密碼同步逞壁,保證從庫能夠提升為主庫
masterauth "keweizhou"
- 打開AOF持久化
appendonly yes
兩個(gè)從節(jié)點(diǎn)配置
兩個(gè)從節(jié)點(diǎn)和主節(jié)點(diǎn)的配置基本相同,額外需要添加主庫的同步配置
slaveof 172.19.210.221 6379
哨兵配置
修改3個(gè)節(jié)點(diǎn)的redis-sentinel配置文件锐锣、分別為:usr/tool/redis/sentinel.conf腌闯、usr/tool/redis-R1/sentinel.conf、usr/tool/redis-R2/sentinel.conf刺下,步驟如下:
# 1. 保護(hù)模式修改為否绑嘹,允許遠(yuǎn)程連接
protected-mode no
# 2. 設(shè)定監(jiān)控地址,為對應(yīng)的主redis庫的內(nèi)網(wǎng)地址橘茉,mymaster為集群名字工腋,可以根據(jù)情況自己修改
sentinel monitor mymaster 172.19.210.221 6379 2
# 3. 表示如果master重新選出來后,其它slave節(jié)點(diǎn)能同時(shí)并行從新master同步緩存的臺數(shù)有多少個(gè)畅卓,顯然該值 越大擅腰,所有slave節(jié)點(diǎn)完成同步切換的整體速度越快,但如果此時(shí)正好有人在訪問這些slave翁潘,可能造成讀取失敗趁冈,影響面會更廣。最保定的設(shè)置為1拜马,只同一時(shí)間渗勘,只能有一臺干這件事,這樣其它slave還能繼續(xù)服務(wù)俩莽,但是所有slave全部完成緩存更新同步的進(jìn)程將變慢旺坠。
sentinel parallel-syncs mymaster 2
# 4. 主數(shù)據(jù)庫密碼,需要將配置放在sentinel monitor master 127.0.0.1 6379 1下面
sentinel auth-pass mymaster keweizhou
sentinel.conf里面還有一些其他的參數(shù),可以根據(jù)項(xiàng)目情況自我設(shè)置扮超,如:sentinel failover-timeout取刃、sentinel down-after-milliseconds等
啟動
啟動順序需要按照Master->Slave->Sentinel進(jìn)行啟動蹋肮,分別把redis的config里面的daemonize參數(shù)設(shè)置為yes,這樣就可以后臺啟動進(jìn)程了璧疗,不用開啟多個(gè)窗口了坯辩,啟動步驟如下:
# 啟動redis-server的master和slave(根據(jù)配置文件啟動)
redis-server /usr/tool/redis/redis.conf
redis-server /usr/tool/redis-R1/redis.conf
redis-server /usr/tool/redis-R1/redis.conf
# 啟動3個(gè)redis-sentinel(根據(jù)配置文件啟動)
redis-sentinel /usr/tool/redis/sentinel.conf
redis-sentinel /usr/tool/redis-R1/sentinel.conf
redis-sentinel /usr/tool/redis-R2/sentinel.conf
redis-sentinel啟動如下:
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);"
src="https://img-blog.csdnimg.cn/20200815192122612.png">
<div style="color:orange; border-bottom: 1px solid #d9d9d9;
display: inline-block;
color: #999;
padding: 2px;">redis-sentinel 啟動</div>
</center>
驗(yàn)證
同步狀態(tài)查看
進(jìn)入master節(jié)點(diǎn)通過info replication查看
連接Sentinel狀態(tài)查看
[root@iZuf6b24c7i2yeaa3eldgfZ redis]# redis-cli -h 172.19.210.221 -p 26379 INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.19.210.221:6379,slaves=2,sentinels=3
[root@iZuf6b24c7i2yeaa3eldgfZ redis]# redis-cli -h 172.19.210.221 -p 26389 INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.19.210.221:6379,slaves=2,sentinels=3
[root@iZuf6b24c7i2yeaa3eldgfZ redis]# redis-cli -h 172.19.210.221 -p 26399 INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.19.210.221:6379,slaves=2,sentinels=3
[root@iZuf6b24c7i2yeaa3eldgfZ redis]#
主從復(fù)制驗(yàn)證
主節(jié)點(diǎn)負(fù)責(zé)寫,從節(jié)點(diǎn)負(fù)責(zé)讀崩侠,只有主節(jié)點(diǎn)可以刪除數(shù)據(jù)漆魔、從節(jié)點(diǎn)只能同步主節(jié)點(diǎn)的數(shù)據(jù),如下:
在master節(jié)點(diǎn)添加一條數(shù)據(jù)
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);"
src="https://img-blog.csdnimg.cn/20200815194031906.png">
<div style="color:orange; border-bottom: 1px solid #d9d9d9;
display: inline-block;
color: #999;
padding: 2px;">master節(jié)點(diǎn)增加數(shù)據(jù)</div>
</center>
從節(jié)點(diǎn)數(shù)據(jù)6389同步數(shù)據(jù):
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);"
src="https://img-blog.csdnimg.cn/20200815194245323.png">
<div style="color:orange; border-bottom: 1px solid #d9d9d9;
display: inline-block;
color: #999;
padding: 2px;">從節(jié)點(diǎn)6389同步數(shù)據(jù)</div>
</center>
從節(jié)點(diǎn)數(shù)據(jù)6399同步數(shù)據(jù):
<center>
<img style="border-radius: 0.3125em;
box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);"
src="https://img-blog.csdnimg.cn/20200815195553109.png">
<div style="color:orange; border-bottom: 1px solid #d9d9d9;
display: inline-block;
color: #999;
padding: 2px;">從節(jié)點(diǎn)6399同步數(shù)據(jù)</div>
</center>
哨兵高可用驗(yàn)證
分別連接對應(yīng)的redis服務(wù)端啦膜,手動停止哨兵有送、停止主redis服務(wù)淌喻,查看主是否切換成功
- 把6379master節(jié)點(diǎn)停了
# redis實(shí)例掛掉兩臺僧家,剩下一臺能夠成為主,自動切換
# 1.利用kill -9 pid直接暴力殺掉當(dāng)前role:master的對應(yīng)的redis服務(wù),重新檢查狀態(tài)看是否切換
kill -9 7400
# 2.查看連接:redis-cli -h 172.19.210.221 -p 26379 INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.19.210.221:6389,slaves=2,sentinels=3
可以看到此時(shí)master節(jié)點(diǎn)已經(jīng)切換到6389上了(原來6379)
- 再把6389master節(jié)點(diǎn)停了裸删,查看連接情況
# redis-cli -h 172.19.210.221 -p 26379 INFO Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.19.210.221:6399,slaves=2,sentinels=3
可以看見master節(jié)點(diǎn)已經(jīng)切換到6399了八拱,這里的切換并不是一下子完成的,需要稍微等待幾秒
搭建過程遇到的問題
- The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 參考:http://www.reibang.com/p/a86e0248af58
在/etc/sysctl.conf中添加: net.core.somaxconn = 2048
然后在終端中執(zhí)行
sysctl -p
- 啟動redis-client的時(shí)候出現(xiàn):Error: Connection reset by peer
重新啟動redis服務(wù)端涯塔,根據(jù)配置文件啟動