Redis-Cluster集群
  DcpJeOZ6VzTX 2023年11月02日 29 0

环境准备

外网

内网

端口

安装包

10.0.0.51

172.16.1.51

7000,7001

redis-7.2.0.tar.gz

10.0.0.52

172.16.1.52

7002,7003

redis-7.2.0.tar.gz

10.0.0.53

172.16.1.53

7004,7005

redis-7.2.0.tar.gz

安装部署redis+多机多实例+Cluster集群

# 安装redis
wget https://github.com/redis/redis/archive/7.2.0.tar.gz

# 创建安装目录
mkdir /app

# 解压
tar xf 7.2.0.tar.gz -C /app/

# 编译和安装
[root@db01 ~]# cd /app/redis-7.2.0/
[root@db01 redis-7.2.0]# make && make install

# 做个软连接
ln -s /app/redis-7.2.0/ /app/redis

# 优化内存(永久生效)
vim /etc/sysctl.conf 
vm.overcommit_memory = 1
-------------------------------上面的操作三台机器都需要---------------------------------------------------------

# 创建多实例目录
[root@db01 ~]# mkdir -p /data/redis/{7000,7001}
[root@db02 ~]# mkdir -p /data/redis/{7002,7003}
[root@db03 ~]# mkdir -p /data/redis/{7004,7005}

# 编辑多实力配置文件
---------------------------------------机器1-----------------------------------------------------------------
[root@db01 ~]# vim /data/redis/7000/redis.conf
port 7000
daemonize yes
pidfile /data/redis/7000/redis.pid
loglevel notice
logfile /data/redis/7000/redis.log
dbfilename dump.rdb
dir /data/redis/7000
bind 172.16.1.51
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db01 ~]# vim /data/redis/7001/redis.conf
port 7001
daemonize yes
pidfile /data/redis/7001/redis.pid
loglevel notice
logfile /data/redis/7001/redis.log
dbfilename dump.rdb
dir /data/redis/7001
bind 172.16.1.51
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
---------------------------------------机器2-----------------------------------------------------------------

[root@db02 ~]# vim /data/redis/7002/redis.conf
port 7002
daemonize yes
pidfile /data/redis/7002/redis.pid
loglevel notice
logfile /data/redis/7002/redis.log
dbfilename dump.rdb
dir /data/redis/7002
bind 172.16.1.52
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db02 ~]# vim /data/redis/7003/redis.conf
port 7003
daemonize yes
pidfile /data/redis/7003/redis.pid
loglevel notice
logfile /data/redis/7003/redis.log
dbfilename dump.rdb
dir /data/redis/7003
bind 172.16.1.52
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

----------------------------------------机器3----------------------------------------------------------------

[root@db03 ~]# vim /data/redis/7004/redis.conf
port 7004
daemonize yes
pidfile /data/redis/7004/redis.pid
loglevel notice
logfile /data/redis/7004/redis.log
dbfilename dump.rdb
dir /data/redis/7004
bind 172.16.1.53
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

[root@db03 ~]# vim /data/redis/7005/redis.conf
port 7005
daemonize yes
pidfile /data/redis/7005/redis.pid
loglevel notice
logfile /data/redis/7005/redis.log
dbfilename dump.rdb
dir /data/redis/7005
bind 172.16.1.53
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

# 启动redis多实例
[root@db01 ~]# redis-server /data/redis/7000/redis.conf
[root@db01 ~]# redis-server /data/redis/7001/redis.conf
[root@db02 ~]# redis-server /data/redis/7002/redis.conf
[root@db02 ~]# redis-server /data/redis/7003/redis.conf
[root@db03 ~]# redis-server /data/redis/7004/redis.conf
[root@db03 ~]# redis-server /data/redis/7005/redis.conf

# 检查端口
[root@db01 ~]# netstat -lntup | grep redis
tcp        0      0 172.16.1.51:17000       0.0.0.0:*               LISTEN      22530/redis-server  
tcp        0      0 172.16.1.51:17001       0.0.0.0:*               LISTEN      22524/redis-server  
tcp        0      0 172.16.1.51:7000        0.0.0.0:*               LISTEN      22530/redis-server  
tcp        0      0 172.16.1.51:7001        0.0.0.0:*               LISTEN      22524/redis-server  

