首頁  >  文章  >  資料庫  >  一文聊聊Redis中的Cluster集群

一文聊聊Redis中的Cluster集群

青灯夜游
青灯夜游轉載
2021-07-23 10:21:592866瀏覽

這篇文章跟大家介紹一下Redis中的Cluster集群,看看TCP埠、資料分片,了解如何利用docker搭建一個三主三從的Redis集群。

一文聊聊Redis中的Cluster集群

Redis Cluster (Redis叢集)

Redis Cluster是Redis的分散式實作。 當我們傳輸資料到 Redis Cluster,資料會自動分片,儲存到各個Redis節點上。 【相關建議:Redis影片教學

Redis Cluster相對於單點Redis,可以在某些節點發生故障或無法通訊時繼續運作。但是,如果伺服器出現較大故障(例如,超過一半以上的伺服器無法使用),則叢集將停止運作。

Redis Cluster TCP連接埠

每個Redis群集節點都需要開啟兩個TCP連線。 一是用於服務客戶端的常規TCP端口,預設為6379。 第二個連接埠用於群集匯流排,預設設定16379,二進位協定的節點到節點通訊通道。節點利用群集匯流排用於故障偵測,配置更新,故障轉移授權等。

  • 客戶端永遠不要嘗試與群集總線端口進行通信,而應始終與普通的Redis命令端口進行通信,但是請確保同時打開防火牆中的兩個端口,否則Redis集群節點將無法進行通信。命令連接埠和叢集匯流排連接埠的偏移量是固定的,並且始終為10000。
  • 如果沒有同時開啟兩個TCP端口,則群集將無法正常運作。
  • 叢集匯流排使用不同的二進位協定進行節點到節點的資料交換,它更適合於用很少的頻寬和處理時間在節點之間交換資訊。

Redis Cluster資料分片

#Redis Cluster不使用一致性哈希,而是使用一種叫做哈希槽hash_slot的東西。

Redis群集中有16384個雜湊槽,當我們在Redis中儲存一對Key-Value時,要計算給定Key的雜湊槽。方法是先計算Key的CRC16,然後將計算出來的結果取模16384:

hash_slot = CRC16(key) mod 16384

Redis群集中的每個Redis節點都負責雜湊槽的子集,因此,如果有一個包含3個節點的群集,其中:

  • 節點A包含從0到5500的雜湊槽。
  • 節點B包含從5501到11000的雜湊槽。
  • 節點C包含從11001到16383的雜湊槽。

這樣可以輕鬆新增和刪除叢集中的節點。例如,如果我想新增一個節點D,則需要將一些雜湊槽從節點A,B,C移到D。類似地,如果我想從群集中刪除節點A,則只需移動A所服務的哈希槽到B和C。當節點A為空時,我可以將其從群集中完全刪除。

因為將雜湊槽從一個節點移動到另一個節點不需要停止操作,所以新增或刪除或更改節點持有的雜湊槽的佔比不需要任何停機時間。

接下來我們利用docker搭建一個三主三從的Redis集群。

使用Docker建立RedisCluster

#Redis配置

port ${PORT}                                       ##节点端口
protected-mode no                                  ##开启集群模式
cluster-enabled yes                                ##cluster集群模式
cluster-config-file nodes.conf                     ##集群配置名
cluster-node-timeout 5000                          ##超时时间
cluster-announce-ip 192.168.1.XX                   ##实际为各节点网卡分配ip  先用一个ip代替
cluster-announce-port ${PORT}                      ##节点映射端口
cluster-announce-bus-port 1${PORT}                 ##节点总线端口
appendonly yes                                     ##持久化模式

建立自訂network

docker network create redis-net

自訂路徑

mkdir -p /usr/redis_cluster
cd /usr/redis_cluster

#在自訂路徑下產生成conf和data目標,並產生設定資訊

for port in `seq 6001 6006`; do
    mkdir -p ./${port}/conf
    touch ./${port}/conf/redis.conf 
    mkdir -p ./${port}/data 
    echo "port ${port}" >>./${port}/conf/redis.conf
    echo "protected-mode no" >>./${port}/conf/redis.conf
    echo "cluster-enabled yes" >>./${port}/conf/redis.conf
    echo "cluster-config-file nodes.conf" >>./${port}/conf/redis.conf
    echo "cluster-node-timeout 5000" >>./${port}/conf/redis.conf
    echo "cluster-announce-ip 192.168.1.XX" >>./${port}/conf/redis.conf
    echo "cluster-announce-port ${port}" >>./${port}/conf/redis.conf
    echo "cluster-announce-bus-port 1${port}" >>./${port}/conf/redis.conf
    echo "appendonly yes" >>./${port}/conf/redis.conf
done
  • cluster-announce-ip 192.168.1.XX 中的IP必須是容器間通訊的ip,之後可以在先前新增的network中查看。
  • 共產生6個資料夾,從6001到6006,每個資料夾下包含data和conf資料夾,同時conf裡面有redis.conf設定檔。

啟動Redis容器

for port in `seq 6001 6006`; do \
  docker run -d --privileged=true -p ${port}:${port} -p 1${port}:1${port}\
  -v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v $PWD/${port}/data:/data \
  --restart always --name redis-${port} --net redis-net \
  redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf; \
done

#啟動叢集

# 进入任意Redis容器
docker exec -it redis-6001 /bin/bash
# 初始化Redis集群命令
redis-cli --cluster create 172.19.0.2:6601 172.19.0.3:6602 172.19.0.4:6603 172.19.0.5:6604 172.19.0.6:6605 172.19.0.7:6606 --cluster-replicas 1
  • 建立成功後我們可以使用redis -cli指令連接到其中一個Redis服務.
# 单机模式启动
redis-cli -h 127.0.0.1 -p 6001
# 集群模式启动
redis-cli -c -h 127.0.0.1 -p 6001
  • 之後透過cluster nodes指令可以查看節點信息,發現符合3主3從的預期

參考文件

更多編程相關知識,請造訪:程式設計影片! !

以上是一文聊聊Redis中的Cluster集群的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:掘金--新海。如有侵權,請聯絡admin@php.cn刪除