1. 主從復(fù)制機(jī)制
-
介紹:主機(jī)數(shù)據(jù)更新后根據(jù)配置和策略, 自動(dòng)同步到備機(jī)的master/slaver機(jī)制,Master以寫為主,Slave以讀為主;
-
優(yōu)點(diǎn):
1)讀寫分離,減輕主機(jī)的壓力,性能擴(kuò)展;
2)容災(zāi)快速恢復(fù):某個(gè)從機(jī)宕機(jī),可自動(dòng)從其他的從機(jī)讀取數(shù)據(jù); -
缺點(diǎn):復(fù)制延時(shí),從機(jī)越多,復(fù)制延時(shí)的情況越嚴(yán)重;
-
通常配置為“一主多從”模式,主機(jī)宕機(jī)帶來的影響可通過搭建集群解決;
1.1 復(fù)制原理
- 數(shù)據(jù)復(fù)制分為:1)全量復(fù)制:在從機(jī)連接主機(jī)時(shí)觸發(fā);2)增量復(fù)制:在主機(jī)有數(shù)據(jù)更新操作時(shí)觸發(fā);
情況1:從機(jī)連接主機(jī)(全量復(fù)制) - 從機(jī)Slave向主機(jī)Master發(fā)出數(shù)據(jù)同步請(qǐng)求;
- 主機(jī)將當(dāng)前內(nèi)存中數(shù)據(jù)持久化到本地rdb文件中,將rdb文件發(fā)送到從機(jī);
- 從機(jī)保存rdb文件,隨后加載該文件復(fù)制數(shù)據(jù);
情況2:主機(jī)發(fā)生數(shù)據(jù)更新(增量復(fù)制)
- 主機(jī)發(fā)生數(shù)據(jù)更新,主動(dòng)將數(shù)據(jù)更新操作發(fā)送到從機(jī);
- 從機(jī)接收更新數(shù)據(jù),完成數(shù)據(jù)同步;
1.2 配置“一主多從”試驗(yàn)主從復(fù)制
- 此處在一臺(tái)服務(wù)器中,通過啟動(dòng)不同的Redis進(jìn)程模擬“1主2從”;
- 有條件的可以使用多臺(tái)主機(jī)模擬;
- 提前創(chuàng)建一個(gè)實(shí)驗(yàn)?zāi)夸浄胖酶鱾€(gè)進(jìn)程對(duì)應(yīng)的redis.conf配置文件:1)
mkdir redis_demo
;2)cd redis_demo
; - 不同Redis進(jìn)程需要對(duì)應(yīng)不同的啟動(dòng)端口,此處三個(gè)進(jìn)程分別對(duì)應(yīng)6379、6380、6381端口;
- 配置文件公共內(nèi)容通過
include
參數(shù)引入,由相同目錄下redis.conf文件提供; - 主機(jī)負(fù)責(zé)寫數(shù)據(jù),從機(jī)負(fù)責(zé)讀數(shù)據(jù);
1)為每個(gè)Redis進(jìn)程提供配置文件
- 各進(jìn)程對(duì)應(yīng)配置文件分別為:redis6379.conf、redis6380.conf、redis6381.conf;
- 配置文件內(nèi)容包括:
拷貝多個(gè)redis.conf文件include(寫絕對(duì)路徑);
開啟daemonize yes;
Pid文件名字pidfile;
指定端口port;
Log文件名字;
dump.rdb名字dbfilename;
Appendonly 關(guān)掉或者換名字;
2)分別在不同客戶端啟動(dòng)Redis服務(wù)
- 使用不同的配置文件,通過
redis-server redis***.conf
啟動(dòng)Redis服務(wù); - 使用
redis-cli -p 端口號(hào)
訪問Redis服務(wù); - 可使用
info replication
查看主從復(fù)制信息;
3)配置服務(wù)器成為某主機(jī)的下屬?gòu)臋C(jī)
- 在從機(jī)環(huán)境下使用
slaveof 主機(jī)ip 主機(jī)Redis服務(wù)對(duì)應(yīng)端口
進(jìn)行配置;
1.3 不同模式
1.3.1 一主二仆
- 一個(gè)主機(jī)Master,兩個(gè)從機(jī)Slave;
- 從機(jī)一旦連接主機(jī),則會(huì)從頭復(fù)制主機(jī)數(shù)據(jù);
- 從機(jī)只負(fù)責(zé)讀數(shù)據(jù),無法寫數(shù)據(jù);
- 主機(jī)宕機(jī)后,從機(jī)不作任何操作,原地等待主機(jī)恢復(fù);
1.3.2 薪火相傳
- 從機(jī)slave也可以作為某些下屬服務(wù)器的主機(jī)master;
- 從機(jī)只會(huì)與其從屬的主機(jī)進(jìn)行數(shù)據(jù)同步;
- 優(yōu)點(diǎn):有效降低主機(jī)的寫壓力;
- 缺點(diǎn):一旦作為“主機(jī)”的從機(jī)宕機(jī),其下屬的從機(jī)都無法進(jìn)行數(shù)據(jù)復(fù)制;
1.3.3 反客為主
- 當(dāng)主機(jī)宕機(jī)后,與其相連的從機(jī)可變?yōu)橹鳈C(jī);
- 實(shí)現(xiàn)方式,在從機(jī)中執(zhí)行
slaveof no one
命令即可;
1.4 哨兵模式
-
反客為主的自動(dòng)版,能夠后臺(tái)監(jiān)控主機(jī)是否故障,如果故障了根據(jù)投票數(shù)自動(dòng)將從庫轉(zhuǎn)換為主庫;
-
選擇策略:
優(yōu)先級(jí)在redis.conf中默認(rèn):replica-priority 100
,值越小優(yōu)先級(jí)越高;
偏移量是指獲得原主機(jī)數(shù)據(jù)最全的;
每個(gè)redis實(shí)例啟動(dòng)后都會(huì)隨機(jī)生成一個(gè)40位的runid;
1.4.1 使用一主二仆模式試驗(yàn)哨兵模式
- 提前配置好一主二仆模式,參見2.2節(jié);
- 在配置文件目錄下新建sentinel.conf哨兵模式配置文件;
-
sentinel.conf文件中寫入內(nèi)容
sentinel monitor 監(jiān)控主機(jī)別名 主機(jī)ip Redis進(jìn)程端口號(hào) 同意發(fā)生遷移的哨兵數(shù)量
:該哨兵需要監(jiān)控的主機(jī)ip等信息; - 啟動(dòng)哨兵:
redis-sentinel sentinel.conf
; - 一旦哨兵所監(jiān)控的主機(jī)發(fā)生故障,哨兵會(huì)根據(jù)投票數(shù)量在主機(jī)所下屬的從機(jī)中選取一個(gè)作為新的主機(jī);
- 原始主機(jī)重新啟動(dòng)后,自動(dòng)變?yōu)閺臋C(jī);
2. 集群
-
Redis存在的問題:
1)Redis擴(kuò)容問題;
2)Redis分?jǐn)偛l(fā)寫操作;
3)主從模式,薪火相傳模式,主機(jī)宕機(jī),導(dǎo)致ip地址發(fā)生變化,應(yīng)用程序中配置需要修改對(duì)應(yīng)的主機(jī)地址、端口等信息; -
解決方案:
1)早期方案:代理主機(jī)
特點(diǎn):客戶端請(qǐng)求通過代理主機(jī)轉(zhuǎn)發(fā);
2)早期方案:無中心化集群
特點(diǎn):服務(wù)器之間互相連通,任何一臺(tái)服務(wù)器都可以作為客戶端訪問入口; -
集群介紹:
1)Redis 集群實(shí)現(xiàn)了對(duì)Redis的水平擴(kuò)容,即啟動(dòng)N個(gè)redis節(jié)點(diǎn),將整個(gè)數(shù)據(jù)庫分布存儲(chǔ)在這N個(gè)節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)存儲(chǔ)總數(shù)據(jù)的1/N;
2)Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability): 即使集群中有一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊, 集群也可以繼續(xù)處理命令請(qǐng)求; -
集群缺點(diǎn):
1)多鍵操作是不被支持的 ;
2)多鍵的Redis事務(wù)是不被支持的;lua腳本不被支持;
3)由于集群方案出現(xiàn)較晚,很多公司已經(jīng)采用了其他的集群方案,而代理或者客戶端分片的方案想要遷移至redis cluster,需要整體遷移而不是逐步過渡,復(fù)雜度較大;
2.1 模擬實(shí)現(xiàn)集群
搭建集群流程:文章來源:http://www.zghlxwxcb.cn/news/detail-479095.html
- 1)清空已有的rdb文件、aof文件;
- 2)使用Redis服務(wù)器中6個(gè)不同的Redis進(jìn)程模擬不同服務(wù)器,進(jìn)程分別對(duì)應(yīng)6379、6380、6381、6389、6390、6391端口,對(duì)應(yīng)配置文件分別為:**redis6379.conf、redis6380.conf、redis6381.conf等;
- 3)配置文件內(nèi)容包括:
拷貝多個(gè)redis.conf文件include(寫絕對(duì)路徑);
開啟daemonize yes;
Pid文件名字pidfile;
指定端口port;
Log文件名字;
dump.rdb名字dbfilename;
Appendonly 關(guān)掉或者換名字;
cluster-enabled yes 打開集群模式;
cluster-config-file nodes-xxx.conf 設(shè)定節(jié)點(diǎn)配置文件名;
cluster-node-timeout 15000 設(shè)定節(jié)點(diǎn)失聯(lián)時(shí)間,超過該時(shí)間(毫秒),集群自動(dòng)進(jìn)行主從切換; - 4)啟動(dòng)6個(gè)Redis進(jìn)程;
- 5)將6個(gè)節(jié)點(diǎn)合成一個(gè)集群:進(jìn)入
Redis安裝目錄的src目錄下
,使用redis-cli --cluster create --cluster-replicas 1 ip:6379 ip:6380 ip:6381 ip:6389 ip:6390 ip:6391
進(jìn)行合體; - 6)采用
redis-cli -c -p 任意Redis服務(wù)端口
進(jìn)行集群策略連接,設(shè)置數(shù)據(jù)會(huì)自動(dòng)切換到相應(yīng)的寫主機(jī); - 可使用
cluster nodes
查看集群節(jié)點(diǎn)信息;
2.1.1 節(jié)點(diǎn)分配策略
- 此處采用6個(gè)節(jié)點(diǎn)搭建無中心化主從集群;
- 每個(gè)主機(jī)搭配一個(gè)從機(jī);
- Redis要求集群至少有3個(gè)主節(jié)點(diǎn);
-
--cluster-replicas 1
指Redis要求每個(gè)主機(jī)至少需要一個(gè)從機(jī),故6個(gè)節(jié)點(diǎn)被分為3組,每組由一個(gè)主節(jié)點(diǎn)和一個(gè)從節(jié)點(diǎn)構(gòu)成; - 分配原則:1)盡量保證主節(jié)點(diǎn)不在同一個(gè)IP地址;2)盡量保證主節(jié)點(diǎn)和從節(jié)點(diǎn)不在同一個(gè)IP地址;
2.1.2 slots介紹
- slot是插槽的意思,Redis集群共包括16384個(gè)插槽,編號(hào)為0~16383;
- Redis集群將所有的插槽均分到每個(gè)主節(jié)點(diǎn)中,即每個(gè)主節(jié)點(diǎn)對(duì)應(yīng)的插槽對(duì)應(yīng)一個(gè)編號(hào)區(qū)間,比如0~5460;
- 數(shù)據(jù)庫中的鍵屬于某個(gè)插槽slot,集群通過
CRC16(key) % 16384
來計(jì)算鍵key屬于哪個(gè)槽;
2.2 集群相關(guān)操作
- 在進(jìn)行數(shù)據(jù)操作時(shí),集群會(huì)先計(jì)算出鍵key屬于哪個(gè)槽,然后通過插槽缺點(diǎn)數(shù)據(jù)所在主節(jié)點(diǎn);
- 寫入數(shù)據(jù)時(shí)需注意,不在一個(gè)slot下的鍵值,是不能使用mget,mset等多鍵操作,如果還想使用則需要通過{}定義組的概念,從而使key中{}內(nèi)相同內(nèi)容的鍵值對(duì)放到一個(gè)slot中去;
- 查找數(shù)據(jù):
1)cluster keyslot key
計(jì)算key所在插槽;
2)cluster countkeysinslot 插槽編號(hào)
統(tǒng)計(jì)該插槽內(nèi)key的數(shù)量;
3)cluster getkeysinslot 插槽編號(hào) 期望返回的key數(shù)量
返回期望數(shù)量個(gè)該槽中的鍵;
2.3 故障恢復(fù)
- 主節(jié)點(diǎn)出現(xiàn)故障,超過15秒會(huì)自動(dòng)發(fā)生主從切換,切記如果為服務(wù)器設(shè)置了訪問密碼,需要在從機(jī)配置文件中配置對(duì)應(yīng)主機(jī)
masterauth 密碼
才能自動(dòng)切換; - 發(fā)生故障的主節(jié)點(diǎn)恢復(fù)后,成為從機(jī);
- 如果某段插槽對(duì)應(yīng)的主從節(jié)點(diǎn)都出現(xiàn)故障,存在以下兩種情況,該參數(shù)在redis.conf文件中進(jìn)行配置:
1)cluster-require-full-coverage = yes
則整個(gè)集群全部掛掉,不能使用;
2)cluster-require-full-coverage = no
則整個(gè)集群中只有當(dāng)前主從節(jié)點(diǎn)無法使用,其他部分正常使用;
參考資料:《尚硅谷》文章來源地址http://www.zghlxwxcb.cn/news/detail-479095.html
到了這里,關(guān)于Redis進(jìn)階:主從復(fù)制、集群搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!