NEIL's_學而時習之x不學無術~私藏IT技術經驗分享部落

關於部落格
NEIL. Cheng....寫作只是為了日後工作之備忘操作參考

本部落格文章撰寫前進邁向第五年(since 2009 ~至今)仍繼續推進分享IT學習!!About Windows/Linux Server,Virtualization


分享網誌: 由於,本人預先完成LAB後,才補上撰寫文章與截圖,若發現文圖對照說明有誤..本人將盡快校正,也請不吝指教! Thanks!

  • 146059

    累積人氣

  • 1

    今日人氣

    0

    訂閱人氣

Redis 3.0.x Cluster 高可用叢集設計與管理 by Navier

 [ 實驗開始 ]

Part 1 :  佈署 3台 Redis Server 安裝與啟動
(請參考前言所提到預先完成前置作業配置)

(以Redis50這台配置為例,其餘Redis51,Redis52兩台依樣畫葫蘆微修改配置即可)

<安裝Redis 3.0.5 Server Redis50(10.10.10.50/24)

cd  /usr/local

tar zxvf  
 redis-3.0.5.tar.gz  

cd redis-3.0.5

make PREFIX=/usr/local/redis       #預定安裝redis路徑指定

make PREFIX=/usr/loca/redis install    #安裝redis 

cp src/redis-trib.rb ../redis/bin/   #將叢集佈署工具redis-trib.rb 複製到安裝目錄bin底下

ls -al ../redis/bin     #在/usr/local/redis/bin 目錄下有一堆關於redis執行應用程式

編輯Redis組態檔案"redis.conf"

cd /usr/local/redis-3.0.5 

 #將redis.conf 範例檔案拷貝集中到/usr/local/redis/conf 目錄下方便管理

cp redis.conf  ../redis/conf
 

開始編輯"redis.conf"

.daemonize yes                                   #redis 後台運行
 
pidfile /var/run/redis50-7000.pid     #pid 檔案路徑
 
port 7000                                             #預設使用6379,本Lab改7000
 

 bind 10.10.10.50                                    #綁定Redis IP Address: 10.10.10.50

 unixsocket /var/run/50-7000.sock         #變更50-7000.sock
 
 timeout 150
 
loglevel verbose    #log詳細資料層級

databases 16         #資料庫數量16,保留預設

dbfilename dump-50-7000.rdb  #儲存本機磁碟db檔案名稱取名: dump-50-7000.rdb

dir  /usr/local/redis/data                #指定db資料存儲路徑: /usr/local/redis/data

appendonly yes                                               #aof持久化開啟
appendfilename append-50-7000.aof         
appendfsync everysec                                    #每秒鐘同步一次
 
 cluster-enabled yes               #啟動叢集配置
 
 cluster-config-file /usr/local/redis/data/r50-7000.conf 
 
 cluster-node-timeout 15000
 
走到,Redis組態方面配置已完成:  

 阿天王#(誤):  看過~來



由於我們Lab計畫在3台Redis Server 各自啟動兩台Redis Service Port: 7000,7001 ) 所以

需要兩份組態檔案, 在此我們將上一步完成redis.conf 複製更名為以下

Redis50:

10.10.10.50:7000  
組態對應"/usr/local/redis/conf"  redis50-7000.conf     

10.10.10.50:7001  組態對應"/usr/local/redis/conf"  redis50-7001.conf 

Then  參考上一步修改每個redis.conf 組態檔案內標示"青綠色"(不可重複相同檔案名稱)

參數檔案對應修改成各自組態
(Redis51,Redis52請參照上述依樣畫葫蘆修改即可,不再墜述)


就緒後,依序啟動 Redis50,Redis51,Redis52  Redis服務器

cd /usr/local/redis/bin  #啟動redis service  (共六個)

#Redis50(10.10.10.50/24)

./redis-server  ../conf/redis50-7000.conf

./redis-server  ../conf/redis50-7001.conf

#Redis51(10.10.10.51/24)

./redis-server  ../conf/redis51-7000.conf

./redis-server  ../conf/redis51-7001.conf


#Redis51(10.10.10.52/24)

./redis-server  ../conf/redis52-7000.conf

./redis-server  ../conf/redis52-7001.conf


[確認各台redis server port 7000,7001 正常啟動]  下圖以Redis50為例


Part 2 : 組建Redis Cluser 使用 redis-trib.rb  tool

cd /usr/local/redis/bin

./redis-trib.rb create --replicas 1 10.10.10.50:7000 10.10.10.51:7000 10.10.10.52:7000
10.10.10.52:7001 10.10.10.50:7001 10.10.10.51:7001  

#建立一個複寫叢集 1 Master 對應 1 Slave 節點 (應以順序啟動為排序)

Redis Cluster 其一Node 來檢查來看Master/Slave Node分佈狀態

./redis-trib.rb  check 10.10.10.52:7000

     # 10.10.10.52:7000 為Slave Role  , 10.10.10.50:7000 為Slave Role

      10.10.1052:7001 為 Master Role ,10.10.10.50:7001 為Slave Role

       10.10.10.51:7001 為 Master Role ,10.10.10.51:7000 為 Master Role

詳細檢視各結點配對關係 : 

./redis-cli  -c -p 7001  -h 10.10.10.52   

> info                   #輸入info後檢視該角色為"Master" 對應到10.10.10.10.52:7000 (Slave)

檢視Redis Cluster  "redis-trib.rb"  工具操作使用
 
cd  /usr/local/redis-3.0.5/src

./redis-trib.rb     # create,reshard,add-node,del-node.....這個幾個是比較常使用配置指
[動態新增主節點,從節點並設定主從關聯] Ubuntu 14.04x1  計畫啟用兩台Redis 服務  

 master:  10.10.10.53:7000 ----Replication---->  slave:  10.10.10.53:7001

#手動建立此二節點主從複寫關係           #下圖已順利啟動Ubuntu Redis Service 待加入叢集
         主機資訊: Ubuntu 14.04, IP Address 10.10.10.53/24
現有Redis叢集加入"新"主從節點( Master: 10.10.10.53:7000 , Slave: 10.10.10.53:7001)


隨機登入叢集其一節點檢視 Redis50(10.10.10.50:7000):  

下圖訊息可知目前該節點為Master: 10.10.10.51:7001(所對應之Slave)

ab1999418feebf76ba9e2862f713c3cb1bad131b 10.10.10.51:7001 master - 0 1448704459409 7 connected 0-5460

a97723d9be5c46fb750927c976b1249cc025ab76 10.10.10.50:7000 myself,slave ab1999418feebf76ba9e2862f713c3cb1bad131b 0 0 1 connected
 
將方才預備好的Ubuntu Redis(Redis53) 主機加入目前存在叢集

./redis-trib.rb   add-node 10.10.10.53:7000  10.10.10.50:7001 

#將10.10.10.53:7000 redis 服務加入 10.10.10.50:7001(叢集內任一已存在舊節點)並賦與Master角色

確定加入Master Role 成功

#再一次執行Cluster info 指令檢視 10.10.10.53:7000 成功動態加入叢集行列
 
c0159df4dec59b9d926c8aaf9e678a68847cafb0 10.10.10.53:7000 master - 0 1448705571495 0 connected  

#新的主節點加入OK



Then 加入"從"節點,前面提到我們希望設計架構為以下

 master:  10.10.10.53:7000 ----Replication---->  slave:  10.10.10.53:7001

./redis-trib.rb add-node --slave --master-id c0159df4dec59b9d926c8aaf9e678a68847cafb0  10.10.10.53:7001 10.10.10.53:7000

#--slave: 加入slave複寫腳色 , 選擇複寫同步主節點 --master-id 即對應到 10.10.10.53:7000

  10.10.10.53:7000 為叢集中以存在任一節點

再檢視cluster info 訊息 :  下圖檢視主從對應關係 (如預期規劃設計架構OK)

 master:  10.10.10.53:7000 ----Replication---->  slave:  10.10.10.53:7001
 由於新加入主節點: 10.10.10.53:7000  沒分配到slot,存取數據不被選擇到,故需分配些許slot

     給予該節點(使用reshard 參數)

   ./redis-trib.rb check 10.10.10.53:7000

   ./redis-trib.rb redhard 10.10.10.53:7000

Q1: How many slot do you want to move(from 1 to 16384)?  5566   #無關56不能亡

Q2: What is the receviing node ID?  c0159df4dec59b9d926c8aaf9e678a68847cafb0   

