1. 程式人生 > >【Redis學習】--Redis叢集搭建

【Redis學習】--Redis叢集搭建

文章目錄

1. Redis部署

以Linux(CentOS7.4)為例

1.1 安裝依賴環境

Redis是c語言開發的。
安裝redis需要c語言的編譯環境。如果沒有gcc需要線上安裝。

yum install gcc-c++

1.2 安裝 Redis

第一步:redis的原始碼包上傳到linux系統,或線上下載

wget http://download.redis.io/releases/redis-3.0.0.tar.gz 

第二步:解壓縮redis。

tar xzf redis-3.0.0.tar.gz

第三步:編譯。進入redis原始碼目錄,其內建了Makefile檔案,我們可以直接編譯。

make

第四步:安裝,PREFIX引數指定redis的安裝目錄。一般軟體安裝到/usr目錄下。

make install PREFIX=/usr/local/redis

1.3 啟動Redis

前臺啟動:

在redis的安裝目錄下直接啟動redis-server

[[email protected] bin]# ./redis-server 

後臺啟動:

把原始檔中/root/redis-3.0.0/redis.conf配置檔案複製到安裝目錄/usr/local/redis/bin目錄下

[[email protected] redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

修改配置檔案
修改安裝目錄下redis.conf檔案的daemonize引數為yes,指定配置檔案啟動,例如:

 [[email protected] bin] vim redis.conf
    
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes

後臺啟動

[[email protected] bin]# ./redis-server redis.conf

檢視redis程序:

[[email protected] bin]# ps aux|grep redis
root      5190  0.1  0.3  33936  1712 ?        Ssl  18:23   0:00 ./redis-server *:6379    
root      5196  0.0  0.1   4356   728 pts/0    S+   18:24   0:00 grep redis

1.4 測試客戶端可用情況:

使用ping-pong機制檢測健康狀態

[[email protected] bin]# ./redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set str1 Hepburn 
OK
127.0.0.1:6379> get str1
"Hepburn"
127.0.0.1:6379> 

2.Redis叢集原理

為了在大流量訪問下提供穩定的業務,叢集化是儲存的必然形態,Redis 叢集是一個可以在多個 Redis 節點之間進行資料共享的設施installation。

2.1 redis-cluster架構圖

在這裡插入圖片描述

  1. 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
  2. 節點的fail是通過叢集中超過半數的節點檢測失效時才生效,所以最少需要三個master節點,然後每個master要有一個從節點,三主三從,所以至少需要6個redis例項。(ps:為什麼主節點數要>3?? 如果是兩個master節點,其中一個宕機後,只有另一個master發現,這樣永遠無法超過半數,感覺這個解釋有點搞笑。)
  3. 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
  4. redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value
  5. 整個Redis 叢集中共內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點,這樣可以保證快取比較均勻的存到每個節點,讓每個節點都工作。

2.1.1 例項展示

如下圖所示:整個redis叢集中的第0-5000雜湊槽是在節點1上的,第5001-10000雜湊槽是在節點2上的,第10001-16383個雜湊槽是在節點3上的,雜湊槽數是固定的,每個節點上有多少個雜湊槽是我們可以自定義配置的,但總數永遠都是16384,這也就決定了整個redis叢集最多有16384個節點。
在這裡插入圖片描述

存入快取的過程:

當第一個字串Hello利用C16演算法,假定得出的key是500,所以這個字串將會存到對應區間雜湊槽數在(0-5000)的Server1,以此類推,Hello2,Hello3等字串也根據C16演算法得到相應的key,存到對應的雜湊槽存入。取值的時候同理反之,根據Key直接找到對應的雜湊槽,到相應的節點上獲取快取資料,避免了遍歷查詢的過程,這也就是從快取中讀取資料高效的原因。

2.1.2 redis-cluster投票:容錯

在這裡插入圖片描述

  1. 投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超時(cluster-node-timeout),認為當前master節點掛掉.
  2. 什麼時候整個叢集不可用(cluster_state:fail)?

如果叢集任意一個master掛掉,且當前master沒有slave.或者slave與master同時掛掉,叢集就進入fail狀態,也可以理解成叢集的slot對映[0-16383]雜湊槽不完整時就進入fail狀態.
redis-3.0.0.rc1加入cluster-require-full-coverage引數,預設關閉,開啟叢集相容部分失敗.
如果叢集超過半數以上master掛掉,無論是否有slave,叢集進入fail狀態.

3. Redis叢集搭建

明白了原理之後,現在開始搭建叢集

3.1 建立6個Redis例項

建立redis-cluster資料夾,將6個Redis例項放置其中

    [[email protected] redis-cluster]# ll
    total 52
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis01
    drwxr-xr-x 2 root root   193 Oct 11 18:28 redis02
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis03
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis04
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis05
    drwxr-xr-x 2 root root   171 Oct 11 18:28 redis06

3.2 分別修改配置檔案

修改以上6個Redis例項中bin目錄下的redis.conf檔案
本次是在一臺伺服器的六個不同埠搭建的偽叢集,若在多臺伺服器上不必修改埠這項。

# 該項設定後臺方式執行(可選操作)
 daemonize yes 
# 埠分別為7001,7002,7003,7004,7005,7006 (可選操作)
port 7001 
# 可詳細檢視Cluster模組關於叢集配置引數的說明 (此處為開啟叢集模式)
cluster-enabled yes

3.3 集體啟動Redis

寫個指令碼方便集體啟動redis例項,不嫌麻煩可以一個一個啟。

[[email protected] redis-cluster]# vim start-all.sh 
cd redis01
./redis-server redis.conf
cd ..   
cd redis02
./redis-server redis.conf
cd ..   
cd redis03
./redis-server redis.conf
cd ..  
cd redis04
./redis-server redis.conf
cd .. 
cd redis05
./redis-server redis.conf
cd .. 
cd redis06
./redis-server redis.conf
cd .. 

你以為到這就結束了麼,其實並沒有……

3.4 叢集環境搭建

3.4.1 ruby環境

因為Redis使用ruby指令碼搭建叢集,所以需要ruby的執行環境。

#  安裝ruby執行環境
[[email protected] ~] yum install ruby

# 安裝ruby第三方包管理工具
[[email protected] ~] yum install rubygems

#  執行ruby指令碼使用的第三方依賴包。
[[email protected] ~] gem install redis-3.0.0.gem

3.4.2 執行redis-trib.rb指令碼

將redis原始檔中的ruby指令碼複製到安裝目錄下

[[email protected] ~]# cp redis-trib.rb /usr/local/redis-cluster/
[[email protected] redis-cluster]# ll
total 52
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis01
drwxr-xr-x 2 root root   193 Oct 11 18:28 redis02
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis03
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis04
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis05
drwxr-xr-x 2 root root   171 Oct 11 18:28 redis06
-rwxr-xr-x 1 root root 48141 Oct 11 18:32 redis-trib.rb
-rwxr--r-- 1 root root   264 Oct 11 18:24 start-all.sh

執行指令碼,create --replicas是建立叢集的命令,replicas後面的1是指每個節點有一個slave備份,後面是6個redis例項所在的位置。

[[email protected] redis-cluster]# ./redis-trib.rb create --replicas 1
192.168.178.12:7001 192.168.178.12:7002 192.168.178.12:7003 192.168.178.12:7004 192.168.178.12:7005 192.168.178.12:7006

執行結果:

Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.178.12:7001                                #三個主機
192.168.178.12:7002
192.168.178.12:7003
Adding replica 192.168.178.12:7004 to 192.168.178.12:7001        #主從關係設定
Adding replica 192.168.178.12:7005 to 192.168.178.12:7002
Adding replica 192.168.178.12:7006 to 192.168.178.12:7003
  
  # 下面分別是master的id, 所在ip埠,設定的雜湊槽範圍      
M: 1043a01095d309de69bd4c508299b3fef347bf8e 192.168.178.12:7001
   slots:0-5460 (5461 slots) master                     
M: 24425aa5c7a31fee5dfe6742c609bb70b351cc43 192.168.178.12:7002
   slots:5461-10922 (5462 slots) master
M: 791626e062c8f676a2f41ea5a4d32ec527c1f07a 192.168.178.12:7003
   slots:10923-16383 (5461 slots) master
S: 56e8ebf36a827b044ed23b7bbab7b2e7e3ca7229 192.168.178.12:7004
   replicates 1043a01095d309de69bd4c508299b3fef347bf8e
S: 9b953784c34116fa58b0cc973e772654b5b1e0de 192.168.178.12:7005
   replicates 24425aa5c7a31fee5dfe6742c609bb70b351cc43
S: 0337e5dfecbf29e9c81a6b8a6c429774e4b24c63 192.168.178.12:7006
   replicates 791626e062c8f676a2f41ea5a4d32ec527c1f07a
Can I set the above configuration? (type 'yes' to accept): 

這是redis為我們做的預設設定,回覆yes表示接受設定,即可照此設定搭建叢集。

3.4.2 叢集搭建成功

看到下面的圖示表示叢集搭建成功
在這裡插入圖片描述

3.5 測試叢集連線狀態

3.5.1 檢視叢集狀態

192.168.178.12:7002> cluster info
cluster_state:ok                               #叢集狀態
cluster_slots_assigned:16384                #被分配的槽位數
cluster_slots_ok:16384                   #正確分配的槽位                   
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6                      #當前節點總數
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_sent:2260
cluster_stats_messages_received:2260

3.5.1 檢視節點狀態

192.168.178.12:7002> cluster nodes
1043a01095d309de69bd4c508299b3fef347bf8e 192.168.178.12:7001 master - 0 1539261504890 1 connected 0-5460
791626e062c8f676a2f41ea5a4d32ec527c1f07a 192.168.178.12:7003 master - 0 1539261506904 3 connected 10923-16383
56e8ebf36a827b044ed23b7bbab7b2e7e3ca7229 192.168.178.12:7004 slave 1043a01095d309de69bd4c508299b3fef347bf8e 0 1539261507910 4 connected
9b953784c34116fa58b0cc973e772654b5b1e0de 192.168.178.12:7005 slave 24425aa5c7a31fee5dfe6742c609bb70b351cc43 0 1539261502874 5 connected
24425aa5c7a31fee5dfe6742c609bb70b351cc43 192.168.178.12:7002 myself,master - 0 0 2 connected 5461-10922
0337e5dfecbf29e9c81a6b8a6c429774e4b24c63 192.168.178.12:7006 slave 791626e062c8f676a2f41ea5a4d32ec527c1f07a 0 1539261505896 6 connected

3.5.2 連線叢集

使用任意一個客戶端連線叢集
此處是用redis01連線埠為7004的節點,-c引數是連線叢集的標誌

[[email protected] redis-cluster]# redis01/redis-cli -p 7004 -c
127.0.0.1:7004> set a 123456
-> Redirected to slot [15495] located at 192.168.178.12:7003
OK
192.168.178.12:7003> set b 66666
-> Redirected to slot [3300] located at 192.168.178.12:7001
OK
192.168.178.12:7001> set c 77777
-> Redirected to slot [7365] located at 192.168.178.12:7002
OK
192.168.178.12:7002> 

此時,存入了a,b,c三個key,他們各自通過C16演算法被分配到了 [15495],[3300], [7365]三個雜湊槽上,即資料存在了對應的7003,7001,7002埠所在的節點上,這樣保證每個主節點都有一定的資料,做到均衡分配,主從的配置也實現了高可用。

完美收官,感謝您的閱讀~