Redis應用學習——Redis Cluster部署 原

1. 認識Redis Cluster

1. 集羣所解決的問題

  • 提供極高的併發量,即使單個Redis的併發處理量已經很多,但是在大型應用系統中,仍然遠遠不足,集羣提高了併發處理量
  • 能存儲更多的數據,單臺Redis機器的內存大小有限制,可以通過增加內存條來解決但仍然有限制,集羣就可以更好的解決

2. 數據分佈:對於一份全量數據,如果其大小超過機器內存,就需要將數據按照分區規則分佈式存儲在一個個節點上,常用分區規則有

  • 順序分佈:比如有一百個數據,4個Redis節點,那麼將這一百個數據順序分爲4份,分佈在4個節點上
  • 哈希分佈:全量數據中的每一條數據都進行一個哈希運算,依據哈希運算的結果將數據存儲在對應的節點中,並且該哈希算法要保證基本能均勻分佈數據;典型的例子就是Redis Cluster、Memcache等
    • 節點取餘哈希分區:hash(key)%nodes,依據哈希算法計算出對應數據key的哈希值,然後與節點數取餘求值,得到應該存儲在第幾個節點中,但是在節點伸縮時(增加或減少節點)就會發生數據遷移,對原來的每一個數據進行再哈希遷移存儲到新的節點中,如果遷移數據量較多就會導致系統性能消耗過大,建議節點擴容的數量翻倍,因爲這樣數據遷移發生的次數是最少的
    • 一致性哈希分區:節點區域哈希會造成數據遷移,會造成極大的性能消耗,而一致性哈希分區則減輕了這種情況;原理簡單來說就是,首先會有一個token環,這個環上代表着0到2的32次方,可以指定一個節點所在的點,多個節點將這個環分爲多段,此時將一條數據的key進行哈希運算後,將得到的值找到在token環中的位置,從該位置順時針旋轉碰到的一個節點就是存放的節點。之所以伸縮節點會減少數據遷移,是因爲每添加一個節點只會影響相鄰的兩個節點之間的數據,數據遷移量就會減少很多
    • 虛擬槽分區:Redis Cluster採用的分區規則;預設虛擬槽,每個槽隱射一個數據子集,一般會比節點數量多,Redis Cluster的範圍是0到16383,會將這些槽位均勻的分配到每個節點中,然後將每一個數據的key進行一個哈希運算後得到的值發送給Redis Cluster中的任意一個節點,假如值在該節點中的所管理槽位值範圍包括該值,那麼就保存在該節點中,如果不在範圍內,則將該數據存儲到對應的節點中;該方式也會進行數據遷移,但數據遷移量會更少,Redis Cluster中各個節點之間共享信息

3. Redis集羣的基本架構

  • 節點:服務端有多個Redis節點,每個節點都能處理來自客戶端的讀寫請求操作,並且各個節點之間都能互相通信,交換信息(比如每個節點都能知道其他節點負責那些槽位),當客戶端訪問某個節點時,如果訪問的key在這個節點上,那就直接訪問該節點,否則該節點不會自動的將客戶端連接遷移目標節點,而是會返回給客戶端key所在的目標節點的信息,客戶端再進行一次跳轉
  • meet:每一個節點都會對集羣中的其他所有節點進行meet操作,如果能夠meet到其他節點,那麼就表示兩個節點之間可以進行通信
  • 指派槽:必須要給集羣中的每一個Redis節點指派其負責管理的槽位,槽位共有從0到16383這一共16384個槽位,爲了達到負載均衡的效果,儘量均勻分配槽位到每個節點中,比如有3個節點,那麼就將0~5460槽位分配到一個節點,5461~10922分配到另一個槽位,10923~16383分配到最後一個。
  • 主從複製,實現高可用

