1财喳、Redis 主從復(fù)制
主從復(fù)制啤握,是指將一臺Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱為主節(jié)點(Master)基矮,后者稱為從節(jié)點(Slave)漂彤;數(shù)據(jù)的復(fù)制是單向的弦牡,只能由主節(jié)點到從節(jié)點兼都。
1.主從復(fù)制流程
1.1、若啟動一個Slave機器進程套媚,則它會向Master機器發(fā)送一個“sync command”命令缚态,請求同步連接。
1.2堤瘤、無論是第一次連接還是重新連接玫芦,Master機器都會啟動一個后臺進程,將數(shù)據(jù)快照保存到數(shù)據(jù)文件中(執(zhí)行rdb操作)本辐,同時Master還會記錄修改數(shù)據(jù)的所有命令并緩存在數(shù)據(jù)文件中桥帆。
1.3、后臺進程完成緩存操作之后慎皱,Master機器就會向Slave機器發(fā)送數(shù)據(jù)文件老虫,Slave端機器將數(shù)據(jù)文件保存到硬盤上,然后將其加載到內(nèi)存中茫多,接著Master機器就會將修改數(shù)據(jù)的所有操作一并發(fā)送給Slave端機器祈匙。若Slave出現(xiàn)故障導(dǎo)致宕機,則恢復(fù)正常后會自動重新連接天揖。
1.4夺欲、Master機器收到Slave端機器的連接后,將其完整的數(shù)據(jù)文件發(fā)送給Slave端機器今膊,如果Mater同時收到多個Slave發(fā)來的同步請求些阅,則Master會在后臺啟動一個進程以保存數(shù)據(jù)文件,然后將其發(fā)送給所有的Slave端機器斑唬,確保所有的Slave端機器都正常
2.搭建Redis 主從復(fù)制
docker啟動三個reids容器
docker run --name redis1 --network redis_net -d -v D:\www\redis\redis1\config\redis.conf:/usr/local/etc/redis/redis.conf -v D:\www\redis\redis1\data\redis:/data redis redis-server /usr/local/etc/redis/redis.conf
將redis1作為主庫扑眉,查看redis1的ip地址,
編輯redis.conf文件
#設(shè)置密碼
requirepass 123123
masterauth 123123
slaveof 192.168.31.3 6379
daemonize yes #開啟守護進程
appendonly yes #開啟AOF持久化功能
重啟redis2 和redis3容器
進入redis3容器使用命令查看主從關(guān)系
info replication
master_link_status:up 代表主庫在線狀態(tài)
進入redis1查看從庫狀態(tài)赖钞,可以看到兩個從庫的詳細(xì)信息
操作主庫和從庫,可以發(fā)現(xiàn)主庫的的數(shù)據(jù)同步到了從庫聘裁, 從庫不能寫入數(shù)據(jù)雪营。
停掉redis1主庫,進入redis2從庫衡便,數(shù)據(jù)可以讀献起,但不能寫了洋访。
這個時候如果想恢復(fù)數(shù)據(jù)寫入就要手動重新綁定主庫了。所以就有哨兵模式出現(xiàn)了谴餐。
2.redis哨兵模式
Redis哨兵機制(Sentinel)是一種高可用性解決方案姻政,用于監(jiān)控和管理Redis集群中的多個節(jié)點。
2.1.基本概念
定義:Redis Sentinel是一個分布式系統(tǒng)岂嗓,由一個或多個Sentinel進程組成汁展,這些進程會監(jiān)控Redis集群中的主節(jié)點和從節(jié)點的健康狀態(tài)。
功能:主要負(fù)責(zé)監(jiān)控厌殉、故障轉(zhuǎn)移食绿、通知和配置管理。
2.2.工作原理
監(jiān)控:每個Sentinel進程定期通過PING命令檢查主節(jié)點和從節(jié)點的狀態(tài)公罕。如果發(fā)現(xiàn)某個節(jié)點不可用器紧,它會將其標(biāo)記為主觀下線狀態(tài)。
故障判斷:當(dāng)多數(shù)Sentinel實例確認(rèn)某個主節(jié)點無法訪問時楼眷,它們會開始進行故障轉(zhuǎn)移過程铲汪。
故障轉(zhuǎn)移:通過選舉機制,選舉出一個新的主節(jié)點罐柳,并將原主節(jié)點的從節(jié)點重新配置為新的從節(jié)點掌腰。
通知:當(dāng)Redis實例的狀態(tài)發(fā)生變化時,Sentinel可以通過通知機制將故障或恢復(fù)信息發(fā)送給管理員或其他系統(tǒng)硝清。
2.2辅斟、搭建Redis 哨兵模式
在各節(jié)點的配置文件創(chuàng)建sentinel.conf,并增加配置
sentinel monitor mymaster 192.168.31.2 6379 2 #指定該哨兵節(jié)點監(jiān)控192.168.31.2:6379這個主節(jié)點芦拿,該主節(jié)點的名稱是mymaster士飒,最后的2的含義與主節(jié)點的故障判定有關(guān):至少需要2個哨兵節(jié)點同意,才能判定主節(jié)點故障并進行故障轉(zhuǎn)移
sentinel down-after-milliseconds mymaster 3000 #判定服務(wù)器down掉的時間周期蔗崎,默認(rèn)3000毫秒(3秒)
啟動哨兵模式 先啟master酵幕,再啟slave,進入redis容器
redis-sentinel /usr/local/etc/redis/sentinel.conf &
連接哨兵 查看哨兵模式狀態(tài)
redis-cli -p 26379 #26379 為哨兵模式默認(rèn)端口
info sentinel 查看哨兵狀態(tài)
上圖可以看到哨兵的數(shù)量,主從庫的信息等缓苛。
分別進入redis1和redis2 主庫和從庫 測試芳撒,主庫可以讀寫,從庫只能讀數(shù)據(jù)未桥。這時候redis主從復(fù)制的哨兵模式就搭建成功了笔刹。
2.3、模擬主庫掛掉
我們將主庫容器停掉冬耿,在進入redis3查看主從信息舌菜。這時候看到master變成了192.168.31.4也就是redis2
我們進入redis2,可以看到redis2 已經(jīng)成為master
可以看到此時數(shù)據(jù)還存在亦镶,而且redis2可以寫入數(shù)據(jù)了日月。
3袱瓮、Redis 群集模式
集群,即Redis Cluster爱咬,是Redis 3.0開始引入的分布式存儲方案尺借。
集群由多個節(jié)點(Node)組成,Redis的數(shù)據(jù)分布在這些節(jié)點中精拟。集群中的節(jié)點分為主節(jié)點和從節(jié)點:只有主節(jié)點負(fù)責(zé)讀寫請求和集群信息的維護燎斩;從節(jié)點只進行主節(jié)點數(shù)據(jù)和狀態(tài)信息的復(fù)制。
3.1串前、集群的作用
數(shù)據(jù)分區(qū):數(shù)據(jù)分區(qū)(或稱數(shù)據(jù)分片)是集群最核心的功能瘫里。
集群將數(shù)據(jù)分散到多個節(jié)點,一方面突破了Redis單機內(nèi)存大小的限制荡碾,存儲容量大大增加谨读;另一方面每個主節(jié)點都可以對外提供讀服務(wù)和寫服務(wù),大大提高了集群的響應(yīng)能力坛吁。
Redis單機內(nèi)存大小受限問題劳殖,在介紹持久化和主從復(fù)制時都有提及;例如拨脉,如果單機內(nèi)存太大哆姻,bgsave和bgrewriteaof的fork操作可能導(dǎo)致主進程阻塞,主從環(huán)境下主機切換時可能導(dǎo)致從節(jié)點長時間無法提供服務(wù)玫膀,全量復(fù)制階段主節(jié)點的復(fù)制緩沖區(qū)可能溢出矛缨。
高可用:集群支持主從復(fù)制和主節(jié)點的自動故障轉(zhuǎn)移(與哨兵類似);當(dāng)任一節(jié)點發(fā)生故障時帖旨,集群仍然可以對外提供服務(wù)箕昭。
3.2、集群模式的數(shù)據(jù)分片
1解阅、Redis集群引入了哈希槽的概念
2落竹、Redis集群有 16384 個哈希槽( 編號0-16383)
3、集群的每個節(jié)點負(fù)責(zé)一部分哈希槽
4货抄、每個Key 通過 CRC16校驗后對16384取余來決定放置哪個哈希槽述召,通過這個值,去找到對應(yīng)的插槽所對應(yīng)的節(jié)點蟹地,然后直接自動跳轉(zhuǎn)到這個對應(yīng)的節(jié)點上進行存取操作
<- - -以3個節(jié)點組成的集群為例- - ->
節(jié)點A 包含0到5460號哈希槽
節(jié)點B 包含5461到10922號哈希槽
節(jié)點C 包含10923到16383號哈希槽
3.3积暖、Redis集群的主從復(fù)制模型
集群中具有A、B怪与、C三個節(jié)點夺刑,如果節(jié)點B失敗了,整個集群就會因缺少5461-10922這個范圍的槽而不可以用琼梆。
為每個節(jié)點添加一個從節(jié)點A1性誉、B1、C1整個集群便有三個Master節(jié)點和三個slave節(jié)點組成茎杂,在節(jié)點B失敗后错览,集群選舉B1位為的主節(jié)點繼續(xù)服務(wù)。當(dāng)B和B1都失敗后煌往,集群將不可用倾哺。
3.5、搭建Redis 群集模式
redis的集群一般需要6個節(jié)點刽脖,3主3從羞海。方便起見,這里我們啟動6個redis容器:
首先依次在redis的本地配置文件redis.conf中,開啟集群模式曲管。
cluster-enabled yes
cluster-config-file nodes-1.conf
cluster-node-timeout 15000
appendonly yes
依次掛載配置文件并啟動:
docker run --name redis1 --network redis_net -d -v D:\www\redis\redis1\config:/usr/local/etc/redis -v D:\www\redis\redis1\data\redis:/data redis redis-server /usr/local/etc/redis/redis.conf
啟動集群
redis-cli --cluster create redis1:6379 redis2:6379 redis3:6379 redis4:6379 192.168.31.6:6379 192.168.31.7:6379 --cluster-replicas 1
#六個實例分為三組,容器使用的同一個網(wǎng)絡(luò)使用容器名稱或者ip都可以却邓,記得機上端口號,每組一主一從院水,前面的做主節(jié)點腊徙,后面的做從節(jié)點。下面交互的時候 需要輸入 yes 才可以創(chuàng)建檬某。
--replicas 1 表示每個主節(jié)點有1個從節(jié)點撬腾。
測試群集,進入容器中
redis-cli -c #加-c參數(shù)恢恼,節(jié)點之間就可以互相跳轉(zhuǎn)
cluster slots #查看節(jié)點的哈希槽編號范圍
可以看到有三個節(jié)點民傻,每個節(jié)點包含一個主從服務(wù)。
查詢數(shù)據(jù)可以看到根據(jù)key調(diào)到對應(yīng)的節(jié)點场斑。name存在ip為192.168.31.3的redis2容器里漓踢。
cluster keyslot name #查看name鍵的槽編號
進入redis2容器,查看存儲的所有數(shù)據(jù)
進入redis2的從服務(wù)容器redis6和簸,查看存儲的所有數(shù)據(jù)
可以看到主從的數(shù)據(jù)一致∨砦恚現(xiàn)在可以把redis2 容器stop掉 再測試一下
第一次連接還是連接的是主數(shù)據(jù)庫192.168.31.3
再次連接就是連的是從服務(wù)192.168.31.7
再次查看集群狀態(tài):第二個節(jié)點變?yōu)榱艘慌_服務(wù)。
小結(jié):
總的來說redis主從復(fù)制是解決了redis數(shù)據(jù)安全的問題锁保。主庫掛掉數(shù)據(jù)在從庫上還存在薯酝。可以手動將從庫切換為主庫爽柒。
哨兵模式解決了主從復(fù)制中主從切換的問題吴菠,在主庫掛掉時候,通過選舉算法浩村,切換到新的主庫做葵。
集群是更高級的模式,增加了數(shù)據(jù)庫的分片存儲心墅,每個節(jié)點可以在主庫掛掉時候進行哨兵模式選舉出新的主庫酿矢。避免單機數(shù)據(jù)過大以及數(shù)據(jù)安全的問題