#填入10.10.10.53:7000 新節點 Node ID

Q3:  Please enter tp use all the node IDs .... Source node #1: all   #節點重新分配

Q4:  Do you want to proceed with the proposed reshard plan ( yes/no)? yes  確認重分配


接者Slot 分配就會重新分配動作(如下圖)

   ./redis-trib.rb check 10.10.10.53:7000   #再次確認10.10.10.53:7000 獲得slot

        共獲得5566 個slot  , 分別是 0-1854, 5461-7316,10923-12777 三個區間

倘若我想變更Slave複寫來源之Master 可以這樣做

以方才配置好的主從關係為例

master:  10.10.10.53:7000 ----Replication---->  slave:  10.10.10.53:7001

現變更 為以下

master:  10.10.10.51:7000   ----Replication---->  slave:   10.10.10.53:7001


redis-cli  -p  7001 -h 10.10.10.53     #首先登入從連線登入從節點終端模式底下

執行

> cluster replicate 62c27a4624f40932e47a7bb6a0aa65fada060a7f

#定義Slave 新複寫來源對象(Master) 之nodes id : 本例以10.10.10.51:7000 對應ID為標的


cluster nodes    再來檢視目前對應關係是否變動     #下圖訊息對應關係已如我們計畫變更

62c27a4624f40932e47a7bb6a0aa65fada060a7f 10.10.10.51:7000 master - 0 1448708163772 2 connected 7317-10922
 
7a217f1f9432fd1b68f710cdeab149efaec7a480 10.10.10.53:7001 myself,slave 62c27a4624f40932e47a7bb6a0aa65fada060a7f 0 0 9 connected

備註: 為繼續後續Lab操作方便,本人將slave 恢復原對應關係

master:  10.10.10.53:7000 ----Replication---->  slave:  10.10.10.53:7001

10.10.10.53:7001> cluster nodes

fc1fd8ef6850ee7f710642b33672875cfa5cf978 10.10.10.52:7000 slave

326aa31b7bdc82a976aa9273e37ba3947674c78a 0 1448709133530 8 connected

c554f34b1b4cd9a59852d12c2d6ff3c8b00eb085 10.10.10.50:7001 slave

62c27a4624f40932e47a7bb6a0aa65fada060a7f 0 1448709136564 2 connected

62c27a4624f40932e47a7bb6a0aa65fada060a7f 10.10.10.51:7000 master - 0 1448709132524 2 connected 7317-10922

a97723d9be5c46fb750927c976b1249cc025ab76 10.10.10.50:7000 slave
ab1999418feebf76ba9e2862f713c3cb1bad131b 0 1448709134540 7 connected

c0159df4dec59b9d926c8aaf9e678a68847cafb0 10.10.10.53:7000 master - 0 1448709131516 10 connected 0-1854 5461-7316 10923-12777

ab1999418feebf76ba9e2862f713c3cb1bad131b 10.10.10.51:7001 master - 0 1448709137578 7 connected 1855-5460

326aa31b7bdc82a976aa9273e37ba3947674c78a 10.10.10.52:7001 master - 0 1448709135553 8 connected 12778-16383

7a217f1f9432fd1b68f710cdeab149efaec7a480 10.10.10.53:7001 myself,slave c0159df4dec59b9d926c8aaf9e678a68847cafb0 0 0 9 connected
10.10.10.53:7001>

[  刪除主節點 ] 10.10.10.53:7000 步驟參考

master:  10.10.10.53:7000 ----Replication---->  slave:  10.10.10.53:7001 

#由於主節點底下有複寫從節點,故將該slave(10.10.10.53:7001)  移轉到其他Master底下

(恢復前一動,在此不再贅述)

redis-cli  -p  7001 -h 10.10.10.53     #首先登入從連線登入從節點終端模式底下

執行

> cluster replicate 62c27a4624f40932e47a7bb6a0aa65fada060a7f

#定義Slave 新複寫來源對象(Master) 之nodes id : 本例以10.10.10.51:7000 對應ID為標的

62c27a4624f40932e47a7bb6a0aa65fada060a7f 10.10.10.51:7000 master - 0 1448708163772 2 connected 7317-10922
 
7a217f1f9432fd1b68f710cdeab149efaec7a480 10.10.10.53:7001 myself,slave62c27a4624f40932e47a7bb6a0aa65fada060a7f 0 0 9 connected

[ 去除Master 分配slot]

./redis-trib.rb  reshard 10.10.10.53:7000  
 
 How many slots do you want to move (from 1 to 16384)?  5566   #搬移Master slot總數量
 
What is the receiving node ID? ab1999418feebf76ba9e2862f713c3cb1bad131  

                                               
  # 指定遷移slot至其他線上移轉Master nodes_id
                                                      即是10.10.10.51:7001 

Please enter all the source node IDs.  
  Type 'all' to use all the nodes as source nodes for the hash slots.  
  Type 'done' once you entered all the source nodes IDs.  

Source node #1:c0159df4dec59b9d926c8aaf9e678a68847cafb0  
#10.10.10.53:7000 計畫移除Master node_id

Source node #2:done    
#開始移轉slot

執行
"cluster nodes"  檢視 10.10.10.53:7000(Master 持有slots歸零?) 
Then 現在可以刪除叢集中 10.10.10.53:7000 Master 角色,做下線主機準備

./redis-trib.rb del-node 10.10.10.53:7000 'c0159df4dec59b9d926c8aaf9e678a68847cafb0'

#刪除主節點順利落幕


再刪除 SLAVE :  10.10.10.53:7001 (直接刪除即可)

./redis-trib.rb del-node 10.10.10.53:7001
> '7a217f1f9432fd1b68f710cdeab149efaec7a480'
[ 驗收測試 Redis Cluster Fail Over 高可用性 ]

先來查看Redis Cluster 主從配對對應關係(目前)

./redis-trib.rb check 10.10.10.52:7000 

M:  10.10.10.52:7001  ---->  S: 10.10.10.52:7000

M:  10.10.10.51:7001 ----->  S: 10.10.10.50:7000

M: 10.10.10.51:7001  ---->    S: 10.10.10.50:7001 


但此設計並非Navier 期望,延用上一步"cluster replicate nodes_id"

變更主從對應如下(參考下圖)


M: 10.10.10.51:7000    

  Replicate     

S: 10.10.10.52:7000

-----

M: 10.10.10.52:7001        

    Replicate
 

 S:
10.10.10.50:7000

-----

M:  10.10.10.51:7000    

     Replicate  

 S: 10.10.10.50:7001

-----
連線叢集中某一節點新增資料以便後續測試(以10.10.10.51:7000 Master) 測試

redis-cli -p 7001  -h 10.10.10.52 -c    #-c參數啟動叢集模式,一定要加,反之將出錯

String 字串寫入操作演示 (set 新增,del 刪除key,exists: 查詢某key名稱是否存在)

當每次連入叢集任一節點時(寫入動作)將隨機挑選任一Master節點儲存資料

(並非100%儲存在當前連線節點): 下圖中我們連線節點10.10.10.52:7001(Master)

新增 "addaburuu "  
時實際上重新導向儲存在10.10.10.51:7001 (Master)節點

List  有序字串串列 (RPUSH:右側寫入一字串,LPUSH:左側寫入一字串,LRANGE:撈取List KEY

資料,LINDEX:索引查詢List列內容) 

Set 字串序列(SADD新增Set 類型 Key,SMEMBERS 傳回key內元素,SREM:刪除Set序列元素) 

Hash 雜湊(hset: 新增 , hget 取得,hdel 刪除,hexists:判斷key是否存在,hsetnx:新增hash欄位) 

redis-cli -c -h 10.10.10.51 -p 7001

Master : 10.10.10.51:7001 =>  Slave:10.10.10.52:7000    #目前10.10.10.52:7000 為從節點

前一步我們新增 hash-x no1  ~ hash-x no5  欄位資料,現將儲存節點 

 "Master : 10.10.10.51:7001 "
  稍後關閉停止服務來觀察
redis-cli -c -h 10.10.10.51 -p 7001 shutdown  #關閉停止服務來觀察

redis-cli  -c -h 10.10.10.50 -P 7001
  #登入叢集任一節點來查看

下圖:  我們嘗試"hget"指令 撈出 hash key (hash-x) 欄位 中 no1~no5  值,OK沒問題

            縱使我們之前寫入的節點是目前已被停用"10.10.10.51:7001",其仍然會重導連線其
 
         
  Slave 對應節點: 10.10.10.52:7000  獲取value

        再次check cluster nodes 您會發現原Slave Role: 10.10.10.52:7000

         
