Stories

Detail Return Return

【趙渝強老師】Redis Cluster分佈式集羣 - Stories Detail

主從複製是Redis集羣實現的一種方式,而Redis集羣的另一種實現方式就是Redis Cluster。它是Redis提供的數據分佈式存儲解決方案。

一、 什麼是Redis Cluster?

日常在對於Redis的使用中經常會遇到一些問題,例如:如何保證Redis的持續高可用性?如何實現單實例Redis擴充?如何提升高併發時的性能問題?針對這些問題,在Redis 3.0版本中推出了Redis Cluster。它是Redis的分佈式解決方案,並有效解決了Redis分佈式方面的需求。當遇到單機的內存、併發和流量等瓶頸時,可以採用Redis Cluster架構達到負載均衡的目的。Redis Cluster主要具有以下的優勢:

  • 官方推薦,毋庸置疑。
  • 去中心化,集羣最大可增加1000個節點,性能隨節點增加而線性擴展。
  • 管理方便,後續可自行增加或摘除節點,移動分槽等等。
  • 簡單,易上手。

二、 Redis Cluster的體系架構

分佈式數據庫首要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集劃分到多個節點上,每個節點負責整個數據的一個子集。常見的分區規則有哈希分區和順序分區。Redis Cluster採用哈希分區規則。哈希分區的原理如下圖所示。

image.png

虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把所有的數據映射到一個固定範圍內的整數集合,整數定義為槽(slot)。比如Redis Cluster槽的範圍是0 ~ 16383。槽是集羣內數據管理和遷移的基本單位。

Redis Cluster採用虛擬槽分區,所有的鍵根據哈希函數映射到0 ~ 16383,計算公式:slot = CRC16(key)&16383。每一個節點負責維護一部分槽以及槽所映射的鍵值數據。以6個節點為例,來介紹Redis Cluster的體系架構,其中:三個為master節點,另外三個為slave節點。體系架構如下圖所示。
image.png

視頻講解如下:
https://www.bilibili.com/video/BV1JiYaz9EJY/?aid=115052929618...

三、 部署Redis Cluster

部署Redis Cluster可以通過手動編輯配置文件來完成,這種方式比較靈活也是在生產環境中使用的方式;另一方面,Redis提供了一個命令腳本create-cluster幫助快速部署一個Redis Cluster,但這種方式多用於開發和測試環境中。

3.1 【實戰】手動部署Redis Cluster

(1)複製6份Redis的配置文件。

cp redis.conf /root/training/redis/conf/redis6379.conf
cp redis.conf /root/training/redis/conf/redis6380.conf
cp redis.conf /root/training/redis/conf/redis6381.conf
cp redis.conf /root/training/redis/conf/redis6382.conf
cp redis.conf /root/training/redis/conf/redis6383.conf
cp redis.conf /root/training/redis/conf/redis6384.conf

(2)以redis6379.conf為例修改配置文件的內容,需要修改的參數如下:

daemonize yes
port 6379
cluster-enabled yes
cluster-config-file nodes/nodes-6379.conf
cluster-node-timeout 15000
dbfilename dump6379.rdb
appendonly yes
appendfilename "appendonly6379.aof"

(3)按照同樣的方式修改其他的Redis Cluster配置文件,如redis6380.conf的修改內容如下:

daemonize yes
port 6380
cluster-enabled yes
cluster-config-file nodes/nodes-6380.conf
cluster-node-timeout 15000
dbfilename dump6380.rdb
appendonly yes
appendfilename "appendonly6380.aof"

(4)創建Redis Cluster節點配置信息保存的目錄。

mkdir /root/training/redis/nodes

(5)啓動所有的Redis實例。

bin/redis-server conf/redis6379.conf 
bin/redis-server conf/redis6380.conf 
bin/redis-server conf/redis6381.conf 
bin/redis-server conf/redis6382.conf 
bin/redis-server conf/redis6383.conf 
bin/redis-server conf/redis6384.conf 

(6)通過ps命令確定Redis實例的進程信息。

ps -ef|grep redis

# 輸出的信息如下:
root       5383  ... bin/redis-server 127.0.0.1:6379 [cluster]
root       5385  ... bin/redis-server 127.0.0.1:6380 [cluster]
root       5387  ... bin/redis-server 127.0.0.1:6381 [cluster]
root       5397  ... bin/redis-server 127.0.0.1:6382 [cluster]
root       5403  ... bin/redis-server 127.0.0.1:6383 [cluster]
root       5413  ... bin/redis-server 127.0.0.1:6384 [cluster]

(7)初始化Redis Cluster。

bin/redis-cli --cluster create --cluster-replicas 1 \
127.0.0.1:6379 \
127.0.0.1:6380 \
127.0.0.1:6381 \
127.0.0.1:6382 \
127.0.0.1:6383 \
127.0.0.1:6384 

# 輸出的信息如下:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6383 to 127.0.0.1:6379
Adding replica 127.0.0.1:6384 to 127.0.0.1:6380
Adding replica 127.0.0.1:6382 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 24840361406aa8ba5ab2d03f28bdb21dd5362d4f 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
M: 8aba2fafcfa5161315ff1dd645db3b75607128a6 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
M: 41780e8f30a91c644cfec889bfce6cb02f977943 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
S: 97119cfb5c5cc8eea385a8aca9b665f1498bced4 127.0.0.1:6382
   replicates 24840361406aa8ba5ab2d03f28bdb21dd5362d4f
S: 9abfeb7da0d9f8017ea5de5114b5bd57a0b8f851 127.0.0.1:6383
   replicates 8aba2fafcfa5161315ff1dd645db3b75607128a6
S: a1b8e2ab26a4b7c9ec20c62e61992e9efca39476 127.0.0.1:6384
   replicates 41780e8f30a91c644cfec889bfce6cb02f977943
   
# 下面這裏輸入yes
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: 24840361406aa8ba5ab2d03f28bdb21dd5362d4f 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: a1b8e2ab26a4b7c9ec20c62e61992e9efca39476 127.0.0.1:6384
   slots: (0 slots) slave
   replicates 41780e8f30a91c644cfec889bfce6cb02f977943
S: 97119cfb5c5cc8eea385a8aca9b665f1498bced4 127.0.0.1:6382
   slots: (0 slots) slave
   replicates 24840361406aa8ba5ab2d03f28bdb21dd5362d4f
M: 8aba2fafcfa5161315ff1dd645db3b75607128a6 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 41780e8f30a91c644cfec889bfce6cb02f977943 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 9abfeb7da0d9f8017ea5de5114b5bd57a0b8f851 127.0.0.1:6383
   slots: (0 slots) slave
   replicates 8aba2fafcfa5161315ff1dd645db3b75607128a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

(8)使用Redis客户端連接Redis Cluster。

bin/redis-cli -c

(9)查看Redis Cluster的統計信息。

127.0.0.1:6379> cluster info

# 輸出的信息如下:
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:152
cluster_stats_messages_pong_sent:151
cluster_stats_messages_sent:303
cluster_stats_messages_ping_received:146
cluster_stats_messages_pong_received:152
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:303

3.2 【實戰】使用腳本部署Redis Cluster

(1)進入Redis源碼的utils/create-cluster目錄,將腳本create-cluster複製到Redis安裝目錄的bin目錄下。

cd /root/tools/redis-6.2.6/utils/create-cluster
cp create-cluster /root/training/redis/bin/

(2)查看腳本create-cluster的內容。

more /root/training/redis/bin/create-cluster

# 輸出的信息如下:
#!/bin/bash

# Settings
BIN_PATH="/root/training/redis/bin"
CLUSTER_HOST=127.0.0.1
PORT=30000
TIMEOUT=2000
NODES=6
REPLICAS=1
PROTECTED_MODE=yes
ADDITIONAL_OPTIONS=""
......

(3)編輯腳本create-cluster設置Redis的bin路徑。

......
# Settings
BIN_PATH="/root/training/redis/bin"
......

(4)啓動Redis Cluster的節點。

bin/create-cluster start

# 輸出的信息如下:
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

(5)通過ps命令查看Redis的後台進程信息。

ps -ef |grep redis-server

# 輸出的信息如下:
... 4398  ... /root/training/redis/bin/redis-server *:30001 [cluster]
... 4400  ... /root/training/redis/bin/redis-server *:30002 [cluster]
... 4402  ... /root/training/redis/bin/redis-server *:30003 [cluster]
... 4412  ... /root/training/redis/bin/redis-server *:30004 [cluster]
... 4418  ... /root/training/redis/bin/redis-server *:30005 [cluster]
... 4424  ... /root/training/redis/bin/redis-server *:30006 [cluster]

(6)初始化Redis Cluster。

bin/create-cluster create

# 輸出的信息如下:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
M: 39b81f4a37933ae7805c3f611ddb869acc8446a4 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
M: 804594da6fb9338610737086e3f1d9bcdba3944e 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
S: 6cae403b057c7e4e17f86d78c245a8bf7358287c 127.0.0.1:30004
   replicates 39b81f4a37933ae7805c3f611ddb869acc8446a4
S: 405154d64389b69335fab2cb1e029aa29344d7de 127.0.0.1:30005
   replicates 804594da6fb9338610737086e3f1d9bcdba3944e
S: 27039bdc08fcb9452ba009adaf31db28d184a528 127.0.0.1:30006
   replicates 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147

# 下面這裏輸入yes。
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147 127.0.0.1:30001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 804594da6fb9338610737086e3f1d9bcdba3944e 127.0.0.1:30003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 6cae403b057c7e4e17f86d78c245a8bf7358287c 127.0.0.1:30004
   slots: (0 slots) slave
   replicates 39b81f4a37933ae7805c3f611ddb869acc8446a4
S: 27039bdc08fcb9452ba009adaf31db28d184a528 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 2b348de30e8145e8d6c5eb3e1d1a38b1ccb6b147
M: 39b81f4a37933ae7805c3f611ddb869acc8446a4 127.0.0.1:30002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 405154d64389b69335fab2cb1e029aa29344d7de 127.0.0.1:30005
   slots: (0 slots) slave
   replicates 804594da6fb9338610737086e3f1d9bcdba3944e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

(7)使用Redis客户端連接Redis Cluster

bin/redis-cli -c -p 30001

(8)查看Redis Cluster的統計信息。

127.0.0.1:30001> cluster info

# 輸出的信息如下:
cluster_state:ok                            集羣狀態
cluster_slots_assigned:16384                已分配的slot數量
cluster_slots_ok:16384                        ok狀況的slot數量
cluster_slots_pfail:0                        可能失效的slot數量
cluster_slots_fail:0                        已失效的slot數量
cluster_known_nodes:6                        集羣中節點的數量        
cluster_size:3                                分片的數量
cluster_current_epoch:6                        集羣中的版本數量。
cluster_my_epoch:1                            當前節點的版本數。
cluster_stats_messages_ping_sent:478        發送ping數量
cluster_stats_messages_pong_sent:480        發送pong數量
cluster_stats_messages_sent:958                總髮送的數量
cluster_stats_messages_ping_received:475    接收ping數量
cluster_stats_messages_pong_received:478    接收pong數量
cluster_stats_messages_received:958            總接收數量
user avatar zeran Avatar infinilabs Avatar bao_686ce718ec240 Avatar fengliudedaxiang_esnzgz Avatar aloudata Avatar
Favorites 5 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.