1. 程式人生 > >Redis 菜鳥筆記(三)叢集原理、搭建

Redis 菜鳥筆記(三)叢集原理、搭建

前言

在實際的生產過程中,單服的redis存在單點的問題,redis通常需要叢集的環境。相比單服的redis,叢集有以下些好處:

  • 1.容錯性

    解決在單服redis的單點問題。在一個或多個節點出現宕機的情況下,叢集內部通過投票的機制能夠快速的進行選舉和不停機的情況下進行服務持續提供。

  • 2.擴充套件性

    相比單服在升級性能過程中,叢集也能夠很好的實現快取的效能升級【多節點的熱部署】。

  • 3.效能提升

    效能的提升其實在擴充套件過程中,就能夠隨之的體現出來。

一、原理

1.1 結構圖

這裡寫圖片描述

  • 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

  • 節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

  • 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

  • redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster
    負責維護node<->slot<->value Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個
    key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key
    都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點

1.2 容錯機制

  • (1)投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.
  • (2):什麼時候整個叢集不可用(cluster_state:fail)?
    a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage引數,預設關閉,開啟叢集相容部分失敗.
    b:如果叢集超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.
    ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

二、搭建

2.1 安裝ruby環境

redis叢集管理工具redis-trib.rb依賴ruby環境,首先需要安裝ruby環境:

安裝ruby

yum install ruby(安裝ruby環境)
yum install rubygems(安裝包管理器)

安裝ruby和redis的介面程式
拷貝redis-3.0.0.gem至/usr/local下
執行:

gem install /usr/local/redis-3.0.0.gem
gem install redis --version 3.0.5(線上安裝)

2.2節點安裝

2.2.1配置節點

在同一臺伺服器用不同的埠表示不同的redis伺服器,如下:
主節點:192.168.101.3:7001 192.168.101.3:7002 192.168.101.3:7003
從節點:192.168.101.3:7004 192.168.101.3:7005 192.168.101.3:7006

在/usr/local下建立redis-cluster目錄,其下建立7001、7002。。7006目錄,如下:

這裡寫圖片描述

將redis安裝目錄bin下的檔案拷貝到每個700X目錄內,同時將redis原始碼目錄src下的redis-trib.rb拷貝到redis-cluster目錄下。

修改每個700X目錄下的redis.conf配置檔案:

port 
cluster-enabled yes 

日誌檔案的一個程序的檔案位置(為了使程序檔案不共用一個)
pidfile /var/run/redis-7001.pid

2.2.2 啟動每個節點

分別進入7001、7002、…7006目錄,執行:

./redis-server ./redis.conf

2.2.3 建立叢集

在啟動每個節點之後,每個節點都是獨立的服務。節點之間並沒有相互形成叢集這樣一個快取環境,需要將這些節點連線到一起。

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

需要注意的是,每個叢集至少需要6個節點,三主三從。箇中引數:replicas 1 含義就是每個主節點需要一個從節點。

在執行這個命令之後,每個node資料夾內會出現node.conf檔案。在node.conf中會寫入節點和主節點之間的配置資訊。表名主、從關係。如下

這裡寫圖片描述

2.2.4 檢視叢集資訊

進入到任意一個節點的bin資料夾內,執行命令

./redis-cli -c -h 192.168.101.3 -p 7000 //以埠7000連線redis客戶端
cluster nodes //查詢叢集資訊 

此處同樣能看到node.conf內的配置資訊。

cluster info //查詢叢集狀態資訊

這裡寫圖片描述

三、叢集常見命令

1.基本操作【crud操作】

//新增主節點
./redis-trib.rb add-node  192.168.101.3:7007 192.168.101.3:7001
//新增從節點
./redis-trib.rb add-node --slave --master-id 主節點id 新增節點的ip和埠 叢集中已存在節點ip和埠
這個相對繁瑣點,需要檢視一下master節點的id,這個通過直接node.conf或者clouster nodes 命令都可以看到。
例如:
./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4【主節點】  192.168.101.3:7008 192.168.101.3:7001
//刪除節點
./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017
ps:這時候需要首先將該節點的存在的資料,也就是槽點進行刪除才能夠進行移除節點操作

2.分配槽

槽:redis 內建有2的14次方個槽點,進行儲存時根據設定的key進行演算法加密後的結果進行取餘,得到的值則為槽的編號,槽在那個節點就儲存在哪個節點。

在新新增的主從節點,需要向主節點分配一定的槽。

//分配槽點
./redis-trib.rb reshard 192.168.101.3:7001

根據提示輸入想分配的槽點的個數即可,接下來會提示是根據所有的槽作為源點進行分配還是從特點的node進行槽的重新分配。