一、Redis有哪些高可用技術?
在Redis中,實現(xiàn)高可用的技術主要包括持久化、主從復制、哨兵和集群。
1、主從復制
主從復制時高可用Redis的基礎,哨兵和cluster都是在主從復制基礎上實現(xiàn)高可用的,主從復制主要實現(xiàn)了數(shù)據(jù)的多級備份,以及對與讀操作的負載均衡和簡單的故障恢復。
缺陷:①故障恢復無法自動化,②寫操作無法負載均衡,③存儲能力受到單機的限制
2、哨兵
在主從復制的基礎上,哨兵實現(xiàn)了自動化的故障恢復
缺陷:①寫操作無法負載均衡,②存儲能力受到單機的限制
3、集群(cluster-推薦6臺)
通過集群,Redis解決了寫操作無法負載均衡以及存儲能力受到單機限制的問題,實現(xiàn)了較為完善的高可用的方案。
二、Redis的主從復制
1、主從復制流程
①若啟動一個slave機器進程,則它會向Master機器發(fā)送一個”sync_command“命令,請求同步鏈接
②無論時第一次連接還是重新連接,Master機器都會啟動一個后臺進程,將數(shù)據(jù)快照(RDB)保存到數(shù)據(jù)文件中(執(zhí)行RDB操作),同時Master還會記錄修改數(shù)據(jù)的所有命令緩存在數(shù)據(jù)文件中。
③后臺進程完成緩存操作之后,Master及其就會向Slave機器發(fā)送數(shù)據(jù)文件,Slave端機器將數(shù)據(jù)文件保存到硬盤上,然后將其加載到內存中,接著Master機器就會修改數(shù)據(jù)的所有操作一并發(fā)給Slave端機器。若Slave出現(xiàn)故障導致宕機,則恢復正常后自動重新連接。
④Master機器收到Slave端機器的連接后,將其完整的數(shù)據(jù)文件發(fā)送給Slave端機器,如果Mater同時收到多個Slave發(fā)來的同步請求,則Master會在后臺啟動一個進程以保存數(shù)據(jù)文件,然后將其發(fā)送給所有的Slave端機器,確保所有的Slave端機器都正常。
1、從服務器發(fā)送SYNC同步數(shù)據(jù)請求
2、主Redis會fork一個子進程,然后產生RDB文件(完備),此時客戶端還是持續(xù)寫入新的命令。
3、RDB文件持久化完成后,主Redis會將RDB文件和緩存起來的命令推送給從服務器
4、推送完成后,主Redis會利用AOF(增備)持久化功能,持續(xù)的同步操作命令到從服務器。
#后續(xù)所有的同步操作,只要沒有新的從設備接入,都是會使用AOF的方式進行同步數(shù)據(jù)
2、Redis主從復制的作用
數(shù)據(jù)冗余:主從復制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
故障恢復:當主節(jié)點出現(xiàn)問題時,可以由從節(jié)點提供服務,實現(xiàn)快速的故障恢復;實際上是一種服務的冗余。
負載均衡:在主從復制的基礎上,配合讀寫分離,可以由主節(jié)點提供寫服務,由從節(jié)點提供讀服務(即寫Redis數(shù)據(jù)時應用連接主節(jié)點,讀Redis數(shù)據(jù)時應用連接從節(jié)點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節(jié)點分擔讀負載,可以大大提高Redis服務器的并發(fā)量。
高可用基石:除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是Redis高可用的基礎。
3、Redis主從復制的實驗部署
3.2 三臺主機安裝Redis服務
一鍵部署腳本
#!/bin/bash
#關閉防火墻
systemctl stop firewalld
setenforce 0
#安裝環(huán)境
yum -y install gcc gcc-c++ make
#解壓
cd /opt
tar -zxvf redis-5.0.7.tar.gz
#編譯
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
#安裝redis服務
cd /opt/redis-5.0.7/utils
yum -y install expect
/usr/bin/expect <<EOF
spawn ./install_server.sh
expect "instance" {send "\r"}
expect "config" {send "\r"}
expect "log" {send "\r"}
expect "this" {send "\r"}
expect "path" {send "/usr/local/redis/bin/redis-server\r"}
expect "abort" {send "\r"}
expect eof
EOF
#創(chuàng)建軟鏈接,方便啟動
ln -s /usr/local/redis/bin/ * /usr/local/bin
#修改配置文件
ip=`ifconfig ens33 |awk '/netmask/{print $2}'`
sed -i "s/bind 127.0.0.1/bind $ip/" /etc/redis/6379.conf
#啟動redis
/etc/init.d/redis_6379 restart
#查看是否開啟
netstat -natp |grep redis
if [ $? -eq 0 ];then
echo "redis 已安裝完成并啟動"
else
echo "redis 未啟動,請檢查"
fi
3.3 修改Master節(jié)點
修改配置文件
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改bind 項,0.0.0.0監(jiān)聽所有網(wǎng)段
daemonize yes #137行,開啟守護進程
logfile /var/log/redis_6379.log #172行,指定日志文件目錄
dir /var/lib/redis/6379 #264行,指定工作目錄
appendonly yes #700行,開啟AOF持久化功能
/etc/init.d/redis_6379 restart
重啟redis服務
如果一直報錯等待關閉,可以去pid的文件位置將pid文件刪除,然后再使用netstat 過濾出redis的pid號,進行kill掉,后開啟redis服務
pid文件位置存在:/var/run/redis_6379.pid
3.4 配置兩臺slave節(jié)點(兩臺一樣)
修改配置文件
vim /etc/redis/6379.conf #配置文件位置
70 bind 0.0.0.0 #修改監(jiān)聽地址
137 daemonize yes #開啟守護進程
172 logfile /var/log/redis_6379.log #指定日志文件目錄
264 dir /var/lib/redis/6379 #指定工作目錄
288 replicaof 20.0.0.55 6379 #添加主服務器(master)地址 及端口
700 appendonly yes #開啟AOF持久化功能
#保存,并啟動服務
/etc/init.d/redis_6379 restart
#重啟slave1節(jié)點和slave2節(jié)點redis服務
重啟redis服務
3.5 驗證主從效果
#在Master節(jié)點上看日志:
tail -f /var/log/redis_6379.log
#在Master節(jié)點上驗證從節(jié)點:
redis-cli
127.0.0.1:6379> info replication
或
redis-cli info replication
#驗證數(shù)據(jù)(在master創(chuàng)建內容,slave查看內容)
三、哨兵模式
1、什么是哨兵?
Redis做好主從復制之后,當master節(jié)點遇到故障,并不會自動切換slave節(jié)點繼續(xù)運行,達不到高可用的情況,所以就需要配置哨兵來實現(xiàn)自動切換故障的功能。當master宕機后,哨兵可以根據(jù)投票選舉機制,在眾多slave節(jié)點中選出一個節(jié)點作為master繼續(xù)執(zhí)行。
2、哨兵的原理
哨兵(sentinel):是一個分布式系統(tǒng), 用于對主從結構中的每臺服務器進行監(jiān)控,當出現(xiàn)故障時通過投票機制選擇新的master并將所有slave連接到新的master。所以整個運行的哨兵的集群的數(shù)量不得少于3個節(jié)點。
哨兵原理詳細步驟
1、哨兵對數(shù)據(jù)節(jié)點集群進行監(jiān)控的步驟
①首先主節(jié)點的信息是配置在哨兵的配置文件中(幾個哨兵配置幾次)。
②哨兵節(jié)點會和配置的主節(jié)點建立兩個連接,分別為:命令連接和訂閱連接
- 命令連接: 為了讓哨兵節(jié)點和master建立連接關系。
- 訂閱連接: 哨兵會通過命令連接后,每10s發(fā)送一次info命令,通過info命令,主節(jié)點會返回自己的run_id 和自己的從節(jié)點信息。
③哨兵通過訂閱連接獲取到了從節(jié)點的信息,便也會向這些從節(jié)點建立兩條連接,命令連接和訂閱連接。
- 命令連接: 為了讓哨兵和slave建立連接關系
- 訂閱連接: 哨兵通過命令連接向從節(jié)點發(fā)送info命令,獲取到從節(jié)點的一些信息(比如:run_id、role(職能)、從服務器的復制偏移量offset)。
2、哨兵與哨兵之間的監(jiān)控步驟
①通過命令連接向服務器的setinel:hello頻道發(fā)送一條消息,內容包括自己的ip端口、run_id、配置等信息。
②通過訂閱連接對服務器的sentinel:hello 頻道做了監(jiān)聽,所以所由向該頻道發(fā)送的哨兵的消息都能被接收到。
③解析監(jiān)聽到的消息,進行分析提取。就可以指導還有哪些別的哨兵服務節(jié)點也在監(jiān)聽這些主從節(jié)點了,更新結構體將這些哨兵節(jié)點記錄下來。
④向觀察到的其它的哨兵節(jié)點建立命令連接,達到批次監(jiān)控的目的。
簡化流程
-
哨兵向redis master節(jié)點獲取狀態(tài)、信息數(shù)據(jù),并知曉從節(jié)點位置
-
哨兵向從節(jié)點獲取狀態(tài)、信息數(shù)據(jù),稍定對redis集群進行監(jiān)控
-
哨兵集群之間向hello頻道(哨兵之間共享數(shù)據(jù)的位置)發(fā)送自己的數(shù)據(jù)
-
哨兵從hello節(jié)點獲取到其它的節(jié)點的位置
-
哨兵之間進行數(shù)據(jù)共享、及彼此監(jiān)控。
3、哨兵模式的作用
**①監(jiān)控:**哨兵會不斷的檢查主節(jié)點和從節(jié)點是否運作正常。
**②自動故障轉移:**當主節(jié)點不能正常工作時,哨兵會開始故障轉移操作,它會將失效的主節(jié)點的集群中的一個從節(jié)點升級為新的主節(jié)點,并讓其它從節(jié)點改為復制新的主節(jié)點。
**③通知(提醒):**哨兵可以將故障轉移的結果發(fā)送給客戶端。
4、哨兵模式下的故障遷移
①主觀下線
哨兵(sentinel)節(jié)點會每秒一次的頻率向建立了命令連接的實例發(fā)送ping命令,如果在down-after-milliseconds毫秒內沒有做出有效的響應(pong/loading/masterdown),哨兵就會將該實例在本結構體中的狀態(tài)標記為SRI_S_DOWN主管下線。
②客觀下線
當一個哨兵節(jié)點發(fā)現(xiàn)主節(jié)點處于主觀下線狀態(tài)時,會向其它的哨兵節(jié)點發(fā)出詢問,該節(jié)點是不是已經(jīng)主觀下線了,如果超過配置DOWN客觀下線詢問命令 SENTINEL is-master-down-by-addr。那么就判斷該master宕機了。
③master選舉
在認為主節(jié)點客觀下線的情況下,哨兵節(jié)點之間會發(fā)起一次選舉,命令為:SENTINEL is-master-down-by-addr 只是runid 這次會將自己的runid帶進去,希望接受者將自己設置為主節(jié)點。如果超過半數(shù)以上的節(jié)點返回該節(jié)點標記為leacer的情況下,會有該leader對故障進行遷移。
概括
-
由于哨兵節(jié)點定期監(jiān)控發(fā)現(xiàn)主節(jié)點是否出現(xiàn)故障。
-
每個哨兵節(jié)點每1秒會向主節(jié)點、從節(jié)點及其它哨兵節(jié)點發(fā)送一次ping命令做一次心跳檢測。
-
如果主節(jié)點在一定時間范圍不回復或回復一個錯誤消息,那么這個哨兵就會認為這個主節(jié)點主觀下線了(單方面)
-
當超過半數(shù)哨兵節(jié)點認為該節(jié)點主觀下線了,這樣就客觀下面。(可以設置多少數(shù)量主觀下線)
-
當主節(jié)點出現(xiàn)故障,此時哨兵節(jié)點會通過 **“ Ratf算法(選舉算法)”**實現(xiàn)選舉機制,共同選舉出一個哨兵 節(jié)點為leader(領導者),來處理主節(jié)點的故障轉移和通知。
-
所以整個運行的哨兵的集群數(shù)量不得少于3個節(jié)點。
由leader哨兵節(jié)點執(zhí)行故障轉移過程
- 將某一個節(jié)點升級為新的主節(jié)點,讓其它從節(jié)點指向新的主節(jié)點。
- 若原主節(jié)點恢復也變成從節(jié)點,并指向新的主節(jié)點。
- 通知客戶端主節(jié)點已經(jīng)更換
需要注意的是
- 客戶端下線是主節(jié)點才有的概念,如果從節(jié)點和哨兵節(jié)點發(fā)生故障,被哨兵主觀下線后,不會再有后續(xù)的客觀下線和故障轉移操作。
主節(jié)點選舉
- 過濾掉不健康的(已下線),沒有恢復哨兵ping響應的從節(jié)點。
- 選擇配置文件中從節(jié)點優(yōu)先級配置最高的為主節(jié)點(replica-priority,默認值為:100)
- 選擇復制偏移量最大的,也就是復制最完整的從節(jié)點。
5、哨兵+主從復制部署實驗
哨兵的部署啟動,需要依賴于主從復制,所以必須在redis主從復制部署好的情況下再去部署哨兵模式
5.1 查看redis主從復制端口
5.2 三臺redis均要配置哨兵模式
修改配置文件,設置哨兵監(jiān)控的master主節(jié)點
#所有節(jié)點配置一樣,如下所示,(配置的時候可以開啟同步配置)
vim /opt/redis-5.0.7/sentinel.conf
17 protected-mode no #關閉保護模式
21 port 26379 #Redis哨兵默認的監(jiān)聽端口
26 daemonize yes #指定sentinel為后臺啟動
36 logfile "/var/log/sentinel.log" #指定日志存放路徑
65 dir "/var/lib/redis/6379" #指定數(shù)據(jù)庫存放路徑
84 sentinel monitor mymaster 20.0.0.55 6379 2 #指定該哨兵節(jié)點監(jiān)控20.0.0.55:6379這個主節(jié)點,該主節(jié)點的名稱是mymaster,最后的2的含義與主節(jié)點的故障判定有關:至少需要2個哨兵節(jié)點同意,才能判定主節(jié)點故障并進行故障轉移
113 sentinel down-after-milliseconds mymaster 30000 #判定服務器down掉的時間周期,默認30000毫秒(30秒)
146 sentinel failover-timeout mymaster 180000 #146行,故障節(jié)點的最大超時時間為180000 (180秒 )
5.3 啟動哨兵模式
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
#先啟動master,再啟動slave
5.4 查看哨兵信息
5.4 故障模擬
查看并殺死m(xù)aster節(jié)點的redis-server
查看哨兵信息
5.5 恢復過程
如過要將以前的master的redis啟動,需要先將/var/run/redis_6379.pid文件刪除,刪除執(zhí)行在執(zhí)行/etc/init.d/redis_6379 start ,即可啟動redis服務,啟動之后,哨兵會將它設置為salve從節(jié)點,并自動指向新的節(jié)點。
最好再去配置文件中去指向主從復制的master,也就是將重新啟動的master的配置文件/etc/redis/6379.conf 中的 288行重新指向新的master。
四、cluster集群模式
1、什么是Redis集群模式?
-
Redis集群模式就是,可以解決寫的操作無法負載均衡,存儲受到單機限制,以及故障自動切換功能的一種集群。
-
集群由多個節(jié)點組成,Redis的數(shù)據(jù)分布在這些節(jié)點中。
-
集群中的節(jié)點分為主節(jié)點和從節(jié)點,只有主節(jié)點復制讀寫請求和集群信息的維護,從節(jié)點只進行主節(jié)點數(shù)據(jù)和狀態(tài)信息的復制。
2、集群的作用
①數(shù)據(jù)分區(qū):數(shù)據(jù)分區(qū)(或稱數(shù)據(jù)分片) 是集群最核心的功能
- 集群將數(shù)據(jù)分散到多個節(jié)點,一方面突破了 Redis 單機內存大小的限制,存儲容量大大增加;
- 另一方面每個主節(jié)點都可以對外提供讀服務和寫服務,大大提高了集群的響應能力。
- Redis 單機內存大小受限問題
②高可用:集群支持主從復制和主節(jié)點的自動故障轉移(與哨兵類似) ;當任一節(jié)點發(fā)生故障時,集群仍然可以對外提供服務。
3、集群模式的數(shù)據(jù)分片介紹
-
Redis集群引入了哈希槽的概念
-
Redis集群由16384個哈希槽(編號0-16383)
-
集群的每一個節(jié)點負責一部分哈希槽
-
每個key通過CRC算法后對16384取余來決定放置哪個槽位。
-
再通過這個槽找到對應的節(jié)點,然后直接跳轉到這個對應的節(jié)點上進行存取操作
總的來說:就是cluster集群是分布式的,它可以將多個master當做一個整體來存放數(shù)據(jù)。并且cluster中有16384個slot(哈希槽),集群中的master來平分這些槽位。當需要由數(shù)據(jù)來存儲到集群匯中時,需要使用CRC16算法得出一個結果,再將這個結果對16384取余,最后得到對應的槽位,根據(jù)槽位選定最頂存放的master節(jié)點。
如果有新的master節(jié)點中加入,那么槽位該怎么分呢?
- cluster集群會將現(xiàn)有的每個slot移除一部分,每個master移除的solt加起來等于自己等下的即可,然后將槽位給到新加的master中。
slave節(jié)點怎么復制master節(jié)點的?
-
每個slave節(jié)點對應著自己的master,不僅同步的是master的數(shù)據(jù),還同步master的槽位,當master宕機后,salve立馬上來進行頂替。
-
如果slave節(jié)點也掛了,并且master節(jié)點還沒有修復,那么有一整個16384個槽位缺少了這一部分,就導致整個集群無法使用。文章來源:http://www.zghlxwxcb.cn/news/detail-524283.html
4、Redis集群模式部署
Redis集群一般需要6個節(jié)點,三主三從。本次實驗使用一臺設備模擬三主三從。文章來源地址http://www.zghlxwxcb.cn/news/detail-524283.html
4.1 服務器上部署好redis服務
4.2 集群部署
cd /etc/redis/
mkdir -p /etc/redis/redis-cluster/redis600{1..6}
cd redis-cluster/redis6001
#在當前服務器配置6個redis服務
#!/bin/bash
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
#執(zhí)行腳本復制配置文件及程序到目錄中
4.3 配置集群功能配置文件
[root@localhost redis6001]# vim redis.conf
69 #bind 127.0.0.1 #將其注釋,即監(jiān)聽所有端口
88 protected-mode no #關閉保護模式
92 port 6001 #為了區(qū)分,將端口更改,6個不能相同
136 daemonize yes #開啟守護進程
699 appendonly yes #開啟AOF持久化
832 cluster-enabled yes #開啟集群功能
840 cluster-config-file nodes-6001.conf #群集名稱文件設置
846 cluster-node-timeout 15000 #群集超時時間設置
#先配置好6001的配置文件,然后將這個配置文件拷貝到另外6002-6006中,并且,修改端口
#!/bin/bash
for i in {2..6}
do
rm -rf /etc/redis/redis-cluster/redis600$i/redis.conf
cp /etc/redis/redis-cluster/redis6001/redis.conf /etc/redis/redis-cluster/redis600$i
sed -i "s/port 6001/port 600$i/" /etc/redis/redis-cluster/redis600$i/redis.conf
sed -i "s/nodes-6001.conf/nodes-600${i}.conf/" /etc/redis/redis-cluster/redis600$i/redis.conf
done
#執(zhí)行腳本一鍵替換其它的配置文件
4.4 啟動redis 節(jié)點
#!/bin/bash
for i in {1..6}
do
cd /etc/redis/redis-cluster/redis600$i
redis-server redis.conf
done
#分別進入6個節(jié)點,進行服務啟動redis-server redis.conf
4.5 啟動集群
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
# -replicas 1 表示每個主節(jié)點有1個從節(jié)點
#若使用6臺服務器,此處節(jié)點ip請換為自己真實ip即端口號
4.6 集群測試
redis-cli -p 6001 -c
#-c 參數(shù),節(jié)點之間可以相互跳轉
cluster slots
#查看節(jié)點的哈希槽編號范圍
cluster keyslot 鍵名
#查看鍵的哈希槽編號
到了這里,關于Redis高可用主從復制、哨兵、集群的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!