66.9-Redis主從復(fù)制沮焕、高可用和3.0集群

決心做好你自己吨岭,要知道,只有發(fā)現(xiàn)自我價值的人峦树,才不會苦惱 !


總結(jié):

  1. redis持久化是有缺陷的辣辫,

Redis集群

Redis集群分為:
主從復(fù)制Replication
高可用 Sentinel(必用) 怎么都能用:3臺
集群Cluster

1. 主從復(fù)制

典型的主從模型,主Redis服務(wù)稱為Master魁巩,從Redis服務(wù)稱為Slave急灭。一主可以多從。

Master會一直將自己的數(shù)據(jù)更新同步到Slave谷遂,以保持主從同步葬馋。
只有Master可以執(zhí)行讀寫操作,Slave只能執(zhí)行讀操作肾扰〕胨唬客戶端可以連接到任一Slave執(zhí)行讀操作,來降低Master的讀取壓力。

創(chuàng)建主從復(fù)制

1. 命令創(chuàng)建(主  從)
redis-server --slaveof <master-ip> <master-port>
配置當(dāng)前服務(wù)稱為某Redis服務(wù)的Slave
redis-server --port 6380 --slaveof 127.0.0.1 6379

2. 指令創(chuàng)建
SLAVEOF host port命令,將當(dāng)前服務(wù)器狀態(tài)從Master修改為別的服務(wù)器的Slave 
redis > SLAVEOF 192.168.1.1 6379娜亿,將服務(wù)器轉(zhuǎn)換為Slave 
redis > SLAVEOF NO ONE ,將服務(wù)器重新恢復(fù)到Master蒋院,不會丟棄已同步數(shù)據(jù)

3. 配置方式
啟動時,服務(wù)器讀取配置文件莲绰,并自動成為指定服務(wù)器的從服務(wù)器
slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379

主從實驗
Master 192.168.140.135 6379
Slave 192.168.140.140 6379

# redis-cli -h 192.168.142.140 -p 6379
slave> SET testkey abc
slave> KEYS *
slave> SLAVEOF 192.168.142.135 6379
slave> KEYS *   看看是否發(fā)生改變
slave> set slavekey 123
(error) READONLY You can't write against a read only slave.
master> SET masterkey 123
slave> GET masterkey
slave> SLAVEOF NO ONE     解除從
slave> KEYS *
slave> SET slavekey1 abc  可寫了
slave> KEYS *

采用上面的多種方式都可以實現(xiàn)主從模式欺旧,一般來說,主從服務(wù)器都是固定的钉蒲,采用配置文件方式切端。

主從復(fù)制問題
一個Master可以有多個Slaves。
如果Slave下線顷啼,只是讀請求的處理能力下降踏枣。
但Master下線,寫請求無法執(zhí)行钙蒙。
當(dāng)Master下線茵瀑,其中一臺Slave使用SLAVEOF no one命令成為Master,其它Slaves執(zhí)行SLAVEOF命令指向這個新的Master躬厌,從它這里同步數(shù)據(jù)马昨。

這個主從轉(zhuǎn)移的過程手動的竞帽,如果要實現(xiàn)自動故障轉(zhuǎn)移,這就需要Sentinel哨兵鸿捧,實現(xiàn)故障轉(zhuǎn)移Failover操作

2. 高可用Sentinel

Redis官方的高可用方案屹篓,可以用它管理多個Redis服務(wù)實例。
Redis Sentinel是一個分布式系統(tǒng)匙奴,可以在一個架構(gòu)中運行多個Sentinel進(jìn)程

使用編譯時產(chǎn)生的redis-sentinel文件堆巧,在新的版本中,它就是redis-server的軟鏈接泼菌。

Sentinel啟動啟動一個運行在Sentinel模式下的Redis服務(wù)實例
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
推薦使用第一種

