Redis分片集群
Redis分片集群
概念
Redis分片集群是用于将Redis的数据分布在多个Redis节点上的分布式系统。通过分片集群,可以将数据分成多个部分,并将每个部分存储在不同的节点上,以便实现Redis的高可用性和高性能。
Redis分片集群原理
Redis分片集群原理是将数据分成多个部分,并将每个部分存储在不同的节点上。这样可以实现Redis的高可用性和高性能。Redis分片集群采用一种称为“哈希分片”的方法来将数据分配到不同的节点上。具体来说,哈希分片使用一个称为键的字符串作为输入,并根据键的哈希值来确定该键所属的节点。这样可以保证相同键的请求始终路由到同一个节点上,从而实现数据的分区和负载均衡。
在Redis分片集群中,节点之间会互相通信,以便实现数据的一致性和高可用性。当一个节点发生故障时,其他节点可以自动地将故障节点上的数据转移到其他可用的节点上,以保证数据的可用性。此外,当客户端需要访问某个键时,它需要先找到该键所属的节点,然后才能进行后续操作。为了实现这个功能,Redis分片集群通常会使用一种称为“代理”的组件,来帮助客户端找到正确的节点。
总的来说,Redis分片集群的原理是通过对数据进行分区和负载均衡来实现高可用性和高性能。通过使用哈希分片和代理等技术,Redis分片集群可以有效地处理大规模的数据和高并发请求。
分片集群结构
主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:
- 海量数据存储问题
- 高并发写的问题
使用分片集群可以解决上诉问题,分片集群特征:
- 集群中有多个master,每个master保存不同数据
- 每个master都可以由多个slave节点
- master之间通过ping检测彼此健康状态
搭建分片集群
这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:
IP | PORT | 角色 |
---|---|---|
192.168.78.129 | 7001 | master |
192.168.78.129 | 7002 | master |
192.168.78.129 | 7003 | master |
192.168.78.129 | 8001 | slave |
192.168.78.129 | 8002 | slave |
192.168.78.129 | 8003 | slave |
我的redis安装在 /tmp 目录下:
在/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 192.168.78.129
# 保护模式
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
启动
因为已经配置了后台启动模式,所以可以直接启动服务:
# 进入/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
创建集群
虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。
Redis5.0以后
我们使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:
redis-cli --cluster create --cluster-replicas 1 192.168.78.129:7001 192.168.78.129:7002 192.168.78.129:7003 192.168.78.129:8001 192.168.78.129:8002 192.168.78.129:8003
命令说明:
redis-cli --cluster
或者./redis-trib.rb
:代表集群操作命令create
:代表是创建集群--replicas 1
或者--cluster-replicas 1
:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)
得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
这里输入yes,则集群开始创建:
通过命令可以查看集群状态:
redis-cli -p 7001 cluster nodes
集群操作时,需要给redis-cli
加上-c
参数才可以:
redis-cli -c -p 7001
散列插槽
Redis 会把每一个master节点映射到0~16383共 16384个插槽上,查看集群信息时就能看到:
数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值(HASH_SLOT = CRC16(key) mod 16384),分两种情况:
- key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分
- key中不包含“{}”,整个key都是有效部分
例如: key是 num,那么就根据 num 计算,如果{itcast} num,根据itcast计算,计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。
集群伸缩
redis-cli --cluster 提供了很多操作集群的命令,可以通过下面方式查看:
比如,添加节点的命令:
案例
向集群中添加一个新的master节点,并向其中存储 num = 10
需求:
- 启动一个新的redis实例,端口为7004
- 添加7004到之前的集群,并作为一个master节点
- 给7004节点分配插槽,使得num这个key可以存储到7004实例
在/tmp 目录下创建一个新的目录 7004:
cd /tmp
mkdir 7004
复制之前创建的redis.conf 文件到 7004 目录下,同时修改配置文件信息:
cp redis.conf 7004
# 修改配置文件信息
sed -i s/6379/7004/g 7004/redis.conf
启动:redis-server 7004/redis.conf
查看:ps -ef | grep redis
通过redis-cli将7004添加到集群中:
redis-cli --cluster add-node 192.168.78.129:7004 192.168.78.129:7001
通过 redis-cli -p 7001 cluster nodes
查看集群状态
我们发现,在7004上并没有分配对应的插槽,也就意味着即使加入了集群,也没办法实现数据的存储
将7001 的插槽分配到7004 中
# 重新分配
redis-cli --cluster reshard <host:port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
- <host:port> - 集群中任意一个节点的host:port,用于连接到集群
- cluster-from <node-id> - 源节点ID,将要移动slot的节点
- cluster-to <node-id> - 目标节点ID,接收slot的节点
- cluster-slots <number of slots> - 要移动的slot数量
- cluster-yes - 确认reshape操作
redis-cli --cluster reshard 192.168.78.129:7001
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)