這篇文章跟大家介紹一下Redis中的Cluster集群,看看TCP埠、資料分片,了解如何利用docker搭建一個三主三從的Redis集群。
Redis Cluster是Redis的分散式實作。 當我們傳輸資料到 Redis Cluster,資料會自動分片,儲存到各個Redis節點上。 【相關建議:Redis影片教學】
Redis Cluster相對於單點Redis,可以在某些節點發生故障或無法通訊時繼續運作。但是,如果伺服器出現較大故障(例如,超過一半以上的伺服器無法使用),則叢集將停止運作。
每個Redis群集節點都需要開啟兩個TCP連線。 一是用於服務客戶端的常規TCP端口,預設為6379。 第二個連接埠用於群集匯流排,預設設定16379,二進位協定的節點到節點通訊通道。節點利用群集匯流排用於故障偵測,配置更新,故障轉移授權等。
#Redis Cluster不使用一致性哈希,而是使用一種叫做哈希槽hash_slot的東西。
Redis群集中有16384個雜湊槽,當我們在Redis中儲存一對Key-Value時,要計算給定Key的雜湊槽。方法是先計算Key的CRC16,然後將計算出來的結果取模16384:
hash_slot = CRC16(key) mod 16384
Redis群集中的每個Redis節點都負責雜湊槽的子集,因此,如果有一個包含3個節點的群集,其中:
這樣可以輕鬆新增和刪除叢集中的節點。例如,如果我想新增一個節點D,則需要將一些雜湊槽從節點A,B,C移到D。類似地,如果我想從群集中刪除節點A,則只需移動A所服務的哈希槽到B和C。當節點A為空時,我可以將其從群集中完全刪除。
因為將雜湊槽從一個節點移動到另一個節點不需要停止操作,所以新增或刪除或更改節點持有的雜湊槽的佔比不需要任何停機時間。
接下來我們利用docker搭建一個三主三從的Redis集群。
#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
啟動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 -h 127.0.0.1 -p 6001 # 集群模式启动 redis-cli -c -h 127.0.0.1 -p 6001
更多編程相關知識,請造訪:程式設計影片! !
以上是一文聊聊Redis中的Cluster集群的詳細內容。更多資訊請關注PHP中文網其他相關文章!