Redis Cluster集群扩容主从节点详细教程

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 文章目录1.Cluster集群扩容概念2.在新节点部署redis cluster3.使用工具将redis-4加入集群3.1.安装ruby环境3.2.将redis-4加入集群4.将槽位重新分配4.1.所有节点分出槽位给新节点4.2.迁移指定节点的槽位给新节点4.3.查看集群信息及状态5.配置四主四从交叉复制5.1.配置四主四从交叉复制5.2.查看集群信息及状态

1.Cluster集群扩容概念

当redis数据量日渐增长,当内存不够用的时候,这时候就需要集群扩容了,cluster集群扩容可以增加内存也可以增加节点,因为redis数据都是存在内存中

redis cluster增加节点进行扩容步骤:

1.在新的服务器上部署redis cluster

2.使用工具将新部署的节点加到集群中

3.使用工具将集群槽位重新分配

4.将主从复制关系调整成交叉模式

扩容原理: 原来的节点算好要拿出多少的槽位给新加的节点,新加的节点准备导入的槽位,准备的前提条件就是加入集群,一切准备就绪后,主节点将划分出来的槽位分配给新节点,然后将相关槽位的数据迁移到新的节点


4个节点的redis cluster,每个节点的槽位时16384/4,一个节点4096个槽位

扩容前后的架构图对比图

新增节点后,主从复制就变成了四主四从,只需要变动192.168.81.230的从库关系即可,192.168.81.230节点从库复制192.168.81.240节点的主库,192.168.81.240从库复制192.168.81.210的主库

环境准备

image.png

2.在新节点部署redis cluster

1.将redis管理工具从redis-1拷贝到redis-4并安装
[root@redis-1 ~]# scp -rp /data/redis_cluster root@192.168.81.240:/data
[root@redis-4 ~]# cd /data/redis_cluster/redis-3.2.9
[root@redis-4 /data/redis_cluster/redis-3.2.9]# make install 
2.创建部署路径
[root@redis-4 ~]# mkdir -p /data/redis_cluster/redis_{6390,6391}/{conf,data,logs,pid}
2.准备配置文件
[root@redis-4 ~]# cat > /data/redis_cluster/redis_6390/conf/redis_6390.conf <<EOF
bind $(ifconfig | awk 'NR==2{print $2}')
port 6390  
daemonize yes
logfile /data/redis_cluster/redis_6390/logs/redis_6390.log
pidfile /data/redis_cluster/redis_6390/pid/redis_6390.log
dbfilename "redis_6390.rdb"
dir /data/redis_cluster/redis_6390/data
cluster-enabled yes
cluster-config-file node_6390.conf
cluster-node-timeout 15000
save 60 10000
save 300 10
save 900 1
EOF
[root@redis-4 ~]# cat > /data/redis_cluster/redis_6391/conf/redis_6391.conf <<EOF
bind $(ifconfig | awk 'NR==2{print $2}')
port 6391  
daemonize yes
logfile /data/redis_cluster/redis_6391/logs/redis_6391.log
pidfile /data/redis_cluster/redis_6391/pid/redis_6391.log
dbfilename "redis_6391.rdb"
dir /data/redis_cluster/redis_6391/data
cluster-enabled yes
cluster-config-file node_6391.conf
cluster-node-timeout 15000
save 60 10000
save 300 10
save 900 1
EOF
3.启动redis
[root@redis-4 ~]# ./redis_shell.sh start 6390
[root@redis-4 ~]# ./redis_shell.sh start 6391

3.使用工具将redis-4加入集群

在原来集群的任意一台机器安装了ruby环境即可操作

3.1.安装ruby环境

