首頁  >  文章  >  資料庫  >  redis叢集配置與管理的詳細介紹(附程式碼)

redis叢集配置與管理的詳細介紹(附程式碼)

不言
不言轉載
2019-04-13 10:15:243440瀏覽

這篇文章帶給大家的內容是關於redis叢集配置與管理的詳細介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Redis在3.0版本以後開始支援集群,經過中間幾個版本的不斷更新優化,最新的版本集群功能已經非常完善。本文簡單介紹一下Redis叢集搭建的流程與配置方法,redis版本是5.0.4,作業系統是中標麒麟(和Centos核心基本上一致)。

1、Redis叢集原理

Redis 叢集是一個提供在多個Redis間節點間共享資料的組件,叢集節點共同建構了一個去中心化的網絡,叢集中的每個節點擁有平等的身份,節點各自保存各自的資料和叢集狀態。 節點之間採用Gossip協定進行通訊,保證了節點狀態的資訊同步。

Redis 叢集資料透過分區來管理,每個節點保存叢集資料的子集。資料的分配採用一種稱為哈希槽(hash slot)的方式來分配,和傳統的一致性雜湊不太相同。 Redis 群集有16384個哈希槽,每個key透過CRC16校驗後對16384取模來決定放置哪個槽。

為了使在部分節點失敗或大部分節點無法通訊的情況下叢集仍然可用,叢集使用了主從複製模型。讀取資料時,根據一致性雜湊演算法到對應的 master 節點取得數據,如果master 掛掉之後,會啟動對應的 salve 節點來充當 master 。

2、環境準備

這裡準備在一台PC上建立一個3主3從的redis叢集。

在/opt/目錄下新建一個資料夾rediscluster,用來存放叢集節點目錄。

接著分別新建server10、server11、server20、server21、server30、server31 6個資料夾準備6個redis節點,這些節點分別使用6379、6380、6381、6382、6383、6384端口,以server10為範例配置如下:

port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file  nodes-6379.conf

其他節點只需修改連接埠和檔案名,依序按此進行設定即可,配置完成後啟動這些節點。

[root@localhost rediscluster]# ./server10/redis-server ./server10/redis.conf &
[root@localhost rediscluster]# ./server11/redis-server ./server11/redis.conf &
[root@localhost rediscluster]# ./server20/redis-server ./server20/redis.conf &
[root@localhost rediscluster]# ./server21/redis-server ./server21/redis.conf &
[root@localhost rediscluster]# ./server30/redis-server ./server30/redis.conf &
[root@localhost rediscluster]# ./server31/redis-server ./server31/redis.conf &

查看啟動狀態:

[root@localhost rediscluster]# ps -ef|grep redis
root     11842     1  0 15:03 ?        00:00:12 ./server10/redis-server 127.0.0.1:6379 [cluster]
root     11950     1  0 15:03 ?        00:00:13 ./server11/redis-server 127.0.0.1:6380 [cluster]
root     12074     1  0 15:04 ?        00:00:13 ./server20/redis-server 127.0.0.1:6381 [cluster]
root     12181     1  0 15:04 ?        00:00:12 ./server21/redis-server 127.0.0.1:6382 [cluster]
root     12297     1  0 15:04 ?        00:00:12 ./server30/redis-server 127.0.0.1:6383 [cluster]
root     12404     1  0 15:04 ?        00:00:12 ./server31/redis-server 127.0.0.1:6384 [cluster]

3、叢集設定

很簡單:redis-cli --cluster create 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 --cluster -replicas 1

#其中-replicas 1表示每個主節點1個從節點

#
[root@localhost rediscluster]# ./server10/redis-cli --cluster create 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 --cluster-replicas 1
>>> 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: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382
   replicates 63e20c75984e493892265ddd2a441c81bcdc575c
S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383
   replicates d9a79ed6204e558b2fcee78ea05218b4de006acd
S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384
   replicates efa84a74525749b8ea20585074dda81b852e9c29
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: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
additional replica(s)
M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
additional replica(s)
S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382
   slots: (0 slots) slave
   replicates 63e20c75984e493892265ddd2a441c81bcdc575c
S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384
   slots: (0 slots) slave
   replicates efa84a74525749b8ea20585074dda81b852e9c29
M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
additional replica(s)
S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383
   slots: (0 slots) slave
   replicates d9a79ed6204e558b2fcee78ea05218b4de006acd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

建立完成,主從節點分配如下:

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

4、叢集測試


透過6379客戶端連線後進行測試,發現轉向了6381:

[root@localhost rediscluster]# ./server10/redis-cli -h 127.0.0.1 -c -p 6379
127.0.0.1:6379> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:6381
OK
127.0.0.1:6381> get foo
"bar"
在6381上連接測試:
[root@localhost rediscluster]# ./server10/redis-cli -h 127.0.0.1 -c -p 6381
127.0.0.1:6381> get foo
"bar"

結果相同,表示叢集配置正常。

5、叢集節點擴容

rediscluster

目錄下在新增兩個目錄server40和server41,新增2個redis節點配置6385和6386兩個連接埠。將6385作為新增的master節點,6386作為從節點,然後啟動節點:

[root@localhost server41]# ps -ef|grep redis
root     11842     1  0 15:03 ?        00:00:18 ./server10/redis-server 127.0.0.1:6379 [cluster]
root     11950     1  0 15:03 ?        00:00:19 ./server11/redis-server 127.0.0.1:6380 [cluster]
root     12074     1  0 15:04 ?        00:00:18 ./server20/redis-server 127.0.0.1:6381 [cluster]
root     12181     1  0 15:04 ?        00:00:18 ./server21/redis-server 127.0.0.1:6382 [cluster]
root     12297     1  0 15:04 ?        00:00:17 ./server30/redis-server 127.0.0.1:6383 [cluster]
root     12404     1  0 15:04 ?        00:00:18 ./server31/redis-server 127.0.0.1:6384 [cluster]
root     30563     1  0 18:01 ?        00:00:00 ./redis-server 127.0.0.1:6385 [cluster]
root     30582     1  0 18:02 ?        00:00:00 ./redis-server 127.0.0.1:6386 [cluster]

新增主節點:

[root@localhost server41]# ./redis-cli --cluster add-node 127.0.0.1:6385 127.0.0.1:6379
>>> Adding node 127.0.0.1:6385 to cluster 127.0.0.1:6379
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
additional replica(s)
M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
additional replica(s)
S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382
   slots: (0 slots) slave
   replicates 63e20c75984e493892265ddd2a441c81bcdc575c
S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384
   slots: (0 slots) slave
   replicates efa84a74525749b8ea20585074dda81b852e9c29
M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
additional replica(s)
S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383
   slots: (0 slots) slave
   replicates d9a79ed6204e558b2fcee78ea05218b4de006acd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:6385 to make it join the cluster.
[OK] New node added correctly.

查看節點清單:

[root@localhost server41]# ./redis-cli 
127.0.0.1:6379> cluster nodes
22e8a8e97d6f7cc7d627e577a986384d4d181a4f 127.0.0.1:6385@16385 master - 0 1555064037664 0 connected
efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379@16379 myself,master - 0 1555064036000 1 connected 0-5460
d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381@16381 master - 0 1555064038666 3 connected 10923-16383
0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382@16382 slave 63e20c75984e493892265ddd2a441c81bcdc575c 0 1555064035000 4 connected
ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384@16384 slave efa84a74525749b8ea20585074dda81b852e9c29 0 1555064037000 6 connected
63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380@16380 master - 0 1555064037000 2 connected 5461-10922
fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383@16383 slave d9a79ed6204e558b2fcee78ea05218b4de006acd 0 1555064037000 5 connected

從節點:

[root@localhost server41]# ./redis-cli --cluster add-node 127.0.0.1:6386 127.0.0.1:6379 --cluster-slave --cluster-master-id 22e8a8e97d6f7cc7d627e577a986384d4d181a4f
>>> Adding node 127.0.0.1:6386 to cluster 127.0.0.1:6379
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
additional replica(s)
M: 22e8a8e97d6f7cc7d627e577a986384d4d181a4f 127.0.0.1:6385
   slots: (0 slots) master
M: d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
additional replica(s)
S: 0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382
   slots: (0 slots) slave
   replicates 63e20c75984e493892265ddd2a441c81bcdc575c
S: ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384
   slots: (0 slots) slave
   replicates efa84a74525749b8ea20585074dda81b852e9c29
M: 63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
additional replica(s)
S: fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383
   slots: (0 slots) slave
   replicates d9a79ed6204e558b2fcee78ea05218b4de006acd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:6386 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 127.0.0.1:6385.
[OK] New node added correctly.
新增成功後,為新節點分配資料:
[root@localhost server41]# ./redis-cli --cluster reshard 127.0.0.1:6385

How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? 22e8a8e97d6f7cc7d627e577a986384d4d181a4f
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all

這樣就新增完畢了,可以透過cluster nodes指令查看一下新增後的slot分佈###
127.0.0.1:6379> cluster nodes
22e8a8e97d6f7cc7d627e577a986384d4d181a4f 127.0.0.1:6385@16385 master - 0 1555064706000 7 connected 0-332 5461-5794 10923-11255
efa84a74525749b8ea20585074dda81b852e9c29 127.0.0.1:6379@16379 myself,master - 0 1555064707000 1 connected 333-5460
d9a79ed6204e558b2fcee78ea05218b4de006acd 127.0.0.1:6381@16381 master - 0 1555064705000 3 connected 11256-16383
7c24e205301b38caa1ff3cd8b270a1ceb7249a2e 127.0.0.1:6386@16386 slave 22e8a8e97d6f7cc7d627e577a986384d4d181a4f 0 1555064705000 7 connected
0469ec03b43e27dc2b7b4eb24de34e10969e3adf 127.0.0.1:6382@16382 slave 63e20c75984e493892265ddd2a441c81bcdc575c 0 1555064707000 4 connected
ddebc3ca467d15c7d25125e4e16bcc5576a13699 127.0.0.1:6384@16384 slave efa84a74525749b8ea20585074dda81b852e9c29 0 1555064707236 6 connected
63e20c75984e493892265ddd2a441c81bcdc575c 127.0.0.1:6380@16380 master - 0 1555064706000 2 connected 5795-10922
fd8ea61503e7c9b6e950894c0da41aed3ee19e7e 127.0.0.1:6383@16383 slave d9a79ed6204e558b2fcee78ea05218b4de006acd 0 1555064708238 5 connected
# #####6、叢集節點縮減#########

缩减节点时先缩减从节点:

[root@localhost server41]# ./redis-cli --cluster del-node 127.0.0.1:6386 7c24e205301b38caa1ff3cd8b270a1ceb7249a2e
>>> Removing node 7c24e205301b38caa1ff3cd8b270a1ceb7249a2e from cluster 127.0.0.1:6386
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

然后进行主节点slot转移:

[root@localhost server41]# ./redis-cli --cluster reshard 127.0.0.1:6385How many slots do you want to move (from 1 to 16384)? 1000What is the receiving node ID? efa84a74525749b8ea20585074dda81b852e9c29  //要移到的节点Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: 22e8a8e97d6f7cc7d627e577a986384d4d181a4f   //要删除的主节点Source node #2: done

最后在缩减主节点

[root@localhost server41]# ./redis-cli --cluster reshard 127.0.0.1:6385

How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? efa84a74525749b8ea20585074dda81b852e9c29  //要移到的节点
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: 22e8a8e97d6f7cc7d627e577a986384d4d181a4f   //要删除的主节点
Source node #2: done

缩减完成!【相关推荐:Redis教程

以上是redis叢集配置與管理的詳細介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除