redis集群详解(redis集群解决方案)
mhr18 2024-11-15 22:08 25 浏览 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
相关推荐
- 说说Redis的单线程架构(redis的单线程模型)
-
一句话总结Redis采用单线程处理命令请求,避免了多线程的上下文切换和锁竞争,保证原子性操作。其基于内存的高效执行和I/O多路复用模型支撑了高并发性能。网络I/O和持久化操作(如RDB/AOF)由后台...
- 答记者问之 - Redis 的高效架构与应用模式解析
-
问:极客程序员你好,请帮我讲一讲redis答:redis主要涉及以下核心,我来一一揭幕Redis的高效架构与应用模式解析Redis是一个开源的内存数据存储系统,因其高性能、丰富的数据结构和易用性...
- Redis的5种核心数据结构,及其最经典的“应用场景”
-
Redis凭什么稳坐缓存界头把交椅?全靠这五个“身怀绝技”的数据结构!在分布式系统的江湖里,Redis就像一位身怀绝技的武林高手,而它的五大核心数据结构正是克敌制胜的五套绝学。今天咱们就来拆解这些独门...
- 精准定位文件包含漏洞:代码审计中的实战思维
-
前言最近看到由有分析梦想cms的,然后也去搭建了一个环境看了一看,发现了一个文件包含漏洞的点,很有意思,下面是详细的复现和分析,以后代码审计又多了一中挖掘文件包含漏洞的新思路环境搭建下载https...
- ARDM:一款国产跨平台的Redis管理工具
-
ARDM(AnotherRedisDesktopManager)是一款免费开源的Redis桌面管理客户端,支持Windows、Mac、Linux跨平台。功能特性ARDM提供的主要功能如...
- SpringBoot的Web应用开发——Web缓存利器Redis的应用!
-
Web缓存利器Redis的应用Redis是目前使用非常广泛的开源的内存数据库,是一个高性能的keyvalue数据库,它支持多种数据结构,常用做缓存、消息代理和配置中心。本节将简单介绍Redis的使...
- Windows服务器部署CRMEB开源电商系统,详细教程来了!
-
安装PHP已经安装过PHP的可以跳过首先安装VC运行库下载地址https://docs.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redi...
- Windows系统下Redis各个安装包介绍与选择指南
-
简介Redis作为高性能的键值数据库,广泛应用于缓存、消息队列等场景。在Windows系统中部署Redis时,用户可以选择多种安装包以满足不同的需求。本文将详细介绍以下Redis8.0.3版本的安装...
- 从面试题入手,深度剖析Redis Cluster原理
-
揭开RedisCluster的神秘面纱**在当今数字化浪潮中,数据量呈爆炸式增长,应用程序对数据存储和处理的要求也日益严苛。Redis作为一款高性能的内存数据库,凭借其出色的读写速度和丰富的数...
- 给大家推荐些好的c语言代码的网站
-
C语言,那就来推荐几个吧,部分含有C++:1、TheLinuxKernelArchives(kernel.org)Linux内核源码,仅限于C,但内核庞大,不太适合新手;2、redis(redi...
- Redis String 类型的底层实现与性能优化
-
RedisString是Redis中最基础也是应用最广泛的数据类型,它能存储文本、数字、二进制数据等多种形式的信息。深入理解其底层实现对构建高性能分布式系统至关重要。Redis字符串的底层结...
- 阿里面试问:Redis 为什么把简单的字符串设计成 SDS?
-
分享了一道面阿里的redis题,我看了以后觉得挺有意思。题目大致是这样的面试官:了解redis的String数据结构底层实现嘛?铁子:当然知道,是基于SDS实现的面试官:redis是用C语言开发的,那...
- 编程语言那么多,为何C语言能成为最成功的语言?
-
编程语言那么多,为何C语言能成为最成功的语言?2025年嵌入式岗位暴增47%,新人却还在问"C语言过时了吗"。真相是连机器人关节驱动都得靠它写,不会指针连芯片手册都看不懂。见过用Pyt...
- go-zero 使用 redis 作为 cache 的 2 种姿势
-
在go-zero框架内,如在rpc的应用service中,其内部已经预置了redis的应用,所以我们只需要在配置中加入相关字段即可,另外,在svcContext声明redisc...
- Redis事务深度解析:ACID特性、执行机制与生产实践指南
-
一、Redis事务的本质与核心机制Redis事务通过MULTI、EXEC、WATCH等命令实现,其本质是将多个命令序列化后一次性执行,而非传统数据库的严格事务模型。核心特点如下:命令队列化:MULT...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis 哨兵 (52)
- redis结构 (53)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)