Redis5.0.5群集搭建

Redis cluster 簡介

1.採用去中心化的思想,沒有中心節點的說法,它使用hash slot方式將16348個hash slot覆蓋到所有節點上,對於存儲的每個key值,使用CRC16(KEY)&16348=slot得到他對應的hash slot,並在訪問key的時候就去找他的hash slot在哪一個節點上,然後由當前訪問節點從實際被分配了這個hash slot的節點去取數據,節點之間使用輕量協議通信 減少帶寬佔用 性能很高,自動實現負載均衡與高可用,自動實現failover並且支持動態擴展,官方已經玩到可以1000個節點 實現的複雜度低。

2.其內部中也需要配置主從,並且內部也是採用哨兵模式,如果有半數節點發現某個異常節點,共同決定更改異常節點的狀態,如果改節點是主節點,則對應的從節點自動頂替為主節點,當原先的主節點上線後,則會變為從節點。如果集群中的master沒有slave節點,則master掛掉後整個集群就會進入fail狀態,因為集群的slot映射不完整。如果集群超過半數以上的master掛掉,無論是否有slave,集群都會進入fail狀態。

3.根據官方推薦 集群部署至少要3臺以上的master節點。

搭建過程

Ip 端口

192.168.83.128 6000

192.168.83.128 6001

192.168.83.128 6002

192.168.83.128 6003

192.168.83.128 6004

192.168.83.128 6005


1. 先安裝redis

cd /usr/local

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

tar xzf redis-5.0.5.tar.gz

cd redis-5.0.5/

make


2.創建目錄

mkdir rediscluster

cd rediscluster/

[root@localhost rediscluster]# mkdir redis6000

[root@localhost rediscluster]# mkdir redis6001

[root@localhost rediscluster]# mkdir redis6002

[root@localhost rediscluster]# mkdir redis6003

[root@localhost rediscluster]# mkdir redis6004

[root@localhost rediscluster]# mkdir redis6005

在每個目錄下面創建 data和log


3.啟動參數

存放目錄 /usr/local/rediscluster/redis6000/redis6000.conf,由於是6個節點,每個節點的目錄和端口是不一樣的,請參照這個進行修改

protected-mode no

port 6005

pidfile "/var/run/redis_6005.pid"

save 9 1

save 300 10

save 60 10000

daemonize yes

timeout 1800

databases 16

loglevel notice

logfile "/usr/local/rediscluster/redis6005/log/redis.log"

rdbcompression yes

dbfilename "dump.rdb"

dir "/usr/local/rediscluster/redis6005/data"

maxclients 50000

maxmemory 1063256064

stop-writes-on-bgsave-error yes

appendonly yes

appendfilename "appendonly.aof"

appendfsync everysec

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 128mb

activerehashing yes

rdbchecksum yes

#vw-enabled yes

aof-use-rdb-preamble yes

aof-load-truncated yes

no-appendfsync-on-rewrite yes

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 1000

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hz 10

aof-rewrite-incremental-fsync yes

#repliaction

#masterauth "123456"

#requirepass "123456"

#slave-serve-stale-data yes

#slave-read-only yes

#repl-diskless-sync no

#repl-diskless-sync-delay 5

#repl-disable-tcp-nodelay no

#slave-priority 100

#cluster

cluster-enabled yes

cluster-config-file nodes_6005.conf

cluster-node-timeout 15000


4.啟動redis

[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6000/redis6000.conf

[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6001/redis6001.conf

[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6002/redis6002.conf

[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6003/redis6003.conf

[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6004/redis6004.conf

[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6005/redis6005.conf

[root@localhost redis-5.0.5]# ps -ef |grep redis

root 57466 1 0 10:45 ? 00:00:00 src/redis-server *:6000 [cluster]

root 57473 1 0 10:46 ? 00:00:00 src/redis-server *:6001 [cluster]

root 57487 1 0 10:46 ? 00:00:00 src/redis-server *:6002 [cluster]

root 57492 1 0 10:46 ? 00:00:00 src/redis-server *:6003 [cluster]

root 57498 1 0 10:46 ? 00:00:00 src/redis-server *:6004 [cluster]

root 57504 1 2 10:46 ? 00:00:00 src/redis-server *:6005 [cluster]

root 57510 52442 0 10:46 pts/0 00:00:00 grep --color=auto redis


Redis5.0.5群集搭建

5.啟動後我們就可以創建集群

注意:

在redis5.0後 創建集群統一使用redis-cli,之前的版本使用redis-trib.rb,但是需要安裝ruby軟件相對複雜,相比之前的版本5.0不需要安裝額外的軟件,方便。具體的可以參照redis官方網站查看

https://redis.io/topics/cluster-tutorial

創建集群命令:其中 cluster-replicas 1 代表 一個master後有幾個slave,1代表為1個slave節點

src/redis-cli --cluster create 192.168.83.128:6000 192.168.83.128:6001 192.168.83.128:6002 192.168.83.128:6003 192.168.83.128:6004 192.168.83.128:6005 --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 192.168.83.128:6004 to 192.168.83.128:6000

Adding replica 192.168.83.128:6005 to 192.168.83.128:6001

Adding replica 192.168.83.128:6003 to 192.168.83.128:6002

>>> Trying to optimize slaves allocation for anti-affinity

[WARNING] Some slaves are in the same host as their master

M: 6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000

slots:[0-5460] (5461 slots) master

M: 236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001

slots:[5461-10922] (5462 slots) master

M: 94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002

slots:[10923-16383] (5461 slots) master

S: 72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003

replicates 94f272ebb67027861a5e788b86388b979e16a4c3

S: 17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004

replicates 6104062a1f3e7f183a01064ca225a43d903c6fa9

S: 16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005

replicates 236ef722de05fb03af442eb528b7aa12da482f35

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 192.168.83.128:6000)

M: 6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000

slots:[0-5460] (5461 slots) master

1 additional replica(s)

S: 17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004

slots: (0 slots) slave

replicates 6104062a1f3e7f183a01064ca225a43d903c6fa9

M: 236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001

slots:[5461-10922] (5462 slots) master

1 additional replica(s)

M: 94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002

slots:[10923-16383] (5461 slots) master

1 additional replica(s)

S: 72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003

slots: (0 slots) slave

replicates 94f272ebb67027861a5e788b86388b979e16a4c3

S: 16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005

slots: (0 slots) slave

replicates 236ef722de05fb03af442eb528b7aa12da482f35

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.


Redis5.0.5群集搭建

6.我們驗證一下集群是否創建成功

登錄redis客戶端 src/redis-cli -c -p 6000, -c 參數代表連接到集群中

我們先看一下主從配對情況,根據node ID匹配可以得出配比。大家可以看看是否有對應的ID,這樣我們就區分了主從節點的關係了。

[root@localhost redis-5.0.5]# src/redis-cli -c -p 6000

127.0.0.1:6000> cluster nodes

17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004@16004 slave 6104062a1f3e7f183a01064ca225a43d903c6fa9 0 1578021017661 5 connected

236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001@16001 master - 0 1578021016656 2 connected 5461-10922

94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002@16002 master - 0 1578021015000 3 connected 10923-16383

6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000@16000 myself,master - 0 1578021015000 1 connected 0-5460

72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003@16003 slave 94f272ebb67027861a5e788b86388b979e16a4c3 0 1578021016000 4 connected

16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005@16005 slave 236ef722de05fb03af442eb528b7aa12da482f35 0 1578021016000 6 connected


Redis5.0.5群集搭建

查看群集信息

[root@localhost redis-5.0.5]# src/redis-cli -c -p 6000

127.0.0.1:6000> 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:7

cluster_my_epoch:1

cluster_stats_messages_ping_sent:2368

cluster_stats_messages_pong_sent:1921

cluster_stats_messages_fail_sent:4

cluster_stats_messages_auth-ack_sent:1

cluster_stats_messages_update_sent:1

cluster_stats_messages_sent:4295

cluster_stats_messages_ping_received:1916

cluster_stats_messages_pong_received:2020

cluster_stats_messages_meet_received:5

cluster_stats_messages_fail_received:1

cluster_stats_messages_auth-req_received:1

cluster_stats_messages_received:3943

驗證數據匹配是否採用哈希槽的方式。我在6000客戶端設置的數據,被分配到6004上了。

127.0.0.1:6000> set aa "1111"

OK

[root@localhost redis-5.0.5]# src/redis-cli -c -p 6004

127.0.0.1:6004> get aa

-> Redirected to slot [1180] located at 192.168.83.128:6000

"1111"


7.驗證故障轉移

我們從上面可以看出6002為master,6003為其從節點。我們按照如下流程進行操作

先停掉6002,發現6003轉為了master節點,然後恢復6002上線,6002變為slave節點。

[root@localhost redis-5.0.5]# ps -ef |grep redis

root 57919 1 0 11:05 ? 00:00:02 src/redis-server *:6000 [cluster]

root 57925 1 0 11:05 ? 00:00:02 src/redis-server *:6001 [cluster]

root 57931 1 0 11:05 ? 00:00:02 src/redis-server *:6002 [cluster]

root 57937 1 0 11:05 ? 00:00:02 src/redis-server *:6003 [cluster]

root 57943 1 0 11:05 ? 00:00:02 src/redis-server *:6004 [cluster]

root 57949 1 0 11:06 ? 00:00:02 src/redis-server *:6005 [cluster]

root 58505 52442 0 11:36 pts/0 00:00:00 grep --color=auto redis

[root@localhost redis-5.0.5]# kill -9 57931

[root@localhost redis-5.0.5]# ps -ef |grep redis

root 57919 1 0 11:05 ? 00:00:02 src/redis-server *:6000 [cluster]

root 57925 1 0 11:05 ? 00:00:02 src/redis-server *:6001 [cluster]

root 57937 1 0 11:05 ? 00:00:02 src/redis-server *:6003 [cluster]

root 57943 1 0 11:05 ? 00:00:02 src/redis-server *:6004 [cluster]

root 57949 1 0 11:06 ? 00:00:02 src/redis-server *:6005 [cluster]

root 58509 52442 0 11:37 pts/0 00:00:00 grep --color=auto redis

[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6002/redis6002.conf

[root@localhost redis-5.0.5]# src/redis-cli -c -p 6000

127.0.0.1:6000> cluster nodes

17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004@16004 slave 6104062a1f3e7f183a01064ca225a43d903c6fa9 0 1578022689000 5 connected

236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001@16001 master - 0 1578022689187 2 connected 5461-10922

94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002@16002 slave 72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 0 1578022690194 7 connected

6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000@16000 myself,master - 0 1578022689000 1 connected 0-5460

72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003@16003 master - 0 1578022688176 7 connected 10923-16383

16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005@16005 slave 236ef722de05fb03af442eb528b7aa12da482f35 0 1578022687000 6 connected

8.集群節點擴容

在rediscluster,新增2個redis節點配置6006和6007兩個端口。將6006作為新增的master節點,6007作為從節點,然後啟動節點:

添加主節點:

./redis-cli --cluster add-node 192.168.83.128:6006 192.168.83.128:6000

添加從節點:

./redis-cli --cluster add-node 192.168.83.128:6007 192.168.83.128:6000 --cluster-slave --cluster-master-id 22e8a8e97d6f7cc7d627e577a986384d4d181a4f(此ID為6006端口的ID)

添加成功後,為新節點分配數據:

./redis-cli --cluster reshard 192.168.83.128:6006

這樣就新增完畢了,可以通過cluster nodes命令查看一下新增後的slot分佈


9.集群節點縮減

縮減節點時先縮減從節點:

./redis-cli --cluster del-node 192.168.83.128:6007

然後進行主節點slot轉移:

./redis-cli --cluster reshard 192.168.83.128:6006

最後在縮減主節點

./redis-cli --cluster del-node 192.168.83.128:6006


分享到:


相關文章: