Dubbo高可用 redis HA環境搭建及集羣擴展

環境規劃
主機名 IP 服務端口 默認 6379
集羣端口 服務端口數+10000
主/從
master1 192.168.229.204 7111 17111 Master
master2 192.168.229.205 7112 17112 Master
master3 192.168.229.206 7113 17113 Master
slave1 192.168.229.207 7114 17114 Slave
slave2 192.168.229.208 7115 17115 Slave
slave3 192.168.229.209 7116 17116 Slave

yum install ansible -y

[root@master1 ~]# ansible all -m shell -a 'pwd'
[root@master1 ~]# ansible all -m shell -a 'yum install gcc tcl -y'

[root@master1 redis3]#  ansible all -m copy -a "src=/root/redis-3.0.3.tar.gz dest=/usr/local/src"
[root@master1 ~]# ansible all -m shell -a 'cd /usr/local/src/ && tar -zxvf redis-3.0.3.tar.gz'
[root@master1 ~]# ansible all -m shell -a 'cd /usr/local/src/redis-3.0.3 && make PREFIX=/usr/local/redis3 install'
[root@master1 ~]# ansible all -m shell -a 'ls /usr/local/redis3/bin'




創建集羣配置目錄,並拷貝 redid.conf 配置文件到各節點配置目錄:
192.168.229.204
# mkdir -p /usr/local/redis3/cluster/7111
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7111/redis-7111.conf
192.168.229.205
mkdir -p /usr/local/redis3/cluster/7112
cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7112/redis-7112.conf
192.168.229.206
mkdir -p /usr/local/redis3/cluster/7113
cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7113/redis-7113.conf

192.168.229.207
mkdir -p /usr/local/redis3/cluster/7114
cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7114/redis-7114.conf

192.168.229.208
mkdir -p /usr/local/redis3/cluster/7115
cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7115/redis-7115.conf

192.168.229.209
mkdir -p /usr/local/redis3/cluster/7116
cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7116/redis-7116.conf

每一臺做相應變動
[root@master1 ~]# vi /usr/local/redis3/cluster/7111/redis-7111.conf
     37 daemonize yes
     41 pidfile /var/run/redis-7111.pid   #每一臺不一樣
     45 port 7111   #每一臺不一樣
    118 databases 1
    632 cluster-enabled yes
    640 cluster-config-file /usr/local/redis3/cluster/7111/nodes.conf
    646 cluster-node-timeout 15000
    710 cluster-migration-barrier 1
    723 cluster-require-full-coverage yes
    504 appendonly yes
    187 dir /usr/local/redis3/cluster/7111

包含了最少選項的集羣配置文件示例如下:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

啓動redis集羣

192.168.229.204
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf
192.168.229.205
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7112/redis-7112.conf
192.168.229.206
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7113/redis-7113.conf
192.168.229.207
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7114/redis-7114.conf
192.168.229.208
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7115/redis-7115.conf
192.168.229.209
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7116/redis-7116.conf

[root@master1 ~]# ansible all -m shell -a 'ps -ef | grep redis'

接下來準備創建集羣
安裝 ruby 和 rubygems(注意:需要 ruby 的版本在 1.8.7 以上
[root@master1 ~]# ansible all -m shell -a ' yum install ruby rubygems -y'

查詢ruby版本
[root@master1 ~]# ansible all -m shell -a ' ruby -v'

gem 安裝 redis ruby 接口
[root@master1 ~]# ansible all -m shell -a ' yum install zlib-devel -y'

更換gem源
gem sources -a https://gems.ruby-china.com/
[root@master1 ~]# ansible all -m shell -a 'gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/'

查看所有源
[root@master1 ~]# ansible all -m shell -a 'gem sources -l'
增加源和刪除源
$ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
更新緩存
ansible all -m shell -a 'gem sources -u'


問題解決方法
[root@master1 ~]# gem install redis
Fetching: redis-4.1.3.gem (100%)
ERROR:  Error installing redis:
        redis requires Ruby version >= 2.3.0.
每臺機器執行如下命令, 不能用ansible 執行,不能批量執行
yum install centos-release-scl-rh -y
yum install rh-ruby23 -y
scl enable rh-ruby23 bash
ruby -v
gem install redis

執行 Redis 集羣創建命令(只需要在其中一個節點上執行一次則可)
ansible all -m shell -a 'cp /usr/local/src/redis-3.0.3/src/redis-trib.rb /usr/local/bin/redis-trib'
 [root@master1 ~]# redis-trib create --replicas 1 192.168.229.207:7114 192.168.229.208:7115 192.168.229.209:7116 192.168.229.204:7111 192.168.229.205:7112 192.168.229.206:7113

集羣簡單測試
[root@master1 ~]# cd /usr/local/redis3/bin/
[root@master1 bin]# ls
redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  redis-sentinel  redis-server
[root@master1 bin]# ./redis-cli -c -p 7114



集羣驗證
1在slave節點上寫入
[root@slave1 ~]# /usr/local/redis3/bin/redis-cli -c -p 7114
127.0.0.1:7114>  set wusc WuShuicheng
-> Redirected to slot [8559] located at 192.168.229.208:7115
OK
192.168.229.208:7115>

2在master1節點上讀取
[root@master1 ~]#  /usr/local/redis3/bin/redis-cli -c -p 7111
127.0.0.1:7111> get wusc
-> Redirected to slot [8559] located at 192.168.229.208:7115
"WuShuicheng"
192.168.229.208:7115>

3在master2節點上讀取
[root@master2 ~]# /usr/local/redis3/bin/redis-cli -c -p 7112
127.0.0.1:7112> get wusc
-> Redirected to slot [8559] located at 192.168.229.208:7115
"WuShuicheng"
192.168.229.208:7115>

4讀取所有節點信息
查看Redis集羣節點
[root@master1 bin]# ./redis-cli -p 7111 cluster nodes
b1565d8e0541389a815bfdedd320060a73ea34b3 192.168.229.209:7116 master - 0 1584421782703 3 connected 10923-16383
5804331faa018ee945faf40b9e80b13d14157488 192.168.229.204:7111 myself,slave c8f1e1e5ea944ae2b46f7c8f45fa626bbd18c779 0 0 4 connected
dca8a5ab378f99fb2245b9063853f5c91bf2ed43 192.168.229.208:7115 master - 0 1584421780687 2 connected 5461-10922
c6dc785b0c0a3ebcc5a5561601a587eff85c4185 192.168.229.206:7113 slave b1565d8e0541389a815bfdedd320060a73ea34b3 0 1584421777655 6 connected
69778143d0208880e52ac0015fa67c3986efd867 192.168.229.205:7112 slave dca8a5ab378f99fb2245b9063853f5c91bf2ed43 0 1584421781695 5 connected
c8f1e1e5ea944ae2b46f7c8f45fa626bbd18c779 192.168.229.207:7114 master - 0 1584421779671 1 connected 0-5460


將Redis配置成服務
參考資料
其它供參考資料
Redis 3.0 集羣搭建測試(一) :http://blog.csdn.net/zhu_tianwei/article/details/44928779
Redis 3.0 集羣搭建測試(二) :http://blog.csdn.net/zhu_tianwei/article/details/45009647
Redis 集羣要點:http://5i.io/redis-3-0-cluster-configuration/


Redis的啓動腳本爲
[root@master1 ~]# ls /usr/local/src/redis-3.0.3/utils/redis_init_script
ansible all -m shell -a 'cp /usr/local/src/redis-3.0.3/utils/redis_init_script /etc/rc.d/init.d/redis'

master1爲例子
[root@master1 ~]# vi /etc/rc.d/init.d/redis
      1 #!/bin/sh
      2 #chkconfig: 2345 80 9
      7 REDISPORT=7111
      8 EXEC=/usr/local/redis3/bin/redis-server
      9 CLIEXEC=/usr/local/redis3/bin/redis-cli

     11 PIDFILE=/var/run/redis-${REDISPORT}.pid
     12 CONF="/usr/local/redis3/cluster/${REDISPORT}/redis-${REDISPORT}.conf "

     20                 $EXEC $CONF &

以上配置操作完成後,便可將 Redis 註冊成爲服務:
# chkconfig --add redis
 啓動 Redis 服務
# service redis start

將 Redis 添加到環境變量中:
# vi /etc/profile
在最後添加以下內容:
## Redis env
export PATH=$PATH:/usr/local/redis3/bin
使配置生效:
# source /etc/profile
現在就可以直接使用 redis-cli 等 redis 命令了:
# service redis stop

默認情況下,Redis 未開啓安全認證,可以通過/usr/local/redis3/cluster/7111/redis-7111.conf 的
requirepass 指定一個驗證密碼

 

 

 

 

Redis集羣擴展
一、安裝新的 Redis 節點,將用於擴展性測試
1、在 192.168.229.210 虛擬機上以同樣的方式安裝 Redis3,並啓動兩個實例,規劃如下:
主機名       IP 服務端口 默認 6379     集羣端口 服務端口值+10000    主/從
slave4 192.168.229.210 7117 17117 Master
slave4 192.168.229.210 7118 17118 Slave
按規劃:在 192.168.229.210 的防火牆中打開相應的端口


2、Redis 安裝過程
可請參考《高可用架構篇--第 05 節--Redis 集羣的安裝(Redis3+CentOS) 》教程的文檔,命令如下:
# yum install gcc tcl
# cd /usr/local/src
# wget http://download.redis.io/releases/redis-3.0.3.tar.gz
# mkdir /usr/local/redis3
# tar -zxvf redis-3.0.3.tar.gz
# cd redis-3.0.3
# make PREFIX=/usr/local/redis3 install
# yum install ruby rubygems
# gem install redis

3、創建集羣配置目錄,並拷貝 redid.conf 配置文件到各節點配置目錄:
192.168.229.210
# mkdir -p /usr/local/redis3/cluster/7117
# mkdir -p /usr/local/redis3/cluster/7118
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7117/redis-7117.conf
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7118/redis-7118.conf

4、在 192.168.229.210 上使用如下命令啓動這 2 個 Redis 實例:
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7117/redis-7117.conf
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7118/redis-7118.conf
# ps -ef | grep redis


二、Redis 集羣的擴展性測試
1、redis-trib.rb 命令介紹:
[root@edu-redis-01 src]# /usr/local/src/redis-3.0.3/src/redis-trib.rb
redis-trib.rb 命令參數說明:
call:執行 redis 命令
create:創建一個新的集羣(上一節教程有介紹)
add-node:將一個節點添加到集羣裏面,第一個是新節點 ip:port, 第二個是集羣中任意一個正常節點
ip:port,--master-id
reshard:重新分片
check:查看集羣信息
del-node:移除一個節點

2、添加新的 Master 節點:
add-node 將一個節點添加到集羣裏面,第一個是新節點 ip:port,第二個是任意一個已存在節點 ip:port
# /usr/local/src/redis-3.0.3/src/redis-trib.rb add-node 192.168.229.210:7117 192.168.1.111:7111

以上操作結果表示節點添加成功,新增的節點不包含任何數據, 因爲它沒有分配任何 slot。
新加入的節點是一個 master 節點,當集羣需要將某個從節點升級爲新的主節點時,這個新節點不會被選
中。

爲新節點分配哈希槽(slot) :
你只需要指定集羣中其中一個節點的地址,redis-trib 就會自動找到集羣中的其他節點。目前 redis-trib
只能在管理員的協助下完成重新分片的工作,命令如下:
# /usr/local/src/redis-3.0.3/src/redis-trib.rb reshard 192.168.1.111:7111


輸入 all 並按下回車之後, redis-trib 將打印出哈希槽的移動計劃:
Do you want to proceed with the proposed reshard plan (yes/no)? yes

在重新分片操作執行完畢之後, 可以使用以下命令來檢查集羣是否正常:
# /usr/local/src/redis-3.0.3/src/redis-trib.rb check 192.168.1.111:7111

也可以用以下命令再次查看集羣的節點狀況:
# /usr/local/redis3/bin/redis-cli -c -p 7111 cluster nodes
以上集羣狀態輸出信息解析:
(1)節點 ID
(2)IP:PORT
(3)節點狀態標識: master、slave、myself、fail?、fail
(4)如果是從節點,表示主節點的 ID;如果是主節點,則爲 '-'
(5)集羣最近一次向各個節點發送 PING 命令後,過去多長時間還沒有接到回覆
(6)節點最近一次返回 PONG 的時間戳
(7)節點的配置紀元
(8)本節點的網絡連接情況: connected、disconnected

3、添加新的 slave 節點
(1)添加節點
#/usr/local/src/redis-3.0.3/src/redis-trib.rb add-node 192.168.229.210:7118 192.168.1.111:7111
Connecting to node 192.168.229.210:7118: OK
>>> Send CLUSTER MEET to node 192.168.229.210:7118 to make it join the cluster.
[OK] New node added correctly.
新增的 7118 爲一個 master

(2)redis-cli 連接上新節點 shell,輸入命令:cluster replicate 對應 master 的 node-id
# /usr/local/redis3/bin/redis-cli -c -p 7118
127.0.0.1:7118>cluster replicate ab31611b3424990e2b9bbe73135cb4cb0ace394f
OK
在線添加 slave 時,需要 dump 整個 master 進程,並傳遞到 slave,再由 slave 加載 rdb 文件到內存,rdb
傳輸過程中 Master 可能無法提供服務,整個過程消耗大量 IO,因此要小心操作。
查看執行結果:
127.0.0.1:7116> cluster nodes

4、在線 reshard 數據
對於負載/數據不均勻的情況,可以在線 reshard slot 來解決,方法與添加新 master 的 reshard 一樣,只
是需要 reshard 的 master 節點是老節點。

5、刪除一個 slave 節點
# cd /usr/local/src/redis-3.0.3/src/
# ./redis-trib.rb del-node 192.168.229.210:7118 5256e05a17c106c93285a03aff1b1b9e7ca7bf0c
這時候,用下以下再查看集羣狀態,會發現該 slave 節點已成功移除
# /usr/local/redis3/bin/redis-cli -c -p 7116 cluster nodes
移除一個節點,對應的節點進程也會被關閉

6、刪除一個 master 節點
刪除 master 節點之前首先要使用 reshard 移除該 master 的全部 slot,然後再刪除當前節點(目前只能把被
刪除 master 的 slot 遷移到一個節點上),操作和分配 slot 類似,指定具體的 Source node 即可

How many slots do you want to move (from 1 to 16384)? 499
//接收 slot 的 master 節點 ID
What is the receiving node ID? 48db78bcc55c4c3a3788940a6458b921ccf95d44
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.
//準備被刪除 master 節點的 node-id Source node #1: ab31611b3424990e2b9bbe73135cb4cb0ace394f Source node #2:done

//輸入 yes 執行 reshard
Do you want to proceed with the proposed reshard plan (yes/no)? yes

移除該 Master 節點的所有 slot 後,重新查看集羣狀態,會發現該節點不再佔用 slot:
# /usr/local/redis3/bin/redis-cli -c -p 7116 cluster nodes

確認已清空該 Master 節點的所有 slot 後就可以刪除該節點了(命令與刪除 slave 節點一樣) :
# cd /usr/local/src/redis-3.0.3/src/
# ./redis-trib.rb del-node 192.168.229.210:7117 ab31611b3424990e2b9bbe73135cb4cb0ace394f
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章