[root@db02 ~]# netstat -lntup | grep redis
tcp        0      0 172.16.1.52:17002       0.0.0.0:*               LISTEN      19047/redis-server  
tcp        0      0 172.16.1.52:17003       0.0.0.0:*               LISTEN      19053/redis-server  
tcp        0      0 172.16.1.52:7002        0.0.0.0:*               LISTEN      19047/redis-server  
tcp        0      0 172.16.1.52:7003        0.0.0.0:*               LISTEN      19053/redis-server 

[root@db03 ~]# netstat -lntup | grep redis
tcp        0      0 172.16.1.53:17004       0.0.0.0:*               LISTEN      17483/redis-server  
tcp        0      0 172.16.1.53:17005       0.0.0.0:*               LISTEN      17497/redis-server  
tcp        0      0 172.16.1.53:7004        0.0.0.0:*               LISTEN      17483/redis-server  
tcp        0      0 172.16.1.53:7005        0.0.0.0:*               LISTEN      17497/redis-server

创建cluster集群

# -a 密码认证,如么有密码就不加
# --cluster create 创建集群实例列表 (host)IP:PORT (host)IP:PORT (host)IP:PORT
# --cluster-replicas 1 复制因子1(每个主节点需1个从节点)(主从比例1:1)

例:redis带密码
[root@db02 ~]# redis-cli -a 123 --cluster create 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  127.0.0.1:6385 --cluster-replicas 1
或
[root@db01 ~]# redis-cli -a 123 --cluster create --cluster-replicas 1 172.16.1.51:7000 172.16.1.51:7001 172.16.1.52:7002 172.16.1.52:7003 172.16.1.53:7004 172.16.1.53:7005
前三个是主,后三个是从
(多机多实例时:主从不能在同一台机器上)
# 创建集群,前三个为主节点,后三个为从节点(老版本)
redis-trib.rb create --replicas 1 172.16.1.51:7000 172.16.1.51:7001 172.16.1.52:7002
172.16.1.52:7003 172.16.1.53:7004 172.16.1.53:7005

# 创建集群
[root@db01 ~]# redis-cli --cluster create 172.16.1.51:7000 172.16.1.51:7001 172.16.1.52:7002 172.16.1.52:7003 172.16.1.53:7004 172.16.1.53:7005 --cluster-replicas 1 

---要输入yes---
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.16.1.52:7003 to 172.16.1.51:7000
Adding replica 172.16.1.53:7005 to 172.16.1.52:7002
Adding replica 172.16.1.51:7001 to 172.16.1.53:7004
M: 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000
   slots:[0-5460] (5461 slots) master
S: a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001
   replicates b7ef4b556d0deea03611e379b58d28b3f66b4948
M: 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002
   slots:[5461-10922] (5462 slots) master
S: 3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003
   replicates 7e8ce3019536da2ebe1cb12f0e0d318cb554807f
M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
   slots:[10923-16383] (5461 slots) master
S: 02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005
   replicates 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
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 172.16.1.51:7000)
M: 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001
   slots: (0 slots) slave
   replicates b7ef4b556d0deea03611e379b58d28b3f66b4948
S: 3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003
   slots: (0 slots) slave
   replicates 7e8ce3019536da2ebe1cb12f0e0d318cb554807f
S: 02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005
   slots: (0 slots) slave
   replicates 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

验证数据存储和读取(集群验证)

# 连接验证
[root@db01 ~]# redis-cli -c -h 172.16.1.51 -p 7000
172.16.1.51:7000> set name wxk
-> Redirected to slot [5798] located at 172.16.1.52:7002
OK
172.16.1.52:7002> get name
"wxk"

# 查看集群信息
172.16.1.52:7002> 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:3
cluster_stats_messages_ping_sent:2383
cluster_stats_messages_pong_sent:2441
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:4825
cluster_stats_messages_ping_received:2441
cluster_stats_messages_pong_received:2384
cluster_stats_messages_received:4825
total_cluster_links_buffer_limit_exceeded:0

# 查看节点信息
172.16.1.52:7002> CLUSTER NODES
2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002@17002 myself,master - 0 1693980001000 3 connected 5461-10922
7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000@17000 master - 0 1693980001000 1 connected 0-5460
b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004@17004 master - 0 1693980002000 5 connected 10923-16383
3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003@17003 slave 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 0 1693980000773 1 connected
a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001@17001 slave b7ef4b556d0deea03611e379b58d28b3f66b4948 0 1693980001590 5 connected
02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005@17005 slave 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 0 1693980001797 3 connected

添加节点

添加主节点
# 先将新节点加入集群(老版本)
[root@db01 ~]# redis-trib.rb add-node 172.16.1.52:7006 172.16.1.51:7000

