Redis-Cluster簡介
1、 什麼是Redis-Cluster
為何要搭建Redis叢集。Redis是在記憶體中儲存資料的,而我們的電腦一般記憶體都不大,這也就意味着Redis不适合存儲大資料,适合存儲大資料的是Hadoop生态系統的Hbase或者是MogoDB。Redis更适合處理高并發,一台裝置的存儲能力是很有限的,但是多台裝置協同合作,就可以讓記憶體增大很多倍,這就需要用到叢集。
Redis叢集搭建的方式有多種,例如使用用戶端分片、Twemproxy、Codis等,但從redis 3.0之後版本支援redis-cluster叢集,它是Redis官方提出的解決方案,Redis-Cluster采用無中心結構,每個節點儲存資料和整個叢集狀态,每個節點都和其他所有節點連接配接。其redis-cluster架構圖如下:

用戶端與 redis 節點直連,不需要中間 proxy 層.用戶端不需要連接配接叢集所有節點連接配接叢集中任何一個可用節點即可。
所有的 redis 節點彼此互聯(PING-PONG 機制),内部使用二進制協定優化傳輸速度和帶寬.
1.1、分布存儲機制-槽
(1)redis-cluster 把所有的實體節點映射到[0-16383]slot 上,cluster 負責維護
node<->slot<->value
(2)Redis 叢集中内置了 16384 個哈希槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個key 都會對應一個編号在 0-16383 之間的哈希槽,redis 會根據節點數量大緻均等的将哈希槽映射到不同的節點。
例如三個節點:槽分布的值如下:
SERVER1: 0-5460
SERVER2: 5461-10922
SERVER3: 10923-16383
1.2、容錯機制-投票
(1)選舉過程是叢集中所有master參與,如果半數以上master節點與故障節點通信超過(cluster-node-timeout),認為該節點故障,自動觸發故障轉移操作. 故障節點對應的從節點自動更新為主節點
(2)什麼時候整個叢集不可用(cluster_state:fail)?
如果叢集任意master挂掉,且目前master沒有slave.叢集進入fail狀态,也可以了解成叢集的slot映射[0-16383]不完成時進入fail狀态.
2、搭建Redis-Cluster
2.1、搭建要求
需要 6 台 redis 伺服器。搭建僞叢集。
需要 6 個 redis 執行個體。
需要運作在不同的端口 7001-7006
2.2、準備工作
(1)安裝gcc
Redis 是 c 語言開發的。安裝 redis 需要 c 語言的編譯環境。如果沒有 gcc 需要線上安裝。
# 檢視是否有 gcc
gcc -v
# centos 安裝
yum install gcc-c++
# ubuntu 安裝
sudo apt-get update
sudo apt-get build-depgcc
(2)安裝 ruby (我們需要使用ruby腳本來實作叢集搭建)
# centos 安裝
yum install ruby
yum install rubygems
# ubuntu 安裝
sudo apt update
sudo apt install ruby-full
# 檢視版本
ruby --version
知識點小貼士
Ruby,一種簡單快捷的面向對象(面向對象程式設計)腳本語言,在20世紀90年代由日本人松本行弘(Yukihiro Matsumoto)開發,遵守GPL協定和Ruby License。它的靈感與特性來自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp 語言。由 Ruby 語言本身還發展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 語言替代品。Ruby的作者于1993年2月24日開始編寫Ruby,直至1995年12月才正式公開釋出于fj(新聞討論區)。因為Perl發音與6月誕生石pearl(珍珠)相同,是以Ruby以7月誕生石ruby(紅寶石)命名
RubyGems簡稱gems,是一個用于對 Ruby元件進行打包的 Ruby 打包系統
(3)将redis源碼包上傳到 linux 系統 ,解壓redis源碼包
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar xzf redis-6.0.9.tar.gz
cd redis-6.0.9
make
如果指令行方式下載下傳出錯,則把網址複制出來用浏覽器下載下傳,然後拷貝到linux中
看到以下輸出結果,表示編譯成功![]()
SpringCloud 之 搭建 Redis 叢集(Redis-Cluster)及 主從複制 ![]()
SpringCloud 之 搭建 Redis 叢集(Redis-Cluster)及 主從複制
(5)建立目錄/usr/local/redis-cluster目錄, 安裝6個redis執行個體,分别安裝在以下目錄
/usr/local/redis-cluster/redis-1
/usr/local/redis-cluster/redis-2
/usr/local/redis-cluster/redis-3
/usr/local/redis-cluster/redis-4
/usr/local/redis-cluster/redis-5
/usr/local/redis-cluster/redis-6
以第一個redis執行個體為例,指令如下
make install PREFIX=/usr/local/redis-cluster/redis-1
出現此提示表示成功,按此方法安裝其餘5個redis執行個體
![]()
SpringCloud 之 搭建 Redis 叢集(Redis-Cluster)及 主從複制
(6)複制配置檔案 将 /redis-3.0.0/redis.conf 複制到redis下的bin目錄下
cp redis.conf /usr/local/redis-cluster/redis-1/bin
cp redis.conf /usr/local/redis-cluster/redis-2/bin
cp redis.conf /usr/local/redis-cluster/redis-3/bin
cp redis.conf /usr/local/redis-cluster/redis-4/bin
cp redis.conf /usr/local/redis-cluster/redis-5/bin
cp redis.conf /usr/local/redis-cluster/redis-6/bin
2.3配置叢集
(1)修改每個redis節點的配置檔案redis.conf
- (91行) 修改運作端口為7001 (7002 7003 ……)
- (224行) 将 daemonsize 的 no 改成 yes,開啟背景運作 redis
- (247行) 将pid檔案的名字 含端口号那個改成相應的端口
- (1222行) 将cluster-enabled yes 前的注釋去掉,開啟叢集
叢集:
6個節點
3主
3從
1)建立6個節點 7001-7006
2)開啟叢集
3)串聯叢集[将叢集連結到一起]
(2)啟動每個redis執行個體
以第一個執行個體為例,指令如下
cd /usr/local/redis-cluster/redis-1/bin/
./redis-server redis.conf
# 為了友善,在/usr/local/redis-cluster目錄下建立 redis-start-all.sh 檔案,并賦予可運作的權限
vim redis-start-all.sh
# 内容
cd /usr/local/redis-cluster/redis-1/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-2/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-3/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-4/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-5/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-6/bin/
./redis-server redis.conf
chmod +x redis-start-all.sh
(3)執行指令,開啟
./redis-start-all.sh出現這個即表示啟動成功![]()
SpringCloud 之 搭建 Redis 叢集(Redis-Cluster)及 主從複制
(4)使用 ruby 腳本搭建叢集。
進入redis源碼目錄中的src目錄 執行下面的指令,可以實作Redis叢集,create建立叢集,cluster-replicas建立主從關系 1:是否随機建立(是)。
./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
出現這樣即建立叢集成功(因為在 redis.conf 檔案中設定 bind 127.0.0.1 是以此時的redis是外面連不上的,需要把每個 bind 改成0.0.0.0 即可)
輸入 yes 建立:
(5):測試叢集
-c:代表連接配接的是 redis 叢集
到此 Redis 叢集搭建完畢
接下來搭建redis各個節點的主從複制
從下圖中可看出
目前的叢集架構是:
當一個節點的 master 當機之後,他的 slave 就不可用了,這不是我們想要的,我們可以利用 redis 的哨兵模式,以達到故障轉移,主節點的選舉等操作
架構原理如圖:
1.多個sentinel 發現并确認master有問題。
2.sentinel内部選舉上司
3.選舉出slave作為新的master
4.通知其餘的slave成為新master的slave
5.通知用戶端 主從變化
6.如果老的master重新複活,那麼成為新的master的slave
要實作上邊的功能的主要細節主要有以下三個定時任務:
每10秒,哨兵會向master和slave發送INFO指令(目的就是監控每一個節點資訊)
每2秒,哨兵會向master庫和slave的頻道(sentinel:hello)發送自己的資訊 (sentinel節點通過sentinel:hello頻道進行資訊交換,比如加入哨兵叢集,分享自己節點資料)
每1秒,哨兵會向master和slave以及其他哨兵節點發送PING指令(目的就是 redis節點的狀态監控,還有上司選舉,主備切換選擇等)
政策總結:
1.盡量為 每一個節點部署一個哨兵
2.哨兵也要搭建叢集(防止哨兵單點故障)
3.每一個節點都同時設定quorum的值超過半數(N/2)+1
具體操作:
- 1、将安裝包目錄下的 sentinel.conf 拷貝到每個 master 的目錄下的bin 目錄下,也就是 redis-1,redis-2,redis-3
cp sentinel.conf /usr/local/redis-cluster/redis-1/bin/
cp sentinel.conf /usr/local/redis-cluster/redis-2/bin/
cp sentinel.conf /usr/local/redis-cluster/redis-3/bin/
- 2、然後編輯 sentinel.conf 檔案,設定主節點的IP和端口即可
在 sentinel.conf 檔案的![]()
SpringCloud 之 搭建 Redis 叢集(Redis-Cluster)及 主從複制 ![]()
SpringCloud 之 搭建 Redis 叢集(Redis-Cluster)及 主從複制
- 3、啟動每個主節點的哨兵
cd /usr/local/redis-cluster/redis-1/bin/
./redis-sentinel ./sentinel.conf
cd /usr/local/redis-cluster/redis-2/bin/
./redis-sentinel ./sentinel.conf
cd /usr/local/redis-cluster/redis-3/bin/
./redis-sentinel ./sentinel.conf
然後就可以發現,之前連接配接 7004 不能存儲節點的現在依然可以使用了,此時要注意,殺死一次7001之後,7004成為主節點,7001再次啟動,則7001成為從節點了
最後檢視程序資訊:
ps -ef|grep redis