Redis-Cluster 5.0.4 集羣部署

1、redis-cluster設計node

Redis集羣搭建的方式有多種,開始使用主從模式作集羣,若master宕機須要手動配置slave轉爲master;後來爲了高可用提出來(redis-sentinel)哨兵模式,該模式下有一個哨兵監視master和slave,若master宕機可自動將slave轉爲master,但它也有一個問題,就是不能動態擴充;從redis 3.0以後版本支持redis-cluster集羣.redis

Redis-Cluster採用無中心結構,每一個節點保存數據和整個集羣狀態,每一個節點都和其餘全部節點鏈接。其redis-cluster架構圖以下:
其結構特色:
一、全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬。
二、節點的fail是經過集羣中超過半數的節點檢測失效時才生效。
三、客戶端與redis節點直連,不須要中間proxy層.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可。
四、redis-cluster把全部的物理節點映射到[0-16383]slot上(不必定是平均分配),cluster 負責維護node<->slot<->value。
五、Redis集羣預分好16384個桶,當須要在 Redis 集羣中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪一個桶中。

一、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節點上獲取數據 app

新增一個主節點:工具

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

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

二、Redis Cluster主從模式
    redis cluster 爲了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集羣不會掛掉。.net

上面那個例子裏, 集羣有ABC三個主節點, 若是這3個節點都沒有加入從節點,若是B掛掉了,咱們就沒法訪問整個集羣了。A和C的slot也沒法訪問。

因此咱們在集羣創建的時候,必定要爲每一個主節點都添加了從節點, 好比像這樣, 集羣包含主節點A、B、C, 以及從節點A一、B一、C1, 那麼即便B掛掉系統也能夠繼續正確工做。

B1節點替代了B節點,因此Redis集羣將會選擇B1節點做爲新的主節點,集羣將會繼續正確地提供服務。 當B從新開啓後,它就會變成B1的從節點。

不過須要注意,若是節點B和B1同時掛了,Redis集羣就沒法繼續正確地提供服務了。

2、redis5.0.4 集羣部署

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

1.準備工做

 本文使用兩臺centOS7主機,一臺機器3個節點,建立出3 master、3 salve 環境,master(192.168.6.42) salve(192.168.6.43)

 2.安裝過程

1.> 安裝支持的庫文件:

yum -y install gcc automake autoconf libtool make

2.> redis安裝

# cd /data/ # tar -zxvf redis-5.0.4.tar.gz # cd redis-5.0.4/ # make PREFIX=/data/redis install # cd src # cp redis-trib.rb /data/redis/bin/

3.> 建立 Redis 節點.

首先在 192.168.6.42 機器上 建立 redis_cluster 目錄;

# mkdir /data/redis_cluster/

在 redis_cluster 目錄下,建立名爲 637九、6380、6381的目錄,並將 redis.conf 拷貝到這三個目錄中.

# mkdir 6379 6380 6381 # cp redis.conf redis_cluster/6379 # cp redis.conf redis_cluster/6380 # cp redis.conf redis_cluster/6381 

分別修改這三個配置文件,修改以下內容

port 6379      //端口6379,6380,6381 
bind 本機ip     //默認ip爲127.0.0.1 須要改成其餘節點機器可訪問的ip 不然建立集羣時沒法訪問對應的端口,沒法建立集羣 
daemonize yes   //redis後臺運行 
pidfile /var/run/redis_6379.pid   //pidfile文件對應6379,6380,6381 
cluster-enabled yes           //開啓集羣 把註釋#去掉 
cluster-config-file nodes_6379.conf //集羣的配置 配置文件首次啓動自動生成 6379,6380,6381 把註釋#去掉 
cluster-node-timeout 15000       //請求超時 默認15秒,可自行設置 把註釋#去掉 
appendonly yes             //aof日誌開啓 有須要就開啓,它會每次寫操做都記錄一條日誌

接着在另一臺機器上(192.168.6.43),的操做重複以上三步,只是把目錄改成638二、638三、6384,對應的配置文件也按照這個規則修改便可.

4.> 啓動各節點

第一臺機器上執行:

# redis-server /data/redis_cluster/6379/redis.conf # redis-server /data/redis_cluster/6380/redis.conf # redis-server /data/redis_cluster/6381/redis.conf

另一臺機器上執行:

# redis-server /data/redis_cluster/6382/redis.conf # redis-server /data/redis_cluster/6383/redis.conf # redis-server /data/redis_cluster/6384/redis.conf

5.>  檢查 redis 啓動狀況

# ps -ef | grep redis //查看redis啓動狀況
# netstat -tnlp | grep redis//查看redis端口開啓狀況

 6.> 建立集羣

原命令 redis-trib.rb 這個工具目前已經廢棄,使用redis-cli

#使用create命令 --replicas 1 參數表示爲每一個主節點建立一個從節點,其餘參數是實例的地址集合。其中,前三個 ip:port 爲第一臺機器的節點,剩下三個爲第二臺機器.

./redis-cli --cluster create --cluster-replicas 1 192.168.6.42:6379 192.168.6.42:6380 192.168.6.42:6381 \ 192.168.6.43:6382 192.168.6.43:6383 192.168.6.43:6384

輸入 yes 便可,而後出現ok字樣,說明安裝成功.

在第一臺機器上鍊接集羣的6379端口的節點,在另一臺鏈接6382節點,鏈接方式爲 

# redis-cli -h 192.168.6.42 -c -p 6379

在6379節點執行命令  set name saneri ,執行結果以下:

 而後在另一臺6382端口,查看 key 爲 hello 的內容, get hello  ,執行結果以下:

 

參考文檔:http://www.javashuo.com/article/p-fyemayju-dr.html

相關文章
相關標籤/搜索