[root@Centos7 dell]# cd /magedu/redis/bin/
[root@Centos7 bin]# ll
total 15080
-rwxr-xr-x. 1 root root 2433432 Aug 13 17:07 redis-benchmark
-rwxr-xr-x. 1 root root   24992 Aug 13 17:07 redis-check-aof
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-check-rdb
-rwxr-xr-x. 1 root root 2586480 Aug 13 17:07 redis-cli
lrwxrwxrwx. 1 root root      12 Aug 13 17:07 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-server

Sentinel會監(jiān)控Master谍肤、Slave是否正常,可以監(jiān)控多個Master哗伯、Slave荒揣。

Sentinel網(wǎng)絡(luò):監(jiān)控同一個Master的Sentinel會自動連接,組成分布式的Sentinel網(wǎng)絡(luò)焊刹,相互通信并交換監(jiān)控信息

服務(wù)器下線
當(dāng)一個sentinel認(rèn)為被監(jiān)視的服務(wù)器已經(jīng)下線時系任,它會向網(wǎng)絡(luò)中的其他Sentinel進(jìn)行確認(rèn),判斷該服務(wù)器是否真的已經(jīng)下線

如果下線的服務(wù)器為主服務(wù)器虐块,那么sentinel網(wǎng)絡(luò)將對下線主服務(wù)器進(jìn)行自動故障轉(zhuǎn)移赋除,通過將下線主服務(wù)器的某個從服務(wù)器提升為新的主服務(wù)器,并讓其從服務(wù)器轉(zhuǎn)為復(fù)制新的主服務(wù)器非凌,以此來讓系統(tǒng)重新回到上線的狀態(tài)

如果原來的主服務(wù)器恢復(fù),只能成為一臺Slave服務(wù)器荆针。

主觀下線sdown:單個Sentinel認(rèn)為服務(wù)器下線
客觀下線odown:多個Sentinel通信后做出了服務(wù)器下線的判斷

當(dāng)server1的下線時長超過用戶設(shè)定的下線時長上限時敞嗡,Sentinel系統(tǒng)就會對server1執(zhí)行故障轉(zhuǎn)移操作:

  • 首先,Sentinel系統(tǒng)會挑選server1屬下的其中一個從服務(wù)器航背,并將這個被選中的從服務(wù)器升級為新的主服務(wù)器喉悴。
  • 之后,Sentinel系統(tǒng)會向server1屬下的所有從服務(wù)器發(fā)送新的復(fù)制指令玖媚,讓它們成為新的主服務(wù)器的從服務(wù)器箕肃,當(dāng)所有從服務(wù)器都開始復(fù)制新的主服務(wù)器時,故障轉(zhuǎn)移操作執(zhí)行完畢今魔。
  • 另外勺像,Sentinel還會繼續(xù)監(jiān)視已下線的server1,并在它重新上線時错森,將它設(shè)置為新的主服務(wù)器的從服務(wù)器吟宦。
配置

至少包含一個監(jiān)控配置選項,用于指定被監(jiān)控Master的相關(guān)信息

Sentinel monitor<name><ip><port><quorum> 涩维,例如 sentinel monitor mymaster 127.0.0.1 6379 2   

監(jiān)視mymaster的主服務(wù)器殃姓,服務(wù)器ip和端口,將這個主服務(wù)器判斷為下線失效至少需要2個Sentinel同意,如果多數(shù)Sentinel同意才會執(zhí)行故障轉(zhuǎn)移
Sentinel會根據(jù)Master的配置自動發(fā)現(xiàn)Master的Slaves

sentinel down-after-milliseconds mymaster 60000
認(rèn)為服務(wù)器下線的毫秒數(shù)蜗侈。Sentinel在指定的毫秒數(shù)內(nèi)沒有返回給Sentinel的Ping回復(fù)篷牌,視為主管下線Sdown。

sentinel failover-timeout mymaster 180000
若sentinel在該配置值內(nèi)未能完成failover操作(即故障時主從自動切換)踏幻,則認(rèn)為本次failover失敗

sentinel parallel-syncs mymaster 1
在執(zhí)行故障轉(zhuǎn)移時枷颊, 最多可以有多少個從服務(wù)器同時對新的主服務(wù)器進(jìn)行同步。1表示只能有1臺從服務(wù)器從新主服務(wù)器同步數(shù)據(jù)叫倍,以便其他從服務(wù)器繼續(xù)提供客戶端服務(wù)的響應(yīng)偷卧。

port 26379
Sentinel默認(rèn)端口號為26379

Sentinel實驗

Master 192.168.140.135 6379
Slave 192.168.140.140 6379

先啟動主從2個Redis服務(wù)
提供Sentinel配置文件

sentinel1.conf文件內(nèi)容如下
port 26379 
Sentinel monitor s1 192.168.142.135 6379 1    # 1臺下線;
sentinel down-after-milliseconds s1 6000 
sentinel failover-timeout s1 10000 
sentinel parallel-syncs s1 1 

啟動Sentinel
redis-sentinel sentinel1.conf
在從服務(wù)器的配置中增加 slaveof 192.168.142.135 6379 吆倦,并重啟該服務(wù)

模擬Master下線
主觀下線有一個超時時間 听诸;

# ps aux | grep redis-server 
root       4588  0.1  0.9  38736  9752 ?        Ssl  14:44   0:34 /magedu/redis/bin/redis-server 
192.168.142.135:6379 
root       4754  0.0  0.0 103244   852 pts/2    S+   20:23   0:00 grep redis-server 
# kill -9 4588 
Master下線后,開始投票蚕泽,決議通過后晌梨,提升從為新主
Master再次上線

原來的主上線后,被迫轉(zhuǎn)換為從须妻。

3. Redis Cluster

從3.0開始仔蝌,Redis支持分布式集群
Redis集群采用無中心節(jié)點設(shè)計荒吏,每一個Redis節(jié)點間互相通信敛惊。
客戶端可以連接任意一個集群的節(jié)點。

Redis集群節(jié)點復(fù)制

Redis集群的每個節(jié)點都有兩種角色可選:主節(jié)點master node绰更、從節(jié)點slave node瞧挤。其中主節(jié)點用于存儲數(shù)據(jù),而從節(jié)點則是某個主節(jié)點的復(fù)制品

當(dāng)用戶需要處理更多讀請求的時候儡湾,添加從節(jié)點可以擴(kuò)展系統(tǒng)的讀性能特恬,因為Redis集群重用了單機(jī)Redis復(fù)制特性的代碼,所以集群的復(fù)制行為和我們之前介紹的單機(jī)復(fù)制特性的行為是完全一樣的


Redis集群故障轉(zhuǎn)移

Redis集群的主節(jié)點內(nèi)置了類似Redis Sentinel的節(jié)點故障檢測和自動故障轉(zhuǎn)移功能徐钠,當(dāng)集群中的某個主節(jié)點下線時癌刽,集群中的其他在線主節(jié)點會注意到這一點,并對已下線的主節(jié)點進(jìn)行故障轉(zhuǎn)移

集群進(jìn)行故障轉(zhuǎn)移的方法和Redis Sentinel進(jìn)行故障轉(zhuǎn)移的方法基本一樣尝丐,不同的是显拜,在集群里面,故障轉(zhuǎn)移是由集群中其他在線的主節(jié)點負(fù)責(zé)進(jìn)行的摊崭,所以集群不必另外使用Redis Sentinel

Redis集群分片

集群將整個數(shù)據(jù)庫分為16384個槽位slot讼油,所有key都數(shù)據(jù)這些slot中的一個,key的槽位計算公式為slot_number=crc16(key)%16384呢簸,其中crc16為16位的循環(huán)冗余校驗和函數(shù)
集群中的每個主節(jié)點都可以處理0個至16383個槽的訪問請求矮台,當(dāng)16384個槽都有某個節(jié)點在負(fù)責(zé)處理時乏屯,集群進(jìn)入上線狀態(tài),并開始處理客戶端發(fā)送的數(shù)據(jù)命令請求

