Redis應用學習——Redis Cluster部署

1. 認識Redis Cluster

1. 集羣所解決的問題node

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

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

  • 順序分佈:好比有一百個數據,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

  • 節點:服務端有多個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、638一、6382爲主節點,638三、638四、6385爲對應的從節點,再次執行cluster nodes命令查看主從關係
  • 查看最終創建的集羣:經過cluster slots命令便可查看集羣中每個主節點的分配的槽位範圍、自身以及從節點的IP地址和端口信息,而後能夠經過集羣環境下的Redis數據讀寫命令,對集羣中的數據進行讀寫操做,集羣環境必須在鏈接客戶端的命令後面加 -c
  • 在實際生產環境中,不會使用這些命令進行部署,而是利用另外的一些工具更方便快捷的方式部署,瞭解這些命令是爲了更好的理解集羣架構

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

  • 須要準備Ruby環境:下載、編譯、安裝Ruby;而後安裝rubygem redis,這個是Ruby客戶端,用來執行Ruby命令;而後再安裝redis-trib.rb
    • 安裝ruby:經過linux命令 yum install ruby    yum install rubygems,便可安裝Ruby環境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
相關文章
相關標籤/搜索