HM-SpringCloud微服务系列10.4【Redis分片集群】

image

1. 搭建分片集群

1.1 集群结构

分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
image
这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:

IP PORT 角色
10.193.193.141 7001 master
10.193.193.141 7002 master
10.193.193.141 7003 master
10.193.193.141 8001 slave
10.193.193.141 8002 slave
10.193.193.141 8003 slave

1.2 准备实例和配置

删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:

# 进入/tmp目录
cd /tmp
# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003

在/tmp下准备一个新的redis.conf文件,内容如下:

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 10.193.193.141
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log

将这个文件拷贝到每个目录下:

# 进入/tmp目录
cd /tmp
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:

# 进入/tmp目录
cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

image
image
image
image
image
image

1.3 启动

因为已经配置了后台启动模式,所以可以直接启动服务而不需要打开六个窗口:

# 进入/tmp目录
cd /tmp
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

通过ps查看状态:

ps -ef | grep redis

如果要关闭所有进程,可以执行命令:

ps -ef | grep redis | awk '{print $2}' | xargs kill

或者(推荐这种方式):

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

image

1.4 创建集群

虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。

1.4.1 Redis5.0之前(了解)

Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。

 # 安装依赖
 yum -y install zlib ruby rubygems
 gem install redis

然后通过命令来管理集群:

# 进入redis的src目录
cd /tmp/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

1.4.2 Redis5.0之后(采用)

我们使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:

redis-cli --cluster create --cluster-replicas 1 10.193.193.141:7001 10.193.193.141:7002 10.193.193.141:7003 10.193.193.141:8001 10.193.193.141:8002 10.193.193.141:8003

命令说明:

  • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
  • create:代表是创建集群
  • --replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

image
这里输入yes,则集群开始创建:
image
通过命令可以查看集群状态:

redis-cli -p 7001 cluster nodes

image

1.5 测试

尝试连接7001节点,存储一个数据:

# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1

结果悲剧了:
image
集群操作时,需要给redis-cli加上-c参数(表示集群)才可以:

redis-cli -c -p 7001

这次可以了:
image

2. 散列插槽

image

  1. Redis如何判断某个key应该在哪个实例?
    • 将16384个插槽分配到不同的实例
    • 根据key的有效部分计算哈希值,对16384取余
    • 余数作为插槽,寻找插槽所在实例即可
  2. 如何将同一类数据固定的保存在同一个Redis实例?
    • 这一类数据使用相同的有效部分,例如key都以{typeId}为前缀

image
image
image

3. 集群伸缩

3.1 添加一个节点到集群

image

3.2 案例

image


image
image
image
image
image
可以看到7004虽然已创建好,但它还未被分配插槽
image
0-2765
image
image
输入done后回车
image
输入yes后回车
image
可以看到7004的插槽已经分配好了
image

3.3 练习

image
image
redis-cli --cluster del-node 10.193.193.141:7004 e158cec2a0ac1bb57310e4622343056d8803fdcb
redis-cli -p 7001 cluster nodes
image
报错提醒7004节点不是空的,需要移除插槽才能删除该节点
下面进行reshard操作,参考3.2 案例
实际就是3.2 案例的逆操作,将7001原先分给7004的3000个插槽还回去
image
image
image
image

4. 故障转移

4.1 故障转移

image
image
image
image
主节点7002挂掉后,一个从节点8001变为了主节点
现在,重启7002,发现7002变为了从节点
至此,默认的主从切换实现了

4.2 数据迁移

image

4.3 案例

接4.1,实现4.2
image
image

5. RedisTemplate访问分片集群

image
在哨兵的演示(RedisTemplate的哨兵模式https://www.cnblogs.com/yppah/p/16183293.html)中第一步和第三步已经配置好了,所以此处仅需再配置第二步即可
image
image
image
image
image
image
image
image
image
image

主节点既可以读又可以写,从节点只能读,写只能在主节点上进行

posted @   yub4by  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-04-26 Ubuntu18.04+ROS Melodic
2021-04-26 16.3.1【deque容器基本概念、构造函数】
2021-04-26 《Python3天快速入门机器学习》day1:机器学习概述+特征工程
2021-04-26 《Python3天快速入门机器学习》day2:分类算法
2021-04-26 《Python3天快速入门机器学习》day3:回归算法+聚类算法
点击右上角即可分享
微信分享提示