舉例
三個主節(jié)點7000瘦赫、7001辰晕、7002平均分配16384個slot槽位
節(jié)點7000指派的槽位為0到5460
節(jié)點7001指派的槽位為5461到10922
節(jié)點7002指派的槽位為10923到16383

Redis集群Redirect轉(zhuǎn)向

由于Redis集群無中心節(jié)點,請求會發(fā)給任意主節(jié)點
主節(jié)點只會處理自己負(fù)責(zé)槽位的命令請求确虱,其它槽位的命令請求含友,該主節(jié)點會返回客戶端一個轉(zhuǎn)向錯誤
客戶端根據(jù)錯誤中包含的地址和端口,重新向正確的負(fù)責(zé)的主節(jié)點發(fā)起命令請求

Redis集群總結(jié)

Redis集群是一個由多個節(jié)點組成的分布式服務(wù)集群校辩,它具有復(fù)制窘问、高可用和分片特性
Redis的集群沒有中心節(jié)點,并且?guī)в袕?fù)制和故障轉(zhuǎn)移特性宜咒,這可用避免單個節(jié)點成為性能瓶頸惠赫,或者因為某個節(jié)點下線而導(dǎo)致整個集群下線

集群中的主節(jié)點負(fù)責(zé)處理槽(儲存數(shù)據(jù)),而從節(jié)點則是主節(jié)點的復(fù)制品
Redis集群將整個數(shù)據(jù)庫分為16384個槽故黑,數(shù)據(jù)庫中的每個鍵都屬于16384個槽中的其中一個
集群中的每個主節(jié)點都可以管理槽儿咱,當(dāng)16384個槽都有節(jié)點在負(fù)責(zé)時,集群進(jìn)入上線狀態(tài)场晶,可以執(zhí)行客戶端發(fā)送的數(shù)據(jù)命令

主節(jié)點只會執(zhí)行和自己負(fù)責(zé)的槽有關(guān)的命令混埠,當(dāng)節(jié)點接收到不屬于自己處理的槽的命令時,它將會處理指定槽的節(jié)點的地址返回給客戶端诗轻,而客戶端會向正確的節(jié)點重新發(fā)送

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钳宪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扳炬,更是在濱河造成了極大的恐慌使套,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞠柄,死亡現(xiàn)場離奇詭異,居然都是意外死亡嫉柴,警方通過查閱死者的電腦和手機(jī)厌杜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來计螺,“玉大人夯尽,你說我怎么就攤上這事〉锹” “怎么了匙握?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陈轿。 經(jīng)常有香客問我圈纺,道長秦忿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任蛾娶,我火速辦了婚禮灯谣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛔琅。我一直安慰自己胎许,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布罗售。 她就那樣靜靜地躺著辜窑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寨躁。 梳的紋絲不亂的頭發(fā)上穆碎,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音朽缎,去河邊找鬼惨远。 笑死,一個胖子當(dāng)著我的面吹牛话肖,可吹牛的內(nèi)容都是我干的北秽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼最筒,長吁一口氣:“原來是場噩夢啊……” “哼贺氓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起床蜘,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辙培,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邢锯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扬蕊,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年丹擎,在試婚紗的時候發(fā)現(xiàn)自己被綠了尾抑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒂培,死狀恐怖再愈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情护戳,我是刑警寧澤翎冲,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站媳荒,受9級特大地震影響抗悍,放射性物質(zhì)發(fā)生泄漏驹饺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一檐春、第九天 我趴在偏房一處隱蔽的房頂上張望逻淌。 院中可真熱鬧,春花似錦疟暖、人聲如沸卡儒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骨望。三九已至,卻和暖如春欣舵,著一層夾襖步出監(jiān)牢的瞬間擎鸠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工缘圈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留劣光,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓糟把,卻偏偏與公主長得像绢涡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遣疯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345