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

redis集群详解(redis集群解决方案)

mhr18 2024-11-15 22:08 21 浏览 0 评论

1.什么是集群

所谓的集群,就是通过增加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。

2.使用redis集群的必要性

单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。而且单个redis的读写能力是有限的。使用redis集群可以强化redis的读写能力,并且当一台服务器宕机了,其他服务器还能正常工作,不影响使用

3.redis集群

1.redis集群中,每一个redis称之为一个节点。
2.redis集群中,有两种类型的节点:主节点(master)、从节点(slave)。
3.redis集群,是基于redis主从复制实现。

4.redis主从复制

4.1 概念

主从复制模型中,有多个redis节点。 其中,有且仅有一个为主节点Master。从节点Slave可以有多个。只要网络连接正常,Master会一直将自己的数据更新同步给Slaves,保持主从同步。

4.2 特点1.主节点Master可读、可写.2.从节点Slave只读。(read-only)因此,主从模型可以提高读的能力,在一定程度上缓解了写的能力。因为能写仍然只有Master节点一个,可以将读的操作全部移交到从节点上,变相提高了写能力。

4.3 配置

建议克隆一个虚拟机,再进行配置

4.3.1 需求

配置主节点:6380
配置从节点(两个):6381、6382


4.3.2 配置步骤

1.在/usr/local目录下,创建一个/redis/master-slave目录

mkdir -p redis/master-slave


2.在master-slave目录下,创建三个子目录6380、6381、6382

mkdir 6380 6381 6382


3.依次拷贝redis解压目录下的redis.conf配置文件,到这三个子目录中

cp -v /opt/soft/redis-3.2.9/redis.conf ./6380 cp -v /opt/soft/redis-3.2.9/redis.conf ./6381 cp -v /opt/soft/redis-3.2.9/redis.conf ./6382


4.进入6380目录,修改redis.conf,将port端口修改成6380即可。





4.3.3 测试1.打开三个xshell窗口,在每一个窗口中,启动一个redis节点。查看日志输出。(不要改成后台模式启动,看不到日志,不直观)

cd 6380 && redis-server ./redis.conf   cd 6381 && redis-server ./redis.conf   cd 6382 && redis-server ./redis.conf

2.另外再打开三个xshell窗口,在每一个窗口中,登陆一个redis节点

redis-cli -p 6380redis-cli -p 6381redis-cli -p 6382

3.在主节点6380上,进行读写操作,操作成功

5.Sentinel哨兵模式

5.1 主从模式的缺陷

当主节点宕机了,整个集群就没有可写的节点了。
由于从节点上备份了主节点的所有数据,那在主节点宕机的情况下,如果能够将从节点变成一个主节点,就可以解决这个问题了。这就是Sentinel哨兵的作用。


5.2 哨兵的任务

Redis的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。


5.2.1 监控(Monitoring)

1.Sentinel可以监控任意多个Master和该Master下的Slaves。(即多个主从模式)
2.同一个哨兵下的、不同主从模型,彼此之间相互独立。
3.Sentinel会不断检查Master和Slaves是否正常。

5.2.2 自动故障切换(Automatic failover)

5.2.2.1 Sentinel网络

监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器的信息。下图中,三个监控s1的Sentinel,自动组成Sentinel网络结构。

5.2.2.2 故障切换的过程1.投票(半数原则)当任何一个Sentinel发现被监控的Master下线时,会通知其它的Sentinel开会,投票确定该Master是否下线(半数以上,所以sentinel通常配奇数个并且至少3个)。2.选举当Sentinel确定Master下线后,会在所有的Slaves中,选举一个新的节点,升级成Master节点。其它Slaves节点,转为该节点的从节点。投票:

当原Master节点重新上线后,自动转为当前Master节点的从节点。

5.3 哨兵模式部署

5.3.1 需求

前提:已经存在一个正在运行的主从模式。
另外,配置三个Sentinel实例,监控同一个Master节点。

5.3.2 配置Sentinel

1.在/usr/local目录下,创建/redis/sentinels/目录

mkdir -p sentinels


2.在/sentinels目录下,以次创建s1、s2、s3三个子目录中

mkdir s1 s2 s3


3.依次拷贝redis解压目录下的sentinel.conf文件,到这三个子目录中


cp -v /opt/soft/redis-3.2.9/sentinel.conf ./s1cp -v /opt/soft/redis-3.2.9/sentinel.conf ./s2cp -v /opt/soft/redis-3.2.9/sentinel.conf ./s3


4.依次修改s1、s2、s3子目录中的sentinel.conf文件,修改端口,并指定要监控的主节点。(从节点不需要指定,sentinel会自动识别)
S1哨兵配置如下:

S2哨兵配置如下:

S3哨兵配置如下:

5.再打开三个xshell窗口,在每一个窗口中,启动一个哨兵实例,并观察日志输出


redis-sentinel ./s1/sentinel.confredis-sentinel ./s2/sentinel.confredis-sentinel ./s3/sentinel.conf



核心日志输出(部署成功):

5.3.3 测试1.先关闭6380节点。发现,确实重新指定了一个主节点查看服务:ps -aux|grep redis

6.Redis-cluster集群

6.1 哨兵模式的缺陷

在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。
只有主节点才具有写能力,那如果在一个集群中,能够配置多个主节点,就可以缓解写压力了,这就是redis-cluster集群模式。


6.2 Redis-cluster集群概念

1.由多个Redis服务器组成的分布式网络服务集群;
2.集群之中有多个Master主节点,每一个主节点都可读可写;
3.节点之间会互相通信,两两相连;
4.Redis集群无中心节点。


6.3集群节点复制

6.4 故障转移Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。

6.5 集群分片策略Redis-cluster分片策略,是用来解决key存储位置的。集群将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。

6.6 集群redirect转向

由于Redis集群无中心节点,请求会随机发给任意主节点。主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误。客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。

6.7 集群搭建

6.7.1准备工作

1.安装ruby环境
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境


yum -y install rubyyum -y install rubygems



2.安装ruby和redis的
接口程序
拷贝redis-3.0.0.gem至/usr/local下,执行安装:

gem install /usr/local/redis-3.0.0.gem



6.7.2 集群规划

1.Redis集群最少需要6个节点,可以分布在一台或者多台主机上。
本次搭建在一台主机上创建伪分布式集群,不同的端口表示不同的redis节点,如下:
主节点:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003
从节点:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006

2.在/usr/local/redis下创建redis-cluster目录,在其下创建7001、7002......7006目录,如下:


mkdir -p redis/redis-clustermkdir -v 7001 7002 7003 7004 7005 7006



3.将redis解压路径下的配置文件redis.conf,依次拷贝到每个700X目录内,并修改每个700X目录下的redis.conf配置文件:
必选配置:
port 700X
bind ip(当前主机ip:192.168.xxx.xxx)
cluster-enabled yes (启动redis-cluster集群模式)
建议配置:
daemonized yes
logfile /usr/local/redis/redis-cluster/700X/node.log


6.7.3 启动每个结点redis服务

依次以700X下的redis.conf,启动redis节点。(必须指定redis.conf文件)

cd 700x && redis-server ./redis.conf




6.7.4 执行创建集群命令

进入到redis源码存放目录redis/redis-4.10.3/src下,执行redis-trib.rb,此脚本是ruby脚本,它依赖ruby环境。


./redis-trib.rb create --replicas 1 192.168.192.128:7001 192.168.192.128:7002 192.168.192.128:7003 192.168.192.128:7004 192.168.192.128:7005 192.168.192.128:7006


其中--replicas 1 表示为每个主节点创建1个子节点

创建过程如下:

6.7.5 查询集群信息集群创建成功登陆任意redis结点查询集群中的节点情况。

./redis-cli -c -h ip -p 端口

说明:-c表示以集群方式连接redis,-h指定ip地址,-p指定端口号

6.8 集群管理

6.8.1添加主节点

6.8.1.1节点规划

集群创建成功后可以向集群中添加节点,下面是添加一个master主节点。
添加7007节点,参考6.7.2 集群结点规划添加一个“7007”目录作为新节点。
集群添加节点命令:./redis-trib.rb add-node 新节点ip:端口 集群中任意节点ip:端口

./redis-trib.rb add-node 192.168.23.3:7007 192.168.23.3:7001


查看集群结点发现7007已添加到集群中

6.8.1.2 hash槽重新分配添加完新的主节点后,需要对主节点进行hash槽分配,这样该主节才可以存储数据。redis集群有16384个槽,被所有的主节点共同分配,通过查看集群结点可以看到槽占用情况。给刚添加的7007结点分配槽:第一步:连接上集群

./redis-trib.rb reshard 192.168.192.128:7001(连接集群中任意一个可用节点都行)

第二步:输入要分配的槽数量

第五步:输入yes开始移动槽到目标结点id

6.8.2 添加从节点集群创建成功后可以向集群中添加节点,下面是添加一个slave从节点。添加7008从结点,将7008作为7007的从结点。新增从节点命令格式:./redis-trib.rb add-node --slave --master-id masterID newNodIP:port MasterIP:portmasterID 主节点id,从cluster nodes信息中查看newNodIP:port 新增节点的ip:端口MasterIP:port 主节点的ip:端口注意:如果原来该结点在集群中的配置信息已经生成cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf),这时可能会报错:[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0解决方法:删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令。

6.8.3 删除结点:

删除节点命令格式:./redis-trib.rb del-node nodeIP:port nodeID
nodeIP:port 待删除节点的ip:端口
nodeID 待删除节点的id,从cluster node中查看

注意,删除已经占有hash槽的结点会失败,报错如下:

7. java程序连接redis集群

7.1 连接步骤

第一步:创建项目,导入jar



7.2 注意事项:

连接Redis集群时,需要修改防火墙,开放每一个redis节点的端口。
编辑防火墙配置文件 vi /etc/sysconfig/iptables

小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。

我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【07】即可免费获取












原文出处:www.shaoqun.com/a/1177093.html

相关推荐

C++开发必知的内存问题及常用的解决方法-经典文章

1.内存管理功能问题由于C++语言对内存有主动控制权,内存使用灵活和效率高,但代价是不小心使用就会导致以下内存错误:omemoryoverrun:写内存越界odoublefree:同一块内...

缓存用不好,系统崩得早!10条军规让你成为缓存高手

凌晨三点,我被电话惊醒:“苏工!首页崩了!”监控显示:缓存命中率0%,数据库QPS10万+,线程阻塞2000+。根本原因竟是同事没加缓存!不会用缓存的程序员,就像不会刹车的赛车手——...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

Java中间件-Memcached(Java中间件大全)

一、知识结构及面试题目分析缓存技术的大规模使用是互联网架构区别于传统IT技术最大的地方,是整体高并发高性能架构设计中是重中之重的关键一笔,也是互联网公司比较偏好的面试题目。按照在软件系统中所处位置...

linux内存碎片防治技术(linux内存碎片整理)

推荐视频:90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc原理剖析Linux内核内存分配与回收Linuxkernel组织管理物理内存的方式是buddysystem(伙...

Redis主从架构详解(redis主从配置详细过程)

Redis主从架构搭建Redis主节点配置创建主节点目录(/opt/redis-master),复制redis.conf到该目录下,redis.conf配置项修改#后台启动daemonizeyes...

揭开CXL内存的神秘面纱(内存c1)

摘要:现代数据中心对内存容量的高需求促进了内存扩展和分解方面的多条创新线,其中一项获得极大关注的工作是基于ComputeeXpressLink(CXL)的内存扩展。为了更好地利用CXL,研究人员建...

一文彻底弄懂 TPS RPS QPS(tps cps)

以下是关于RPS、QPS、TPS的核心区别与关联的总结,结合实际场景和优化建议:一、核心定义与区别RPS:RequestsPerSecond每秒请求数客户端到服务器的完整请求数量Web服务...

用Redis的“集合”找出你和朋友的“共同关注”

你是不是在刷抖音、微博、小红书的时候,常常会看到这样的提示:“你和XXX有共同关注的博主/朋友”?或者当你关注了一个新的明星,系统会推荐“你的朋友YYY也关注了这位明星”?这个看似简单的功能背后,其实...

WOT2016彭哲夫:科班出身开发者对运维人员的期许

“运维与开发”是老生常谈的话题,前几天和一个运维人聊天,TA说一些公司运维岗位都不公开招聘了,这让众多运维人员情何以堪?是运维的岗位真的饱和了?是找到合适的运维人才难?还是有这样那样的因素?带着这些疑...

Java程序员最常用的20%技术总结(java程序员要掌握什么)

我听说编程语言,经常使用的是其中20%的技术。在Java这门语言中,这20%包括哪些内容?找到一份Java初级程序员的工作,有哪些是必须掌握的,有哪些是可以现学现卖的?一个完整的Javaweb项目,有...

秒杀系统实战(四)| 缓存与数据库双写一致性实战

前言微笑挖坑,努力填坑。————已经拥有黑眼圈,但还没学会小猪老师时间管理学的蛮三刀同学本文是秒杀系统的第四篇,我们来讨论秒杀系统中「缓存热点数据」的问题,进一步延伸到数据库和缓存的...

头条评论精灵翻牌子(头条评论精灵翻牌子怎么弄)

关于“头条评论精灵翻牌子”功能,这通常是指平台通过算法或运营手段,将用户的优质评论随机或定向推送到更显眼的位置(如信息流顶部、独立曝光位等),以提升互动率和用户参与感。以下是详细解析和建议:一、功能理...

15个程序员们都应该知道的大模型高级提示词指令模板和示例

作为程序员你如何写大模型指令?你写的指令是不是更专业呢?下面是15个程序员使用的专业的大模型指令,如果早知道可以能节省你很多时间。这些指令可以用在chatgpt,deepseek等大模型。1.一键...

MyBatis-Plus内置的主键生成策略有大坑,要注意!

昨天小伙伴使用Mybaits-Plus开发的项目线上(集群、K8S)出现了主键重复问题,其报错如下:Mybatis-Plus启动时会通过com.baomidou.mybatisplus.core.to...

取消回复欢迎 发表评论: