Redis Cluster高可用集群搭建

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis Cluster高可用集群搭建

在前面两篇文章中,分别介绍了Redis的主从复制哨兵模式,这篇文章我们来介绍一下Redis官方推荐的集群部署方案Redis Cluster,以及它的动态扩容、缩容过程。

Redis Cluster集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。它不需要Sentinel哨兵也能完成节点移除和故障转移的功能,并且它的性能和高可用性均优于哨兵模式,集群配置也非常简单。

在配置过程中,需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,官方文档称可以线性扩展到 1000节点。

image.png

首先我们采用原生搭建的方式搭建3主3从的Redis Cluster,分别给3个master节点配置一个slave节点,总计6个Redis节点。

1、修改配置文件

通用配置:

bind 0.0.0.0
port 7000
pidfile /var/run/redis_7000.pid
logfile "redis7000.log"
dbfilename dump7000.rdb
dir /home/hydra/files/redis/cluster/redis7000
masterauth 123456   
requirepass 123456
appendonly yes 
appendfilename "appendonly7000.aof"

核心配置:

cluster-enabled yes
cluster-config-file nodes-7000.conf #这个config会保存集群配置
cluster-node-timeout 15000  #超时时间
cluster-replica-validity-factor 10
cluster-require-full-coverage  no  #重要配置

修改其余5个配置文件中的端口号,然后分别启动6个Redis实例:

image.png

登陆redis-cli,使用cluster nodes 指令查看集群状态,现在集群下只存在当前一个节点

image.png

其他5台Redis实例相同,当前仍然处于各自独立状态

2、集群节点关联

使用meet指令进行集群下节点的关联,在7000节点上执行:

cluster meet 127.0.0.1 7001

这样7000和7001节点就能通讯了,再执行cluster nodes,可以看见节点已经关联了。如果再关联一个节点,那么3个节点都会互相关联。继续执行:

cluster meet 127.0.0.1 7002
cluster meet 127.0.0.1 7003
cluster meet 127.0.0.1 7004
cluster meet 127.0.0.1 7005

这样6台redis实例就全部关联起来了:

image.png

但是可以看到,当前默认全都是master节点,没有从节点,仍然不能进行写入操作。

3、指派槽位(slot)

首先尝试向节点写入值,写入失败,提示没有分配slot槽位

image.png

这里首先解释槽位的概念,Redis集群中内置了16384个哈希槽,当需要在 Redis集群中放置一条数据时,Redis先对key使用crc16算法算出一个结果,然后把结果对16384取余,这样每个key都会对应一个编号在0-16383之间的哈希槽,Redis会根据节点数量大致均等的将哈希槽映射到不同的节点。映射流程如下图所示:

image.png

当前配置架构为3主3从形式,平均分配16384个槽位:

  • 节点7000分配:0-5461
  • 节点7001分配:5462-10922
  • 节点7002分配:10923-16383

分配槽位指令:

cluster addslots slot #slot为槽位下标

那么在redis7000势力上就需要执行:

cluster addslots 0
...
cluster addslots 5461

如果要所有key值都能正常执行,需要手动执行16384次,因此创建脚本进行批量执行:

start=$1
end=$2
port=$3
for slot in `seq ${start} ${end}`
do
    echo "slot:${slot}"
    /home/hydra/files/redis/redis-5.0.4/src/redis-cli -h 127.0.0.1 -p ${port} -a 123456 cluster addslots ${slot}
done

执行shell脚本:

sh addslots.sh 0 5461 7000
sh addslots.sh 5462 10922 7001
sh addslots.sh 10923 16383 7002

查看集群状态:

image.png

显示槽位分配成功,需要注意在Redis Cluster中,只有master主机才有槽位的概念,从机不需要分配槽位。当前我们采用的是平均分配的方式,在实际环境下,如果服务器性能有差别,可以往性能好的服务器多分配一些槽位。

4、分配主从

Redis cluster分配主从命令:

cluster replicate node-id

如果要让7003作为7000的从机,首先登录7003,执行:

cluster replicate  9d73de74af827cd5025dcd3910d8c2919d9aa24b

后面的40位id为redis7000的node-id。继续将redis7004的主机指派为redis7001,reids7005的主机指派为redis7002。查看集群状态:

image.png

其中,集群的信息会被保存到集群的配置信息会存到redis700x/node-700x.conf的配置文件中。

以集群方式运行客户端,在redis-cli加上启动参数-c

../redis-5.0.4/src/redis-cli -h 172.16.67.134 -p 7000 -a 123456 -c

尝试写入数据,不同数据会根据槽位不同被写到不同主机上

image.png

到这,3主3从的架构的Redis Cluster就搭建完毕了。

image.png

除了手动使用命令搭建Redis Cluster外,还可以使用Redis提供的内置指令来进行一键快速搭建。首先,与手动搭建相同,先修改配置文件,配置与上面完全相同,修改完成后启动。

启动完成后,使用cluster create指令进行搭建:

../redis-5.0.4/src/redis-cli --cluster create 
    127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 
    127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8006 
    --cluster-replicas 1  -a 123456

这里的--cluster-replicas 1 表示1主1从架构。如果要分配为1主2从,那么就要写成:

--cluster-replicas 2

image.png

输入yes进行确认:

image.png

搭建完成,查看一下集群状态:

image.png

包括meet,槽位分配和主从分配全部自动完成。

image.png

1、准备新节点

新建两个redis7006,redis7007,将之前的配置文件拷过来,启动实例。这时候这两个是孤立的节点:

image.png

2、将新的主节点加入集群

使用redis-cli,语法为:

--cluster add-node <newNode ip:port> <oldNode ip:port>

执行:

../redis-5.0.4/src/redis-cli --cluster add-node 
    127.0.0.1:7006 127.0.0.1:7000 -a 123456

执行完成后,新节点被加入集群中:

image.png

添加完成后,默认加进来是master节点,并且没有分配槽位:

image.png

3、添加从节点,并指定它的主节点

语法:

--cluster add-node <newIp:port> <oldIp:port> 
  --cluster-slave --cluster-master-id masterID

执行:

../redis-5.0.4/src/redis-cli --cluster add-node 
  127.0.0.1:7007 127.0.0.1:7000  
  --cluster-slave --cluster-master-id edc8ff41aef320beb5081c5b50bf32485a7ffb9e 
  -a 123456

redis7007被指定为redis7006的从节点:

image.png

查看集群状态:

image.png

4、迁移槽位和数据

语法:

/redis-cli --cluster reshard <ip:port>

执行:

../redis-5.0.4/src/redis-cli 
  --cluster reshard 172.16.67.134:7000  -a 123456

迁移过程中,会进行询问:

  • How many slots do you want to move (from 1 to 16384)?
    提示要分配多少槽:平均分到4个实例,所以输入4096
  • What is the receiving node ID?  
    接收节点ID:输入7006的node-id
  • 【all/done】从哪些分配

       all,所有节点平均分配

       或手动输入node-id分配,done结束

查看集群状态:

image.png

分配完成后,可以查看7006的槽位,看出3个主节点每个都给它分配了一些槽位:

  • 0-1365
  • 5462-6826
  • 10923-12287

image.png

在集群缩容中,我们需要先删除槽位,再删除节点。如果直接删除一个主节点,那么它的从节点就会变成主节点。

1、下线迁移槽

语法:

redis-cli --cluster reshard --cluster-from 要迁出节点ID 
  --cluster-to 接收槽节点ID --cluster-slots 迁出槽数量 
  已存在节点ip 端口

首先将7006的 0-1365迁移回7000,执行:

../redis-5.0.4/src/redis-cli --cluster reshard  
  --cluster-from  edc8ff41aef320beb5081c5b50bf32485a7ffb9e 
  --cluster-to 9d73de74af827cd5025dcd3910d8c2919d9aa24b 
  --cluster-slots 1366 127.0.0.1 7000 -a 12345

之后同样的方式将其余槽位迁移回redis7001和redis7002节点。执行完成后,redis7006上的槽位全部被迁移回3台主机:

image.png

2、删除节点

语法:

redis-cli --cluster del-node 已存在节点ID:端口 要删除的节点ID

先删除7006:

../redis-5.0.4/src/redis-cli --cluster del-node  
  127.0.0.1:7000 edc8ff41aef320beb5081c5b50bf32485a7ffb9e 
  -a 123456

image.png

执行完成后,节点会关机,后台会直接杀死redis7006的进程。再看一下集群状态:

image.png

这时候会把redis7007分配给其他的主节点作为从节点,这是因为redis7006没有槽位和数据,因此没有发生故障转移,把redis7007升级为主节点。那么我们再看一下故障转移过程,使用kill指令杀死redis7000进程后:

image.png

redis7000变成fail状态,并且它的从机redis7003继承了它的槽位和数据。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
14天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
193 0
|
23天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
149 2
|
28天前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
138 0
|
2月前
|
运维 NoSQL 算法
Redis-Cluster 与 Redis 集群的技术大比拼
Redis-Cluster 与 Redis 集群的技术大比拼
47 0
|
1天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
116 10
|
14天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
22天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
31 0
面试官:如何搭建Redis集群?
|
26天前
|
存储 缓存 NoSQL
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)(一)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)
254 0
|
1月前
|
NoSQL Redis Docker
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
64 0
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群

热门文章

最新文章