【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架構圖
- 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
- 節點的fail是通過叢集中超過半數的節點檢測失效時才生效,所以最少需要三個master節點,然後每個master要有一個從節點,三主三從,所以至少需要6個redis例項。(ps:為什麼主節點數要>3?? 如果是兩個master節點,其中一個宕機後,只有另一個master發現,這樣永遠無法超過半數,感覺這個解釋有點搞笑。)
- 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
- redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value
- 整個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投票:容錯
- 投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超時(cluster-node-timeout),認為當前master節點掛掉.
- 什麼時候整個叢集不可用(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埠所在的節點上,這樣保證每個主節點都有一定的資料,做到均衡分配,主從的配置也實現了高可用。
完美收官,感謝您的閱讀~