Redis集羣原理、搭建

在實際的生產過程當中,單服的redis存在單點的問題,redis一般須要集羣的環境。相比單服的redis,集羣有如下些好處:node

  • 1.容錯性redis

    解決在單服redis的單點問題。在一個或多個節點出現宕機的狀況下,集羣內部經過投票的機制可以快速的進行選舉和不停機的狀況下進行服務持續提供。算法

  • 2.擴展性緩存

    相比單服在升級性能過程當中,集羣也可以很好的實現緩存的性能升級【多節點的熱部署】。ruby

  • 3.性能提高服務器

    性能的提高其實在擴展過程當中,就可以隨之的體現出來。工具

1、原理

1.1 結構圖

這裏寫圖片描述

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

  • 節點的fail是經過集羣中超過半數的節點檢測失效時才生效.優化

  • 客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可ui

  • 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、搭建

2.1 安裝ruby環境

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

安裝ruby

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

安裝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(在線安裝)
  • 1
  • 2

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目錄,其下建立700一、7002。。7006目錄,以下:

這裏寫圖片描述

將redis安裝目錄bin下的文件拷貝到每一個700X目錄內,同時將redis源碼目錄src下的redis-trib.rb拷貝到redis-cluster目錄下。

修改每一個700X目錄下的redis.conf配置文件:

port 
cluster-enabled yes
  • 1
  • 2

日誌文件的一個進程的文件位置(爲了使進程文件不共用一個) 
pidfile /var/run/redis-7001.pid

2.2.2 啓動每一個節點

分別進入700一、700二、…7006目錄,執行:

./redis-server ./redis.conf
  • 1

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
  • 1

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

在執行這個命令以後,每一個node文件夾內會出現node.conf文件。在node.conf中會寫入節點和主節點之間的配置信息。表名主、從關係。以下

這裏寫圖片描述

2.2.4 查看集羣信息

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

./redis-cli -c -h 192.168.101.3 -p 7000 //以端口7000鏈接redis客戶端
  • 1
cluster nodes //查詢集羣信息
  • 1

此處一樣能看到node.conf內的配置信息。

cluster info //查詢集羣狀態信息
  • 1

這裏寫圖片描述

3、集羣常見命令

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:這時候須要首先將該節點的存在的數據,也就是槽點進行刪除纔可以進行移除節點操做
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.分配槽

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

在新添加的主從節點,須要向主節點分配必定的槽。

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

根據提示輸入想分配的槽點的個數便可,接下來會提示是根據全部的槽做爲源點進行分配仍是從特色的node進行槽的從新分配。

相關文章
相關標籤/搜索