字體:  

在 CentOS 7 yum 安裝 Redis 5 cluster + sentinel 集群

becky98 發表於: 2018-12-20 11:48 來源: ADJ網路控股集團


Redis從3.0板本開始支持cluster(我們使用Redis 5.0.3)
集群數量至少6個nodes 才能保證組成完整高可用的集群
從5.0開始, cluster manager tool 就不在需要使用ruby 寫的指令 redis-trib.rb 來當管理工具
直接使用 redis-cli 就能做所有的事情了~

測試環境:
CentOS 7.6
我們使用3台虛擬機模擬6個節點,使用端口區分,每台虛擬機2個節點
Redis1  10.140.0.10  7001  7004
Redis2  10.140.0.11  7002  7005
Redis3  10.140.0.12  7003  7006

(1)安裝 redis 5.0 步驟:
# yum install epel-release yum-utils
# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum-config-manager --enable remi
# yum install redis

驗證一下版本
# redis-cli -v
redis-cli 5.0.3

(2)配置每個節點
Redis1 節點,只需要修改一下Cluster相關的配置參數,我們使用 redis-7001.conf 和redis-7004.conf 用來區分節點:

# cp /etc/redis.conf /etc/redis-7001.conf

修改下 redis-7001.conf 相關配置

QUOTE:


bind 0.0.0.0
port 7001
daemonize yes
pidfile /var/run/redis_7001.pid
appendonly yes
cluster-enabled yes
cluster-config-file node-7001.conf  #啟用後會自動生成在 /var/lib/redis/
cluster-node-timeout 15000          #節點超時時間,單位:毫秒
maxmemory 1500mb                    #依照自己環境記憶體配置修改,也可不設
maxmemory-policy volatile-lru       #依照自己需求配置修改,也可不設


然後再copy redis-7001.conf 成 redis-7004.conf
同樣配置下7004端口,只要把port和pid文件還有cluster nodes改成7004

Redis2節點,Redis3節點 比照同上辦理
如果這是在內網.就不用設定防火牆,如果有外網,記得開通防火牆

(3)啟動每個節點
在redis1上
# redis-server /etc/redis-7001.conf
# redis-server /etc/redis-7004.conf

在redis2上
# redis-server /etc/redis-7002.conf
# redis-server /etc/redis-7005.conf

在redis3上
# redis-server /etc/redis-7003.conf
# redis-server /etc/redis-7006.conf

檢查服務,檢查各redis節點啟動情況

redis是否啟動成功和監聽端口

# ps -ef | grep redis
# netstat -tnlp | grep redis

PS: 集群總線端口為redis客戶端連接的端口 + 10000
所以如果有看到 17001 , 17004 的port 是正常的

(4)cluster 環境準備(只需在一台機器上執行此步驟)

Redis 5.0 開始,官方的 redis-cli 就可以直接在命令行中使用 create cluster 了。使用下面這個命令建立cluster。
內部通過Cluster相關命令幫助我們簡化集群創建、檢查、槽遷移和均衡等常見操作

這邊選擇在redis1 執行創建

QUOTE:


# redis-cli --cluster create 10.140.0.10:7001 10.140.0.11:7002 10.140.0.12:7003 10.140.0.10:7004 10.140.0.11:7005 10.140.0.12:7006 --cluster-replicas 1

--cluster-replicas 參數指定集群中每個主節點配備幾個從節點,這裡設置為1。

這裡因為測試,只用了3台機器,如果部署節點使用不同的IP地址,redis-cli 會盡可能保證主從節點不分配在同一台機器下,因此會重新排序節點表順序。節點列表順序用於確定主從角色,先主節點之後是從節點。

如何刪除建立的 cluster 呢?

QUOTE:

這是個好問題...因為你可以用
# redis-cli -p 7001 cluster forget [slot]
來刪除節點...但是你不能夠用這個指令刪掉自己
所以找了很多方法...終於發現...因為 redis 會在 /var/lib/redis/ 生成設定檔,所以要重新建置不同IP的cluster 時,只要刪除 redis 目錄底下的所有生成檔就可以了
# rm -f /var/lib/redis/*
不用擔心刪掉這目錄底下的資料會有問題...因為他們只要重啟,就會在自動生成



預設狀態如下(如果節點有掛掉再重新加入的話, master 跟 slave 的狀態就會改變):

QUOTE:

[root@redis1 etc]# redis-cli -p 7001 cluster nodes
62359b29bf2af9ca9b54db993b5f611e01fefd5c 10.140.0.10:7001@17001 myself,master - 0 1545277872000 1 connected 0-5460
fcb4f722684966bf2aec73e4d42592597e2465fb 10.140.0.12:7006@17006 slave 62359b29bf2af9ca9b54db993b5f611e01fefd5c 0 1545277873000 8 connected
97c4642a053837a033e2508c4c15bc5e2b7ebace 10.140.0.11:7002@17002 master - 0 1545277874991 2 connected 5461-10922
5ab12a20997578e2a0a05154ca49d4eebc592c30 10.140.0.10:7004@17004 slave 97c4642a053837a033e2508c4c15bc5e2b7ebace 0 1545277872985 9 connected
ec79f77817f682757aa6e04656d9a932d6b727b5 10.140.0.12:7003@17003 master - 0 1545277874000 3 connected 10923-16383
44d82d060bbbd8eaa61025f99d558aaeedd2775e 10.140.0.11:7005@17005 slave ec79f77817f682757aa6e04656d9a932d6b727b5 0 1545277873988 7 connected

redis1 找 redis3 的 7006 port 當 slave
redis2 找 redis1 的 7004 port 當 slave
redis3 找 redis2 的 7005 port 當 slave


查看 redis cluster nodes 狀態
# redis-cli -p 7001 cluster nodes

查看 redis cluster info 狀態
# redis-cli -p 7001 cluster info

連線到其他節點的方法:
# redis-cli -p 7002 -h 10.140.0.11

# 查看 cluster DB 使用量的多寡
# redis-cli --cluster call 10.140.0.10:7001 DBSIZE

(5) 報錯解決方法
如果集群第一次啟動失敗,然後再次啟動時也會報錯,要解決這個問題,必須在每個節點跟每個端口上執行了下面的命令,把cluster reset 才可以

QUOTE:


redis-cli --cluster call 10.140.0.10:7001 flushall


參考資料:
https://redis.io/topics/cluster-tutorial
https://www.azurew.com/8694.html
https://alexpacer.com/2018/04/27/redis-cluster-on-centos/
https://hk.saowen.com/a/68f89851b327c512c5a0a085f1d9bbe8ee8bd12bd4a1146ff9abed6cf31d05b6


(6)部署 Sentinel 節點

3 個 Sentinel 節點的部署方法是完全一致的(端口不同),下面以 mymaster1 節點的部署為例子進行說明。
將 sentinel.conf 複製一份到 /etc/redis/,並重命名為 redis-sentinel-27001.conf。3台重複一樣的動作跟設定
配置 Sentinel 節點:

QUOTE:


port 27001
daemonize yes
logfile "/var/log/redis/sentinel-27001.log"
dir "/var/lib/redis"


#Original Setting
sentinel monitor mymaster1 10.140.0.88 7001 2
sentinel down-after-milliseconds mymaster1 3000
sentinel parallel-syncs mymaster1 1
sentinel failover-timeout mymaster1 10000

sentinel monitor mymaster2 10.140.0.89 7002 2
sentinel down-after-milliseconds mymaster2 3000
sentinel parallel-syncs mymaster2 1
sentinel failover-timeout mymaster2 10000

sentinel monitor mymaster3 10.140.0.90 7003 2
sentinel down-after-milliseconds mymaster3 3000
sentinel parallel-syncs mymaster3 1
sentinel failover-timeout mymaster3 10000



解讀下這些配置項:

port 27001:Sentinel 節點的默認端口是 27001。
   
sentinel monitor mymaster1 10.140.0.88 7001 2:代表 mymaster1 節點監控 10.140.0.88 7001 這個主節點,該主節點的別名為 mymaster1,2 代表判斷主節點失敗至少需要 2 個 Sentinel 節點同意。
   
sentinel down-after-milliseconds mymaster1 3000:每個Sentinel 節點都要通過定期發送ping 命令來判斷Redis 數據節點和其餘Sentinel 節點是否可達,如果超過了down-after-milliseconds 配置的時間且沒有有效的回复,則判定節點不可達,3000(單位為毫秒)就是超時時間,這個配置是對節點失敗判定的重要依據。 down-after-milliseconds 越大,代表 Sentinel 節點對於節點不可達的條件越寬鬆,反之越嚴格。
   
sentinel parallel-syncs mymaster1 1:用來限制在一次故障轉移之後,每次向新的主節點發起復制操作的從節點個數。如果這個參數配置的比較大,那麼多個從節點會向新的主節點同時發起復制操作,儘管複製操作通常不會阻塞主節點,但是同時向主節點發起復制,必然會對主節點所在的機器造成一定的網絡和磁盤IO 開銷。例如:parallel- syncs = 3 從節點會同時發起復制(並行),parallel-syncs = 1 時從節點會輪詢發起復制(順序),這個是有區別的。

sentinel failover-timeout mymaster1 10000:故障轉移超時時間,從節點複製新的主節點超過了 failover-timeout(不包含複製時間), 則故障轉移失敗。


啟動 Sentinel 節點,依次啟動3個 Sentinel 節點:
使用 redis-sentinel 命令:
# redis-sentinel /etc/redis/redis-sentinel-27001.conf

Sentinel 節點本質上是一個特殊的Redis 節點,所以也可以通過info 命令來查詢它的相關信息,它有兩個從節點,同時發現Redis Sentinel一共有3個Sentinel 節點。

# redis-cli -p 27001 info sentinel

QUOTE:


# Sentinel
sentinel_masters:3
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster1,status=ok,address=10.140.0.90:7003,slaves=3,sentinels=2
master1:name=mymaster2,status=ok,address=10.140.0.89:7002,slaves=1,sentinels=1
master2:name=mymaster3,status=ok,address=10.140.0.90:7003,slaves=3,sentinels=2


這個時候在打開redis-sentinel-27001.conf 配置文件,發現Sentinel 節點會在啟動後,會給自己分配一個sentinel myid 值,同時會將他所感知到的一些節點信息保存到他指定的配置文件中去,同時將執行結果複寫至原檔案。

基本上...這樣就已經完成 redis sentinel 的部署與配置了

參考資料:
https://www.leeyom.top/2018/04/20/redis-sentinel/