溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis中的Cluster集群介紹

發(fā)布時(shí)間:2021-07-23 17:23:48 來(lái)源:億速云 閱讀:198 作者:chen 欄目:關(guān)系型數(shù)據(jù)庫(kù)

這篇文章主要介紹“Redis中的Cluster集群介紹”,在日常操作中,相信很多人在Redis中的Cluster集群介紹問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Redis中的Cluster集群介紹”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Redis Cluster (Redis集群)

Redis Cluster是Redis的分布式實(shí)現(xiàn)。 當(dāng)我們傳輸數(shù)據(jù)到 Redis Cluster,數(shù)據(jù)會(huì)自動(dòng)分片,存儲(chǔ)到各個(gè)Redis節(jié)點(diǎn)上。

Redis Cluster相對(duì)于單點(diǎn)Redis,可以在一些節(jié)點(diǎn)出現(xiàn)故障或無(wú)法通信時(shí)繼續(xù)運(yùn)行。但是,如果服務(wù)器出現(xiàn)較大故障(例如,超過(guò)一半以上的服務(wù)器不可用),群集將停止運(yùn)行。

Redis Cluster TCP端口

每個(gè)Redis群集節(jié)點(diǎn)都需要打開(kāi)兩個(gè)TCP連接。 一是用于服務(wù)客戶端的常規(guī)TCP端口,默認(rèn)為6379。 第二個(gè)端口用于群集總線,默認(rèn)設(shè)置16379,二進(jìn)制協(xié)議的節(jié)點(diǎn)到節(jié)點(diǎn)通信通道。節(jié)點(diǎn)利用群集總線用于故障檢測(cè),配置更新,故障轉(zhuǎn)移授權(quán)等。

  • 客戶端永遠(yuǎn)不要嘗試與群集總線端口進(jìn)行通信,而應(yīng)始終與普通的Redis命令端口進(jìn)行通信,但是請(qǐng)確保同時(shí)打開(kāi)防火墻中的兩個(gè)端口,否則Redis群集節(jié)點(diǎn)將無(wú)法進(jìn)行通信。命令端口和集群總線端口的偏移量是固定的,并且始終為10000。

  • 如果沒(méi)有同時(shí)打開(kāi)兩個(gè)TCP端口,則群集將無(wú)法正常工作。

  • 集群總線使用不同的二進(jìn)制協(xié)議進(jìn)行節(jié)點(diǎn)到節(jié)點(diǎn)的數(shù)據(jù)交換,它更適合于用很少的帶寬和處理時(shí)間在節(jié)點(diǎn)之間交換信息。

Redis Cluster數(shù)據(jù)分片

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

Redis群集中有16384個(gè)哈希槽,當(dāng)我們?cè)赗edis中存儲(chǔ)一對(duì)Key-Value時(shí),要計(jì)算給定Key的哈希槽。方法是先計(jì)算Key的CRC16,然后對(duì)計(jì)算出的結(jié)果取模16384:

hash_slot = CRC16(key) mod 16384

Redis群集中的每個(gè)Redis節(jié)點(diǎn)都負(fù)責(zé)哈希槽的子集,因此,如果有一個(gè)包含3個(gè)節(jié)點(diǎn)的群集,其中:

  • 節(jié)點(diǎn)A包含從0到5500的哈希槽。

  • 節(jié)點(diǎn)B包含從5501到11000的哈希槽。

  • 節(jié)點(diǎn)C包含從11001到16383的哈希槽。

這樣可以輕松添加和刪除集群中的節(jié)點(diǎn)。例如,如果我想添加一個(gè)新節(jié)點(diǎn)D,則需要將一些哈希槽從節(jié)點(diǎn)A,B,C移到D。類(lèi)似地,如果我想從群集中刪除節(jié)點(diǎn)A,則只需移動(dòng)A所服務(wù)的哈希槽到B和C。當(dāng)節(jié)點(diǎn)A為空時(shí),我可以將其從群集中完全刪除。

因?yàn)閷⒐2蹚囊粋€(gè)節(jié)點(diǎn)移動(dòng)到另一個(gè)節(jié)點(diǎn)不需要停止操作,所以添加或刪除或者更改節(jié)點(diǎn)持有的哈希槽的占比不需要任何停機(jī)時(shí)間。

接下來(lái)我們利用docker搭建一個(gè)三主三從的Redis集群。

使用Docker搭建RedisCluster

Redis配置

port ${PORT}                                       ##節(jié)點(diǎn)端口
protected-mode no                                  ##開(kāi)啟集群模式
cluster-enabled yes                                ##cluster集群模式
cluster-config-file nodes.conf                     ##集群配置名
cluster-node-timeout 5000                          ##超時(shí)時(shí)間
cluster-announce-ip 192.168.1.XX                   ##實(shí)際為各節(jié)點(diǎn)網(wǎng)卡分配ip  先用一個(gè)ip代替
cluster-announce-port ${PORT}                      ##節(jié)點(diǎn)映射端口
cluster-announce-bus-port 1${PORT}                 ##節(jié)點(diǎn)總線端口
appendonly yes                                     ##持久化模式

創(chuàng)建自定義network

docker network create redis-net

自定義路徑

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

在自定義路徑下生成成conf和data目標(biāo),并生成配置信息

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個(gè)文件夾,從6001到6006,每個(gè)文件夾下包含data和conf文件夾,同時(shí)conf里面有redis.conf配置文件。

啟動(dòng)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

啟動(dòng)集群

# 進(jìn)入任意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
  • 創(chuàng)建成功后我們可以使用redis-cli命令連接到其中一個(gè)Redis服務(wù).

# 單機(jī)模式啟動(dòng)
redis-cli -h 127.0.0.1 -p 6001
# 集群模式啟動(dòng)
redis-cli -c -h 127.0.0.1 -p 6001
  • 之后通過(guò)cluster nodes命令可以查看節(jié)點(diǎn)信息,發(fā)現(xiàn)符合3主3從的預(yù)期

到此,關(guān)于“Redis中的Cluster集群介紹”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI