07. Redis架构-集群

简介

集群概述

Redis集群是一个由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。
Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。
Redis集群需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展。
Redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。
Redis Cluster是Redis的分布式解决方案,是在3.0版本正式推出的。
当遇到单击、内存、并发、流量等瓶颈时,可以采用Redis Cluster架构方案达到负载均衡目的。
Redis集群的运用主要是针对海量数据+高并发+高可用的场景。

数据分布

Redis集群没有使用一致性hash,而是引入了哈希槽的概念。
Redis集群中有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。
注意:有任意一个哈希槽损坏就会导致整个集群无法使用。
比如当前集群有3个节点,那么:

  • 节点A包含0-5461号哈希槽
  • 节点B包含5462到10922号哈希槽
  • 节点C包含10922到16383号哈希槽

安装

规划

主机规划

主机名称主机地址主机端口主机用途
Redis-Cluster-01192.168.108.1296379/6380master+slaver
Redis-Cluster-02192.168.108.1306379/6380master+slaver
Redis-Cluster-03192.168.108.1316379/6380master+slaver

目录规划

用途路径备注
日志目录/usr/local/redis-cluster/redis_{6379,6380}/logs
数据目录/usr/local/redis-cluster/redis_{6379,6380}/data
配置目录/usr/local/redis-cluster/redis_{6379,6380}/conf
PID目录/usr/local/redis-cluster/redis_{6379,6380}/pid

三主三从(手动部署)

安装Redis

三台主机都要执行!

  1. 解决依赖
yum -y install wget gcc gcc-c++ make automake autoconf libtool libc
  1. 下载解压
#下载Redis
wget http://download.redis.io/releases/redis-3.2.9.tar.gz

#解压Redis
mkdir -p /usr/local/redis-cluster/
tar -zxvf redis-3.2.9.tar.gz -C /usr/local/redis-cluster/
  1. 拷贝文件
cp -a /usr/local/redis-cluster/redis-3.2.9/ /usr/local/redis-cluster/redis_6379
cp -a /usr/local/redis-cluster/redis-3.2.9/ /usr/local/redis-cluster/redis_6380
  1. 编译安装
cd /usr/local/redis-cluster/redis_6379
make && make PREFIX=/usr/local/redis-cluster/redis_command install

cd /usr/local/redis-cluster/redis_6380
make && make PREFIX=/usr/local/redis-cluster/redis_command install
  1. 创建目录
mkdir -p /usr/local/redis-cluster/redis_{6379,6380}/{logs,data,conf,pid}
  1. 命令配置
cat >> /etc/profile << EOF
export PATH=$PATH:/usr/local/redis-cluster/redis_command/bin/
EOF

source /etc/profile

配置Redis

三台主机都要执行!

  • 6379
cat > /usr/local/redis-cluster/redis_6379/conf/redis.conf << EOF
bind 0.0.0.0
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis-cluster/redis_6379/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis-cluster/redis_6379/logs/redis.log"

#数据保存路径
dir /usr/local/redis-cluster/redis_6379/data/

#备份策略
save 900 1
save 300 10
save 60 10000

#备份文件名称
dbfilename dump.rdb
EOF
  • 6380
cat > /usr/local/redis-cluster/redis_6380/conf/redis.conf << EOF
bind 0.0.0.0
port 6380
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis-cluster/redis_6380/pid/redis_6380.pid
loglevel notice
logfile "/usr/local/redis-cluster/redis_6380/logs/redis.log"

#数据保存路径
dir /usr/local/redis-cluster/redis_6380/data/

#备份策略
save 900 1
save 300 10
save 60 10000

#备份文件名称
dbfilename dump.rdb
EOF

配置Cluster

  • 6379
cat >> /usr/local/redis-cluster/redis_6379/conf/redis.conf << EOF
#节点通信密码
masterauth 1qaz!QAZ

#开启cluster
cluster-enabled yes
#集群配置文件
cluster-config-file nodes-6379.conf
#节点通信时间
cluster-node-timeout 15000
EOF
  • 6380
cat >> /usr/local/redis-cluster/redis_6380/conf/redis.conf << EOF
#节点通信密码
masterauth 1qaz!QAZ

#开启cluster
cluster-enabled yes
#集群配置文件
cluster-config-file nodes-6380.conf
#节点通信时间
cluster-node-timeout 15000
EOF

启动Redis

三台主机都要执行!

  • 启动Redis
redis-server /usr/local/redis-cluster/redis_6379/conf/redis.conf
redis-server /usr/local/redis-cluster/redis_6380/conf/redis.conf
  • 查看进程
[root@localhost ~]# ps -ef | grep redis
root      25624      1  0 11:12 ?        00:00:00 redis-server 0.0.0.0:6379 [cluster]
root      25628      1  0 11:12 ?        00:00:00 redis-server 0.0.0.0:6380 [cluster]
root      25657  25582  0 11:16 pts/0    00:00:00 grep --color=auto redis
  • 查看日志
tail -300f /usr/local/redis-cluster/redis_6379/logs/redis.log
tail -300f /usr/local/redis-cluster/redis_6380/logs/redis.log

发现节点

手动发现节点

  • 手动发现
# 192.168.108.129:6379> CLUSTER MEET 192.168.108.130 6379
# OK
CLUSTER MEET 192.168.108.130 6379
CLUSTER MEET 192.168.108.131 6379
CLUSTER MEET 192.168.108.129 6380
CLUSTER MEET 192.168.108.130 6380
CLUSTER MEET 192.168.108.131 6380

注意:只需要在一个节点上添加各个节点信息,集群会自动同步添加的节点信息。

  • 查看集群信息
192.168.108.129:6379> CLUSTER NODES
49bfd748a599df69c0a9168d94a55aeb33135064 192.168.108.129:6379 myself,master - 0 0 1 connected
818f44651f42980e106a6f12c78d7089d5714717 192.168.108.131:6380 master - 0 1709960062599 5 connected
8cdd8b65e0d43a85f0f15115aef5ea2616ef5386 192.168.108.131:6379 master - 0 1709960061590 3 connected
3627d5ed398fd504c030683abb53f1b213df4ca7 192.168.108.130:6379 master - 0 1709960059573 2 connected
ccff6d563167e753ca1c632f22066a537f5a1e56 192.168.108.129:6380 master - 0 1709960059069 0 connected
c5e21e3e42f329f6018ce70e2a4e841480339c6f 192.168.108.130:6380 master - 0 1709960058565 4 connected

创建分配槽位

手动创建分配槽位

  • 6379(主节点操作)
redis-cli -h 192.168.108.129 -p 6379 -a '1qaz!QAZ' cluster addslots {0..5461}
redis-cli -h 192.168.108.130 -p 6379 -a '1qaz!QAZ' cluster addslots {5462..10922}
redis-cli -h 192.168.108.131 -p 6379 -a '1qaz!QAZ' cluster addslots {10923..16383}
  • 查看集群信息
192.168.108.129:6379> CLUSTER NODES
e8c05979e96511b76958d9b1f6781798ecc3db06 192.168.108.130:6380 master - 0 1710121087861 4 connected
55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 192.168.108.130:6379 master - 0 1710121088872 2 connected 5462-10922
068f881469cd403537cb45f346b443935a6085e1 192.168.108.131:6379 master - 0 1710121089880 3 connected 10923-16383
e345504b5244908a03c161455f8816b2f0e93466 192.168.108.129:6379 myself,master - 0 0 1 connected 0-5461
cd3226b217bfd0ed7731e9c9a3d5286e3ca8e340 192.168.108.131:6380 master - 0 1710121085846 5 connected
f7187988f5e3beab0b17021416d0bb453e3b2877 192.168.108.129:6380 master - 0 1710121084836 0 connected
  • 查看集群状态
192.168.108.129: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:5
cluster_my_epoch:1
cluster_stats_messages_sent:2601
cluster_stats_messages_received:2530

设置从节点

根据拓扑结构设定主从

  • 拓扑结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 查看6379节点信息
redis-cli -h 192.168.108.129 -p 6379 -a '1qaz!QAZ' cluster nodes | awk '/6379/{print $1,$2}'
55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 192.168.108.130:6379
068f881469cd403537cb45f346b443935a6085e1 192.168.108.131:6379
e345504b5244908a03c161455f8816b2f0e93466 192.168.108.129:6379
  • 手动设置6380为从节点
redis-cli -h 192.168.108.129 -p 6380 -a '1qaz!QAZ' cluster replicate 068f881469cd403537cb45f346b443935a6085e1
redis-cli -h 192.168.108.130 -p 6380 -a '1qaz!QAZ' cluster replicate e345504b5244908a03c161455f8816b2f0e93466
redis-cli -h 192.168.108.131 -p 6380 -a '1qaz!QAZ' cluster replicate 55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19

注意:为从节点指定主节点

  • 查看节点主从状态
redis-cli -h 192.168.108.131 -p 6380 -a '1qaz!QAZ' cluster nodes
e345504b5244908a03c161455f8816b2f0e93466 192.168.108.129:6379 master - 0 1710122837486 1 connected 0-5461
e8c05979e96511b76958d9b1f6781798ecc3db06 192.168.108.130:6380 slave e345504b5244908a03c161455f8816b2f0e93466 0 1710122839504 4 connected
55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 192.168.108.130:6379 master - 0 1710122840513 2 connected 5462-10922
cd3226b217bfd0ed7731e9c9a3d5286e3ca8e340 192.168.108.131:6380 myself,slave 55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 0 0 5 connected
068f881469cd403537cb45f346b443935a6085e1 192.168.108.131:6379 master - 0 1710122838495 3 connected 10923-16383
f7187988f5e3beab0b17021416d0bb453e3b2877 192.168.108.129:6380 slave 068f881469cd403537cb45f346b443935a6085e1 0 1710122836478 3 connected

集群路由

  • 提示信息
redis-cli -h 192.168.108.129 -p 6380 -a '1qaz!QAZ' set age 18
(error) MOVED 741 192.168.108.129:6379
  • 提示逻辑

  • 解决方式–ask路由
redis-cli -h 192.168.108.129 -p 6380 -a '1qaz!QAZ' -c set age 18
OK

#redis-cli --help
#-c                 Enable cluster mode (follow -ASK and -MOVED redirections).
  • 解决逻辑

验证Cluster

监听端口
[root@localhost ~]# netstat -lntup | grep redis
tcp        0      0 0.0.0.0:16379           0.0.0.0:*               LISTEN      25624/redis-server
tcp        0      0 0.0.0.0:16380           0.0.0.0:*               LISTEN      25628/redis-server
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      25624/redis-server
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      25628/redis-server

注意:命令端口和集群总线程端口迁移量为10000,所以正常客户端通信端口为6379,集群总线程端口为16379。

集群进程
[root@localhost ~]# ps -ef | grep redis
root      25624      1  0 11:12 ?        00:00:05 redis-server 0.0.0.0:6379 [cluster]
root      25628      1  0 11:12 ?        00:00:05 redis-server 0.0.0.0:6380 [cluster]
root      25967  25927  0 13:00 pts/2    00:00:00 grep --color=auto redis
验证读写
  • 写入数据
redis-cli -h 192.168.108.129 -p 6380 -a '1qaz!QAZ' -c set address HeNan
OK
  • 读取数据
redis-cli -h 192.168.108.130 -p 6380 -a '1qaz!QAZ' -c get address
"HeNan"
验证故障转移
  • 查看集群
redis-cli -h 192.168.108.130 -p 6380 -a '1qaz!QAZ' cluster nodes

e345504b5244908a03c161455f8816b2f0e93466 192.168.108.129:6379 master - 0 1710122837486 1 connected 0-5461
e8c05979e96511b76958d9b1f6781798ecc3db06 192.168.108.130:6380 slave e345504b5244908a03c161455f8816b2f0e93466 0 1710122839504 4 connected
55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 192.168.108.130:6379 master - 0 1710122840513 2 connected 5462-10922
cd3226b217bfd0ed7731e9c9a3d5286e3ca8e340 192.168.108.131:6380 myself,slave 55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 0 0 5 connected
068f881469cd403537cb45f346b443935a6085e1 192.168.108.131:6379 master - 0 1710122838495 3 connected 10923-16383
f7187988f5e3beab0b17021416d0bb453e3b2877 192.168.108.129:6380 slave 068f881469cd403537cb45f346b443935a6085e1 0 1710122836478 3 connected
  • 关闭主机
#根据提示192.168.108.129:6379为主节点,现在关闭
redis-cli -h 192.168.108.129 -p 6379 -a '1qaz!QAZ' shutdown
  • 查看集群信息
redis-cli -h 192.168.108.130 -p 6380 -a '1qaz!QAZ' cluster nodes

55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 192.168.108.130:6379 master - 0 1710126112763 2 connected 5462-10922
e345504b5244908a03c161455f8816b2f0e93466 192.168.108.129:6379 master,fail - 1710126095519 1710126093604 1 disconnected
e8c05979e96511b76958d9b1f6781798ecc3db06 192.168.108.130:6380 myself,master - 0 0 6 connected 0-5461
cd3226b217bfd0ed7731e9c9a3d5286e3ca8e340 192.168.108.131:6380 slave 55d8b4fe9d06a071d2ef8760dd1aa4f68ce8fd19 0 1710126114781 5 connected
f7187988f5e3beab0b17021416d0bb453e3b2877 192.168.108.129:6380 slave 068f881469cd403537cb45f346b443935a6085e1 0 1710126114277 3 connected
068f881469cd403537cb45f346b443935a6085e1 192.168.108.131:6379 master - 0 1710126115789 3 connected 10923-16383
  • 查看集群状态
redis-cli -h 192.168.108.130 -p 6380 -a '1qaz!QAZ' 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:6
cluster_stats_messages_sent:14154
cluster_stats_messages_received:11291

三主三从(工具部署)

安装Redis

三台主机都要执行!

  1. 解决依赖
yum -y install wget gcc gcc-c++ make automake autoconf libtool libc vim
  1. 下载解压
#下载Redis
wget http://download.redis.io/releases/redis-3.2.9.tar.gz

#解压Redis
mkdir -p /usr/local/redis-cluster/
tar -zxvf redis-3.2.9.tar.gz -C /usr/local/redis-cluster/
  1. 拷贝文件
cp -a /usr/local/redis-cluster/redis-3.2.9/ /usr/local/redis-cluster/redis_6379
cp -a /usr/local/redis-cluster/redis-3.2.9/ /usr/local/redis-cluster/redis_6380
  1. 编译安装
cd /usr/local/redis-cluster/redis_6379
make && make PREFIX=/usr/local/redis-cluster/redis_command install

cd /usr/local/redis-cluster/redis_6380
make && make PREFIX=/usr/local/redis-cluster/redis_command install
  1. 创建目录
mkdir -p /usr/local/redis-cluster/redis_{6379,6380}/{logs,data,conf,pid}
  1. 命令配置
cat >> /etc/profile << 'EOF'
export PATH=$PATH:/usr/local/redis-cluster/redis_command/bin/
EOF

source /etc/profile

配置Redis

三台主机都要执行!
注意:配置文件中的bind 0.0.0.0需要根据主机真实IP配置!!!

  • 6379
cat > /usr/local/redis-cluster/redis_6379/conf/redis.conf << EOF
bind 0.0.0.0    #注意要调整为真实IP
port 6379
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis-cluster/redis_6379/pid/redis_6379.pid
loglevel notice
logfile "/usr/local/redis-cluster/redis_6379/logs/redis.log"

#数据保存路径
dir /usr/local/redis-cluster/redis_6379/data/

#备份策略
save 900 1
save 300 10
save 60 10000

#备份文件名称
dbfilename dump.rdb
EOF
  • 6380
cat > /usr/local/redis-cluster/redis_6380/conf/redis.conf << EOF
bind 0.0.0.0    #注意要调整为真实IP
port 6380
requirepass 1qaz!QAZ
protected-mode yes
timeout 0
databases 16
daemonize yes
pidfile /usr/local/redis-cluster/redis_6380/pid/redis_6380.pid
loglevel notice
logfile "/usr/local/redis-cluster/redis_6380/logs/redis.log"

#数据保存路径
dir /usr/local/redis-cluster/redis_6380/data/

#备份策略
save 900 1
save 300 10
save 60 10000

#备份文件名称
dbfilename dump.rdb
EOF

配置Cluster

  • 6379
cat >> /usr/local/redis-cluster/redis_6379/conf/redis.conf << EOF
#节点通信密码
masterauth 1qaz!QAZ

#开启cluster
cluster-enabled yes
#集群配置文件
cluster-config-file nodes-6379.conf
#节点通信时间
cluster-node-timeout 15000
EOF
  • 6380
cat >> /usr/local/redis-cluster/redis_6380/conf/redis.conf << EOF
#节点通信密码
masterauth 1qaz!QAZ

#开启cluster
cluster-enabled yes
#集群配置文件
cluster-config-file nodes-6380.conf
#节点通信时间
cluster-node-timeout 15000
EOF

启动Redis

三台主机都要执行!

  • 启动Redis
redis-server /usr/local/redis-cluster/redis_6379/conf/redis.conf
redis-server /usr/local/redis-cluster/redis_6380/conf/redis.conf
  • 查看进程
ps -ef | grep redis
root      17316      1  0 20:18 ?        00:00:00 redis-server 192.168.108.129:6379 [cluster]
root      17320      1  0 20:18 ?        00:00:00 redis-server 192.168.108.129:6380 [cluster]
root      17324   1241  0 20:19 pts/0    00:00:00 grep --color=auto redis
  • 查看日志
tail -300f /usr/local/redis-cluster/redis_6379/logs/redis.log
tail -300f /usr/local/redis-cluster/redis_6380/logs/redis.log

安装ruby

任意一节点安装即可
注意:centos7默认的ruby版本太低(2.0),需要编译安装(最低2.2)
ruby下载地址:https://cache.ruby-lang.org/pub/ruby/

  • 安装ruby
#安装ruby依赖
yum install -y gcc rubygems zlib-devel readline-devel openssl-devel libyaml-devel

#下载ruby
wget https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0.tar.gz

#安装ruby
tar -zxvf ruby-3.3.0.tar.gz -C /usr/local/
cd /usr/local/ruby-3.3.0
./configure
make
make install
  • 查看版本
ruby -v
  • 调整源
#移除官方源
gem sources --remove https://rubygems.org/

#添加国内源
gem sources -a http://mirrors.aliyun.com/rubygems/

#更新源
gem update - system
  • 调整client.rb配置
#查找client.rb所在路径
find / -name client.rb

# /usr/share/ruby/xmlrpc/client.rb
# /usr/local/lib/ruby/gems/3.3.0/gems/debug-1.9.1/lib/debug/client.rb
# /usr/local/lib/ruby/gems/3.3.0/gems/redis-3.3.5/lib/redis/client.rb
# /usr/local/ruby-3.3.0/.bundle/gems/debug-1.9.1/lib/debug/client.rb

#编辑文件
vim /usr/local/lib/ruby/gems/3.3.0/gems/redis-3.3.5/lib/redis/client.rb

#修改:“:password => nil”为:“:password => "1qaz!QAZ"”
  • 安装Redis接口
gem install redis --version 3.3.5

启动集群

注意: redis节点已经准备好了,但是要将redis串联起来就得需要redis的一个工具:redis-trib.rb,这个工具也在src目录下。

  • 命令解释

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 执行命令
cd /usr/local/redis-cluster/redis-3.2.9/src/
./redis-trib.rb create --replicas 1 192.168.108.129:6379 192.168.108.130:6379 192.168.108.131:6379 192.168.108.129:6380 192.168.108.130:6380 192.168.108.131:6380
  • 创建过程
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.108.129:6379
192.168.108.130:6379
192.168.108.131:6379
Adding replica 192.168.108.130:6380 to 192.168.108.129:6379
Adding replica 192.168.108.129:6380 to 192.168.108.130:6379
Adding replica 192.168.108.131:6380 to 192.168.108.131:6379
M: c6e4f59c447e8e4044024c0a379266b8a2651e66 192.168.108.129:6379
   slots:0-5460 (5461 slots) master
M: df6074d09e7ed9221e38a162d449480ebed4ac77 192.168.108.130:6379
   slots:5461-10922 (5462 slots) master
M: 0202ea3572181f8ef4a9339edf28acfaa5e90990 192.168.108.131:6379
   slots:10923-16383 (5461 slots) master
S: e18222d39649b275413aa187a4469b0a0edb2259 192.168.108.129:6380
   replicates df6074d09e7ed9221e38a162d449480ebed4ac77
S: aa58a73668cb856611044237fca8ad2a09600c42 192.168.108.130:6380
   replicates c6e4f59c447e8e4044024c0a379266b8a2651e66
S: f25748e776a836f1362081efcd93e5bbe0527e12 192.168.108.131:6380
   replicates 0202ea3572181f8ef4a9339edf28acfaa5e90990
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.108.129:6379)
M: c6e4f59c447e8e4044024c0a379266b8a2651e66 192.168.108.129:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: aa58a73668cb856611044237fca8ad2a09600c42 192.168.108.130:6380
   slots: (0 slots) slave
   replicates c6e4f59c447e8e4044024c0a379266b8a2651e66
S: f25748e776a836f1362081efcd93e5bbe0527e12 192.168.108.131:6380
   slots: (0 slots) slave
   replicates 0202ea3572181f8ef4a9339edf28acfaa5e90990
M: df6074d09e7ed9221e38a162d449480ebed4ac77 192.168.108.130:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 0202ea3572181f8ef4a9339edf28acfaa5e90990 192.168.108.131:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: e18222d39649b275413aa187a4469b0a0edb2259 192.168.108.129:6380
   slots: (0 slots) slave
   replicates df6074d09e7ed9221e38a162d449480ebed4ac77
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  • 查看集群信息
192.168.108.129:6379> cluster nodes
48c2ac9a8b360c8538f49c22f50f22a5d2ce3751 192.168.108.129:6380 slave ca96f097d91b62d0175ea324c5cda0c980bcf049 0 1710223805006 4 connected
ef9b721062d5ddd0896f298ade0a546c73eda5a9 192.168.108.131:6380 slave 18a3f286cb3f4c6ae989fb53c30b5be824cdf48b 0 1710223806016 6 connected
5c1d1d094366a582d861706f5967ec89aabf6435 192.168.108.129:6379 myself,master - 0 0 1 connected 0-5460
18a3f286cb3f4c6ae989fb53c30b5be824cdf48b 192.168.108.131:6379 master - 0 1710223802991 3 connected 10923-16383
ca96f097d91b62d0175ea324c5cda0c980bcf049 192.168.108.130:6379 master - 0 1710223807025 2 connected 5461-10922
fb1eabcf65d8ce57fa765c9999309a607116cf2c 192.168.108.130:6380 slave 5c1d1d094366a582d861706f5967ec89aabf6435 0 1710223803999 5 connected
  • 查看集群状态
192.168.108.129: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_sent:139
cluster_stats_messages_received:139

集群扩缩容

规划

通过扩容实现四主四从。

主机名称主机地址主机端口主机用途
Redis-Cluster-01192.168.108.1296379/6380master+slaver
Redis-Cluster-02192.168.108.1306379/6380master+slaver
Redis-Cluster-03192.168.108.1316379/6380master+slaver
Redis-Cluster-04192.168.108.1286379/6380master+slaver(新增)

扩容

Redis集群支持动态扩容!!!

  1. 安装Redis

参照上述安装方法,此处不再演示。
注意:注意bind的IP地址修改成主机IP地址!

  1. 扩容集群

注意:需要登录安装ruby的那台机器

cd /usr/local/redis-cluster/redis-3.2.9/src/
#添加主节点
./redis-trib.rb add-node 192.168.108.128:6379 192.168.108.129:6379
#添加从节点
./redis-trib.rb add-node 192.168.108.128:6380 192.168.108.129:6379

命令解释:添加节点192.168.108.128:6379,到集群内任意节点192.168.108.129:6379

  1. 主从规划


根据规划只需要操作192.168.108.129和192.168.108.128

  • 192.168.108.128:6379从机为192.168.108.129:6380
  • 192.168.108.131:6379从机为192.168.108.128:6380
  1. 指定交叉主从
