從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
- daemonize yes
- port 7001(分別對每個機器的端口號進行設置)
- bind 192.168.1.10(必須要綁定當前機器的ip,這裏方便redis集羣定位機器,不綁定可能會出現循環查找集羣節點機器的情況)
- dir /opt/redis-cluster/7001/(指定數據文件存放位置,必須要指定不同的目錄位置,不然會丟失數據)
- cluster-enabled yes(啓動集羣模式)
- cluster-config-file nodes-7001.conf(這裏700x最好和port對應上) 集羣內部配置文件,改掉端口號
- cluster-node-timeout 15000 節點超時時間
- 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
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
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
第六步,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
檢查是否安裝成功
[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,這裏還有詳細介紹創建集羣時的具體過程。