# 添加节点(先将新节点加入集群)
(这里是在db02上又加了两个实例 端口:7006和7007)
                                  添加节点选项   新的节点       要添加到那里(集群在这里创建的)
[root@db01 ~]# redis-cli --cluster add-node 172.16.1.52:7006 172.16.1.51:7000
>>> Adding node 172.16.1.52:7007 to cluster 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001
   slots: (0 slots) slave
   replicates b7ef4b556d0deea03611e379b58d28b3f66b4948
S: 3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003
   slots: (0 slots) slave
   replicates 7e8ce3019536da2ebe1cb12f0e0d318cb554807f
S: 02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005
   slots: (0 slots) slave
   replicates 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7 172.16.1.52:7006
   slots: (0 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Getting functions from cluster
>>> Send FUNCTION LIST to 172.16.1.52:7007 to verify there is no functions in it
>>> Send FUNCTION RESTORE to 172.16.1.52:7007
>>> Send CLUSTER MEET to node 172.16.1.52:7007 to make it join the cluster.
[OK] New node added correctly.

-------------------查看节点信息,新添加的节点并没有槽位-------------------------
# 重新分片(分配槽位 老版本)
[root@db01 ~]# redis-trib.rb reshard 127.0.0.1:7000

# 重新分片(分配槽位)
[root@db01 ~]# redis-cli --cluster reshard 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001
   slots: (0 slots) slave
   replicates b7ef4b556d0deea03611e379b58d28b3f66b4948
S: 3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003
   slots: (0 slots) slave
   replicates 7e8ce3019536da2ebe1cb12f0e0d318cb554807f
S: 02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005
   slots: (0 slots) slave
   replicates 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
M: 836fe7163e6bc9fdb4369c21af4cd6213a501aea 172.16.1.52:7007
   slots: (0 slots) master
M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7 172.16.1.52:7006
   slots: (0 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
# 你想要转移多少slot(槽位)到新节点(随便,想平均分就16384个槽位除以主机个数)
How many slots do you want to move (from 1 to 16384)? 4096
# 哪个节点接收这些槽位(输入新节点ID)(这里是7006端口)
What is the receiving node ID? e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7
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.
# 原节点的ID
Source node #1: all

Ready to move 4096 slots.
  Source nodes:
    M: 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
    M: 836fe7163e6bc9fdb4369c21af4cd6213a501aea 172.16.1.52:7007
       slots: (0 slots) master
    M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
       slots:[10923-16383] (5461 slots) master
       1 additional replica(s)
    M: 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002
       slots:[5461-10922] (5462 slots) master
       1 additional replica(s)
  Destination node:
    M: e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7 172.16.1.52:7006
       slots: (0 slots) master
  Resharding plan:
    Moving slot 5461 from 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
    Moving slot 5462 from 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
# 是否确认分片计划 
    Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 5461 from 172.16.1.52:7002 to 172.16.1.52:7006: 
Moving slot 5462 from 172.16.1.52:7002 to 172.16.1.52:7006:
添加从节点
# 添加从节点 (老版本)
[root@db01 ~]# redis-trib.rb add-node --slave --master-id f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7007 172.16.1.51:7000

 (这个新节点是没有加入集群的)                                         主节点ID
[root@db01 ~]# redis-cli --cluster add-node --cluster-slave --cluster-master-id 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.52:7009 172.16.1.51:7000
要添加的从节点        主节点

[root@db01 ~]# redis-cli --cluster add-node --cluster-slave --cluster-master-id 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.52:7009 172.16.1.51:7000
>>> Adding node 172.16.1.52:7009 to cluster 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000
   slots:[2389-5460] (3072 slots) master
   1 additional replica(s)
S: a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001
   slots: (0 slots) slave
   replicates b7ef4b556d0deea03611e379b58d28b3f66b4948
S: 3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003
   slots: (0 slots) slave
   replicates 7e8ce3019536da2ebe1cb12f0e0d318cb554807f
S: 02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005
   slots: (0 slots) slave
   replicates 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
M: 836fe7163e6bc9fdb4369c21af4cd6213a501aea 172.16.1.52:7007
   slots:[0-2388],[5461-6143],[6827-7850] (4096 slots) master
M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
   slots:[6144-6826],[10923-16383] (6144 slots) master
   1 additional replica(s)
M: 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002
   slots:[7851-10922] (3072 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 172.16.1.52:7009 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 172.16.1.51:7000.
[OK] New node added correctly.

删除节点

# 重新分片(分配槽位)
[root@db01 ~]# redis-cli --cluster reshard 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
S: a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001
   slots: (0 slots) slave
   replicates b7ef4b556d0deea03611e379b58d28b3f66b4948
S: 3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003
   slots: (0 slots) slave
   replicates 7e8ce3019536da2ebe1cb12f0e0d318cb554807f
S: 02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005
   slots: (0 slots) slave
   replicates 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3
M: 836fe7163e6bc9fdb4369c21af4cd6213a501aea 172.16.1.52:7007
   slots: (0 slots) master
M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
M: 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
M: e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7 172.16.1.52:7006
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
# 你想要转移多少slot(槽位)到新节点(随便,想平均分就16384个槽位除以主机个数)
How many slots do you want to move (from 1 to 16384)? 4096
# 哪个节点接收这些槽位(输入接收节点ID)?
What is the receiving node ID? b7ef4b556d0deea03611e379b58d28b3f66b4948
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.
# 输入要删除节点的ID(可以输入多个,输完一个回车输入下一个,最后输入done)
Source node #1: e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7
Source node #2: done

Ready to move 4096 slots.
  Source nodes:
    M: e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7 172.16.1.52:7006
       slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
  Destination node:
    M: b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004
       slots:[12288-16383] (4096 slots) master
       1 additional replica(s)
  Resharding plan:
    Moving slot 0 from e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7
    Moving slot 1 from e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7
# 是否确认分片计划 
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 12287 from 172.16.1.52:7006 to 172.16.1.53:7004: 


# 删除节点
# 老版本
[root@db01 ~]# redis-trib.rb del-node 172.16.1.52:7006f4e3ce12a9aa1fe741634e74b88bb8b70b414f51
                                   选项    要删除节点所在主机IP和端口        要删除节点的ID
[root@db01 ~]# redis-cli --cluster del-node 172.16.1.52:7006 e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7
>>> Removing node e0bc8ebb0b8689c4d2716127965c6d2fd6cbb8d7 from cluster 172.16.1.52:7006
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

# 查看集群状态(确认已删除)
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 7000 cluster nodes
a8d43a0b656faf70059582732dae923d6e30111a 172.16.1.51:7001@17001 slave b7ef4b556d0deea03611e379b58d28b3f66b4948 0 1693984841203 9 connected
3ce41775178a61b68f9f188afbf66c2a48a807b7 172.16.1.52:7003@17003 slave 7e8ce3019536da2ebe1cb12f0e0d318cb554807f 0 1693984840586 1 connected
02669e4d4e2bcf40e47f6779d639a0802b0786eb 172.16.1.53:7005@17005 slave 2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 0 1693984842222 3 connected
836fe7163e6bc9fdb4369c21af4cd6213a501aea 172.16.1.52:7007@17007 master - 0 1693984840000 7 connected
b7ef4b556d0deea03611e379b58d28b3f66b4948 172.16.1.53:7004@17004 master - 0 1693984842120 9 connected 0-1364 5461-6826 10923-16383
2c3fb5d314aaa6613674ff6e96fd216bd91d4cf3 172.16.1.52:7002@17002 master - 0 1693984841203 3 connected 6827-10922
7e8ce3019536da2ebe1cb12f0e0d318cb554807f 172.16.1.51:7000@17000 myself,master - 0 1693984840000 1 connected 1365-5460

redis高可用集群

sentinel

Redis-Cluster

Codis

Redis Cluster 分布式集群

Redis什么时候才会读取dump.rdb文件?

1)Redis启动时 2)从库跟主库建立连接时

Redis Cluster作用

(什么是Redis Cluster:)

1)Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)。 2)Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。 3)Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。 4)Redis集群有将数据自动切分(split)到多个节点的能力。

Redis-Cluster集群_redis高可用集群

Redis Cluster如何存储数据

hash槽 哈希算法

  • CRC16算法(redis-cluster槽位算法)
  • CRC32算法
存储一个key
set name zls
12

crc16(name)=5092
16384 % 5092
1108

get name

Redis Cluster的特点

高性能

1.在多酚片节点中,将16384个槽位,均匀分布到多个分片节点中。 2.存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)。 3.根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上。 4.如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储。

高可用

在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof功能,同时当主节点down,实现类似于sentinel的自动failover的功能。

Redis-Cluster集群_Redis Clus分布式集群_02

Redis Cluster客户端连接任意节点

Redis-Cluster集群_redis高可用集群_03

如图所示,当我们用客户端连接A分片时,如果按照数据的取模,我们想要访问的数据,不在A分片中,那么集群会自动将请求进行转发。

redis集群数据共享(设计理念)

Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

1.节点 A 负责处理 0 号至 5500 号哈希槽。 2.节点 B 负责处理 5501 号至 11000 号哈希槽。 3.节点 C 负责处理 11001 号至 16383 号哈希槽。 

Redis Cluster运行机制

所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. 节点的fail是通过集群中超过半数的master节点检测失效时才生效. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key

Redis Cluster如何做集群复制

为了使得集群在一部分节点下线或者无法与集群的大多数(majority)节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。