4. Redis集羣簡單搭建過程:有兩種安裝配置方式,分別是官方工具安裝和原生命令安裝,主要介紹原生命令安裝過程,用來理解架構

  • 配置Redis節點:除了需要配置端口號port(因爲是在一臺機器進行部署集羣)、以及以守護線程運行Redis的參數daemonize yes等,主要配置參數有
    • cluster-enabled yes:該參數配置就表示當前Redis是一個Redis集羣節點
    • cluster-node-timeout 15000:該配置可以被其他節點用來判斷當前節點是否主觀下線
    • cluster-config-file nodes-port.conf:集羣節點的配置文件,通過port來區別每個節點生成的集羣配置文件
    • cluster-require-full-coverage no:用於配置是否需要當前集羣中所有節點全部正常才能對外提供服務,如果有一個節點發生故障將不會對外提供服務
    • 最簡配置示例:如下圖中的配置,將其中的端口數字修改爲每個節點所佔用的端口,複製修改該文件爲6份,用作啓動6個節點
  • meet:在一個Redis的客戶端通過meet命令,即可與另一個節點建立通信交換信息,使用格式爲cluster meet ip port,通過該命令將集羣中的所有節點連接起來
    • 連接各個節點,通過cluster nodes命令即可查看當前節點所連接的節點有哪些
  • 分配槽位:通過命令cluster addslots slot,slot爲數值,範圍是0~16383,不可能一條條的寫,所以可以通過shell腳本執行,從六個節點中任意挑選三個節點作爲主節點用於後面的主從複製,輸入對應參數執行該shell腳本爲這三個主節點分配槽位,分配完成後,在連接任意一個節點的客戶端通過cluster nodes命令即可查看集羣中節點的節點信息(比如每個節點分配的槽位、節點id等),通過cluster info命令即可查看集羣的狀態信息(比如正常的節點數等),通過這兩個命令即可查看集羣是否配置成功,成功後即可開始讀寫命令
  • 設置主從節點,建立主從複製:通過命令cluster replicate node-id,node-id表示某個節點的id,執行這個命令後就會將當前節點作爲node-id節點的從節點,實現主從複製以及高可用的自動故障轉移,node-id可以通過cluster nodes命令查看獲得,比如在上面的執行cluster nodes命令的結果圖中,6380端口的Redis節點的node-id爲 4dec2bb5e32a6cd6bec9250d4a881f46d6530746 ,建立主從節點關係後,6380、6381、6382爲主節點,6383、6384、6385爲對應的從節點,再次執行cluster nodes命令查看主從關係
  • 查看最終建立的集羣:通過cluster slots命令即可查看集羣中每一個主節點的分配的槽位範圍、自身以及從節點的IP地址和端口信息,然後可以通過集羣環境下的Redis數據讀寫命令,對集羣中的數據進行讀寫操作,集羣環境必須在連接客戶端的命令後面加 -c
  • 在實際生產環境中,不會使用這些命令進行部署,而是利用另外的一些工具更方便快捷的方式部署,瞭解這些命令是爲了更好的理解集羣架構

5. 使用Ruby腳本快速搭建Redis集羣

  • 需要準備Ruby環境:下載、編譯、安裝Ruby;然後安裝rubygem redis,這個是Ruby客戶端,用來執行Ruby命令;然後再安裝redis-trib.rb
    • 安裝ruby:通過linux命令 yum install ruby    yum install rubygems,即可安裝Ruby環境

    • 下載redis-3.0.0.gem至/usr/local下,執行:gem install /usr/local/redis-3.0.0.gem

    • 安裝redis-trib.rb只需要將Redis安裝包解壓後的目錄下,找到src目錄,將其中的redis-trib.rb文件複製到/usr/local/bin目錄下,複製到/usr/local/bin目錄下主要是爲了能夠在任意目錄下都能執行該文件,而運行該文件的前提就是要有Ruby環境

  • 正常啓動6臺Redis節點,每個Redis節點的啓動配置文件仍然和上面所寫的原生命令搭建中所使用的相同(注意,之前使用原生命令創建的集羣會產生一系列的日誌文件和生成集羣配置文件,將這些文件全部刪除後纔可以重新配置集羣,默認這些文件存儲的路徑就在每個Redis啓動配置文件中dir參數所指定的路徑下),然後使用redis-trib.rb中的命令,將這些Redis節點建立爲一個集羣
    • redis-trib.rb create --replicas <count> host1:port1 [host2:port2 ... hostn:portn] :該命令用於建立集羣和節點間主從節點關係,count參數表示一個主節點對應多少個從節點,後面寫上所有節點的IP地址和端口,redis-trib.rb會自動將這些節點分爲主節點和從節點,比如count爲1,節點數有6個,那麼前3個節點就是主節點,後面3個就是從節點,按順序主從節點對應,如果節點數量有問題無法匹配,則會報錯,否則就會返回一個配置方案,選擇是否接受該方案,輸入yes表示接受該方案,集羣就會生成

 6. Redis Cluster架構補充細節:

  • 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
  • 節點的下線是通過集羣中超過半數的主節點檢測失效時才生效.
  • 客戶端與redis節點直連,不需要中間proxy層(例如redis sentinel中需要sentinel做中間層),客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
  • redis-cluster把所有的物理節點映射到[0-16383]slot,cluster負責維護node<->slot<->value

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章