查看完整版本: 在 CentOS 7 yum 安裝 Redis 5 cluster + sentinel 集群


becky98 2018-12-20 11:48

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

Redis從3.0板本開始支持cluster(我們使用Redis 5.0.3)<br>集群數量至少6個nodes 才能保證組成完整高可用的集群<br>從5.0開始, cluster manager tool 就不在需要使用ruby 寫的指令 redis-trib.rb 來當管理工具<br>直接使用 redis-cli 就能做所有的事情了~<br><br><div>測試環境:</div><div>CentOS 7.6<br></div>我們使用3台虛擬機模擬6個節點,使用端口區分,每台虛擬機2個節點<br>Redis1&nbsp;&nbsp;10.140.0.10&nbsp;&nbsp;7001&nbsp;&nbsp;7004<br>Redis2&nbsp;&nbsp;10.140.0.11&nbsp;&nbsp;7002&nbsp;&nbsp;7005<br>Redis3&nbsp;&nbsp;10.140.0.12&nbsp;&nbsp;7003&nbsp;&nbsp;7006<br><br>(1)安裝 redis 5.0 步驟:<br># yum install epel-release yum-utils<br># yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm<br># yum-config-manager --enable remi<br># yum install redis<br><br>驗證一下版本<br># redis-cli -v<br>redis-cli 5.0.3<br><br>(2)配置每個節點<br>Redis1 節點,只需要修改一下Cluster相關的配置參數,我們使用 redis-7001.conf 和redis-7004.conf 用來區分節點:<br><br># cp /etc/redis.conf /etc/redis-7001.conf<br><br>修改下 redis-7001.conf 相關配置 <br>[quote]<br>bind 0.0.0.0<br>port 7001<br>daemonize yes<br>pidfile /var/run/redis_7001.pid<br>appendonly yes<br>cluster-enabled yes<br>cluster-config-file node-7001.conf&nbsp;&nbsp;#啟用後會自動生成在 /var/lib/redis/<br>cluster-node-timeout 15000 &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; #節點超時時間,單位:毫秒<br>maxmemory 1500mb&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;#依照自己環境記憶體配置修改,也可不設<br>maxmemory-policy volatile-lru&nbsp; &nbsp;&nbsp; &nbsp; #依照自己需求配置修改,也可不設<br>[/quote]<br><br>然後再copy redis-7001.conf 成 redis-7004.conf<br>同樣配置下7004端口,只要把port和pid文件還有cluster nodes改成7004<br><br>Redis2節點,Redis3節點 比照同上辦理<br>如果這是在內網.就不用設定防火牆,如果有外網,記得開通防火牆<br><br>(3)啟動每個節點<br>在redis1上<br># redis-server /etc/redis-7001.conf <br># redis-server /etc/redis-7004.conf <br><br>在redis2上<br># redis-server /etc/redis-7002.conf <br># redis-server /etc/redis-7005.conf <br><br>在redis3上<br># redis-server /etc/redis-7003.conf <br># redis-server /etc/redis-7006.conf <br><br>檢查服務,檢查各redis節點啟動情況<br><br>redis是否啟動成功和監聽端口<br><br># ps -ef | grep redis<br># netstat -tnlp | grep redis<br><div><br></div><div><font color="Red"><span class="tlid-translation translation">PS: 集群總線端口為redis客戶端連接的端口 + 10000</span></font></div><div><span class="tlid-translation translation"><font color="Red">所以如果有看到 17001 , 17004 的port 是正常的</font><br></span></div><div><br></div>(4)cluster 環境準備(只需在一台機器上執行此步驟)<br><br>Redis 5.0 開始,官方的 redis-cli 就可以直接在命令行中使用 create cluster 了。使用下面這個命令建立cluster。<br>內部通過Cluster相關命令幫助我們簡化集群創建、檢查、槽遷移和均衡等常見操作<br><br>這邊選擇在redis1 執行創建<br>[quote]<br>#<font color="RoyalBlue"> 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<br></font><br>--cluster-replicas 參數指定集群中每個主節點配備幾個從節點,這裡設置為1。<br>[/quote]<br>這裡因為測試,只用了3台機器,如果部署節點使用不同的IP地址,redis-cli 會盡可能保證主從節點不分配在同一台機器下,因此會重新排序節點表順序。節點列表順序用於確定主從角色,先主節點之後是從節點。<br><div><br></div><div>如何刪除建立的 cluster 呢?<br></div><div>[quote]這是個好問題...因為你可以用<br># redis-cli -p 7001 cluster forget [slot]<br>來刪除節點...但是你不能夠用這個指令刪掉自己<br>所以找了很多方法...終於發現...因為 redis 會在 /var/lib/redis/ 生成設定檔,所以要重新建置不同IP的cluster 時,只要刪除 redis 目錄底下的所有生成檔就可以了<br># rm -f /var/lib/redis/*<br>不用擔心刪掉這目錄底下的資料會有問題...因為他們只要重啟,就會在自動生成<br>[/quote]<br></div><div><br></div><div><br></div>預設狀態如下(如果節點有掛掉再重新加入的話, master 跟 slave 的狀態就會改變):<br>[quote]<div>[root@redis1 etc]# redis-cli -p 7001 cluster nodes</div><div><font color="Sienna">62359b29bf2af9ca9b54db993b5f611e01fefd5c 10.140.0.10:7001@17001 myself,master - 0 1545277872000 1 connected 0-5460</font></div><div><font color="Sienna">fcb4f722684966bf2aec73e4d42592597e2465fb 10.140.0.12:7006@17006 slave
62359b29bf2af9ca9b54db993b5f611e01fefd5c 0 1545277873000 8 connected</font></div><div>97c4642a053837a033e2508c4c15bc5e2b7ebace 10.140.0.11:7002@17002 master - 0 1545277874991 2 connected 5461-10922</div><div>5ab12a20997578e2a0a05154ca49d4eebc592c30 10.140.0.10:7004@17004 slave
97c4642a053837a033e2508c4c15bc5e2b7ebace 0 1545277872985 9 connected</div><div><font color="DarkOliveGreen">ec79f77817f682757aa6e04656d9a932d6b727b5 10.140.0.12:7003@17003 master - 0 1545277874000 3 connected 10923-16383</font></div><div><font color="DarkOliveGreen">44d82d060bbbd8eaa61025f99d558aaeedd2775e 10.140.0.11:7005@17005 slave ec79f77817f682757aa6e04656d9a932d6b727b5 0 1545277873988 7 connected</font><br></div><div>[/quote]<br></div><div>redis1 找 redis3 的 7006 port 當 slave<br>redis2 找 redis1 的 7004 port 當 slave<br>redis3 找 redis2 的 7005 port 當 slave<br><div><br></div></div><div><br></div>查看 redis cluster nodes 狀態<br># <font color="RoyalBlue">redis-cli -p 7001 cluster nodes</font><br><br>查看 redis cluster info 狀態<br># redis-cli -p 7001 cluster info<br><br>連線到其他節點的方法:<br><div># redis-cli -p 7002 -h 10.140.0.11</div><div><br></div><div># 查看 cluster DB 使用量的多寡<br># <font color="Blue">redis-cli --cluster call 10.140.0.10:7001 DBSIZE</font><br></div><br>(5) 報錯解決方法<br>如果集群第一次啟動失敗,然後再次啟動時也會報錯,要解決這個問題,必須在每個節點跟每個端口上執行了下面的命令,把cluster reset 才可以<br>[quote]<br>redis-cli --cluster call 10.140.0.10:7001 flushall<br>[/quote]<br><br>參考資料:<br><a href="https://redis.io/topics/cluster-tutorial" target="_blank">https://redis.io/topics/cluster-tutorial</a><br><a href="https://www.azurew.com/8694.html" target="_blank">https://www.azurew.com/8694.html</a><br><a href="https://alexpacer.com/2018/04/27/redis-cluster-on-centos/" target="_blank">https://alexpacer.com/2018/04/27/redis-cluster-on-centos/</a><br><div><a href="https://hk.saowen.com/a/68f89851b327c512c5a0a085f1d9bbe8ee8bd12bd4a1146ff9abed6cf31d05b6" target="_blank">https://hk.saowen.com/a/68f89851b327c512c5a0a085f1d9bbe8ee8bd12bd4a1146ff9abed6cf31d05b6</a></div><div><br></div><div><br></div><div>(6)部署 Sentinel 節點<br><br>3 個 Sentinel 節點的部署方法是完全一致的(端口不同),下面以 mymaster1 節點的部署為例子進行說明。<br>將 sentinel.conf 複製一份到 /etc/redis/,並重命名為 redis-sentinel-27001.conf。3台重複一樣的動作跟設定<br>配置 Sentinel 節點:<br><br>[quote]<br>port 27001<br>daemonize yes<br>logfile "/var/log/redis/sentinel-27001.log"<br>dir "/var/lib/redis"<br><br><br>#Original Setting<br>sentinel monitor mymaster1 10.140.0.88 7001 2<br>sentinel down-after-milliseconds mymaster1 3000<br>sentinel parallel-syncs mymaster1 1<br>sentinel failover-timeout mymaster1 10000<br><br>sentinel monitor mymaster2 10.140.0.89 7002 2<br>sentinel down-after-milliseconds mymaster2 3000<br>sentinel parallel-syncs mymaster2 1<br>sentinel failover-timeout mymaster2 10000<br><br>sentinel monitor mymaster3 10.140.0.90 7003 2<br>sentinel down-after-milliseconds mymaster3 3000<br>sentinel parallel-syncs mymaster3 1<br>sentinel failover-timeout mymaster3 10000<br>[/quote]<br><br><br>解讀下這些配置項:<br><br>port 27001:Sentinel 節點的默認端口是 27001。<br>&nbsp;&nbsp;&nbsp; <br>sentinel monitor mymaster1 10.140.0.88 7001 2:代表 mymaster1 節點監控 10.140.0.88 7001 這個主節點,該主節點的別名為 mymaster1,2 代表判斷主節點失敗至少需要 2 個 Sentinel 節點同意。<br>&nbsp;&nbsp;&nbsp; <br>sentinel down-after-milliseconds mymaster1 3000:每個Sentinel 節點都要通過定期發送ping 命令來判斷Redis 數據節點和其餘Sentinel 節點是否可達,如果超過了down-after-milliseconds 配置的時間且沒有有效的回复,則判定節點不可達,3000(單位為毫秒)就是超時時間,這個配置是對節點失敗判定的重要依據。 down-after-milliseconds 越大,代表 Sentinel 節點對於節點不可達的條件越寬鬆,反之越嚴格。<br>&nbsp;&nbsp;&nbsp; <br>sentinel parallel-syncs mymaster1 1:用來限制在一次故障轉移之後,每次向新的主節點發起復制操作的從節點個數。如果這個參數配置的比較大,那麼多個從節點會向新的主節點同時發起復制操作,儘管複製操作通常不會阻塞主節點,但是同時向主節點發起復制,必然會對主節點所在的機器造成一定的網絡和磁盤IO 開銷。例如:parallel- syncs = 3 從節點會同時發起復制(並行),parallel-syncs = 1 時從節點會輪詢發起復制(順序),這個是有區別的。<br><br>sentinel failover-timeout mymaster1 10000:故障轉移超時時間,從節點複製新的主節點超過了 failover-timeout(不包含複製時間), 則故障轉移失敗。<br><br><br>啟動 Sentinel 節點,依次啟動3個 Sentinel 節點:<br>使用 redis-sentinel 命令:<br># redis-sentinel /etc/redis/redis-sentinel-27001.conf<br><br>Sentinel 節點本質上是一個特殊的Redis 節點,所以也可以通過info 命令來查詢它的相關信息,它有兩個從節點,同時發現Redis Sentinel一共有3個Sentinel 節點。<br><br># redis-cli -p 27001 info sentinel<br>[quote]<br># Sentinel<br>sentinel_masters:3<br>sentinel_tilt:0<br>sentinel_running_scripts:0<br>sentinel_scripts_queue_length:0<br>sentinel_simulate_failure_flags:0<br>master0:name=mymaster1,status=ok,address=10.140.0.90:7003,slaves=3,sentinels=2<br>master1:name=mymaster2,status=ok,address=10.140.0.89:7002,slaves=1,sentinels=1<br>master2:name=mymaster3,status=ok,address=10.140.0.90:7003,slaves=3,sentinels=2<br>[/quote]<br><br>這個時候在打開redis-sentinel-27001.conf 配置文件,發現Sentinel 節點會在啟動後,會給自己分配一個sentinel myid 值,同時會將他所感知到的一些節點信息保存到他指定的配置文件中去,同時將執行結果複寫至原檔案。<br><br>基本上...這樣就已經完成 redis sentinel 的部署與配置了<br><br>參考資料:<br>https://www.leeyom.top/2018/04/20/redis-sentinel/<br></div>
頁: [1]
查看完整版本: 在 CentOS 7 yum 安裝 Redis 5 cluster + sentinel 集群