Redis集羣——Redis4.0.1版本高可用集羣模式搭建(3.9.2版本適用)

從reids3.0版本以後實現redis高可用不只是通過哨兵模式實現了,redis提供了redis-cluster模式,下面比較一下兩種模式

Redis集羣模式比較

哨兵模式

在 redis3.0以前的版本要實現集羣一般是藉助哨兵 sentinel工具來監控 master節點的狀態,如果 master節點異常,則會主從切換,將某一臺 slave作爲 master,哨兵的配置略微複雜,並且性能和高可用性等各方面表現一般,特別是在主從切換瞬間存在訪問瞬斷的情況。

高可用集羣模式

redis集羣是一個由多個主從節點羣組成的分佈式服務器羣,它具有複製、高可用和分片特性。Reds集羣不需要sentinel哨兵也能完成節點移除和故障轉移的功能。需要將每個節點設置成集羣模式,這種集羣模式沒有中心點,可水平擴展,據官方文檔稱可以線性擴展到1000點節。redis集羣的性能和高可用性均優於之前版本的哨兵模式,且集羣配置非常簡單。

這種模式每一個master和各自的slave相當於一個小集羣,當其中的master節點掛掉後,會在剩餘的slave節點選擇一個升級爲master節點,當這個小集羣所有的節點掛掉則這個小集羣不能提供服務了,也就無法訪問這個集羣中緩存的數據了。

根據壓測,redis每秒最高可承受10w或者15w的併發,由於哨兵模式只有一個master節點,所以哨兵模式最高就是10w或者15w的承受能力,而redis-cluster集羣可以有多個master節點,所以是要比哨兵模式承壓能力強很多的。

現在阿里、京東這些BAT巨頭都是使用第二種模式的,所以這篇文章主要介紹redis高可用集羣的搭建方式。

redis高可用集羣搭建

版本介紹

centos7 虛擬機三臺 ip分別是192.168.1.10 192.168.1.11 192.168.12

redis版本 4.0.1 (3.9.2)也可以使用我的方法搭建是一樣的

ruby版本 2.3.5

redis安裝

第一步,安裝gcc

yum install gcc-c++

 

第二步,安裝zlib

yum -y install zlib zlib-devel

第三步,下載redis

cd /home/data
wget http://download.redis.io/releases/redis-4.0.1.tar.gz

第四步,安裝redis(不需要config)

cd redis-4.0.1
make && make install (確保安裝了gcc 和 zlib)

第五步,確認安裝成功

[root@localhost redis-4.0.1]# redis-server -v
Redis server v=4.0.1 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=1ce1baf22cf9ba09

Redis集羣搭建

由於只有三臺虛擬機,redis集羣需要至少要三個master節點,我們這裏搭建三個master節點,並且給每個master再搭建一個slave節點,總共6個redis節點,由於節點數較多,所以搭建一個僞集羣,一臺機器部署兩個節點,端口分別是7001到7006

第一步,在192.168.1.10機器上創建文件夾

mkdir -p /opt/redis-cluster/{7001,7004}
cp /home/data/redis-4.0.1/redis.conf /opt/redis-cluster/7001/redis-7001.conf

第二步,編輯redis-7001.conf,修改以下幾個位置

vim /opt/redis-cluster/7001/redis-7001.conf
  1. daemonize yes
  2. port 7001(分別對每個機器的端口號進行設置)
  3. bind 192.168.1.10(必須要綁定當前機器的ip,這裏方便redis集羣定位機器,不綁定可能會出現循環查找集羣節點機器的情況)
  4. dir  /opt/redis-cluster/7001/(指定數據文件存放位置,必須要指定不同的目錄位置,不然會丟失數據)
  5. cluster-enabled yes(啓動集羣模式)
  6. cluster-config-file nodes-7001.conf(這裏700x最好和port對應上) 集羣內部配置文件,改掉端口號 
  7. cluster-node-timeout 15000 節點超時時間
  8. appendonly yes 寫操作寫日誌

第三步,把這個文件複製到7004下面並把端口改爲7004

cp /opt/redis-cluster/7001/redis-7001.conf /opt/redis-cluster/7004/redis-7004.conf

可以使用批量修改模式 

:%s/源字符串/目的字符串/g

:%s/7001/7004/g
:wq!

 

第四步,同樣的在192.168.1.11和192.168.1.12兩臺機器重複上面的操作 ,其中192.168.1.11的端口爲7002和7005,192.168.1.12的端口爲7003和7006

第五步,接下來分別啓動三臺機器的每個節點

cd /home/data/redis-4.0.1
./redis-server /opt/redis-cluster/7001/redis-7001.conf
./redis-server /opt/redis-cluster/7004/redis-7004.conf

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

cd /home/data/redis-4.0.1
./redis-server /opt/redis-cluster/7002/redis-7002.conf
./redis-server /opt/redis-cluster/7005/redis-7005.conf

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

cd /home/data/redis-4.0.1
./redis-server /opt/redis-cluster/7003/redis-7003.conf
./redis-server /opt/redis-cluster/7006/redis-7006.conf

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

第六步redis-trib.rb環境準備(該文件存在於redis-4.0.1/src/目錄中)    //只需要在其中一臺上執行此步驟!!

redis-trib.rb是採用Ruby實現的Redis集羣管理工具。內部通過Cluster相關命令幫助我們簡化集羣創建、檢查、槽遷移和均衡等常見操作,使用之前需要安裝Ruby依賴環境。

我選擇在10的機器上安裝

第七步,安裝ruby

cd /home/data/
wget http://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.5.tar.gz
tar -zxvf  ruby-2.3.5.tar.gz
cd ruby-2.3.5
./configure  --prefix=/opt/ruby
make && make install
ln -s /opt/ruby/bin/ruby /usr/bin/ruby
ln -s /opt/ruby/bin/gem /usr/bin/gem

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

檢查是否安裝成功

[root@localhost 7001]# ruby -v
ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux]

第八步,安裝rubygem redis依賴    

wget http://rubygems.org/downloads/redis-3.3.0.gem

gem install -l redis-3.3.0.gem

如果安裝失敗參考:https://blog.csdn.net/feinifi/article/details/78251486

檢查redis-trib.rb可用性

第九步,開放端口

10服務器開放7001 17001 7004 17004 端口

11服務器開放7002 17002 7005 17005 端口

12服務器開放7003 17003 7005 17005 端口

第十步,創建集羣

cd /home/data/redis-4.0.1/src
./redis-trib.rb create --replicas 1 192.168.1.10:7001 192.168.1.11:7002 192.168.1.12:7003 192.168.1.10:7004 192.168.1.11:7005 192.168.1.12:7006

說明:--replicas參數指定集羣中每個主節點配備幾個從節點,這裏設置爲1,沒個主節點只有一個從節點。

這裏因爲測試,只用了3臺機器,如果部署節點使用不同的IP地址,redis-trib-rb會盡可能保證主從節點不分配在同一臺機器下,因此會重新排序節點表順序。節點列表順序用於確定主從角色,先主節點之後是從節點。創建過程中首先會給出主從節點角色分配的計劃,如下圖:

集羣把7001 7002 7003 當作主節點 7005 7004 7006分別是它們的從節點

(因爲redis集羣儘量使主從節點不在同一臺機器上,所以這裏7005是7001的從節點,7004是7002的從節點)

填寫yes

最後的輸出報告說明:16384個槽全部被分配完,集羣創建成功。

如果你卡在join一直等待請檢查是否開放了17001、17002.。。端口

redis集羣不僅需要開通redis客戶端連接的端口,而且需要開通集羣總線端口

集羣總線端口爲redis客戶端連接的端口 + 10000
如redis端口爲6379
則集羣總線端口爲16379
故,所有服務器的點需要開通redis的客戶端連接端口和集羣總線端口
注意:iptables 放開,如果有安全組,也要放開這兩個端口
另外,你必須保證每個節點無數據(即剛纔配置的7001、7002等文件夾下除了redis配置文件的其他文件),否則集羣節點拒絕連接。

第十一步,完整性檢查

任意一個節點都行

./redis-trib.rb check 192.168.1.10:7001

第十二步,連接一個節點測試

cd /home/data/redis-4.0.1
./redis-cli -c -h 192.168.1.10 -p 7001 (-c 表示集羣模式 -h 表示主機 -p表示端口)

發現中間集羣通過算法負載均衡到到指定的節點。

cluster info 查看集羣信息 cluster nodes 查看節點信息

通過cluster nodes命令發現7005是7001的從節點,7004是7002的從節點,7006是7003的從節點,現在停掉7001主節點,通過命令redis-cli -c -h 192.168.1.10 -p 7001 shutdown或者通過ps -ef | grep redis 查到進程號然後kill 進程號的方式

redis-cli -c -h 192.168.1.10 -p 7001 shutdown

通過ps -ef | grep redis查看確實停掉了

重新連接一個節點查看集羣信息

redis-cli -c -h 192.168.1.10 -p 7004

發現7001的節點多了一個fail,現在他的從節點7005變成了主節點

現在看第一行

bec5fc998979d98a6f591aff25b01de2117efa99是redis集羣分配給7006節點的id,slave表示它是一個從節點,後面的字符串

4ab388e3ed4e1399d6b1b412aec670d60f56383a是它的主節點的id,也就是7003節點,在每個master節點最後有一個分片

7005 是 0-5460 7002是5461-10922 7003是10923-16383

現在重啓7001節點

redis-server /opt/redis-cluster/7001/redis-7001.conf

再次連接一個集羣節點查看節點信息

redis-cli -c -h 192.168.1.10 -p 7004

發現7001節點已經自動加入集羣了,但是是作爲一個從節點加入的,是7005的從節點。

Redis集羣重啓

關閉節點

可以通過kill命令關閉或者/home/data/redis-4.0.1/redis-cli -c -p 192.168.1.0 -p 7001 shutdown逐個關閉

1、先刪除每個節點的如下文件

2、啓動每個節點

3、創建集羣

cd /home/data/redis-4.0.1/src
./redis-trib.rb create --replicas 1 192.168.1.10:7001 192.168.1.11:7002 192.168.1.12:7003 192.168.1.10:7004 192.168.1.11:7005 192.168.1.12:7006

關於redis-trib.rb的命令詳解可以參考https://blog.csdn.net/qq_37595946/article/details/78069298,這裏還有詳細介紹創建集羣時的具體過程。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章