1. 程式人生 > 其它 >一站式學習Redis, 從入門到高可用分散式實踐-09-初識redis cluster

一站式學習Redis, 從入門到高可用分散式實踐-09-初識redis cluster

redis cluster是redis3.0提供的分散式解決方案,有效的解決了redis分散式方面的需求,同時它也是學習分散式儲存的絕佳案例。

  1. 學習redis cluster是大家學習分散式資料庫的一個很好的案例

  2. 我們為什麼需要redis cluster叢集這樣的功能?
    併發量:redis單機預設支援10萬/s ,如果對併發要求更高,百萬/s呢?
    資料量:redis單機記憶體是16-256G,如果業務需要500G呢?

  • 解決方法:
    配置強悍的機器:超大記憶體,超牛CPU
  • 正確的解決方法:
    分散式:簡單的認為加機器
  • 叢集,規模化需求
    併發量需求,QPS
    資料量需求,大資料
  1. 資料分佈概論
  • 分散式資料庫,資料分割槽
  • 順序分割槽和雜湊分割槽
  • 資料順序分佈和雜湊分佈的對比

    注意:雜湊分佈不支援批量操作
  • 雜湊分佈主要有三種
    (1)節點取餘分割槽
    (2)一致性雜湊分割槽(是對節點取餘分割槽問題的一種優化)
    (3)虛擬槽分割槽(redis cluster使用的分割槽方式)
  1. 節點取餘分割槽
  • 節點取餘會有一個問題
    當新增一個節點的時候,會有80%左右的資料進行分割槽遷移
    翻倍擴容分割槽,這樣會好一點,將有50%左右的資料進行分割槽遷移
  • 節點取餘的特點
    客戶端分片:雜湊+取餘
    節點伸縮:資料節點關係變化,導致資料遷移
    遷移數量和新增節點數量有關,建議翻倍擴容分割槽
  1. 一致性雜湊分割槽
  • 一致性雜湊解決了節點取餘帶來資料遷移過大的問題,在Memcache中使用比較廣泛
  • 一致性雜湊

    客戶端分片:雜湊+順時針(優化節點取餘)
    節點伸縮:隻影響臨近節點,但是還是有資料遷移
    翻倍伸縮:保證最小遷移資料和負載均衡
  1. 虛擬槽分割槽
  • redis cluster採用了虛擬槽分割槽的方式
  • 預設虛擬槽,每個槽對映一個數據子集,一般比節點數大
  • 良好的雜湊函式,例如CRC16
  • 服務端管理節點、槽、資料,例如redsi cluster
  1. redis cluster的基本架構
  • 智慧客戶端知道每一個節點負責的槽的範圍

  • 分散式之間每個節點是可以互相通訊的,而且每一個節點知道其它節點負責的槽的範圍

  • 每個節點都負責資料的讀寫,因為每個節點都負責整個資料集的一部分,這也是分散式的一個特性

  • redis cluster架構
    節點
    meet:節點之間可以互相通訊

    指派槽
    複製:保證高可用,當一個主節點掛了,會啟動該主節點的從節點,同時redis cluster沒有使用sentinel

  • redis cluster特性
    複製
    高可用
    分片

  1. redis cluster原生命令安裝
    原生命令安裝可以充分理解redis cluster的基本架構
  • 配置開啟節點

    redis-server redis-7000.conf

  • meet
    cluster meet ip port
    cluster節點主要配置

  • 指派槽
    cluster addslots {0...5461}

  • 主從
    cluster replicate node-id

  1. 原生安裝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

  1. 原生安裝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
  1. 原生安裝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
  1. 原生安裝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已經大功告成。

  1. ruby環境準備
  • 下載、編譯、安裝ruby
  • 安裝rubygem redis
  • 安裝redis-trib.rb
  1. 安裝步驟
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

  1. 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
    簡直是太方便了
  1. 原生命令與redis-trib.rb對比
  • 原生命令安裝
    理解redis cluster架構
    生產環境不使用
  • 官方工具安裝
    高效、準確
    生產環境可以使用
  • 其它
    視覺化部署-cachecloud
    cachecloud官網