# 查看现有主从
redis-cli -h 192.168.108.129 -p 6379 -a '1qaz!QAZ' cluster nodes | grep master | awk -F ' ' '{print $1,$2}'
1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e 192.168.108.128:6379
c6e4f59c447e8e4044024c0a379266b8a2651e66 192.168.108.129:6379
df6074d09e7ed9221e38a162d449480ebed4ac77 192.168.108.130:6379
0202ea3572181f8ef4a9339edf28acfaa5e90990 192.168.108.131:6379
f5fc9197e2eb569280d9bfb5dc76c67d774ae7aa 192.168.108.128:6380

# 新主从关系
redis-cli -h 192.168.108.128 -p 6380 -a '1qaz!QAZ' cluster replicate 0202ea3572181f8ef4a9339edf28acfaa5e90990
redis-cli -h 192.168.108.129 -p 6380 -a '1qaz!QAZ' cluster replicate 1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e
  1. 分配槽位
cd /usr/local/redis-cluster/redis-3.2.9/src/
./redis-trib.rb reshard 192.168.108.129:6379

#How many slots do you want to move (from 1 to 16384)? 4096		#所有槽位分配到4台主节点上,每台分的4096个槽位
#What is the receiving node ID?1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e			#指定接收槽位的节点ID
#Source node #1:all								#其他的三个节点都要发给新节点槽位
#Do you want to proceed with the proposed reshard plan (yes/no)?yes				#开始分配槽位

命令解释:集群内任意节点192.168.108.129:6379

  1. 检查槽位分配
cd /usr/local/redis-cluster/redis-3.2.9/src/
./redis-trib.rb rebalance 192.168.108.129:6379
# >>> Performing Cluster Check (using node 192.168.108.129:6379)
# [OK] All nodes agree about slots configuration.
# >>> Check for open slots...
# >>> Check slots coverage...
# [OK] All 16384 slots covered.
# *** No rebalancing needed! All nodes are within the 2.0% threshold.
cd /usr/local/redis-cluster/redis-3.2.9/src/
./redis-trib.rb check 192.168.108.129:6379

命令解释:集群内任意节点192.168.108.129:6379

收缩

  1. 节点释放槽位
cd /usr/local/redis-cluster/redis-3.2.9/src/
./redis-trib.rb reshard 192.168.108.129:6379

#分发槽位给192.168.108.129:6379
#How many slots do you want to move (from 1 to 16384)? 1365		#本节点共有4096个槽位,需要分配给三个节点,所以1365
#What is the receiving node ID? c6e4f59c447e8e4044024c0a379266b8a2651e66			#此ID为192.168.108.129:6379主节点ID,接受槽位的主节点
#Source node #1:1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e			#此ID为192.168.108.128:6379主节点ID,从这个主节点分配给其他节点
#Source node #2:done																					#结束一个节点的配置
#Do you want to proceed with the proposed reshard plan (yes/no)? yes

#分发槽位给192.168.108.130:6379
#How many slots do you want to move (from 1 to 16384)? 1365
#What is the receiving node ID? df6074d09e7ed9221e38a162d449480ebed4ac77    #此ID为192.168.108.130:6379主节点ID,接受槽位的主节点
#Source node #1:1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e			#此ID为192.168.108.128:6379主节点ID,从这个主节点分配给其他节点
#Source node #2:done																					#结束一个节点的配置
#Do you want to proceed with the proposed reshard plan (yes/no)? yes

#分发槽位给192.168.108.131:6379
#How many slots do you want to move (from 1 to 16384)? 1366
#What is the receiving node ID? 0202ea3572181f8ef4a9339edf28acfaa5e90990    #此ID为192.168.108.130:6379主节点ID,接受槽位的主节点
#Source node #1:1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e			#此ID为192.168.108.128:6379主节点ID,从这个主节点分配给其他节点
#Source node #2:done		
#Do you want to proceed with the proposed reshard plan (yes/no)? yes
  1. 主从规划

  1. 指定主从交叉
# 查看现有主从
redis-cli -h 192.168.108.129 -p 6379 -a '1qaz!QAZ' cluster nodes | grep master | awk -F ' ' '{print $1,$2}'
1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e 192.168.108.128:6379
c6e4f59c447e8e4044024c0a379266b8a2651e66 192.168.108.129:6379
df6074d09e7ed9221e38a162d449480ebed4ac77 192.168.108.130:6379
0202ea3572181f8ef4a9339edf28acfaa5e90990 192.168.108.131:6379
f5fc9197e2eb569280d9bfb5dc76c67d774ae7aa 192.168.108.128:6380

# 新主从关系
redis-cli -h 192.168.108.129 -p 6380 -a '1qaz!QAZ' cluster replicate 0202ea3572181f8ef4a9339edf28acfaa5e90990
  1. 节点移除集群
#查看要移除节点ID
redis-cli -h 192.168.108.128 -p 6380 -a '1qaz!QAZ' cluster nodes
f5fc9197e2eb569280d9bfb5dc76c67d774ae7aa 192.168.108.128:6380 myself,slave 0202ea3572181f8ef4a9339edf28acfaa5e90990 0 0 8 connected
0202ea3572181f8ef4a9339edf28acfaa5e90990 192.168.108.131:6379 master - 0 1710237900462 11 connected 6826 10923-16383
aa58a73668cb856611044237fca8ad2a09600c42 192.168.108.130:6380 slave c6e4f59c447e8e4044024c0a379266b8a2651e66 0 1710237895424 9 connected
e18222d39649b275413aa187a4469b0a0edb2259 192.168.108.129:6380 slave 1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e 0 1710237898447 11 connected
1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e 192.168.108.128:6379 master - 0 1710237901469 7 connected
f25748e776a836f1362081efcd93e5bbe0527e12 192.168.108.131:6380 slave 1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e 0 1710237900965 7 connected
c6e4f59c447e8e4044024c0a379266b8a2651e66 192.168.108.129:6379 master - 0 1710237899958 9 connected 0-5460
df6074d09e7ed9221e38a162d449480ebed4ac77 192.168.108.130:6379 master - 0 1710237896431 10 connected 5461-6825 6827-10922

#节点移除集群(根据节点IP、端口、ID来移除节点)
cd /usr/local/redis-cluster/redis-3.2.9/src/
./redis-trib.rb del-node 192.168.108.128:6379 1f30f6d1a0f2f5e1dd2b2fb75678e9d6eff59b3e
./redis-trib.rb del-node 192.168.108.128:6380 f5fc9197e2eb569280d9bfb5dc76c67d774ae7aa
  1. 查看集群信息
redis-cli -h 192.168.108.129 -p 6379 -a '1qaz!QAZ' cluster nodes
aa58a73668cb856611044237fca8ad2a09600c42 192.168.108.130:6380 slave c6e4f59c447e8e4044024c0a379266b8a2651e66 0 1710238449878 9 connected
f25748e776a836f1362081efcd93e5bbe0527e12 192.168.108.131:6380 slave df6074d09e7ed9221e38a162d449480ebed4ac77 0 1710238454519 10 connected
c6e4f59c447e8e4044024c0a379266b8a2651e66 192.168.108.129:6379 myself,master - 0 0 9 connected 0-5460
df6074d09e7ed9221e38a162d449480ebed4ac77 192.168.108.130:6379 master - 0 1710238449476 10 connected 5461-6825 6827-10922
0202ea3572181f8ef4a9339edf28acfaa5e90990 192.168.108.131:6379 master - 0 1710238455528 11 connected 6826 10923-16383
e18222d39649b275413aa187a4469b0a0edb2259 192.168.108.129:6380 slave 0202ea3572181f8ef4a9339edf28acfaa5e90990 0 1710238453510 11 connected
  1. 删除Redis

redis删除不做演示

集群命令

查看集群节点信息

  • CLUSTER NODES
192.168.108.129:6380> CLUSTER NODES
ccff6d563167e753ca1c632f22066a537f5a1e56 :6380 myself,master - 0 0 0 connected
  • 集群配置文件信息
[root@localhost ~]# cat /usr/local/redis-cluster/redis_6380/data/nodes-6380.conf
ccff6d563167e753ca1c632f22066a537f5a1e56 :0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0

查看集群状态信息

  • CLUSTER INFO
192.168.108.129: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:1
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_sent:19750
cluster_stats_messages_received:19567
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值