1. 程式人生 > >Redis3快取叢集(cluster)搭建

Redis3快取叢集(cluster)搭建

Redis3以後支援Cluster特性:1.節點自動發現;2.slave->master 選舉,叢集容錯;3.Hot resharding:線上分片;4.進群管理:cluster xxx;5.基於配置(nodes-port.conf)的叢集管理;6.ASK 轉向/MOVED 轉向機制。

叢集搭建技術知識點

  • Redis服務埠:用於接收客戶端連線或客戶端請求命令的埠,如:9579.
  • Redis叢集通訊埠:用於Redis內部更新交流狀態的埠,為當前伺服器埠+10000,如19579.
  • Redis的slot:Redis把所有的keys分成16284份,從0到16283.
  • Redis伺服器的關係:主從,從是主的備份;主主:主主分別承擔不同slot的keys的資料,0-16383個slot都需要分配主伺服器上去.
  • Redis的配置檔案:redis啟動時候使用配置檔案初始化伺服器的資訊,使用命令redis-server redis.conf.
  • Redis叢集搭建的最少redis例項是3個,為3個主例項,分配0-16383個slot到三個例項中。從的redis例項可以是任意個,作為備份切換使用.
  • Redis叢集中的node_id:redis的叢集中除了使用ip加port來標示一個redis例項外,還是用了一個叫做node_id的東西來標示一個redis例項.

Redis Cluster架構

1.redis-cluster架構圖
這裡寫圖片描述

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

2.redis-cluster選舉 容錯
這裡寫圖片描述

  1. 領著選舉過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.

  2. 什麼時候整個叢集不可用(cluster_state:fail),當叢集不可用時,所有對叢集的操作做都不可用,收到((error)CLUSTERDOWN The cluster is down)錯誤.
      a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成進群的slot對映[0-16383]不完成時進入fail狀態.
      b:如果進群超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.

Redis3 安裝

1.下載與解包

cd /data/crm/crmweb
wget http:////download.redis.io/releases/redis-3.2.0.tar.gz
tar -zxvf /redis-3.2.1.tar.gz

2.編譯與安裝

cd redis-3.2.0
make && make install

3.建立Redis結點

本次我們選取一臺機作驗證,一般生產上叢集建議不要在一臺機主機上,以免出現系統單點故障,無法確保高可用。本次在一臺主機上搭建一個叢集(3個主結點,6個從結點)

cd /data/crm/crmweb/redis-3.2.0
  mkdir redis_cluster  //建立叢集目錄
  mkdir 9579 9679 9779  //分別代表三個主節點    其對應伺服器埠 9579 9679 9779
 //建立9579節點為例,拷貝到9579目錄
 cp /data/crm/crmweb/redis-3.2.0/redis.conf  ./redis_cluster/9579/   
 //拷貝到9679目錄
 cp /data/crm/crmweb/redis-3.2.0/redis.conf  ./redis_cluster/9679/   
 //拷貝到9779目錄
 cp /data/crm/crmweb/redis-3.2.0/redis.conf  ./redis_cluster/9779/   

分別對9579,9679、9779資料夾中的3個檔案修改對應的配置

daemonize    yes                          //redis後臺執行
pidfile  /var/run/redis_9579.pid          //pidfile檔案對應9579,9679,9779
port  9579                                //埠9579,9679,9779
cluster-enabled  yes                      //開啟叢集  把註釋#去掉
cluster-config-file  nodes_9579.conf      //叢集的配置  配置檔案首次啟動自動生成 9579,9679,9779
cluster-node-timeout  5000                //請求超時  設定5秒夠了
appendonly  yes                           //aof日誌開啟  有需要就開啟,它會每次寫操作都記錄一條日誌

4.啟動以上節點

cd /data/crm/crmweb/redis-3.2.0/src
redis-server  ../redis_cluster/9579/redis.conf
redis-server  ../redis_cluster/9679/redis.conf
redis-server  ../redis_cluster/9779/redis.conf

重複以上3,4兩步依次再建立其它從節點8689,8699,9689,9699,9789,9799

5.檢視啟動結果 ps -ef|grep redis
這裡寫圖片描述

建立叢集

前面已經準備好了搭建叢集的redis節點,接下來我們要把這些節點都串連起來搭建叢集。官方提供了一個工具:redis-trib.rb(/data/crm/crmweb/redis-3.2.0/src/redis-trib.rb) 看字尾就知道這鳥東西不能直接執行,它是用ruby寫的一個程式,所以我們還得安裝ruby.

yum -y install ruby ruby-devel rubygems rpm-build 

再用 gem 這個命令來安裝 redis介面 gem是ruby的一個工具包.

gem install redis    //等一會兒就好了

上面的步驟完事了,接下來執行一下redis-trib.rb

