一. 鋪墊
1. 為什麼要用伺服器叢集
(1). 分攤用戶端的壓力,提高伺服器效率。(高并發)
(2). 解決單點故障問題,即删除伺服器節點或者增加伺服器節點都不影響使用。(高可用)
2. 叢集的類型
(1). 對稱叢集:各個叢集執行個體角色的地位相同。(資料計算)
(2). 非對稱叢集:各個叢集執行個體角色的地位不相同。(資料存儲)
下圖:秒殺叢集是對稱叢集,DB叢集是非對稱叢集。

二. 演變曆程
第一代:簡單的主從複制,讀寫分離
一個主伺服器(master)對應多個從伺服器(slaver),主從之間實作資料同步,主伺服器負責【寫】,從伺服器負責【讀】。
分析:主伺服器master當機了,從伺服器也跟着就挂了。
第二代:哨兵模式
在Redis3.0之前的版本,要實作叢集一般是借助哨兵(sentinel工具)監視master節點的狀态,如果master挂機, 其中一個slaver會頂上去,頂替master使用,哨兵模式的配置略微複雜,并且性能和高可用性等方面表現一般,特别是主從切換的瞬間存在 通路瞬斷 的問題。
分析:
雖然解決了第一代中主挂全挂的問題,但所有的寫壓力都在一個master上,且當機的時候,slaver頂上去的這個切換期間,整個服務停止,進而影響項目的正常運作。而且就一個master,單個節點的極限并發也就10萬左右了。
第三代:Cluster
該模式是由多個主從節點群組成的分布式服務叢集,它具有複制、高可用和分片特性。Redis叢集不需要Sentinel哨兵也能完成節點移除和故障轉移工作。需要将每個節點設定成叢集模式,這種叢集沒有中心節點,可水準擴充,根據官方文檔成可以線性擴充到1000個節點,redis叢集的性能和高可用性均優于之前的哨兵模式,且叢集的配置非常簡單。
分析:多個master平行節點,分攤了寫的壓力,且無論是master還是slave水準都可以擴充很多,另外即使單個的master-slave故障或者瞬斷,那麼新的請求來了,也不會分發到這個節點上。
三. Cluster模式搭建
1. 需要準備的東西
(1). redis
(2). redis叢集搭建工具:redis-trib.rb (類似IIS協調排程)
(3). Ruby的運作環境
(4). Ruby環境下redis驅動:redis-3.2.2.gem (好比C#通過ADO.NET通路SQLServer)
補充對應的下載下傳位址:
下載下傳Redis安裝檔案:https://github.com/MSOpenTech/redis/releases/,Redis提供msi和zip格式的下載下傳檔案,這裡下載下傳zip格式Redis-x64-3.2.100版本。
下載下傳Ruby運作環境檔案:http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.2.4-x64.exe
下載下傳Ruby環境下Redis驅動:https://rubygems.org/gems/redis/versions/3.2.2,考慮到相容性,這裡下載下傳的是3.2.2版本
下載下傳Redis叢集工具redis-trib.rb,路徑如下:https://github.com/beebol/redis-trib.rb
2. 搭建步驟
(1). 配置Reids叢集
準備六個配置檔案【redis.6380.conf】【redis.6381.conf】【redis.6382.conf】【redis.6383.conf】【redis.6384.conf】【redis.6385.conf】,拷貝到Redis檔案夾中。然後通過cmd指令【redis-server.exe redis.6380.conf】【redis-server.exe redis.6381.conf】【redis-server.exe redis.6382.conf】【redis-server.exe redis.6383.conf】【redis-server.exe redis.6384.conf】【redis-server.exe redis.6385.conf】,進行啟動。
分析配置檔案中的内容:以【redis.6380.conf】為例
port 6380 #端口号
appendonly yes #資料的儲存為aof格式
appendfilename "appendonly.6380.aof" #資料儲存檔案
cluster-enabled yes #是否開啟叢集
cluster-config-file nodes.6380.conf #叢集節點配置檔案
cluster-node-timeout 15000 #叢集節點的逾時時間
cluster-slave-validity-factor 10 #校驗從節點是否可以進行主從複制,校驗10次
cluster-migration-barrier 1 #配置資料轉移
cluster-require-full-coverage yes #主從節點全量複制
PS:
這裡6個配置檔案是平行關系的,配置級别都一樣,主從關系是在下面【redis-trib.rb】配置哦。
這裡要求最少得配置3個主master,不能低于3個,有沒有從 無要求。
(2). 安裝ruby運作環境
(rubyinstaller-2.2.4-x64.exe)注意勾選後兩個,讓其自動配置環境變量,最終安裝在這個這個檔案夾中【Ruby22-x64】
(3). 安裝驅動
進入ruby運作環境的檔案夾中【Ruby22-x64】中,進入指令行模式,安裝Redis的驅動 【gem install --local C:\Users\DELL\Desktop\redis-cluster\redis-3.2.2.gem】
(4). 利用 redis-trib.rb 進行叢集的協調配置
進入它所在的檔案夾cmd指令行,進行叢集的配置,指令:【redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385】,這裡的 replicas 1,1代表1個master對應1個slave,改為2,則代表1個master對應2個slave。
PS:其它指令
create:建立叢集
check:檢查叢集
info:檢視叢集資訊
fix:修複叢集
reshard:線上遷移slot
rebalance:平衡叢集節點slot數量
add-node:将新節點加入叢集
del-node:從叢集中删除節點
set-timeout:設定叢集節點間心跳連接配接的逾時時間
call:在叢集全部節點上執行指令
import:将外部redis資料導入叢集
問題:我最後配置完了,我寫的時候通路哪個?
答案:以上主節點通路通路任何一個都可以,進到redis叢集中,會根據負載均衡算法自動進行分發到某個節點上。
3. 測試
(1). 在6380節點進行輸入 userName的值為 ypf1, 則6個節點都能擷取到資料。
等等,不一一截圖了。
(2). 在6385節點輸入age的值為10,則6個節點中都能擷取到資料。
總結:無論是master節點還是slave節點寫入資料,所有節點都能讀取到資料,這裡測試使用指令測試,不要用可視化工具直接看,有延遲有緩存不準确哦。
!
- 作 者 : Yaopengfei(姚鵬飛)
- 部落格位址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 如有錯誤,歡迎讨論,請勿謾罵^_^。
- 聲 明2 : 原創部落格請在轉載時保留原文連結或在文章開頭加上本人部落格位址,否則保留追究法律責任的權利。