简介
集群概述
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-01 | 192.168.108.129 | 6379/6380 | master+slaver |
Redis-Cluster-02 | 192.168.108.130 | 6379/6380 | master+slaver |
Redis-Cluster-03 | 192.168.108.131 | 6379/6380 | master+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
三台主机都要执行!
- 解决依赖
yum -y install wget gcc gcc-c++ make automake autoconf libtool libc
- 下载解压
#下载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/
- 拷贝文件
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
- 编译安装
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
- 创建目录
mkdir -p /usr/local/redis-cluster/redis_{6379,6380}/{logs,data,conf,pid}
- 命令配置
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
三台主机都要执行!
- 解决依赖
yum -y install wget gcc gcc-c++ make automake autoconf libtool libc vim
- 下载解压
#下载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/
- 拷贝文件
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
- 编译安装
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
- 创建目录
mkdir -p /usr/local/redis-cluster/redis_{6379,6380}/{logs,data,conf,pid}
- 命令配置
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-01 | 192.168.108.129 | 6379/6380 | master+slaver |
Redis-Cluster-02 | 192.168.108.130 | 6379/6380 | master+slaver |
Redis-Cluster-03 | 192.168.108.131 | 6379/6380 | master+slaver |
Redis-Cluster-04 | 192.168.108.128 | 6379/6380 | master+slaver(新增) |
扩容
Redis集群支持动态扩容!!!
- 安装Redis
参照上述安装方法,此处不再演示。
注意:注意bind的IP地址修改成主机IP地址!
- 扩容集群
注意:需要登录安装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
- 主从规划
根据规划只需要操作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
- 指定交叉主从
# 查看现有主从
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
- 分配槽位
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
- 检查槽位分配
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
收缩
- 节点释放槽位
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
- 主从规划
- 指定主从交叉
# 查看现有主从
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
- 节点移除集群
#查看要移除节点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
- 查看集群信息
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
- 删除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