一站式學習Redis, 從入門到高可用分散式實踐-09-初識redis cluster
阿新 • • 發佈:2022-04-18
redis cluster是redis3.0提供的分散式解決方案,有效的解決了redis分散式方面的需求,同時它也是學習分散式儲存的絕佳案例。
-
學習redis cluster是大家學習分散式資料庫的一個很好的案例
-
我們為什麼需要redis cluster叢集這樣的功能?
併發量:redis單機預設支援10萬/s ,如果對併發要求更高,百萬/s呢?
資料量:redis單機記憶體是16-256G,如果業務需要500G呢?
- 解決方法:
配置強悍的機器:超大記憶體,超牛CPU - 正確的解決方法:
分散式:簡單的認為加機器 - 叢集,規模化需求
併發量需求,QPS
資料量需求,大資料
- 資料分佈概論
- 分散式資料庫,資料分割槽
- 順序分割槽和雜湊分割槽
- 資料順序分佈和雜湊分佈的對比
注意:雜湊分佈不支援批量操作 - 雜湊分佈主要有三種
(1)節點取餘分割槽
(2)一致性雜湊分割槽(是對節點取餘分割槽問題的一種優化)
(3)虛擬槽分割槽(redis cluster使用的分割槽方式)
- 節點取餘分割槽
- 節點取餘會有一個問題
當新增一個節點的時候,會有80%左右的資料進行分割槽遷移
翻倍擴容分割槽,這樣會好一點,將有50%左右的資料進行分割槽遷移 - 節點取餘的特點
客戶端分片:雜湊+取餘
節點伸縮:資料節點關係變化,導致資料遷移
遷移數量和新增節點數量有關,建議翻倍擴容分割槽
- 一致性雜湊分割槽
- 一致性雜湊解決了節點取餘帶來資料遷移過大的問題,在Memcache中使用比較廣泛
- 一致性雜湊
客戶端分片:雜湊+順時針(優化節點取餘)
節點伸縮:隻影響臨近節點,但是還是有資料遷移
翻倍伸縮:保證最小遷移資料和負載均衡
- 虛擬槽分割槽
- redis cluster採用了虛擬槽分割槽的方式
- 預設虛擬槽,每個槽對映一個數據子集,一般比節點數大
- 良好的雜湊函式,例如CRC16
- 服務端管理節點、槽、資料,例如redsi cluster
- redis cluster的基本架構
-
智慧客戶端知道每一個節點負責的槽的範圍
-
分散式之間每個節點是可以互相通訊的,而且每一個節點知道其它節點負責的槽的範圍
-
每個節點都負責資料的讀寫,因為每個節點都負責整個資料集的一部分,這也是分散式的一個特性
-
redis cluster架構
節點
meet:節點之間可以互相通訊
指派槽
複製:保證高可用,當一個主節點掛了,會啟動該主節點的從節點,同時redis cluster沒有使用sentinel -
redis cluster特性
複製
高可用
分片
- redis cluster原生命令安裝
原生命令安裝可以充分理解redis cluster的基本架構
-
配置開啟節點
redis-server redis-7000.conf -
meet
cluster meet ip port
cluster節點主要配置 -
指派槽
cluster addslots {0...5461} -
主從
cluster replicate node-id
- 原生安裝redis cluster 01-準備節點
編寫6個配置檔案,三個主節點,三個從節點
port 7000
daemonize yes
dir "/opt/soft/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-require-full-coverage no
# 注意上面的所有port埠和下面的匯流排埠都要開開,否則叢集啟動失敗
# 雲伺服器上部署需指定公網ip
cluster-announce-ip xxx.xxx.xxx.xxx
# Redis匯流排埠,用於與其它節點通訊
cluster-announce-bus-port port + 10000
開啟叢集6個節點服務redis-server redis-7000.conf
檢視叢集節點的配置redis-cli -p 7000 cluster nodes
檢視叢集節點的資訊redis-cli -p 7000 cluster info
- 原生安裝redis cluster 02-meet操作(節點握手)
redis-cli -p 7000 cluster meet 公網ip 7001
redis-cli -p 7000 cluster meet 公網ip 7002
redis-cli -p 7000 cluster meet 公網ip 7003
...04
...05
- 原生安裝redis cluster 03-分配槽
- 編寫為三個主節點新增槽的指令碼
start=$1
end=$2
port=$3
for slot in `seq ${start} ${end}`
do
echo "slot:${slot}"
redis-cli -p ${port} cluster addslots ${slot}
done
- 執行指令碼命令
sh addslots.sh 0 5461 7000
sh addslots.sh 5462 10922 7001
sh addslots.sh 10923 16383 7002
- 原生安裝redis cluster 04-分配主從
redis-cli -p 7003 cluster replicate 99cfeb7aaxxxxc5b5c3a1965b
這個id就是7000埠的Id,通過命令redis-cli -p 7000 cluster nodes
檢視
redis-cli -p 7003 cluster replicate 7000-c5b5c3a1965b
redis-cli -p 7004 cluster replicate 7001-axxxxc5b5c3a1965b
redis-cli -p 7005 cluster replicate 7002-b7aaxxxxc5b5c3a1965b
- 注意,客戶端連結叢集redis例項時這樣寫
redis-cli -c -p 7003
- 以槽位單位檢視槽內對應的節點資訊
redis-cli -p 7000 cluster slots
至此,原生安裝redis cluster已經大功告成。
- ruby環境準備
- 下載、編譯、安裝ruby
- 安裝rubygem redis
- 安裝redis-trib.rb
- 安裝步驟
wget https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.gz
tar xvf ruby-3.2.0.tar.gz
cd ruby-3.2.0
./configure -prefix=/usr/local/ruby
make
make install
./configure && make && make install
wget https://rubygems.org/downloads/redis-4.6.0.gem
sudo gem install -l redis-4.6.0.gem
sudo gem list -- check redis gem
檢視ruby版本ruby --version
- redis-trib構建叢集
- 將redis-trib.rb檔案拷貝
cp /opt/soft/redis/src/redis-trib.rb /usr/local/bin
- 建立6個配置檔案8000-8005
port 8000
daemonize yes
dir "/opt/soft/redis/data"
logfile "8000.log"
dbfilename "dump-8000.rdb"
cluster-enabled yes
cluster-config-file nodes-8000.conf
cluster-require-full-coverage no
protected-mode no
# 雲伺服器上部署需指定公網ip
cluster-announce-ip xxx.xxx.xxx.xxx
# Redis匯流排埠,用於與其它節點通訊
cluster-announce-bus-port 18000
- 切換目錄
cd /opt/soft/redis/src/
- 建立叢集(比上面原生安裝省略了meet、分配槽、建立主從關係)
redis-cli --cluster create xxx:8000 xxxx:8001 ip:8002 4xxxx71:8003 xxxx:8004 xxxx:8005 --cluster-replicas 1
當然新版本redis6.0已經將上面的命令移除了,也不需要安裝上面的ruby等等,redis-cli直接提供了建立叢集的命令redis-cli --cluster create ip:8000 ip:8001 ip:8002 ip:8003 ip:8004 ip:8005 --cluster-replicas 1
簡直是太方便了
- 原生命令與redis-trib.rb對比
- 原生命令安裝
理解redis cluster架構
生產環境不使用 - 官方工具安裝
高效、準確
生產環境可以使用 - 其它
視覺化部署-cachecloud
cachecloud官網