目录
前言
环境:centos7.9、redis-6.2.6
本篇将在centos7.9上使用源码包安装方式搭建redis-cluster集群,redis集群采用6节点,即3主3从集群模式。
知乎上有一篇写的很好的文章,可以作为参考:https://www.zhihu.com/tardis/sogou/art/391762630
介绍Cluster模式
我们知道redis一共有3种集群模式,1、主从模式。2、哨兵模式。3、Cluster模式
。
主从模式、哨兵模式都是以前redis旧版本推荐的,随着官方的redis版本更新已经修复主从模式、哨兵模式的缺点,目前官方主推redis集群的搭建使用Cluster模式,Cluster模式最少需要6个节点。
redis cluster是Redis的分布式解决方案,在redis 3.0版本推出后有效地解决了redis分布式方面的需求,自动将数据进行分片,每个master上放一部分数据提供内置的高可用支持,部分master不可用时,还是可以继续工作的。Cluster模式支撑n个master 节点,每个master 节点都可以挂载多个slave 节点,Cluster模式具备高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master,换句话说,只有当一个master节点和master所挂载的slave都挂掉了,集群才会不可用。
Cluster模式的原理
Redis Cluster模式继续沿用了主从复制的技术,同时还采用了一种更强大的数据分片技术,即Sharding 技术;
数据分片技术是这样的:
一个redis 集群包含 16384 个哈希槽(hash slot),每个key键都被放置于这 16384 个哈希槽中的一个,集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽,其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和。
集群中的每个节点负责处理一部分哈希槽。 举个例子,一个集群可以有3个master节点,其中:
节点 A 负责处理 0 号至 5500 号哈希槽;
节点 B 负责处理 5501 号至 11000 号哈希槽;
节点 C 负责处理 11001 号至 16384 号哈希槽;
这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:
我现在想设置一个key,叫my_name:
set my_name xiaoming
按照Redis Cluster的哈希槽算法,CRC16('my_name')%16384 = 2412 那么这个key就被分配到了节点A上
同样的,当我连接(A,B,C)的任意一个节点想获取my_name这个key,查询会重定向转到节点A上进行查询。
再比如
如果用户将新节点 D 添加到集群中,那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
增加一个D节点的结果可能如下:
节点A覆盖1365-5460
节点B覆盖6827-10922
节点C覆盖12288-16383
节点D覆盖0-1364,5461-6826,10923-1228
与此类似,如果用户要从集群中移除节点 A ,那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C ,然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞,所以无论是添加新节点还是移除已存在节点,又或者改变某个节点包含的哈希槽数量,都不会造成集群下线。
真是因为Redis Cluster这种集群模式功能非常强大,所以官网才会建议使用cluster模式来搭建redis集群。
准备工作
1、准备3台虚拟机,(由于虚拟机资源有限,所以每台虚拟机上跑2个redis实例,这样3台虚拟机才能构成一共6个redis节点);
2、关闭防火墙systemctl stop firewalld
,关闭selinux 输入命令vi /etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled, setenforce 0临时关闭
, 同步时间systemctl start ntpd && systemctl enable ntpd
等;
3、下载redis源码安装包:wget https://download.redis.io/releases/redis-6.2.6.tar.gz
安装redis
下面将在其中一台虚拟机上安装redis进行步骤演示,其他2台自行安装,都是同样的安装步骤。
#安装依赖,可以先不安装,等后面编译redis时出现报错再安装对应的依赖也不迟
yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc
yum -y install devtoolset-9-c++
yum -y install devtoolset-9-binutils scl enable devtoolset-9
# 安装redis
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
tar -zxvf redis-6.2.6.tar.gz
cd redis-6.2.6/
mkdir /usr/local/redis-6.2.6
# 编译
make -j 4
# 正式安装Redis,加PREFIX参数指定Redis安装到/usr/local/redis-6.2.6目录下
# 如果不加的话直接执行make install的话,默认安装二进制命令就会生成到/usr/local/bin下
make PREFIX=/usr/local/redis-6.2.6 install
# 进入Redis的安装目录
cd /usr/local/redis-6.2.6
# ll查看一下有哪些文件,发现只有一个bin目录
[root@Redis redis-6.2.6]# ll
drwxr-xr-x 2 root root 134 Jan 23 22:31 bin
# 其实就是生成了Redis-server、Redis-cli等6个命令文件而已
[root@Redis redis-6.2.6]# tree bin/
bin/
redis-benchmark
redis-check-aof -> redis-server
redis-check-rdb -> redis-server
redis-cli
redis-sentinel -> redis-server
redis-server
#前面我们也看到了,redis的安装目录就一个bin目录,所以为了规范化,这里创建对应的目录用于存放对应的文件
#我们一台虚拟机上跑两个实例,所以这里以6363,6364 端口来启动不同的实例,创建了存放对应文件的目录
#进入Redis的安装目录
cd /usr/local/redis-6.2.6
#创建3个目录,etc用于存放redis的主配置文件,logs目录存放redis日志,data用于存放redis的持久化数据
mkdir etc logs data
#在logs目录下创建6363,6364这两个目录
cd logs && mkdir 6363 && mkdir 6364
#在6363,6364这两个目录下分别创建日志文件
touch 6363/redis_6363.log && touch 6364/redis_6364.log
#在6363,6364这两个目录下分别创建pid文件
touch 6363/redis_6363.pid && touch 6364/redis_6364.pid
#进入Redis的安装目录
cd /usr/local/redis-6.2.6
#在data目录下创建2个6363,6364目录存放持久化数据
mkdir data/6363 data/6364 -p
复制配置文件
#复制一份源码包配置文件到Redis安装目录
cp /redis-6.2.6/redis.conf /usr/local/redis-6.2.6/etc/
#进入Redis的安装目录
cd /usr/local/redis-6.2.6
#以不同端口命名配置文件
cp redis.conf redis_6363.conf
#以不同端口命名配置文件
cp redis.conf redis_6364.conf
#备份配置文件
mv redis.conf redis.conf_bak
修改配置文件
#进入Redis的安装目录
cd /usr/local/redis-6.2.6/etc/
#主要修改或启用下面这些配置
vim redis_6363.conf
[root@Redis etc]# grep -Ev '$^|#' redis_6363.conf
bind 0.0.0.0 #表示监听本机上的哪个IP的请求,0.0.0.0表示监听本机所有的IP地址
protected-mode yes #默认就是这样,保持默认即可
port 6363 #redis监听端口
tcp-backlog 511 #默认就是这样,保持默认即可
timeout 0 #默认就是这样,保持默认即可
tcp-keepalive 300 #默认就是这样,保持默认即可
daemonize yes #是否后台启动redis服务,改为yes
pidfile /usr/local/redis-6.2.6/logs/6363/redis_6363.pid #pid文件存放路径
loglevel notice #日志输出级别,默认就是这样,保持默认即可
logfile /usr/local/redis-6.2.6/logs/6363/redis_6363.log #日志文件存放路径
databases 16 #redis数据库总个数,默认就是16个,保持默认即可
always-show-logo no #默认就是这样,保持默认即可
set-proc-title yes #默认就是这样,保持默认即可
proc-title-template "{title} {listen-addr} {server-mode}" #默认就是这样,保持默认即可
stop-writes-on-bgsave-error yes #默认就是这样,保持默认即可
rdbcompression yes #默认就是这样,保持默认即可
rdbchecksum yes #默认就是这样,保持默认即可
dbfilename dump.rdb #持久化的备份文件,默认就是这样,保持默认即可
rdb-del-sync-files no #默认就是这样,保持默认即可
dir /usr/local/redis-6.2.6/data/6363/ #持久化备份文件存放的路径
masterauth 123456 #主从认证的密码,要与requirepass设置的密码一致
replica-serve-stale-data yes #默认就是这样,保持默认即可
replica-read-only yes #默认就是这样,保持默认即可
repl-diskless-sync no #默认就是这样,保持默认即可
repl-diskless-sync-delay 5 #默认就是这样,保持默认即可
repl-diskless-load disabled #默认就是这样,保持默认即可
repl-disable-tcp-nodelay no #默认就是这样,保持默认即可
replica-priority 100 #默认就是这样,保持默认即可
acllog-max-len 128 #默认就是这样,保持默认即可
requirepass 123456 #redis的登陆密码,注意masterauth和requirepass设置的密码要一致
lazyfree-lazy-eviction no #默认就是这样,保持默认即可
lazyfree-lazy-expire no #默认就是这样,保持默认即可
lazyfree-lazy-server-del no #默认就是这样,保持默认即可
replica-lazy-flush no #默认就是这样,保持默认即可
lazyfree-lazy-user-del no #默认就是这样,保持默认即可
lazyfree-lazy-user-flush no #默认就是这样,保持默认即可
oom-score-adj no #默认就是这样,保持默认即可
oom-score-adj-values 0 200 800 #默认就是这样,保持默认即可
disable-thp yes #默认就是这样,保持默认即可
appendonly no #这是aof持久化方式,可以开启也可以不开启,因为redis默认开了rdb持久化,这样选择不开启aof持久化方式
appendfilename "appendonly.aof" #aof持久化备份文件名称,这个备份文件也是默认存放到dir设置的目录
appendfsync everysec #默认就是这样,保持默认即可
no-appendfsync-on-rewrite no #默认就是这样,保持默认即可
auto-aof-rewrite-percentage 100 #默认就是这样,保持默认即可
auto-aof-rewrite-min-size 64mb #默认就是这样,保持默认即可
aof-load-truncated yes #默认就是这样,保持默认即可
aof-use-rdb-preamble yes #默认就是这样,保持默认即可
lua-time-limit 5000 #默认就是这样,保持默认即可
cluster-enabled yes #是否启用集群,必须设置为yes,我们就是搭建3主3从集群
cluster-config-file nodes-6363.conf #集群节点的配置文件,这个配置文件也是默认存放到dir设置的目录
slowlog-log-slower-than 10000 #默认就是这样,保持默认即可
slowlog-max-len 128 #默认就是这样,保持默认即可
latency-monitor-threshold 0 #默认就是这样,保持默认即可
notify-keyspace-events "" #默认就是这样,保持默认即可
hash-max-ziplist-entries 512 #默认就是这样,保持默认即可
hash-max-ziplist-value 64 #默认就是这样,保持默认即可
list-max-ziplist-size -2 #默认就是这样,保持默认即可
list-compress-depth 0 #默认就是这样,保持默认即可
set-max-intset-entries 512 #默认就是这样,保持默认即可
zset-max-ziplist-entries 128 #默认就是这样,保持默认即可
zset-max-ziplist-value 64 #默认就是这样,保持默认即可
hll-sparse-max-bytes 3000 #默认就是这样,保持默认即可
stream-node-max-bytes 4096 #默认就是这样,保持默认即可
stream-node-max-entries 100 #默认就是这样,保持默认即可
activerehashing yes #默认就是这样,保持默认即可
client-output-buffer-limit normal 0 0 0 #默认就是这样,保持默认即可
client-output-buffer-limit replica 256mb 64mb 60 #默认就是这样,保持默认即可
client-output-buffer-limit pubsub 32mb 8mb 60 #默认就是这样,保持默认即可
hz 10 #默认就是这样,保持默认即可
dynamic-hz yes #默认就是这样,保持默认即可
aof-rewrite-incremental-fsync yes #默认就是这样,保持默认即可
rdb-save-incremental-fsync yes #默认就是这样,保持默认即可
jemalloc-bg-thread yes #默认就是这样,保持默认即可
[root@Redis etc]#
#同理,编辑redis_6364.conf配置文件,大部分参数是不需要修改的,像上面那样修改部分参数的设置即可
[root@Redis etc]# vim redis_6364.conf #参照redis_6364.conf配置文件,改对应的参数
启动redis服务
redis配置文件已经修改完毕,启动2个redis实例:
cd /usr/local/redis-6.2.6/bin/
#指定配置文件启动实例
./redis-server /usr/local/redis-6.2.6/etc/redis_6363.conf
#指定配置文件启动实例
./redis-server /usr/local/redis-6.2.6/etc/redis_6364.conf
#查看redis进程,已经启动了2个redis实例
ps -ef | grep redis
#查看日志文件都正常
tail -222f ../logs/6363/redis_6363.log
#查看日志文件都正常
tail -222f ../logs/6364/redis_6364.log
#查看pid文件都正常
cat ../logs/6363/redis_6363.pid
#查看pid文件都正常
cat ../logs/6364/redis_6364.pid
问题排查
#第一次启动redis可能会看到日志报下面的3个警告:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
WARNING: overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
WARNING: you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain thesetting after a reboot. Redis must be restarted after THP is disabled.
按照提示解决即可:
#打开/etc/sysctl.conf文件,添加下面2行
vim /etc/sysctl.conf
#指定内核参数,默认值128对于负载很大的服务是不够的,改为1024或2048或者更大
net.core.somaxconn = 1024
#内存的分配策略,设置为1表示允许内核分配所有的物理内存
vm.overcommit_memory = 1
修改完成后保存,执行:sysctl -p 使修改立即生效
使用root账号执行:echo never > /sys/kernel/mm/transparent_hugepage/enabled
为了防止重启服务器失效,将echo never > /sys/kernel/mm/transparent_hugepage/enabled 添加到/etc/rc.local开机自启中即可。
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local && chmod a+x /etc/rc.local /etc/rc.d/rc.local
配置另外2台虚拟机
同理,其它2台虚拟机也做同样的工作,安装相同版本的redis,redis安装路径,目录结构,端口设置,配置文件的修改与上面的一样。
这里默认你已经正常完成了其它2台虚拟机的redis安装工作,正常启动了redis。
登陆redis
上面已经正常启动了redis服务,下面验证一下我们的3台虚拟机上的redis是否能正常登陆:
#前面已经启动redis了,现在验证是否可以正常登录redis
#登录第1台虚拟机
cd /usr/local/redis-6.2.6/bin/
./redis-cli -h 192.168.118.129 -p 6363 -a 123456
./redis-cli -h 192.168.118.129 -p 6364 -a 123456
#登录第2台虚拟机
cd /usr/local/redis-6.2.6/bin/
./redis-cli -h 192.168.118.132 -p 6363 -a 123456
./redis-cli -h 192.168.118.132 -p 6364 -a 123456
#登录第3台虚拟机
cd /usr/local/redis-6.2.6/bin/
./redis-cli -h 192.168.118.133 -p 6363 -a 123456
./redis-cli -h 192.168.118.133 -p 6364 -a 123456
#关闭redis服务
#可以直接使用redis-cli命令关闭redis实例,也可以先./redis-cli -h 192.168.118.129 -p 6363登陆进去然后再输入shutdown命令关闭redis
cd /usr/local/redis-6.2.6/bin/
./redis-cli -h 192.168.118.129 -p 6363 -a 123456 shutdown
./redis-cli -h 192.168.118.129 -p 6364 -a 123456 shutdown
自动创建redis集群,6节点,构成3主3从集群模式
注意:如果需要手动创建集群,下面还有一种手动创建集群的方式
下面,我们将自动创建redis集群,6节点,构成3主3从集群模式,使用redis-cli --cluster create
命令来搭建集群,在任意一个服务器上执行都可以。
注意:第一次搭建集群要保证redis是没有数据的,否则会造成分配槽点失败。
#默认情况下,我们让redis自动给我们分配哪个是主节点哪个是从节点哪个主节点对应哪个从节点即可,我们一般不需要过多的死犟让哪个是主哪个是
#从,哪个主对应哪个从,因为当集群搭建好之后,redis实例如果挂掉了从会自动变成主的,如果真有需要指定哪个实例为主哪个为从,可以参考后面介
#绍的方式
#在任意一台服务器上执行
#使用redis-cli --cluster create 命令来自动创建集群
#--cluster-replicas 1表示每个主节点带一个从节点,因为我们搭建的就是3主3从集群结构
# -a 123456指定redis登陆密码
cd /usr/local/redis-6.2.6/bin/
./redis-cli --cluster create --cluster-replicas 1 192.168.118.129:6363 192.168.118.129:6364 192.168.118.132:6363 192.168.118.132:6364 192.168.118.133:6363 192.168.118.133:6364 -a 123456
>>> Performing hash slots allocation on 6 nodes... #redis开始执行哈希槽分配
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.118.132:6364 to 192.168.118.129:6363 #redis自动帮我们分配了主从对应的节点
Adding replica 192.168.118.133:6364 to 192.168.118.132:6363 #redis自动帮我们分配了主从对应的节点
Adding replica 192.168.118.129:6364 to 192.168.118.133:6363 #redis自动帮我们分配了主从对应的节点
M: 4101c25b914cae947072f6ce8e567e15b3dbd10e 192.168.118.129:6363 #192.168.118.129:6363是主节点
slots:[0-5460] (5461 slots) master
S: c33d45a803ee25d8e4542a41ecff91dde5ccfe20 192.168.118.129:6364
replicates 3143ff3b8a3d4d11fb03b11307db450b9eb28709
M: f7247dad516e455172e92fe4564c3e1cd7c55ff7 192.168.118.132:6363 # 这个也是主节点
slots:[5461-10922] (5462 slots) master
S: 17abbfcc3c702f4daf0ed922bf4a62e6d58aa95f 192.168.118.132:6364
replicates 4101c25b914cae947072f6ce8e567e15b3dbd10e
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363 # 这个也是主节点
slots:[10923-16383] (5461 slots) master
S: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364
replicates f7247dad516e455172e92fe4564c3e1cd7c55ff7
Can I set the above configuration? (type 'yes' to accept): yes #redis询问是否接收这样的哈希槽分配结果,输入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.118.129:6363)
M: 4101c25b914cae947072f6ce8e567e15b3dbd10e 192.168.118.129:6363
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 17abbfcc3c702f4daf0ed922bf4a62e6d58aa95f 192.168.118.132:6364
slots: (0 slots) slave
replicates 4101c25b914cae947072f6ce8e567e15b3dbd10e
M: f7247dad516e455172e92fe4564c3e1cd7c55ff7 192.168.118.132:6363
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364
slots: (0 slots) slave
replicates f7247dad516e455172e92fe4564c3e1cd7c55ff7
S: c33d45a803ee25d8e4542a41ecff91dde5ccfe20 192.168.118.129:6364
slots: (0 slots) slave
replicates 3143ff3b8a3d4d11fb03b11307db450b9eb28709
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. #所有槽点分配完成,redis集群搭建完成
手动创建redis集群,6节点,构成3主3从集群模
#手动指定哪个主哪个从,哪个主对应哪个从,这里将6363端口定为主节点
#先创建主节点,这里将每台服务器上的redis的6363端口定为主节点
cd /usr/local/redis-6.2.6/bin/
./redis-cli -a 123456 --cluster create 192.168.118.129:6363 192.168.118.132:6363 192.168.118.133:6363 -a 123456
M: 972b376e8cc658b8bf5f2a1a3294cbe2c84ee852 192.168.118.129:6363 # 主节点分配了5461个哈希槽,记住该节点的id
slots:[0-5460] (5461 slots) master
replicates ac6cc9dd3a86cf370333d36933c99df5f13f42ab
M: 18b4ceacd3222e546ab59e041e4ae50e736c5c26 192.168.118.132:6363 # 主节点分配了5461个哈希槽,记住该节点的id
slots:[10923-16383] (5461 slots) master
M: ac6cc9dd3a86cf370333d36933c99df5f13f42ab 192.168.118.133:6363 # 主节点分配了5462个哈希槽,记住该节点的id
slots:[5461-10922] (5462 slots) master
Can I set the above configuration? (type 'yes' to accept): yes #输入yes表示接收槽点分配结果
.................
#为每个master节点添加slave节点
#192.168.118.129:6363的位置可以是任意一个master节点,仅表示在哪个master节点上执行操作而已,一般我们用第一个master节点即可
#--cluster-master-id参数指定该salve节点对应的master节点的id,注意是master节点的id
# 192.168.118.129:6364 从 >> 192.168.118.129:6363 主
[root@Redis bin]# ./redis-cli -a 123456 --cluster add-node 192.168.118.129:6364 192.168.118.129:6363 --cluster-slave --cluster-master-id 972b376e8cc658b8bf5f2a1a3294cbe2c84ee852
# 192.168.118.132:6364 从 >> 192.168.118.132:6363 主
[root@Redis bin]# ./redis-cli -a 123456 --cluster add-node 192.168.118.132:6364 192.168.118.129:6363 --cluster-slave --cluster-master-id 18b4ceacd3222e546ab59e041e4ae50e736c5c26
# 192.168.118.133:6364 从 >> 192.168.118.133:6363 主
[root@Redis bin]# ./redis-cli -a 123456 --cluster add-node 192.168.118.133:6364 192.168.118.129:6363 --cluster-slave --cluster-master-id ac6cc9dd3a86cf370333d36933c99df5f13f42ab
检查集群是否创建成功
当redis集群创建完成之后,需要检查redis集群状态,在任意节点上指定redis节点的ip端口执行命令即可完成集群状态检查:
[root@Redis ~]# cd /usr/local/redis-6.2.6/bin/
[root@Redis bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.129:6363 (4101c25b...) -> 0 keys | 5461 slots | 1 slaves.
192.168.118.132:6363 (f7247dad...) -> 0 keys | 5462 slots | 1 slaves.
192.168.118.133:6363 (3143ff3b...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.118.129:6363)
M: 4101c25b914cae947072f6ce8e567e15b3dbd10e 192.168.118.129:6363
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 17abbfcc3c702f4daf0ed922bf4a62e6d58aa95f 192.168.118.132:6364
slots: (0 slots) slave
replicates 4101c25b914cae947072f6ce8e567e15b3dbd10e
M: f7247dad516e455172e92fe4564c3e1cd7c55ff7 192.168.118.132:6363
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364
slots: (0 slots) slave
replicates f7247dad516e455172e92fe4564c3e1cd7c55ff7
S: c33d45a803ee25d8e4542a41ecff91dde5ccfe20 192.168.118.129:6364
slots: (0 slots) slave
replicates 3143ff3b8a3d4d11fb03b11307db450b9eb28709
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@Redis bin]#
上面介绍了2种安装redis集群的方式,即自动创建集群和手动创建集群,至此,redis集群,6节点,构成3主3从集群模式已经搭建完成。
集群验证
集群模式下,我们还是使用redis-cli命令登录,不过要使用 -c 参数,-c参数是启用集群模式的意思。
往master节点插入数据:
[root@Redis ~]# cd /usr/local/redis-6.2.6/bin/
[root@Redis bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456 #先查看哪个是master节点:
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.129:6363 (4101c25b...) -> 0 keys | 5461 slots | 1 slaves. #192.168.118.129:6363是master节点,并且0个key
192.168.118.133:6363 (3143ff3b...) -> 0 keys | 5461 slots | 1 slaves. #192.168.118.133:6363是master节点,并且0个key
192.168.118.133:6364 (bd068279...) -> 0 keys | 5462 slots | 1 slaves. #192.168.118.133:6364是master节点,并且0个key
................
[OK] All 16384 slots covered.
[root@Redis bin]#
#随便登陆一个节点,不一定要是master节点,这里登录192.168.118.129:6364从节点
[root@Redis bin]# ./redis-cli -c -h 192.168.118.129 -p 6364 -a 123456 #随便登录一个节点,这里登录从节点,这里要使用-c参数
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.129:6364> keys * #可以看到现在从节点是没有key键的
(empty array)
192.168.118.129:6364> set name "WangMeng" #在从节点插入一个key数据
-> Redirected to slot [5798] located at 192.168.118.133:6364 #显示重定向到了192.168.118.133:6364这个主节点
OK
192.168.118.133:6364> auth 123456 #这里提示要输入192.168.118.133:6364的登陆密码
OK
192.168.118.133:6364> keys * #查看我们刚才插入的key键,能正常查到
1) "name"
192.168.118.133:6364> get name #查看我们刚才插入的key键,能正常查到
"WangMeng"
192.168.118.133:6364> quit #我们退出192.168.118.133:6364这个实例
#以上说明,当我们往任意一个节点(即使是slave节点)插入数据时,redis使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽,然后就往对
# 应的hash slot存入数据,同时还会跳转到对应的master节点,而master节点设置了登录密码,所以需要摄入密码。
# 只有master有hash slot,slave是没有hash slot的,也就是说,插入数据必定是往其中一个master节点插入数据,然后该master对应的slave就
# 会同步数据。
#我们刚才往192.168.118.133:6364 这个master节点插入一个名为name 的key,下面我们来查看192.168.118.133:6364 这个master节点
#对应的192.168.118.132:6363这个slave是否成功同步到数据了
[root@node1 bin]# ./redis-cli -h 192.168.118.132 -p 6363 -a 123456 #没有使用-c参数,但是单机模式登陆
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.132:6363> keys * #已经成功同步了master节点的数据了
1) "name"
192.168.118.132:6363> get name #查看,报错了,因为我们没有使用-c参数登录
(error) MOVED 5798 192.168.118.133:6364
192.168.118.132:6363>
[root@node1 bin]# ./redis-cli -c -h 192.168.118.132 -p 6363 -a 123456 #我们使用-c参数登录
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.132:6363> get name #查询key,发现重定向了master节点
-> Redirected to slot [5798] located at 192.168.118.133:6364
"WangMeng"
192.168.118.133:6364>
#小结
1、使用-c参数以集群模式登陆,任意一个主节点或从节点登录都可以,如下所示:
./redis-cli -c -h 192.168.118.132 -p 6363 -a 123456 #我们使用-c参数登录
2、插入数据会根据 CRC16(key) % 16384 来计算键 key 属于哪个槽,然后得出数据应该往哪个master节点插入,我们在创建集群
的时候已经分配好哈希槽了。
3、插入数据会自动跳转到计算出哈希槽后的对应的master节点,master节点存入数据后,其对应的slave就会进行同步数据。
4、使用redis-cli -c 参数从任意节点登录的,不管数据在哪个节点上,get 读取数据时都会重定向到数据所在master节点上读取。
5、登录redis cluster集群使用 redis-cli -c -a password,即使用-c和-a参数,-c参数表示Enable cluster mode,-a参数指定密码
这样当redis跳转的时候就不用再次认证密码了,否则不加-a参数登录,会发现每查询或插入都需要使用auth认证,否则报错:
(error) NOAUTH Authentication required.,不加-c参数,插入key会报错:error) MOVED 5798 192.168.xx.xx:6364
添加一个master节点(redis扩容)
为已有的集群添加一个ip和端口是192.168.118.134:16363 的master节点,新加了master节点,就要涉及到如何重新分配哈希槽了:
#使用./redis-cli --cluster help命令查看如何添加节点
[root@Redis bin]# ./redis-cli --cluster help
#使用命令 redis-cli --cluster add-node new_host:new_port existing_host:existing_port 添加新的master节点
#192.168.118.134:16363是新加入的master节点ip和端口,192.168.118.129:6363可以是任意一个已经存在于集群的节点ip和端口
[root@node1 bin]# ./redis-cli --cluster add-node 192.168.118.134:16363 192.168.118.129:6363 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.118.134:16363 to cluster 192.168.118.129:6363
>>> Performing Cluster Check (using node 192.168.118.129:6363)
........................
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.118.134:16363 to make it join the cluster.
[OK] New node added correctly. #新节点已加入集群
[root@node1 bin]#
#重新查看集群,现在有4个master节点了,但是新加入的节点哈希槽是0
[root@node1 bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
........................
M: aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 192.168.118.134:16363 #新加入的master节点哈希槽是0
slots: (0 slots) master
........................
[root@node1 bin]#
添加后查看集群信息,发现master已经加入进来了,但是哈希槽是0,这说明这个master节点不能存储数据。
原来,并不是新加入master节点,redis就会自动重新分配哈希槽,需要使用reshard命令重新分配哈希槽。
#使用reshard命令重新分配哈希槽
#reshard 命令后面随便接一个节点的ip和端口即可
[root@node1 bin]# ./redis-cli --cluster reshard 192.168.118.129:6363 -a 123456
......省略.....
#这里提示需要迁移多少slot到16363上,我们可以算一下:16384/4 = 4096,也就是说,为了平衡分配起见,
# 我们需要移动4096个槽点到16363上
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 #提示接受的node ID是多少,输入16363节点的id
Please enter all the source node IDs. #问你要从哪个源节点id抽取哈希槽
Type 'all' to use all the nodes as source nodes for the hash slots. #all表示从全部节点取哈希槽,这样的话将从各个源节点
Type 'done' once you entered all the source nodes IDs. #取出一部分哈希槽,凑够4096个,然后移动到16363节点上
Source node #1: all #输入all
接下来就开始迁移了,并且会询问你是否确认:
Moving slot 1359 from d2237fdcfbba672de766b913d1186cebcb6e1761
Moving slot 1360 from d2237fdcfbba672de766b913d1186cebcb6e1761
........................
Moving slot 1364 from d2237fdcfbba672de766b913d1186cebcb6e1761
Do you want to proceed with the proposed reshard plan (yes/no)? yes #输入yes并回车后,redis就会正式执行重新分片操作
#将制定的哈希槽从源节点一个个移动到16363节点上.
#迁移结束之后,我们来检查一下
#发现192.168.118.134:16363节点已经分配了哈希槽 slots:[0-1364],[5461-6826],[10923-12287] (4096 slots)共4096个
#这样 192.168.118.134:16363节点就能存数据了
[root@node1 bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
........................
>>> Performing Cluster Check (using node 192.168.118.129:6363)
........................
M: aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 192.168.118.134:16363
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master #已经分配了哈希槽
........................
[root@node1 bin]#
添加一个slave节点(redis扩容)
上面我们新加了一个192.168.118.134:16363 master节点,这个master节点还没slave,所以我们为它添加一个slave,slave的ip和端口是192.168.118.134:16364。
#解析:redis-cli --cluster add-node命令进行添加
# 192.168.118.134:16364是要新加入的节点ip和端口
#192.168.118.129:6363 指定任意一个集群节点即可,主要用于标识是哪个集群
#--cluster-slave表示新加入节点是slave节点,cluster-master-id 后面指定从节点属于哪个master节点,接master节点的id即可
[root@Redis bin]# ./redis-cli --cluster add-node 192.168.118.134:16364 192.168.118.129:6363 --cluster-slave --cluster-master-id aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 -a 123456
........................
>>> Send CLUSTER MEET to node 192.168.118.134:16364 to make it join the cluster.
Waiting for the cluster to join
>>> Configure node as replica of 192.168.118.134:16363.
[OK] New node added correctly.
[root@Redis bin]#
#查看集群信息,发现已经192.168.118.134:16364已经成为了192.168.118.134:16363的从节点了
[root@Redis bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
........................
S: 62371da329c3df4fdbda9d7c311813dba31a2acf 192.168.118.134:16364 #16364成为了16363的从节点
slots: (0 slots) slave
replicates aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63
M: aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 192.168.118.134:16363
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
1 additional replica(s)
........................
[root@Redis bin]#
删除master节点(缩容)
下面演示删除一个master节点:
删除节点使用命令:redis-cli --cluster del-node host:port node_id
#删除192.168.118.134:16363这个master节点,其id是aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63
[root@Redis bin]# ./redis-cli --cluster del-node 192.168.118.129:6363 aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 from cluster 192.168.118.129:6363
[ERR] Node 192.168.118.134:16363 is not empty! Reshard data away and try again. #提示我们节点非空,需要移除哈希槽
[root@Redis bin]#
#需要清空要删除的master节点的哈希槽,即重新分配哈希槽,将我们要删除的master节点的哈希槽分配到其它master上
[root@Redis bin]# ./redis-cli --cluster reshard 192.168.118.129:6363 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 192.168.118.129:6363)
..........................
M: aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 192.168.118.134:16363 #我们要删除这个,所以要把它的4096个哈希槽全部分出去
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
1 additional replica(s)
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363
slots:[12288-16383] (4096 slots) master
1 additional replica(s)
M: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364 #下面我们将指定这个master节点接收上面节点移除的哈希槽
slots:[6827-10922] (4096 slots) master
1 additional replica(s)
.......................
How many slots do you want to move (from 1 to 16384)? 4096 #输入我们要删除的master节点的哈希槽总个数,4096个
What is the receiving node ID? bd068279f9be9c50be53361705b7329168ff9938 #哪个master节点将接收这些哈希槽,这里输入192.168.118.133:6364节点id来接收
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: aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 #从哪个节点划分,这里当然是从我们要删除的master节点划分出哈希槽,所以输入我们要删除的master节点id
Source node #4: done #输入done表示完成
.............................................................. #开始前移哈希槽了
Do you want to proceed with the proposed reshard plan (yes/no)? #输入yes表示接收分配结果
#重新分配哈希槽完成,再次查看集群,这时要删除的节点192.168.118.134:16363已经没有哈希槽了
[root@Redis bin]# ./redis-cli --cluster reshard 192.168.118.129:6363 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 192.168.118.129:6363)
..........................
M: aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 192.168.118.134:16363 #我们要删除这个节点,已经没有哈希槽了
slots: (0 slots) master
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363
slots:[12288-16383] (4096 slots) master
1 additional replica(s)
M: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364 #哈希槽变成了8192个,因为原来的4096+我们要删除的哪个
#节点划分过来的4096个哈希槽就是8192
slots:[6827-10922] (8192 slots) master
1 additional replica(s)
.......................
#删除192.168.118.134:16363这个master节点,其id是aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63,这个节点哈希槽是0,能正常删除
[root@Redis bin]# ./redis-cli --cluster del-node 192.168.118.129:6363 aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node aa3e92db3e4f6cd417bb5a55f2e9ef3c9bef4d63 from cluster 192.168.118.129:6363
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
[root@Redis bin]#
#再次查看,已经没有192.168.118.134:16363这个master节点
[root@Redis bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
192.168.118.129:6363 (4101c25b...) -> 0 keys | 2730 slots | 1 slaves.
192.168.118.133:6363 (3143ff3b...) -> 0 keys | 2731 slots | 1 slaves.
192.168.118.133:6364 (bd068279...) -> 2 keys | 10923 slots | 2 slaves.
[OK] 2 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.118.129:6363)
M: 4101c25b914cae947072f6ce8e567e15b3dbd10e 192.168.118.129:6363
slots:[2731-5460] (2730 slots) master
1 additional replica(s)
S: 17abbfcc3c702f4daf0ed922bf4a62e6d58aa95f 192.168.118.132:6364
slots: (0 slots) slave
replicates 4101c25b914cae947072f6ce8e567e15b3dbd10e
S: 62371da329c3df4fdbda9d7c311813dba31a2acf 192.168.118.134:16364 #我们发现这个slave节点自动变成了其它master节点的从节点,
slots: (0 slots) slave #因为我们删掉了它之前的192.168.118.134:16363的主节点
replicates bd068279f9be9c50be53361705b7329168ff9938
S: f7247dad516e455172e92fe4564c3e1cd7c55ff7 192.168.118.132:6363
slots: (0 slots) slave
replicates bd068279f9be9c50be53361705b7329168ff9938
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363
slots:[13653-16383] (2731 slots) master
1 additional replica(s)
M: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364
slots:[0-2730],[5461-13652] (10923 slots) master
2 additional replica(s)
S: c33d45a803ee25d8e4542a41ecff91dde5ccfe20 192.168.118.129:6364
slots: (0 slots) slave
replicates 3143ff3b8a3d4d11fb03b11307db450b9eb28709
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@Redis bin]#
删除slave节点(缩容)
删除slave节点不需要重新分配哈希槽,因为slave节点没有哈希槽:
# 192.168.118.129:6363位置任意一个集群节点即可,后面输入要删除的slave的id即可
[root@Redis bin]# ./redis-cli --cluster del-node 192.168.118.129:6363 62371da329c3df4fdbda9d7c311813dba31a2acf -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 62371da329c3df4fdbda9d7c311813dba31a2acf from cluster 192.168.118.129:6363
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
[root@Redis bin]#
重新平衡哈希槽
刚才,redis的3个master节点上的哈希槽已经被数据分片的乱七八糟了,一个节点哈希槽少另一个节点哈希槽特别多,那么有没有办法让redis重新平衡各个master节点的哈希槽数量呢?答案是:可以。使用redis-cli --cluster rebalance
命令让redis重新调整每个master上的哈希槽数量以达到每个master节点数量平衡状态。
#查看集群,3个master节点的哈希槽数量验证失衡
[root@nginx bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
.......................
>>> Performing Cluster Check (using node 192.168.118.129:6363)
M: 4101c25b914cae947072f6ce8e567e15b3dbd10e 192.168.118.129:6363
slots:[2731-5460] (2730 slots) master
1 additional replica(s)
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363
slots:[13653-16383] (2731 slots) master
1 additional replica(s)
M: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364
slots:[0-2730],[5461-13652] (10923 slots) master
1 additional replica(s)
#使用redis-cli --cluster rebalance命令让redis重新调整每个master上的哈希槽数量以达到每个master节点平衡状态
[root@nginx bin]# ./redis-cli --cluster rebalance 192.168.118.129:6363 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 192.168.118.129:6363)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 3.00
Moving 2732 slots from 192.168.118.133:6364 to 192.168.118.129:6363
.....................
#查看集群状态,各个master的哈希槽数量已经平均了
[root@nginx bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.129:6363 (4101c25b...) -> 1 keys | 5462 slots | 1 slaves.
192.168.118.133:6363 (3143ff3b...) -> 1 keys | 5461 slots | 1 slaves.
192.168.118.133:6364 (bd068279...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 2 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.118.129:6363)
M: 4101c25b914cae947072f6ce8e567e15b3dbd10e 192.168.118.129:6363
slots:[0-5461] (5462 slots) master
1 additional replica(s)
M: 3143ff3b8a3d4d11fb03b11307db450b9eb28709 192.168.118.133:6363
slots:[5462-8191],[13653-16383] (5461 slots) master
1 additional replica(s)
M: bd068279f9be9c50be53361705b7329168ff9938 192.168.118.133:6364
slots:[8192-13652] (5461 slots) master
1 additional replica(s)
[root@nginx bin]#
常用命令
下面是一些常用的命令:
#启动redis
[root@Redis bin]# ./redis-server /usr/local/redis-6.2.6/etc/redis_6363.conf #指定配置文件启动实例
[root@Redis bin]# ./redis-server /usr/local/redis-6.2.6/etc/redis_6364.conf #指定配置文件启动实例
#登录redis
# 单实例登录
[root@Redis bin]# ./redis-cli -h 192.168.118.129 -p 6363 #登录正常
192.168.118.129:6363> auth 123456 #输入auth 密码登录
OK
192.168.118.129:6363>
# redis-cluster集群登录
redis-cli -c -h 192.168.118.129 -p 6363 -a 123456 # 命令行加上-c参数和-a参数
#停止/关闭redis
#可以直接使用redis-cli命令关闭redis实例,也可以先./redis-cli -h 192.168.118.129 -p 6363登陆进去然后再输入shutdown
[root@node1 bin]# ./redis-cli -h 192.168.118.129 -p 6363 -a 123456 shutdown #指定端口关闭redis实例
#集群健康检查
#在任意节点上某处某个节点的ip端口执行即可完成集群状态检查
[root@Redis bin]# ./redis-cli --cluster check 192.168.118.129:6363 -a 123456
#查看集群的信息
[root@Redis bin]# ./redis-cli --cluster info 192.168.118.129:6363 -a 123456
#查看集群的信息
[root@Redis bin]# ./redis-cli --cluster info 192.168.118.129:6363 -a 123456
#使用-c登录集群,可以登录任意一个集群,登录后会自动进行切换
[root@Redis bin]# ./redis-cli -c -h 192.168.118.129 -p 6363 -a 123456
#更多关于集群的命令,请查看帮助
[root@Redis bin]# ./redis-cli --cluster help
helm安装redis集群
kubectl create ns redis-cluster
helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo redis-cluster
helm pull bitnami/redis-cluster --version=10.0.0
tar xf redis-cluster-10.0.0.tgz
vim redis-cluster/value.yaml # 改下存储类和密码即可
global:
storageClass: "nfs-storageclass"
redis:
password: "123456"
persistence:
storageClass: "nfs-storageclass"
password: "123456"
# 安装redis集群到redis-cluster命名空间
helm -n redis-cluster install redis-cluster redis-cluster/
# 获取redis密码
export REDIS_PASSWORD=$(kubectl get secret --namespace "redis-cluster" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d)
# 可以部署一个redis客户端用于验证redis集群
cat << 'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: redis-cluster-client
name: redis-cluster-client
namespace: redis-cluster
spec:
replicas: 1
selector:
matchLabels:
app: redis-cluster-client
template:
metadata:
labels:
app: redis-cluster-client
spec:
containers:
- image: docker.io/bitnami/redis-cluster:7.2.4-debian-12-r9
name: redis-cluster
env:
- name: REDIS_NODES
value: 'redis-cluster-0.redis-cluster-headless redis-cluster-1.redis-cluster-headless
redis-cluster-2.redis-cluster-headless redis-cluster-3.redis-cluster-headless
redis-cluster-4.redis-cluster-headless redis-cluster-5.redis-cluster-headless '
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
key: redis-password
name: redis-cluster
EOF
# 检查redis集群是否正常
kubectl -n redis-cluster exec -it redis-cluster-client-b5546f6c7-vnzr2 -- bash
# 检查集群健康状态
redis-cli --cluster check redis-cluster-0.redis-cluster-headless:6379 -a $REDIS_PASSWORD
# 使用redis客户端登录
redis-cli -c -h redis-cluster -a $REDIS_PASSWORD
redis cluster模式下不支持select n
redis-cluster集群模式是没有select n的,因为redis-cluster默认下只支持是db 0 ,不能切换到其他库,例如:执行select 0返回ok,但执行
select 1则返回(error) ERR SELECT is not allowed in cluster mode
redis-cluster集群登录命令、健康检查命令
# 检查redis集群健康状态
redis-cli --cluster check 192.168.118.129:6363 -a 123456
# 登录redis-cluster集群,
#-c是Enable cluster mode,-a是指定密码,在命令行指定密码可以使在插入key的时候不用验证密码
redis-cli -c -h 192.168.118.129 -p 6363 -a 123456
总结
1、本篇讲了如何搭建redis的集群模式,redis的cluster模式也是官方最推荐的一种模式;
2、3台主机,每台启动2个redis实例,一共构成6个节点的cluster模式的集群;
3、自动创建redis集群,手动创建redis集群;
4、添加一个master节点,添加完后还需要重新分配哈希槽给新的master,这样它才能存数据;
5、添加一个salve节点,可以给新的master加slave节点,也可以给已存在的master节点加slave,构成一个主带多个从;
6、删除一个master之前要保证该master节点哈希槽为0,即要先重新数据分片,将它的哈希槽划分给其他master节点,这样才能使用redis-cli --cluster del-node
命令删除master节点。
7、删除一个slave节点可以使用redis-cli --cluster del-node
命令删除,slave又没有哈希槽,可以直接删除。
8、使用redis-cli --cluster rebalance
命令可以让redis重新调整每个master上的哈希槽数量以达到每个master节点数量平衡状态。
9、如果是在k8s集群上部署redis集群,使用helm部署即可。
10、redis-cluster模式下不支持select 1切换库,因为redis-cluster 只支持db 0 。
11、在redis-cluster模式下,使用keys *
只能看到当前自己节点的全部key,set key、get key
都会重定向到对应的节点添加或查询。