=> 自動轉換成 Master 角色(成為可寫可讀節點)繼續提供服務(Fail Over 測視成功)

        由於本Lab Mater 1:1 Slave 對應...所以下圖 0  addtional replicas(s) ,可手動後續追加Slave
[ 安裝 php 7.0.x(predis)  , python(redis-py-cluster) 測試存取 Redis Cluster]

安裝PHP 7.0.x  參考 PHP7 Build

1.) 建立repo

cd  
 /etc/yum.repos.d/

vi    zend-php7.repo


[zend-php7]
name = PHP7 nightly by Zend Technologies
baseurl = http://repos.zend.com/zend-server/early-access/php7/repos/centos/
gpgcheck=0


2.)安裝php7  :   #查看php7-nightly  package資訊
 
安裝php-nightly   #另有提供beta1版本,不建議採用beta  (LAMP架構)

yum -y info php7-nightly

 cp /usr/local/php7/libphp7.so /etc/httpd/modules/  

 #複製libphp7.so 至/etc/httpd/modules/ 目錄下

編輯 " /etc/httpd/conf/httpd.conf "加入以下,

LoadModule php7_module        /usr/lib64/httpd/modules/libphp7.so
<FilesMatch .php$>
SetHandler application/x-httpd-php
</FilesMatch>

重啟httpd serice,
建立一個測試檔案查看phpinf(); 資訊

systemctl restart httpd

http://10.10.10.50/info.php    
#PHP Version 7.0.1-dev  佈建安裝完成

Then 安裝Predis:  讓PHP7 Client 可以存取Redis Cluster (叢集架構)

cd  /var/www/html

wget  https://github.com/nrk/predis/archive/v1.0.3.tar.gz  #目前釋出最新穩定版本

tar zxvf  v1.0.3.tar.gz

mv  predis-1.0.3  predis

ln -s  predis/autoload.php    autoload.php
  #建立autoload.php 捷徑待會方便載入

撰寫Predis 連接測試Redis Cluster 範例

vi  tesv.php 

<?php

require 'autoload.php';       #載入Predis內autoload.php

$servers = array(                 #redis cluster  all節點(6個)加入
 'tcp://10.10.10.51:7000',
 'tcp://10.10.10.52:7000',
 'tcp://10.10.10.51:7001',
 'tcp://10.10.10.52:7001',
 'tcp://10.10.10.50:7000',
 'tcp://10.10.10.50:7001',
);

$options = array('cluster' => 'redis');       #啟用3.0.x Redis叢集

$client = new PredisClient($servers, $options);

$client->set("cssss", "jaco");        #新增String字串類型"cssss"對應"jaco" 值 
$result = $client->get("cssss");
echo $result;                                  #傳回result結果
?>

瀏覽 http://10.10.10.50/tesv.php    

 #Predis 已順利存取Redis Cluster OK,正常輸出結果為"JACO"



最後Navier
安裝  
python(redis-py-cluster) 存取 Redis Cluster 做結尾

可以先到 redis-py-cluster 官方看一下順便下載redis-py-cluster package

wget  https://github.com/Grokzen/redis-py-cluster/archive/unstable.zip

unzip  unstable.zip

cd redis-py-cluster-unstable

python setup.py install   #安裝redis-py-cluster


參照官方釋出範例做測試
(這次以叢集任意二Redis節點做存取測試)

vi tesvx.py 

import redis
from rediscluster import StrictRedisCluster          #宣告使用RedisCluter

startup_nodes = [{"host": "10.10.10.50", "port": "7000",
                  "host": "10.10.10.51","port":"7001" }]
 
rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)

rc.set("giwawa", "bar")   #新增字串"giwawa" -> "bar"

print(rc.get("giwawa"))       #傾印上一步新增 "giwawa" 對應值

print(rc.get("adaburu"))       #傾印"adaburu" 對應值(先前已存在key/value)

         正確傾印: 
 
         "bar",
 
         "hell,world"



測試FailOver設計,
我們停掉其一節點"10.10.10.50:7000" 來觀察

redis-cli  -c -h 10.10.10.50 -p 7000 shutdown

python t
相簿設定
標籤設定
相簿狀態