1. 程式人生 > >Redis叢集方案應該怎麼做?

Redis叢集方案應該怎麼做?

Redis Cluster叢集

一、redis-cluster設計

Redis叢集搭建的方式有多種,例如使用zookeeper等,但從redis 3.0之後版本支援redis-cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。其redis-cluster架構圖如下:

其結構特點:

     1、所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。
     2、節點的fail是通過叢集中超過半數的節點檢測失效時才生效。
     3、客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。
     4、redis-cluster把所有的物理節點對映到[0-16383]slot上(不一定是平均分配),cluster 負責維護node<->slot<->value。

     5、Redis叢集預分好16384個桶,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。

1、redis cluster節點分配

   現在我們是三個主節點分別是:A, B, C 三個節點,它們可以是一臺機器上的三個埠,也可以是三臺不同的伺服器。那麼,採用雜湊槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:


      節點A覆蓋0-5460;
      節點B覆蓋5461-10922;
      節點C覆蓋10923-16383.

     獲取資料:

      如果存入一個值,按照redis cluster雜湊槽的演算法: CRC16('key')%16384 = 6782。 那麼就會把這個key 的儲存分配到 B 上了。同樣,當我連線(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的演算法,然後內部跳轉到B節點上獲取資料 

     新增一個主節點:

      新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上,我會在接下來的實踐中實驗。大致就會變成這樣:
  

    節點A覆蓋1365-5460
    節點B覆蓋6827-10922
    節點C覆蓋12288-16383
    節點D覆蓋0-1364,5461-6826,10923-12287


     同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了。

    2、Redis Cluster主從模式

          redis cluster 為了保證資料的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供資料存取,從節點則是從主節點拉取資料備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證叢集不會掛掉。

      上面那個例子裡, 叢集有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個叢集了。A和C的slot也無法訪問。

     所以我們在叢集建立的時候,一定要為每個主節點都添加了從節點, 比如像這樣, 叢集包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B掛掉系統也可以繼續正確工作。

     B1節點替代了B節點,所以Redis叢集將會選擇B1節點作為新的主節點,叢集將會繼續正確地提供服務。 當B重新開啟後,它就會變成B1的從節點。

    不過需要注意,如果節點B和B1同時掛了,Redis叢集就無法繼續正確地提供服務了。

二、redis叢集的搭建

    叢集中至少應該有奇數個節點,所以至少有三個節點,每個節點至少有一個備份節點,所以下面使用6節點(主節點、備份節點由redis-cluster叢集確定)。

     下面使用redis-3.2.0安裝,下載地址   

     1、安裝redis節點指定埠

         解壓redis壓縮包,編譯安裝

  1. [[email protected] redis-3.2.0]# tar xzf redis-3.2.0.tar.gz  
  2. [[email protected] redis-3.2.0]# cd redis-3.2.0  
  3. [[email protected] redis-3.2.0]# make  
  4. [[email protected] redis01]# make install PREFIX=/usr/andy/redis-cluster  

 在redis-cluster下 修改bin資料夾為redis01,複製redis.conf配置檔案

     配置redis的配置檔案redis.conf

daemonize yes #後臺啟動

        port 7001 #修改埠號,從7001到7006

        cluster-enabled yes #開啟cluster,去掉註釋

        cluster-config-file nodes.conf

        cluster-node-timeout 15000

        appendonly yes

        複製六份,修改對應的埠號

        

   2、安裝redis-trib所需的 ruby指令碼

          複製redis解壓檔案src下的redis-trib.rb檔案到redis-cluster目錄

  1. [[email protected] redis-cluster]# cp /usr/andy/redis/redis-3.2.0/src/redis-trib.rb ./  

   安裝ruby環境:

  1. [[email protected] redis-cluster]# yum install ruby  
  2. [[email protected] redis-cluster]# yum install rubygems  

 安裝redis-trib.rb執行依賴的ruby的包redis-3.2.2.gem,下載

  1. [[email protected] redis-cluster]# gem install redis-3.2.2.gem  

     3、啟動所有的redis節點

       可以寫一個命令指令碼start-all.sh

  1. cd redis01  
  2. ./redis-server redis.conf  
  3. cd ..  
  4. cd redis02  
  5. ./redis-server redis.conf  
  6. cd ..  
  7. cd redis03  
  8. ./redis-server redis.conf  
  9. cd ..  
  10. cd redis04  
  11. ./redis-server redis.conf  
  12. cd ..  
  13. cd redis05  
  14. ./redis-server redis.conf  
  15. cd ..  
  16. cd redis06  
  17. ./redis-server redis.conf  
  18. cd ..  

     設定許可權啟動

  1. [[email protected] redis-cluster]# chmod 777 start-all.sh   
  2. [[email protected] redis-cluster]# ./start-all.sh   

       檢視redis程序啟動狀態

  1. [[email protected] redis-cluster]# ps -ef | grep redis  
  2. root       4547      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7001 [cluster]  
  3. root       4551      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7002 [cluster]  
  4. root       4555      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7003 [cluster]  
  5. root       4559      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7004 [cluster]  
  6. root       4563      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7005 [cluster]  
  7. root       4567      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7006 [cluster]  
  8. root       4840   4421  0 23:26 pts/1    00:00:00 grep --color=auto redis  

  可以看到redis的6個節點已經啟動成功

    殺死全部的幾點:

  1. [[email protected] redis-cluster]# pkill -9 redis  

     4、使用redis-trib.rb建立叢集

  1. ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006  

       使用create命令 --replicas 1 引數表示為每個主節點建立一個從節點,其他引數是例項的地址集合。

  1. [[email protected] redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006  
  2. >>> Creating cluster  
  3. >>> Performing hash slots allocation on 6 nodes...  
  4. Using 3 masters:  
  5. 127.0.0.1:7001  
  6. 127.0.0.1:7002  
  7. 127.0.0.1:7003  
  8. Adding replica 127.0.0.1:7004 to 127.0.0.1:7001  
  9. Adding replica 127.0.0.1:7005 to 127.0.0.1:7002  
  10. Adding replica 127.0.0.1:7006 to 127.0.0.1:7003  
  11. M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001  
  12.    slots:0-5460 (5461 slots) master  
  13. M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002  
  14.    slots:5461-10922 (5462 slots) master  
  15. M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003  
  16.    slots:10923-16383 (5461 slots) master  
  17. S: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004  
  18.    replicates dfd510594da614469a93a0a70767ec9145aefb1a  
  19. S: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005  
  20.    replicates e02eac35110bbf44c61ff90175e04d55cca097ff  
  21. S: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006  
  22.    replicates 4385809e6f4952ecb122dbfedbee29109d6bb234  
  23. Can I set the above configuration? (type 'yes' to accept): yes  
  24. >>> Nodes configuration updated  
  25. >>> Assign a different config epoch to each node  
  26. >>> Sending CLUSTER MEET messages to join the cluster  
  27. Waiting for the cluster to join......  
  28. >>> Performing Cluster Check (using node 127.0.0.1:7001)  
  29. M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001  
  30.    slots:0-5460 (5461 slots) master  
  31. M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002  
  32.    slots:5461-10922 (5462 slots) master  
  33. M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003  
  34.    slots:10923-16383 (5461 slots) master  
  35. M: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004  
  36.    slots: (0 slots) master  
  37.    replicates dfd510594da614469a93a0a70767ec9145aefb1a  
  38. M: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005  
  39.    slots: (0 slots) master  
  40.    replicates e02eac35110bbf44c61ff90175e04d55cca097ff  
  41. M: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006  
  42.    slots: (0 slots) master  
  43.    replicates 4385809e6f4952ecb122dbfedbee29109d6bb234  
  44. [OK] All nodes agree about slots configuration.  
  45. >>> Check for open slots...  
  46. >>> Check slots coverage...  
  47. [OK] All 16384 slots covered.  

 上面顯示建立成功,有3個主節點,3個從節點,每個節點都是成功連線狀態。

3個主節點[M]以及分配的雜湊卡槽如下:

  M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001
       slots:0-5460 (5461 slots) master
  M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002
       slots:5461-10922 (5462 slots) master
  M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003
       slots:10923-16383 (5461 slots) master

 3個從節點[S]以及附屬的主節點如下:

          S: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004
             replicates dfd510594da614469a93a0a70767ec9145aefb1a
          S: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005
             replicates e02eac35110bbf44c61ff90175e04d55cca097ff
          S: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006
             replicates 4385809e6f4952ecb122dbfedbee29109d6bb234

以上叢集安裝成功了,如果安裝未成功報如下錯誤
       >>> Creating cluster
       [ERR] Sorry, can't connect to node  ....

          需要安裝最新的ruby原始碼,下載

  1. [[email protected] redis-cluster]# tar -zxvf ruby-2.3.1.tar.gz   
  2. [[email protected] redis-cluster]# cd    
  3. [[email protected] redis-cluster]# ./configure --prefix=/usr/local/ruby-2.3.1    
  4. [[email protected] redis-cluster]# make && make install       
  5. [[email protected] redis-cluster]#gem install redis    

         還有一種情況是,在VMware做測試的時間(都在一臺伺服器時),ip應該使用127.0.0.1,如果使用區域網ip,也會報節點建立失敗。

        

三、redis叢集的測試

     1、測試存取值

         客戶端連線叢集redis-cli需要帶上 -c ,redis-cli -c -p 埠號

相關推薦

Redis叢集方案應該怎麼

Redis Cluster叢集 一、redis-cluster設計 Redis叢集搭建的方式有多種,例如使用zookeeper等,但從redis 3.0之後版本支援redis-cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資

Redis叢集方案應該怎麼?都有哪些方案

twemproxy,它類似於一個代理方式,使用方法和普通redis無任何區別,設定好它下屬的多個redis例項後,使用時在本需要連線redis的地方改為連線twemproxy,它會以一個代理的身份接收請求並使用一致性hash演算法,將請求轉接到具體redis,將結果返回twemproxy。使用方式簡單(相對r

第一章:Redis+twemproxy+keepalive+ sentinel實現完整的redis叢集方案實驗

Redis叢集 1.  背景描述 Redis+twemproxy+keepalive+ sentinel實現完整的redis叢集方案 Redis:快取伺服器 Twemproxy:redis的負載均衡代理伺服器,主要對redis的多主從複製叢集進行負載均衡 Keepaliv

這可能是最全的Redis叢集方案介紹了

來源   由於Redis出眾的效能,其在眾多的移動網際網路企業中得到廣泛的應用。Redis在3.0版本前只支援單例項模式,雖然現在的伺服器記憶體可以到100GB、200GB的規模,但是單例項模式限制了Redis沒法滿足業務的需求(例如新浪微博就曾經用Redis儲存了超過

Redis叢集方案及實現

之前做了一個Redis的叢集方案,跑了小半年,線上執行的很穩定差不多可以跟大家分享下經驗,前面寫了一篇文章 資料線上服務的一些探索經驗,可以做為背景閱讀應用我們的Redis叢集主要承擔了以下服務:1. 實時推薦2. 使用者畫像3. 誠信分值服務叢集狀況叢集峰值QPS 1W左右

架構設計:系統儲存(18)——Redis叢集方案:高效能

1、概述 通過上一篇文章(《架構設計:系統儲存(17)——Redis叢集方案:高可用》)的內容,Redis主從複製的基本功能和進行Redis高可用叢集監控的Sentinel基本功能基本呈現給了讀者。雖然本人並不清楚上一篇根據筆者實際工作經驗所撰寫的文章有什麼重

Redis叢集方案(codis)

Codis是豌豆莢使用Go和C語言開發、以代理的方式實現的一個Redis分散式叢集解決方案,且完全相容Twemproxy。Twemproxy對於上一層的應用來說, 連線Codis Proxy(Redis代理服務)和連線原生的Redis伺服器沒有明顯的區別,上一層應用能夠像使用單機的 Redis一樣對待。

Redis叢集方案,Codis安裝測試

1,關於豌豆莢開源的Codis Codis是豌豆莢使用Go和C語言開發、以代理的方式實現的一個Redis分散式叢集解決方案,且完全相容Twemproxy。Twemproxy對於上一層的應用來說, 連線Codis Proxy(Redis代理服務)和連線原生的

redis叢集方案-一致性hash演算法

前奏 叢集的概念早在 Redis 3.0 之前討論了,3.0 才在原始碼中出現。Redis 叢集要考慮的問題: 節點之間怎麼據的同步,如何做到資料一致性。一主一備的模式,可以用 Redis 內部實現的主從備份實現資料同步。但節點不斷增多,存在多個 master 的時候,

Redis叢集方案的對比

Redis叢集方案          長期以來,Redis本身僅支援單例項,記憶體一般最多10~20GB。這無法支撐大型線上業務系統的需求。而且也造成資源的利用率過低,畢竟現在伺服器記憶體動輒100~200GB。          為解決單機承載能力不足的問題,出現了不

Redis叢集方案-Codis

作者介紹 郝朝陽,DevOps視角社群發起人,高階運維工程師,專注於運維自動化的實現。現就職於宜搜科技,負責前端運維工作。致力於形成自己的運維細想體系。 codis介紹 codis是豌豆莢基礎架構團隊開發並開源的分散式redis服務,可以看作是一個無限記憶體的redis服務,有動態擴容/縮容的能力。

基於twemproxy的redis叢集方案實踐

Twemproxy又名nutcraker,是由Twtter 開源,是一種代理分片機制的中介軟體(類似於mycat),主要用於管理 Redis Memcached 叢集,可接受來自多個客戶端的請求,按照路由規則,轉發給後端cache節點,減少了客戶端與cache 伺服器直接連線的數量。 一、t

基於Twemproxy的Redis叢集方案部署

1、安裝redis。 2、在一臺機器上搭建多個redis例項 需要啟動多個Redis例項: 一臺Redis伺服器,分成多個節點,每個節點分配一個埠(6380,6381…),預設埠是6379。 每個節點對應一個Redis配置檔案,如: redis6380.conf、redi

Redis叢集方案

Redis叢集方案目前主流的有三種: 主從 SENTINEL CLUSTER SENTINEL sentinel是redis2

大資料量的方案收集--AdMaster 如何駕馭百億級Key實時Redis 叢集

注:本文轉載自公眾號AdMaster 作為技術驅動的營銷資料公司,AdMaster每天處理超過100億的資料請求,每天對1000億資料進行上千種維度計算,每天增加超過5T資料量,為來自各行業的客戶提供7*24小時資料應用服務。在這樣領先的技術佈局下,無論是資料實時性還是資料安全,都能得到

基於Redis Sentinel的Redis叢集(主從&Sharding)高可用方案

本文主要介紹一種通過Jedis&Sentinel實現Redis叢集高可用方案,該方案需要使用Jedis2.2.2及以上版本(強制),Redis2.8及以上版本(可選,Sentinel最早出現在Redis2.4中,Redis2.8中Sentinel更加穩定),Red

redis叢集redis宕機處理方案

redis一般在企業中做分散式快取,可以大大的減小高併發的開銷 企業中一定不是單機版的 因為如果是單機版的有可能會引起宕機 redis叢集:兩臺為一組,一臺主機一臺備機 ,平時主機工作,備機不工作 ,備機每隔幾秒就會給主機發送一個ping ,主機在正常工作的

redis叢集部署方案

1)     系統包安裝 配置作業系統yum 源安裝以下系統包 安裝gcc:yum install gcc 安裝zlib:yum install zib 安裝ruby:yum install ruby 2.0以上 安裝rubygems:yum install

深入學習Redis叢集搭建方案及實現原理

本文將詳細介紹叢集,主要內容包括: 叢集的作用 叢集的搭建方法及設計方案 叢集的基本原理 客戶端訪問叢集的方法 實踐須知(叢集伸縮、故障轉移、引數優化等) 叢集的作用 叢集,即 Redis Cluster,是 Redis

錯過血虧!深入學習Redis叢集搭建方案及實現原理

本文將詳細介紹叢集,主要內容包括:  ●  叢集的作用 ●  叢集的搭建方法及設計方案 ●  叢集的基本原理 ●  客戶端訪問叢集的方法  ●  實踐須知(叢集伸縮、故障轉移、引數優化等) 叢集的作用 叢集,即 Redis Cluster,是 Redis 3.0 開始