/usr/local/redis-3.2.1/src/redis-trib.rb
   Usage: redis-trib <command> <options> <arguments ...>

   reshard        host:port
                  --to <arg>
                  --yes
                  --slots <arg>
                  --from <arg>
  check          host:port
  call            host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  add-node        new_host:new_port existing_host:existing_port
                  --master-id <arg>
                  --slave
  del-node        host:port node_id
  fix            host:port
  import          host:port
                  --from <arg>
  help            (show this help)
  create          host1:port1 ... hostN:portN
                  --replicas <arg>

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

確認以上9個結點均啟動,接下就可以用上面的命令來create了。

./redis-trib.rb create --replicas 0 132.126.2.235:9579 132.126.2.235:9679 132.126.2.235:9779

replicas 0 表示為以上三個結點建立0個從結點,當然如果為1,則會為以上3個結點預設建立1個從結點。由於我想自己指定前面的6個結點分別掛在不同的主結點下,所以這裡就不自動分配了。

接下來為以上3個主結點依次掛從結點:

./redis-trib.rb **add-node** --slave --master-id ef131da7722c9451b7f111a83c19ddba8faa3df4 132.126.2.235:8689 132.126.2.235:9579

以上命令就是將132.126.2.235:8689 結點當作132.126.2.235:9579的從結點。master-id ef131da7722c9451b7f111a83c19ddba8faa3df4 這個可以有好多方式可以獲取 比如用 ./redis-trib.rb check 132.126.2.235:9579 也會顯示出來。其它結點也依次掛載到相應的主節點上。這裡就不一一寫出來了。

檢視一下 /data/crm/crmweb/redis-3.2.0/src/redis-trib.rb check 132.126.2.235:9579
到這裡叢集已經初步搭建好了。

接下來可以登陸下節點驗證一把值的存取,cluster資訊等
登陸命令:

redis-cli -h 132.126.2.235 -p 9579

這裡寫圖片描述

以上驗證基本能說明叢集已經搭建成功。

Redis3 配置檔案

以上相關步驟已經完成,以下對相關配置引數含義進行說明:
1.Redis3叢集配置項

#開啟叢集模式
cluster-enabled yes
#執行過程中叢集資訊儲存的檔名,不能衝突,需要個性化
cluster-config-file nodes.conf
#叢集節點通訊內限定的超時時間
cluster-node-timeout 5000
#以追加的方式寫資料
appendonly yes
#在某個主節點掛死的情況下,其他主節點仍然可以工作
cluster-require-full-coverage no

2.Redis3其它配置

#繫結ip,需要個性化
bind 127.0.0.1
#啟用保護模式
protected-mode yes
#繫結的服務埠,需要個性化
port 6379
tcp-backlog 511
#日誌級別debug # verbose# notice# warning
loglevel warning
#redis連線多久不連線就關閉,單位秒,0表示不斷開
timeout 0
#用於檢測連線是否掛死,每多少秒傳送一個ack
tcp-keepalive 60
daemonize no
stop-writes-on-bgsave-error no
rdbcompression no
#本地檔案儲存的資料,需要個性化
dbfilename dump.rdb
#本地資料儲存檔案dbfilename的目錄
dir ./
#開啟日誌檔案
logfile redis.log
#pidfile
pidfile /var/run/redis.pid
#配置連線數
maxclients 10000
#配置使用記憶體
maxmemory 4gb
#記憶體過期策略
maxmemory-policy volatile-lru
#需要個性化
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

問題總結

安裝問題1:

CC adlist.o
  /bin/sh: cc: command not found
  make[1]: *** [adlist.o] Error 127
  make[1]: Leaving directory `/data/crm/crmweb/redis-3.2.0/src
  make: *** [all] Error 2

解決辦法:GCC沒有安裝或版本不對,安裝一下

yum  install  gcc

安裝問題2:

zmalloc.h:50:31: 
  error: jemalloc/jemalloc.h: No such file or directory
  zmalloc.h:55:2: error: 

  #error "Newer version of jemalloc required"
  make[1]: *** [adlist.o] Error 
  1
  make[1]: Leaving directory `/data/crm/crmweb/redis-3.2.0/src
  make: *** [all] 
  Error 2

解決辦法:原因是沒有安裝jemalloc記憶體分配器,可以安裝jemalloc 或 直接輸入make MALLOC=libc && make install

叢集連通性問題1:
叢集搭建成功後,在本地tomcat啟了一個應用來訪問快取叢集,發現老是提示如下錯誤:no reachable node in cluster

這個問題竟然困繞了我一整個上午,老以為是叢集有什麼地方配置不當,但檢查再三,網上也查了好多資料,也最終沒有解決。後來試著從本地對叢集的某個節點進行了網路連線驗證:

cmd
telnet 132.126.2.235 9579

結果發現不通,運氣太差了,因為先前我試過telnet 132.126.2.235 8806是通的,原來當時只針對這個埠單獨開過。
解決方法:聯絡整合同事放開防火牆的限制即可。

其它使用問題,後續再補充……