在之前列举的节点 A 、B 、C 的例子中, 如果节点 B 下线了, 那么集群将无法正常运行, 因为集群找不到节点来处理 5501 号至 11000 号的哈希槽。

假如在创建集群的时候(或者至少在节点 B 下线之前), 我们为主节点 B 添加了从节点 B1 , 那么当主节点 B 下线的时候, 集群就会将 B1 设置为新的主节点, 并让它代替下线的主节点 B , 继续处理 5501 号至 11000 号的哈希槽, 这样集群就不会因为主节点 B 的下线而无法正常运作了。

不过如果节点 B 和 B1 都下线的话, Redis 集群还是会停止运作。

**集群的复制特性重用了 SLAVEOF 命令的代码,所以集群节点的复制行为和 SLAVEOF 命令的复制行为完全相同。 **

Redis Cluster故障转移

1)在集群里面,节点会对其他节点进行下线检测。

2)当一个主节点下线时,集群里面的其他主节点负责对下线主节点进行故障移。

3)换句话说,集群的节点集成了下线检测和故障转移等类似 Sentinel 的功能。

4)因为 Sentinel 是一个独立运行的监控程序,而集群的下线检测和故障转移等功能是集成在节点里面的,它们的运行模式非常地不同,所以尽管这两者的功能很相似,但集群的实现没有重用 Sentinel 的代码。

Redis Cluster中执行命令的两种情况

1)命令发送到了正确的节点:命令要处理的键所在的槽正好是由接收命令的节点负责,那么该节点执行命令,就像单机 Redis 服务器一样。

Redis-Cluster集群_Redis Clus分布式集群_04

2)命令发送到了错误的节点:接收到命令的节点并非处理键所在槽的节点,那么节点将向客户端返回一个转向(redirection)错误,告知客户端应该到哪个节点去执行这个命令,客户端会根据错误提示的信息,重新向正确的节点发送命令。

Redis-Cluster集群_redis高可用集群_05

老版本redis需要安装ruby环境

[root@db01 ~]# yum install ruby rubygems -y

# 查看ruby源 (是国外的)
[root@db01 ~]# gem source --list
*** CURRENT SOURCES ***

https://rubygems.org/

# 更换ruby源(这里换的阿里源)
[root@db01 ~]# gem sources -a https://mirrors.aliyun.com/rubygems/
https://mirrors.aliyun.com/rubygems/ added to sources
------查看一下---------------------
[root@db01 ~]# gem source --list
*** CURRENT SOURCES ***

https://rubygems.org/
https://mirrors.aliyun.com/rubygems/

# 移除官方源(国外源)
[root@db01 ~]# gem sources --remove https://rubygems.org/
https://rubygems.org/ removed from sources
------查看一下---------------------
[root@db01 ~]# gem source --list
*** CURRENT SOURCES ***

https://mirrors.aliyun.com/rubygems/


# 安装redis的ruby插件
[root@db01 ~]# gem install redis -v 3.3.3

# 创建集群
前三个为主节点,后三个为从节点(老版本)
redis-trib.rb create --replicas 1 172.16.1.51:7000 172.16.1.51:7001 172.16.1.52:7002 172.16.1.52:7003 172.16.1.53:7004 172.16.1.53:7005

# 先将新节点加入集群(老版本)
[root@db01 ~]# redis-trib.rb add-node 172.16.1.52:7006 172.16.1.51:7000

# 重新分片(分配槽位 老版本)
[root@db01 ~]# redis-trib.rb reshard 127.0.0.1:7000

## 添加从节点 (老版本)
[root@db01 ~]# redis-trib.rb add-node --slave --master-id
f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7007 172.16.1.51:7000

## 删除节点老版本
[root@db01 ~]# redis-trib.rb del-node 172.16.1.52:7006
f4e3ce12a9aa1fe741634e74b88bb8b70b414f51
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论