1五、Redis的集羣

 寫在前面的話:讀書破萬卷,編碼若有神
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
一、複製的問題
因爲複製中,每一個數據庫都是擁有完整的數據,所以複製的總數據存儲量,受限於內存最小的數據庫節點,若是數據量過大,複製就無能爲力了。
二、分片(partitioning)
分片就是將你的數據拆分到多個Redis實例的過程,這樣每一個redis實例將只包含完整數據的一部分。常見的分片方式:
  • 按照範圍分片
  • 哈希分片,好比一致性哈希
三、常見的分片實現
  1. 在客戶端進行分片
  2. 經過代理來進行分片,好比:Twemproxy
  3. 查詢路由:就是發送查詢到一個隨機實例,這個實例會保證轉發你的查詢到正確的節點,Redis集羣在客戶端的幫助下,實現了查詢路由的一種混合形式,請求不是直接從Redis實例轉發到另外一個,而是客戶端收到重定向到正確的節點。
  4. 在服務器端進行分片,Redis採用哈希槽(hash slot)的方式在服務器端進行分片:Redis集羣有16384個哈希槽,使用鍵的CRC16編碼對16384取模來計算一個鍵所屬的哈希槽。
四、Redis分片的缺點
  1. 不支持涉及多鍵的操做,如mget,若是所操做的鍵都在同一個節點,就正常執行,不然會提示錯誤
  2. 分片的粒度是鍵,所以每一個鍵對應的值不要太大
  3. 數據備份會比較麻煩,備份數據時你須要聚合多個實例和主機的持久化文件
  4. 擴容的處理比較麻煩
  5. 故障恢復的處理也比較麻煩,可能須要從新梳理Master和Slave的關係,並調整每一個複製集裏面的數據
五、Redis集羣
因爲數據量過大,單個複製集難以承擔,所以須要對多個複製集進行集羣,造成水平擴展,每一個複製集只負責存儲整個數據集的一部分,這就是Redis的集羣
  1. 在之前版本中,redis的集羣是依靠客戶端來分片來完成,可是這會有不少缺點,好比維護成本高,須要客戶端編碼解決;增長、移出節點都比較繁瑣等。
  2. Redis3.0新增的一大特性就是支持集羣,在不下降性能的狀況下,還提供了網絡分區後的可訪問下和支持對主數據庫故障的恢復
  3. 使用集羣后,都只能使用默認的0號數據庫
  4. 每一個Redis集羣節點須要兩個TCP鏈接打開,正常的TCP端口用來服務客戶端,列如6379,增長10000的端口用做數據端口,必須保證防火牆打開着兩個端口。
  5. Redis集羣不保證強一致性,這意味着在特定的條件下,Redis集羣可能會丟掉一些被系統受到的寫入請求命令。
六、集羣架構
  1. 全部的Redis節點彼此互聯,內部使用二進制協議優化傳輸速度和帶寬
  2. 節點的fail是經過集羣中超過半數的節點檢測失效時才生效
  3. 客戶端與Redis節點直連,不須要中間proxy層。客戶端不須要鏈接集羣的全部節點,鏈接集羣中任何一個可用節點便可
  4. 集羣把全部的物理節點映射到[0-16383]插槽上,集羣負責維護:節點-插槽-值 的關係
七、集羣操做的基本命令
(1)cluster info : 獲取集羣的信息
(2)cluster nodes : 獲取集羣當前已知的全部節點,以及這些節點的相關信息
(3)cluster meet <ip> <port> : 將ip和port所指定的節點添加到集羣中
(4)cluster forget <node_id> : 從集羣中移除node_id指定的節點
(5)cluster replicate <node_id> : 將當前節點設置爲node_id指定的節點的從節點
(6)cluster saveconfig :將節點的配置文件保存到硬盤裏面
(7)cluster addslots <slot> [slot ...] :將一個或者多個槽分配給當前節點
(8)cluster delslots <slot> [slot ...] : 從當前節點移除一個或者多個槽
(9)cluster flushslots : 移除分配給當前節點的全部槽
(10)cluster setslot <slot> NODE <node_id> : 將槽分配給node_id指定的節點,若是槽已經分配給了另外一個節點,那麼先讓另外一個節點刪除該槽,而後再進行分配。
(11)cluster setslot <slot> migrate <node_id> : 將本節點的槽遷移到指定的節點中
(12)cluster setslot <slot> importing <node_id> : 從指定節點導入槽到本節點
(13)cluster setslot <slot> stable : 取消對槽的導入(importing)或遷移(migrate)
(14)cluster keyslot <key> : 計算鍵key應該被放置在哪一個槽
(15)cluster countkeysinslot <slot> : 返回槽目前包含的鍵值對數量
(16)cluster getkeysinslot <slot> <count> : 返回count個槽中的鍵
(17)migrate 目的節點ip 目前節點port 鍵名 數據庫號 超時時間 [copy] [replace] : 遷移某個鍵值對
相關文章
相關標籤/搜索