redis主從複制
redis主從配置比較簡單,基本就是在從節點配置檔案加上:slaveof 192.168.33.130 6379
主要是通過master server持久化的rdb檔案實作的。master server 先dump出記憶體快照檔案,然後将rdb檔案傳給slave server,slave server 根據rdb檔案重建記憶體表。
redis複制過程如下:
1、slave server啟動連接配接到master server之後,salve server主動發送SYNC指令給master server
2、master server接受SYNC指令之後,判斷,是否有正在進行記憶體快照的子程序,如果有,則等待其結束,否則,fork一個子程序,子程序把記憶體資料儲存為檔案,并發送給slave server
3、master server子程序程序做資料快照時,父程序可以繼續接收client端請求寫資料,此時,父程序把新寫入的資料放到待發送緩存隊列中
4、slave server 接收記憶體快照檔案之後,清空記憶體資料,根據接收的快照檔案,重建記憶體表資料結構
5、master server把快照檔案發送完畢之後,發送緩存隊列中儲存的子程序快照期間改變的資料給slave server,slave server做相同處理,儲存資料一緻性
6、master server 後續接收的資料,都會通過步驟1建立的連接配接,把資料發送到slave server
需要注意:slave server如果因為網絡或其他原因斷與master server的連接配接,當slave server重新連接配接時,需要重新擷取master server的記憶體快照檔案,slave server的資料會自動全部清空,然後再重建立立記憶體表,這樣會讓slave server 啟動恢複服務比較慢,同時也給master server帶來較大壓力,可以看出redis的複制沒有增量複制的概念,這是redis主從複制的一個主要弊端,在實際環境中,盡量規避中途增加從庫
redis2.8之前不支援增量,到2.8之後就支援增量了!
redis cluster(叢集)
3.0之後的功能,至少需要3(Master)+3(Slave)才能建立叢集,是無中心的分布式存儲架構,可以在多個節點之間進行資料共享,解決了Redis高可用、可擴充等問題。
redis叢集提供了以下兩個好處
1、将資料自動切分(split)到多個節點
2、當叢集中的某一個節點故障時,redis還可以繼續處理用戶端的請求。
一個 redis 叢集包含 16384 個哈希槽(hash slot),資料庫中的每個資料都屬于這16384個哈希槽中的一個。叢集使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽。叢集中的每一個節點負責處理一部分哈希槽。
叢集中的主從複制
叢集中的每個節點都有1個至N個複制品,其中一個為主節點,其餘的為從節點,如果主節點下線了,叢集就會把這個主節點的一個從節點設定為新的主節點,繼續工作。這樣叢集就不會因為一個主節點的下線而無法正常工作
注意:
1、如果某一個主節點和他所有的從節點都下線的話,redis叢集就會停止工作了。redis叢集不保證資料的強一緻性,在特定的情況下,redis叢集會丢失已經被執行過的寫指令
2、使用異步複制(asynchronous replication)是redis 叢集可能會丢失寫指令的其中一個原因,有時候由于網絡原因,如果網絡斷開時間太長,redis叢集就會啟用新的主節點,之前發給主節點的資料就會丢失。
Redis叢集
基本介紹
Redis
叢集是一個可以在多個
Redis
節點之間進行資料共享的設施
installation
。
Redis
叢集不支援那些需要同時處理多個鍵的
Redis
指令, 因為執行這些指令需要在多個
Redis
節點之間移動資料, 并且在高負載的情況下, 這些指令将降低
Redis
叢集的性能, 并導緻不可預測的行為。
Redis
叢集通過分區
partition
來提供一定程度的可用性
availability
: 即使叢集中有一部分節點失效或者無法進行通訊, 叢集也可以繼續處理指令請求。
Redis
叢集提供了以下兩個好處:
- 将資料自動切分
到多個節點的能力。split
- 當叢集中的一部分節點失效或者無法進行通訊時, 仍然可以繼續處理指令請求的能力。
叢集原理
redis-cluster架構圖
- 所有的
節點彼此互聯(redis
-PING
機制),内部使用二進制協定優化傳輸速度和帶寬。PONG
- 節點的
是通過叢集中超過半數的節點檢測失效時才生效。fail
- 用戶端與
節點直連,不需要中間redis
層.用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可。proxy
-
把所有的實體節點映射到[redis-cluster
]0-16383
上,slot
負責維護cluster
<->node
<->slot
value
Redis
叢集中内置了
16384
個哈希槽,當需要在
Redis
叢集中放置一個
key-value
時,
redis
先對
key
使用
crc16
算法算出一個結果,然後把結果對
16384
求餘數,這樣每個
key
都會對應一個編号在
0-16383
之間的哈希槽,
redis
會根據節點數量大緻均等的将哈希槽映射到不同的節點
redis-cluster投票:容錯
- 投票過程是叢集中所有
參與,如果半數以上master
節點與master
節點通信逾時(master
),認為目前cluster-node-timeout
節點挂掉.master
- 什麼時候整個叢集不可用(
)?cluster_state:fail
- 如果叢集任意
挂掉,且目前master
沒有master
.叢集進入slave
狀态,也可以了解成叢集的fail
映射[slot
]不完整時進入fail狀态.0-16383
-
加入redis-3.0.0.rc1
參數,預設關閉,打開叢集相容部分失敗.cluster-require-full-coverage
- 如果叢集超過半數以上
挂掉,無論是否有master
,叢集進入slave
狀态.fail
主從概念
- 一個master可以擁有多個slave,一個slave又可以擁有多個slave。如此下去,形成了強大的多級伺服器叢集架構。
- master用寫資料,經統計:網站的讀寫比率是10:1
- 通過主從分離可以實作讀寫分離
- master和slave都是一個redis執行個體(redis服務)
-
是以,主從模型可以提高讀的能力,在一定程度上緩解了寫的能力。因為能寫仍然隻有Master節點一個,可以将讀的操作全部移交到從節點上,變相提高了寫能力。
問題:我們已經部署好了redis,并且能啟動一個redis,實作資料的讀寫,為什麼還要學習redis叢集?
答:(1)單個redis存在不穩定性。當redis服務當機了,就沒有可用的服務了。
(2)單個redis的讀寫能力是有限的。
redis叢集是為了強化redis的讀寫能力。