主從
- 從機使用slaveof 命令來複制主機的緩存數據,包括同步sync與命令傳播兩個操做;
- 從機同步sync命令給主機,主機收到後執行須要耗費大量cpu、內存和磁盤IO資源的bgsave命令來生成rdb文件,併發送給從服務器,期間會耗費大量網絡資源,所以,同步的代價是很大的;
- 從機載入rdb文件後,主機再把執行bgsave後記錄在緩衝區裏的全部寫命令發送給從服務器實現主從當前狀態的同步;
- redis 2.8以前的版本在複製是若是出現了斷網,則會從新所有從新複製,效率低,2.8版之後使用psync <runid> <offset>命令,根據主機維護的複製積壓緩衝區以及主從間各自維護的偏移量來肯定是完整重同步仍是部分重同步;
- 每一個運行的redis服務器都有一個惟一識別的運行ID,初次複製從機會記錄主機的運行ID,當斷線重連是會先檢測記錄的主機ID與當前鏈接的主機ID是否一致,若是不一致則說明主機重啓過,此時將執行完整重同步;
- 複製實現過程:
- 從機保存主機的ip、port到redisServer數據結構裏;
- 主從創建套接字進行鏈接;
- 從機發送ping命令給主機對主機進行狀態監測;
- 主機對從機進行身份密碼驗證;
- 從機給主機發送監聽的端口號;
- 從機向主機發送psync同步;
- 命名傳播
- 從機默認每一秒向主機發送replconf ACK <replication_offset>,用於檢測主從服務器網絡鏈接狀態、輔助實現最小從機數配置、根據偏移量檢測命令丟失並進行適當重發。
以上文字來自Dimmacro,轉載請說明來源:http://www.cnblogs.com/dimmacro/ redis
哨兵
- sentinel由一個或多個sentinel實例組成系統監視多個主服務器以及所屬的從服務器;
- sentinel本質是一個運行在特殊模式下的redis服務器,只支持ping、sentinel、info、subscribe、unsubscribe、psubscribe、punsubscribe共7個命令;
- 每一個sentinelRedisInstance結構裏能夠是主服務器、從服務器或另外一個sentinel的信息;
- 每一個sentinel會分別於主服務器以及每一個從服務器創建命令鏈接與訂閱鏈接,經過命令鏈接分別向主從服務器發送info信息以得到主從機狀態信息,同時,經過命令鏈接向服務器的sentinel_:hello頻道發送sentinel自身信息以及主從及信息以便其餘sentinel能夠共享;
- 經過訂閱鏈接獲取sentinel_:hello頻道信息,這些信息可能來自本身,也可能來自其餘sentinel;
- sentinel與其餘sentinel之間只建立命令鏈接進行通信,共享信息經過sentinel_:hello頻道便可;
- 每一個sentinel會向主從機以及其餘sentinel發送ping命令,若是在必定的時間內沒有獲得有效回覆,則會被認爲其已主觀下線,若是是主服務器被判斷爲主觀下線,則sentinel會向其餘sentinel進行詢問,若是達到了設置的認爲下線的sentinel數,則判斷主服務器下線;
- 全部sentinel根據raft算法選舉出一個leader sentinel對已下線的主服務器進行故障轉移操做,包括在從服務器中選取某個爲主服務器(依據從的優先級、複製偏移量、最小運行ID),讓其餘從改成複製新的主,讓舊的主變爲從;
以上文字來自Dimmacro,轉載請說明來源:http://www.cnblogs.com/dimmacro/ 算法
集羣
- 多個redis節點能夠組成一個集羣,每一個節點都存儲了集羣裏自身及其餘節點的信息,使用cluster meet將某個節點加到集羣中;
- 在各自節點上使用命令cluster addlots 指派負責的槽號,每一個節點都會記錄本身及集羣內其餘節點的對應負責的槽號,全部槽號都被指派到具體節點後,整個集羣進入上線狀態;
- redis集羣將數據庫分爲8個字節共16384個slot槽,每一個鍵key的crc-16&16384獲得該key所在的槽號;
- 若是key對應的槽號不在當前節點內,會向客戶端返回moved key ip:port,引導客戶端去找正確的節點;
- 擴展節點並指派槽後整個集羣會進行從新分片,分片按單個槽依次進行,若是在槽的分片遷移過程當中請求到槽所在的節點,會發生ask重定向;
- 當集羣內的某個節點發生故障後,其餘正常的節點會從該故障節點所屬的從節點中選取一個主節點,選取的算法一樣基於raft領頭選舉算法;
- 被選中爲從節點先執行slaveof no one命令成爲主節點,而後撤銷全部對已下線主節點的槽指派,並指派給本身,而後在集羣內廣播PONG消息通知其餘主節點;
- 集羣內節點通信的5中消息:
- meet消息:請求接受者加入到發送者當前所處的集羣裏;
- ping消息:集羣內節點探測其餘節點是否在線的消息,這種消息不是每兩兩發送,並且隨機選出5個或者超過必定時間沒有返回pong消息的節點;
- pong消息:回覆meet或ping消息,或者通知其餘節點刷新對本節點的認識;
- fall消息:當節點a判斷節點b進入fall狀態,會發送此消息給集羣內的其餘節點;
- publish消息:當節點收到publish命令會執行此命令並向集羣內廣播一條publish消息,全部接收到這條publish消息的節點都會執行相同的publish命令
以上文字來自Dimmacro,轉載請說明來源:http://www.cnblogs.com/dimmacro/ 數據庫