//安装ruby管理工具  
[root@redis-1 ~]# yum -y install rubygems   
//移除官网源
[root@redis-1 ~]# gem sources --remove https://rubygems.org/      
https://rubygems.org/ removed from sources
//增加阿里云源
[root@redis-1 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/
http://mirrors.aliyun.com/rubygems/ added to sources
//更新缓存
[root@redis-1 ~]# gem update --system
ruby2.3.0以下版本执行会报错
//安装ruby支持redis的插件
[root@redis-1 ~]# gem install redis -v 3.3.5
Fetching: redis-3.3.5.gem (100%)
Successfully installed redis-3.3.5
Parsing documentation for redis-3.3.5
Installing ri documentation for redis-3.3.5
1 gem installed

3.2.将redis-4加入集群

需要将redis-4的6390和6391端口都加入到集群,可以使用工具进行添加

命令:./redis-trib.rb add-node 新节点:端口 现有集群:端口

[root@redis-1 ~]# cd /data/redis_cluster/redis-3.2.9/src/
[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb add-node 192.168.81.240:6390 192.168.81.210:6380
[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb add-node 192.168.81.240:6391 192.168.81.210:6380

查看集群信息,已经有8个节点

[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes
ce75dacf45d3ad4f852b7fb4d359a295b8a2bcdd 192.168.81.220:6380 master - 0 1612424799243 2 connected 5461-10922
9b7641253ea66073d865accdd4460d2877f9ff5d 192.168.81.220:6381 master - 0 1612424801262 8 connected 10923-16383
b19722a1d3d482a2c6eaaec15e5e72018600389f 192.168.81.240:6391 master - 0 1612424797227 0 connected
6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2 192.168.81.240:6390 master - 0 1612424796216 9 connected
bdd20b03b573b2def6a9ee5053a75867709fc908 192.168.81.210:6381 slave ce75dacf45d3ad4f852b7fb4d359a295b8a2bcdd 0 1612424796721 4 connected
812ae8ccf55d8994f1f9d30a20f6cff42fb24b4a 192.168.81.230:6380 slave 9b7641253ea66073d865accdd4460d2877f9ff5d 0 1612424800253 8 connected
904a0109976cae38e5a3059fd70ce2727a0ed8fb 192.168.81.230:6381 slave b61b8d0421b94b9de7267dda6c6f401a42622047 0 1612424798232 6 connected
b61b8d0421b94b9de7267dda6c6f401a42622047 192.168.81.210:6380 myself,master - 0 0 1 connected 0-5460

4.将槽位重新分配

当新节点加入集群后,需要重新分配槽位,否则整个集群是无法使用的

命令格式./redis-trib.rb reshard 集群任意一个主库的ip:端口

分配的时候可以选择all,直接将所有节点分出一部分槽位迁移给新节点

也可以指定某个节点迁移出一部分槽位给新节点

4.1.所有节点分出槽位给新节点

[root@redis-1 ~]# cd /data/redis_cluster/redis-3.2.9/src
[root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380
How many slots do you want to move (from 1 to 16384)? 4096      //需要迁移的槽位数量,也就是要拿出多少个槽位给新节点,我们输入4096,因为16384除4刚好是4096
What is the receiving node ID? 6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2     //迁移给目标节点的ID号,也就是新节点的6390ID号,6390作为新节点的主库
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:all
    //迁移方式:all将所有主节点分出一部分槽位给新节点
Do you want to proceed with the proposed reshard plan (yes/no)? yes     //是否继续分配

设置要迁移的槽位数量,填写4096

填写要迁移到目标节点的ID号,也就是要迁移给谁,这里我们要迁移给新加的节点,我们要让新机器的6390节点成为主库,因此就填写6390节点的ID号

设置要从哪个节点上迁移槽位,可以一台一台的迁移,也可以填写all,all的意思是从所有节点上一共取出4096个槽位分给新机器,如果使用all迁移,会把所有主节点迁移出一部分槽位给新节点,执行完all直接就退出工具

我们使用all自动将所有主节点进行迁移,直接输入all即可自动迁移,一般都使用all

提示我们是否继续分配,我们选择yes

迁移完成自动退出程序

4.2.迁移指定节点的槽位给新节点

前面步骤一致,只需要在source node选择指定节点即可

填写要迁移的主节点ID,填写完主机节点ID后,输入done,回车之后开始迁移数据

提示我们是否继续,我们输入yes

开始数据迁移

4.3.查看集群信息及状态

当6390分配完槽位后,可以看下集群信息是否分配成功

[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes

可以看到6390上有3段槽位号,说明是从三个节点上分出来的,正好也验证了之前说的一句话,槽位顺序不一定要存在,只要槽位数量够就可以

再次使用reshard命令即可看到都是4096个槽位

查看集群状态

[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:8               #节点数已经是8个了
cluster_size:4
cluster_current_epoch:11
cluster_my_epoch:1
cluster_stats_messages_sent:67364
cluster_stats_messages_received:67293

5.配置四主四从交叉复制

目前是5个主节点3个从节点,显然是不合理的,我们要手动配置一些交叉复制实现四主四从

只需要操作192.168.81.230的6381端口和192.168.81.240的6391端口即可

192.168.81.230的6381端口作为192.168.81.240的6390端口的从库

192.168.81.240的6391作为192.168.81.210的6380端口的从库

再配置与新节点交叉复制的时候,建议先操作192.168.81.230,这样192.168.81.210的主库就没有需要传输rdb文件到从库了,也可以减轻主库的压力,如果先让192.168.81.240配置交叉,这样一来192.168.81.210的主库就有2份复制了,主库就需要一次传输2份rdb文件,压力也就大了

注意:先做192.168.81.230的交叉在做192.168.81.240的交叉

5.1.配置四主四从交叉复制

1.将master主库的所有ID获取下来
[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes | grep 'master' | awk '{print $1,$2}'
ce75dacf45d3ad4f852b7fb4d359a295b8a2bcdd 192.168.81.220:6380
6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2 192.168.81.240:6390
812ae8ccf55d8994f1f9d30a20f6cff42fb24b4a 192.168.81.230:6380
b61b8d0421b94b9de7267dda6c6f401a42622047 192.168.81.210:6380
2.建议在记事本里准备好命令
redis-3同步redis-4
192.168.81.230:6381> CLUSTER REPLICATE 6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2
redis-4同步redis-3
192.168.81.240:6391> CLUSTER REPLICATE b61b8d0421b94b9de7267dda6c6f401a42622047

5.2.查看集群信息及状态

[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes
[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:8
cluster_size:4
cluster_current_epoch:11
cluster_my_epoch:1
cluster_stats_messages_sent:69698
cluster_stats_messages_received:69627
[root@redis-1 ~]# 

已经是三主三从了,并且集群状态也是ok

相关实践学习
基于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
目录
相关文章
|
15天前
|
缓存 NoSQL Redis
Redis原理—3.复制、哨兵和集群
详细介绍了Redis的复制原理、哨兵原理和集群原理。
|
7月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
260 0
|
3月前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
90 5
|
7月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
|
7月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
|
3天前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
Redis应用—8.相关的缓存框架
|
1月前
|
缓存 NoSQL 中间件
Redis,分布式缓存演化之路
本文介绍了基于Redis的分布式缓存演化,探讨了分布式锁和缓存一致性问题及其解决方案。首先分析了本地缓存和分布式缓存的区别与优劣,接着深入讲解了分布式远程缓存带来的并发、缓存失效(穿透、雪崩、击穿)等问题及应对策略。文章还详细描述了如何使用Redis实现分布式锁,确保高并发场景下的数据一致性和系统稳定性。最后,通过双写模式和失效模式讨论了缓存一致性问题,并提出了多种解决方案,如引入Canal中间件等。希望这些内容能为读者在设计分布式缓存系统时提供有价值的参考。感谢您的阅读!
130 6
Redis,分布式缓存演化之路
|
3月前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
205 85
|
2月前
|
存储 缓存 NoSQL
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应