Redis Cluster Notes

Redis Cluster Goal:
     1. 最大支持1000個節點的高性能、可線性擴展集羣;集羣架構中無Proxy層,主從間採用異步同步機制(replication),無merge層(不支持跨節點操做)
     2. 可接受的寫入安全性(存在數據丟失的可能)
     3. 可用性:當集羣中大部分主節點可用,且失效的主節點至少有一個Slave可達時,集羣可用;支持主節點失效從節點自動升級爲主節點,支持從節點遷移以保證每一個主節點至少有一個從節點。
node

Redis集羣Key相關:
     1. 不支持須要跨節點的命令,這些命令當須要操做的Key在單個節點上時仍舊可用
     2. 支持指定某些特定Key存儲於同一節點
     3. 集羣再也不支持多databases
    
redis

單個Redis實例單進程運行,只能利用到單個CPU,若要利用服務器全部性能,可在單臺服務器運行多個實例,以最大化利用CPU性能。但要考慮到機器可用性,若機器不可用,則會致使多個實例失效。安全

Redis集羣數據一致性保證:
     Redis集羣不提供強一致性保證。默認狀況下,主節點接收到寫入命令後返回客戶端,而後與從節點進行同步。
     命令WAIT提供了集羣近似強一致性保證。
服務器

Redis集羣TCP端口:
每一個節點須要開通兩個TCP端口
     1. 接收來自客戶端的鏈接,如6379,可稱之爲命令端口。該端口需像集羣其餘節點及客戶端節點開放。
     2. 數據端口(data port),爲鏈接端口+10000,如16379,用於集羣總線(cluster bus)通訊,主要功能有:failure檢測,配置更新,failover認證等。該端口需向集羣其餘節點開放。
     3. 集羣若要正常工做,上述兩端口均需按要求開放。
    
架構

Redis集羣數據分片(Sharding):
     Redis集羣未採用一致性Hash,而是將每一個key映射到slot。一個Redis集羣擁有16384個Hash slot,這些slot被平均分配到集羣中的每一個節點上。每一個key對應的slot爲:key的CRC16碼對16384取模。
     這種數據分片方案使得在集羣中添加或者刪除節點變得很是方便,在添加或者刪除節點時,集羣無需中止。
    
Redis集羣配置參數:
    
     cluster-enabled <yes/no>: 集羣模式開關
     cluster-config-file <filename>: 集羣配置文件,用於存儲集羣內節點的信息及集羣配置信息。該文件由節點維護,每次集羣有變化時重寫,用戶不能對該文件進行編輯。
     cluster-node-timeout <milliseconds> 集羣內節點不可用的最大時間,超過該時間節點將被認爲無效。
     cluster-slave-validity-factor <factor>: 設爲0時集羣內Slave將會持續詢問Master的可用性。當設爲其餘值時,例如10,而cluster-node-timeout設爲5 seconds,當Slave與Master間超過50 seconds沒有通訊時,Slave不會嘗試再去使主節點失效,這有可能致使集羣不可用。
     cluster-migration-barrier <count>: 當某些主節點再也不具備從節點而須要migration時,其餘主節點應保留的最小Slave個數
     cluster-require-full-coverage <yes/no>: 默認爲yes,當集羣內必定比例的Key沒有被節點Cover的時候,集羣再也不可用。設爲no,則這種狀況下集羣仍舊可用
異步

Redis集羣節點ID(Node ID):
     集羣內每一個節點具備一個惟一的ID,該ID在該節點全生命週期中不變,集羣經過ID惟一標識節點,而不是可能發生變化的IP 和Port。
    
Redis集羣在線操做:
     Resharding:
         當集羣內某些節點負載太高時,能夠經過在線Resharding來均衡負載。Resharding操做期間,集羣仍舊可用。
         Resharding須要藉助redis-trib.rb 腳本完成,須要自定Resharding的Slots數量,目標節點,源節點等信息。
    
     手動故障切換(Manually Failover):
         當集羣內某些節點須要進行升級等操做時,Redis集羣支持手動故障切換操做,而同時不影響集羣的可用性。
性能

    動態添加節點:
         經過藉助redis-trib腳本能夠添加節點做爲Master或者Slave。
         redis-trib.rb add-node
     動態刪除節點:
         redis-trib.rb del-node 能夠刪除空Master或者Slave
ui

    集羣升級:
         當集羣須要升級時能夠經過動態啓停實現。
         a. 對於Slave: 經過1. 停機 2. 升級版本 3. 重啓 便可實現
         b. 對於Master:
             1. 對Master實施Manually Failover
             2. 等待Master轉變爲Slave
             3. 實施Slave升級步驟
             4. 對新Master實施Manually Failover以使原節點從新成爲Master
         c. 能夠對集羣內全部節點逐個實施上述步驟以達到升級整個集羣的目的
    
spa

相關文章
相關標籤/搜索