Redis 主從 以及哨兵
單實(shí)例Redis 不足:
上述的是一個(gè)單實(shí)例的Redis。 我們可以先分析下有哪些不足:
- 單點(diǎn)故障 (是每個(gè)單實(shí)例必須面對(duì)的問題)
- 容量有限 (Redis畢竟是緩存型數(shù)據(jù)庫(kù),容量取決于服務(wù)器分配的容量,但容量畢竟是有限的)
- 壓力大(如果出現(xiàn)高并發(fā)的場(chǎng)景,所有查詢的壓力都集中在Redis上)
所以我們的目的就是針對(duì)每個(gè)不足進(jìn)行修復(fù)。
我們先來了解下 一些前置知識(shí)。
Redis 主備 認(rèn)識(shí)
以上示意圖就是主備
大致含義。
-
從一定程度上
主備
解決了單實(shí)例的單點(diǎn)故障。因?yàn)槿绻鱎edis 如果因?yàn)槟承┰蛲V固峁┓?wù),可以啟動(dòng)備Redis 繼續(xù)工作。 -
但是依舊無(wú)法解決
容量有限
以及壓力大
的問題。因?yàn)閺氖贾两K都是一臺(tái)Redis實(shí)例在工作。
Redis 主從 認(rèn)識(shí)
以上示意圖就是主從
的大致含義
- 因?yàn)橐坏﹎aster Redis停止服務(wù)后,slave Redis可以晉升為master,繼續(xù)提供服務(wù)。所以給單點(diǎn)故障提供了保障
- 部署
主從
后,一般來說master 節(jié)點(diǎn)負(fù)責(zé)寫數(shù)據(jù)。slave 節(jié)點(diǎn)服務(wù)讀數(shù)據(jù)。這樣可以有效的避免所有socket請(qǐng)求,都訪問一個(gè)節(jié)點(diǎn),從而降低了壓力。
一般我們生產(chǎn)環(huán)境中會(huì)部署主從
。所以我們會(huì)以主從
來做詳細(xì)的講解
數(shù)據(jù)的一致性
保證
數(shù)據(jù)的一致性
是分布式部署的通病。按主從部署
來講,雖然數(shù)據(jù)已經(jīng)寫入到master 節(jié)點(diǎn),但是需要master節(jié)點(diǎn)往slave 節(jié)點(diǎn)同步數(shù)據(jù)。在這個(gè)同步的過程中可能因?yàn)榫W(wǎng)絡(luò)等種種原因,無(wú)法正常的同步。這就面臨著數(shù)據(jù)一致性的問題。
接下來我們分析幾種數(shù)據(jù)一致性的方案:
強(qiáng)一致性
如果想要實(shí)現(xiàn)數(shù)據(jù)的強(qiáng)一致性,master節(jié)點(diǎn)必須等待slave節(jié)點(diǎn)返回正確的結(jié)果。但是實(shí)際的業(yè)務(wù)場(chǎng)景中,會(huì)遇到各種問題導(dǎo)致slave節(jié)點(diǎn)延遲 或是 無(wú)法返回正確的數(shù)據(jù),所以相當(dāng)于master節(jié)點(diǎn)寫數(shù)據(jù)失敗。使用這種方式會(huì)破壞高可用
弱一致性
其實(shí)弱一致性的本質(zhì)就是:通過異步的形式給slave節(jié)點(diǎn)發(fā)送數(shù)據(jù)。如果數(shù)據(jù)發(fā)送失敗了,會(huì)導(dǎo)致主從數(shù)據(jù)不一致。
最終一致性
其實(shí)最終一致性
是在弱一致性
的基礎(chǔ)上做了升級(jí)。我們可以利用一些特殊的手段,最大可能性保證數(shù)據(jù)完整的傳輸。
比如:master節(jié)點(diǎn)可以將數(shù)據(jù)以同步阻塞的方式,傳遞給kafka
. 由kafka
給每個(gè)slave節(jié)點(diǎn)發(fā)送數(shù)據(jù)。有可能在某一個(gè)時(shí)點(diǎn)數(shù)據(jù)是不一致的,但是最終數(shù)據(jù)是一致性的。
因?yàn)?code>kafka給slave節(jié)點(diǎn)傳遞數(shù)據(jù)是需要時(shí)間的,如果此時(shí)間段內(nèi),數(shù)據(jù)的查詢是高并發(fā)的,有可能出現(xiàn)部分用戶拿到的數(shù)據(jù)不一致,分別是同步前 以及同步后的數(shù)據(jù)。
主從配置過程
接下倆我們實(shí)操下主從的配置過程:
步驟1:關(guān)閉Redis
也許服務(wù)器上啟動(dòng)了redis,如果再配置相同的端口,會(huì)出現(xiàn)一些意想不到的情況,所以我們先將redis關(guān)閉掉。
通過上述截圖中我們會(huì)發(fā)現(xiàn)仍然有redis 占用6379
端口。所以我們需要將其關(guān)閉掉,下面列舉出兩種方式任意選擇:
方案 1
直接通過kill
命令殺死進(jìn)程。
kill -9 19191
通過cli 關(guān)閉redis
[root@VM-8-3-centos bin]# pwd
/opt/redis/bin
[root@VM-8-3-centos bin]# ./redis-cli shutdown
[root@VM-8-3-centos bin]# ps aux | grep redis
root 20135 0.0 0.0 112812 980 pts/0 S+ 15:40 0:00 grep --color=auto redis
[root@VM-8-3-centos bin]#
步驟2:配置主從的前置工作
創(chuàng)建文件
cd /opt
mkdir -p redis-replica/master
mkdir -p redis-replica/slave1
mkdir -p redis-replica/slave2
復(fù)制redis 配置文件
這里我們直接使用shell 來移動(dòng)文件
- 創(chuàng)建并編輯 sh文件
vi mv-redis.sh
- 直接將下面的內(nèi)容復(fù)制到sh中
#!/bin/bash
cp -r /opt/redis/bin/* /opt/redis-replica/master
cp -r /opt/redis/bin/* /opt/redis-replica/slave1
cp -r /opt/redis/bin/* /opt/redis-replica/slave2
- 通過命令執(zhí)行shell
/bin/bash mv-redis.sh
步驟3:修改配置文件
為了不影響我們之前的單機(jī)版
Redis
,我們修改主從的配置
修改master 節(jié)點(diǎn)配置
修改前
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379
修改后
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380
修改slave1 節(jié)點(diǎn)配置
修改前
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379
修改后
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6381
指定 master節(jié)點(diǎn):我們需要在slave 配置文件中指定master節(jié)點(diǎn)
修改前
# 3) Replication is automatic and does not need user intervention. After a
# network partition replicas automatically try to reconnect to masters
# and resynchronize with them.
#
# replicaof <masterip> <masterport>
修改后
# 3) Replication is automatic and does not need user intervention. After a
# network partition replicas automatically try to reconnect to masters
# and resynchronize with them.
#
replicaof 127.0.0.1 6380
如果是不同的服務(wù)器。此處的127.0.0.1
可以修改為 指定的IP。 但是如果服務(wù)器上有密碼就需要指定字段masterauth
修改slave2 配置文件
跟slave1 修改方式保持一致。只不過端口為6382
步驟4:?jiǎn)?dòng)服務(wù)
這次我們還是通過shell 進(jìn)行啟動(dòng)以及關(guān)閉
#!/bin/bash
cd /opt/redis-replica/master
./redis-server ./redis.conf
cd /opt/redis-replica/slave1
./redis-server ./redis.conf
cd /opt/redis-replica/slave2
./redis-server ./redis.conf
執(zhí)行shell
cd /opt/redis-replica
/bin/bash setup.sh
通過上述截圖中我們看到,我們的多個(gè)redis 實(shí)例是啟動(dòng)成功的。
步驟5:查看 啟動(dòng)狀態(tài)
步驟6:查看 主從信息
我們是可以通過命令
info replication
來查看在master節(jié)點(diǎn)中 追隨了幾個(gè)slave節(jié)點(diǎn)。
主節(jié)點(diǎn)設(shè)置值
從節(jié)點(diǎn)可以讀取
步驟7:主從配置總結(jié)
如果看到這里,以為主從配置就結(jié)束了嗎?不不不,如果以為就這樣結(jié)束了, 那就大錯(cuò)特錯(cuò)了。上述步驟雖然進(jìn)行了
主從部署
,但是master節(jié)點(diǎn)負(fù)責(zé)寫數(shù)據(jù),slave 節(jié)點(diǎn)負(fù)責(zé)讀數(shù)據(jù)。如果master節(jié)點(diǎn)宕機(jī)了,也就是意味著Redis就不具備寫的功能,基本算是廢了。
如果是人工發(fā)現(xiàn)master節(jié)點(diǎn)宕機(jī)了,會(huì)將slave節(jié)點(diǎn)升級(jí)為master節(jié)點(diǎn),其他的slave節(jié)點(diǎn)跟隨新的master節(jié)點(diǎn)。
那么我們接下來分析的哨兵,就實(shí)現(xiàn)了該功能。應(yīng)該由人做的事情,將其交給第三方插件做
哨兵
在主從部署中默認(rèn)是只有主節(jié)點(diǎn)具備寫的能力,而從節(jié)點(diǎn)只能讀。如果主宕機(jī),整個(gè)節(jié)點(diǎn)不具備寫能力。但是如果這是讓一個(gè)從變成主,整個(gè)節(jié)點(diǎn)就可以繼續(xù)工作。即使之前的主恢復(fù)過來也當(dāng)做這個(gè)節(jié)點(diǎn)的從即可。
Redis的哨兵就是幫助監(jiān)控master 節(jié)點(diǎn)的,當(dāng)節(jié)點(diǎn)出現(xiàn)宕機(jī)等情況,幫助重新選取主。
Redis中哨兵支持單哨兵和多哨兵。單哨兵是只要這個(gè)哨兵發(fā)現(xiàn)master宕機(jī)了,就直接選取另一個(gè)master。而多哨兵是根據(jù)我們?cè)O(shè)定,達(dá)到一定數(shù)量哨兵認(rèn)為master宕機(jī)后才會(huì)進(jìn)行重新選取主。我們以多哨兵演示
多哨兵模式下,選擇幾個(gè)合適呢???
此時(shí)我們的多哨兵節(jié)點(diǎn)有5個(gè)
全部哨兵節(jié)點(diǎn)
當(dāng)master節(jié)點(diǎn)因?yàn)槟撤N原因停止服務(wù),可能所有的哨兵都檢測(cè)到了。但是因?yàn)榫W(wǎng)絡(luò)原因無(wú)法進(jìn)行匯總,導(dǎo)致4個(gè)哨兵認(rèn)為master宕機(jī)了,一個(gè)哨兵遲遲沒有回應(yīng)。
這種部署方式 有點(diǎn)類似于 數(shù)據(jù)強(qiáng)一致性
。會(huì)破壞可用性。
一個(gè)哨兵節(jié)點(diǎn)
- 如果是一個(gè)哨兵就可以判斷master 節(jié)點(diǎn)是否宕機(jī)的話,會(huì)造成判斷結(jié)果不精準(zhǔn),因?yàn)闀?huì)有很多原因造成哨兵判斷失誤,例如:網(wǎng)絡(luò)
- 但是如果每個(gè)哨兵結(jié)果都不同的話,會(huì)發(fā)生一種情況:
腦裂
。
n/2+1 節(jié)點(diǎn)
- 為了增加結(jié)果的準(zhǔn)確性,我們建議是過半的哨兵如果判斷master 節(jié)點(diǎn)宕機(jī)的話,那master 節(jié)點(diǎn)就是宕機(jī)了
- 這種方式也避免了
腦裂
的情況發(fā)生。
如果是部署4臺(tái)哨兵的話,>=3臺(tái)認(rèn)為master宕機(jī)了,我們就認(rèn)為宕機(jī)
如果是部署5臺(tái)哨兵的話,>=3臺(tái)認(rèn)為master宕機(jī)了,我們就認(rèn)為宕機(jī)
所以為了更好的分區(qū)容忍性,我們是建議部署奇數(shù)臺(tái)哨兵。
哨兵配置過程
創(chuàng)建目錄
mkdir -p /opt/redis-replica/sentinel
cp /opt/redis-replica/master/redis-sentinel /opt/redis-replica/sentinel
從之前的解壓目錄 復(fù)制配置文件
cp /tmp/soft/redis-5.0.14/sentinel.conf /opt/redis-replica/sentinel/
復(fù)制多份配置文件,修改配置文件
三個(gè)配置文件 修改內(nèi)容類似,如下內(nèi)容:
port 26379
daemonize yes
logfile "/opt/redis-replica/sentinel/26379.log"
sentinel monitor mymaster 127.0.0.1 6380 2
啟動(dòng)sentinel
殺死m(xù)aster節(jié)點(diǎn),主動(dòng)自動(dòng)切換
文章來源:http://www.zghlxwxcb.cn/news/detail-414413.html
等殺死m(xù)aster節(jié)點(diǎn)后,等待一段時(shí)間后,通過哨兵,第一個(gè)從節(jié)點(diǎn)升級(jí)為master節(jié)點(diǎn)了。文章來源地址http://www.zghlxwxcb.cn/news/detail-414413.html
到了這里,關(guān)于【Redis 進(jìn)階之路】3. Redis 主從 以及哨兵的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!