百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis高可用集群之水平扩展(redis集群性能)

mhr18 2024-11-09 12:18 16 浏览 0 评论

Redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片等特性,集群模式没有中心节点,可水平扩展,根据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点),但是水平扩展相对比较麻烦,接下来带大家看看如何做Redis高可用集群水平扩展。

原集群由6个Redis节点组成,分布在三台机器上,采用三主(master)三从(slave)的模式:

IP为192.168.1.6的机器Redis实例分别为,master:6380;slave:6379。

IP为192.168.1.7的机器Redis实例分别为,master:6381;master:6382。

IP为192.168.1.8的机器Redis实例分别为,master:6383;slave:6384。

接下来做Redis高可用集群水平扩展,在IP为192.168.1.6的机器上创建两个Redis实例,水平扩展之后变成四主(master)四从(slave)的集群模式,如下图:

1.通过客户端连接Redis实例

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6379

2.查看集群状态

192.168.1.6:6379>cluster nodes

从集群结果中可以看出整个redis集群运行正常,三个master主节点和三个slave从节点,主节点master分配了存储数据的hash槽位, 而slave节点是每个主节点的备份从节点,不显示存储槽位。

3.水平扩展集群操作

3.1 创建一主(master)一从(slave)Redis实例

cd /usr/local/redis/etc

#复制配置文件

cp redis-6380.conf redis-6385.conf

cp redis-6380.conf redis-6386.conf

#修改配置文件

vim redis-6385.conf

#端口号

port 6385

#pidfile的路径

pidfile /usr/local/redis/logs/redis-6385.pid

#日志文件的路径

logfile /usr/local/redis/logs/redis-6385.log

#持久化数据存放的目录

dir /usr/local/redis/data/6385/

#集群节点信息文件,最好与port端口对应

cluster‐config‐file nodes‐6385.conf

配置文件redis-6386.conf和Redis实例6385修改方法一样。

3.2 启动新增的两个Redis实例并查看

cd /usr/local/redis/bin

#启动Redis实例

./redis-server /usr/local/redis/etc/redis-6385.conf

./redis-server /usr/local/redis/etc/redis-6386.conf

#查看服务状态

ps -ef|grep redis

3.3 查看Redis集群命令帮助

/usr/local/redis/bin/redis-cli --cluster help

帮助说明如下:

create:创建一个集群环境host1:port1 ... hostN:portN。

check:检查集群状态。

reshard:集群环境重新分片。

rebalance:平衡集群节点slot数量。

add-node:将一个节点添加到集群里,参数:new_host:new_port existing_host:existing_port,第一个参数为新节点(new_host)的ip:port,第二个参数为集群中任意一个已经存在的节点(existing_host)的ip:port。

del-node:移除一个节点。

call:可以执行redis命令。

3.4 配置Redis实例6385为集群主节点

#使用命令add-node新增一个主节点6385。

/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.6:6385 192.168.1.6:6380

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6379

192.168.1.6:6379>cluster nodes

当新节点加入集群后,节点没有任何数据,因为它还没有分配存储hash槽位(slot),需要手工为新节点分配hash槽位。

#使用命令reshard重新为节点分配槽位

/usr/local/redis/bin/redis‐cli ‐a 123456 ‐‐cluster reshard 192.168.1.6:6380

3.5 配置Redis实例6386为主节点6386的从节点

#将redis实例6386节点添加到集群中

/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.6:6386 192.168.1.6:6380

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

已经成功将redis实例6386添加到集群,并且还是master,还没有分配hash槽位。

#通过执行replicate命令来指定当前从节点的主节点为哪个,首先需要连接新加的6386节点的客户端,然后使用集群命令进行操作,把当前的6386(master)节点指定到一个主节点6385(master)下成为从节点。

#连接客户端

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6386

#执行replicate命令来指定

192.168.1.6:6386> cluster replicate 6a14670fcf844b7ea35177a40b49ea50e36286fe

至此Redis高可用集群水平扩展完成。

4.水平扩展集群删除操作

4.1.先删除从节点

#通过命令del-node先删除从节点6386,指定删除节点ip和端口,以及节点id

/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.1.6:6386 58ddf8c9ff21225dea479f3cc1b158ed78b00829

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

redis从节点6385已经移除,并且该节点的redis服务已经停止服务。

4.2.最后删除主节点

#删除主节点相对麻烦,因为主节点里分配了hash槽位,先要把主节点里的hash槽位移除到其他可用的主节点中去,然后再进行移除节点,不然会出现数据丢失问题

/usr/local/redis/bin/redis-cli -a 123456 --cluster reshard 192.168.1.6:6385

操作如下:

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

#迁移量
How many slots do you want to move (from 1 to 16384)? 900

#需要把数据迁移到那个可用的主节点id(6380)

What is the receiving node ID? 5d25be4b68237e66b78b50f712a9bb410a3dde60

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.

#数据源节点ID(6385)
Source node #1: 6a14670fcf844b7ea35177a40b49ea50e36286fe

Source node #2: done
Do you want to proceed with the proposed reshard plan (yes/no)? yes

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

通过上图可以看出已经成功的把主节点6385的数据迁移到6380上去了,6385节点已经没有任何hash槽了,证明迁移成功!

#通过命令del-node删除6385主节点

/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.1.6:6385 6a14670fcf844b7ea35177a40b49ea50e36286fe

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

#平衡集群节点slot数量

/usr/local/redis/bin/redis-cli -a 123456 --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 192.168.1.6:6380

话说一招回到解放前,但是Redis高可用集群水平扩展比较麻烦,删除水平扩展的节点同样比较麻烦,因为存在节点数据迁移,不然会存在数据丢失问题。

相关推荐

B站收藏视频失效?mybili 收藏夹备份神器完整部署指南

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...

中间件推荐初始化配置

Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

后端开发必看!Redis 哨兵机制如何保障系统高可用?

你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...

Redis合集-大Key处理建议

以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...

深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服

大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...

Redis 中 AOF 持久化技术原理全解析,看完你就懂了!

你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...

Redis合集-必备的几款运维工具

Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...

别再纠结线程池大小 + 线程数量了,没有固定公式的!

我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...

网络编程—IO多路复用详解

假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...

5分钟学会C/C++多线程编程进程和线程

前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...

尽情阅读,技术进阶,详解mmap的原理

1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...

C++11多线程知识点总结

一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...

微服务高可用的2个关键技巧,你一定用得上

概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...

Java线程间如何共享与传递数据

1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...

取消回复欢迎 发表评论: