Redis哨兵和集群模式

news2024/11/16 3:15:03
特性哨兵模式集群模式
高可用性
数据分片
水平扩展
配置复杂度
管理复杂度
多键操作支持否(有限制)

哨兵模式

原理:

Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障转移,从而确保服务的连续性。哨兵模式的核心组件包括哨兵(Sentinel)节点、主节点(Master)和从节点(Slave)。

1. 哨兵节点

哨兵节点是专门用于监控 Redis 主从架构的独立进程。哨兵节点会周期性地检查主从服务器的健康状况,并在主服务器宕机时进行自动故障转移。哨兵节点的功能包括:

  • 监控:哨兵节点持续地向主从服务器发送 PING 请求,以确定它们的健康状况。如果服务器在指定时间内没有响应,就认为它已经失效。

  • 通知:哨兵节点会将服务器的状态变化通知给管理员或其他应用程序。

  • 自动故障转移:当检测到主服务器失效时,哨兵节点会从现有的从服务器中选举出一个新的主服务器,并将其他从服务器指向新的主服务器。

  • 配置提供者:哨兵节点可以提供当前主服务器的地址给 Redis 客户端,以便客户端可以连接到正确的服务器。

2. 监控和故障检测

哨兵节点通过 PING 和 INFO 命令监控主从服务器的状态。如果一个服务器在 down-after-milliseconds 时间内没有响应,哨兵节点会认为它失效。为了避免误报,哨兵节点之间会相互通信,只有达到 quorum 个哨兵节点一致认为主服务器失效,才会进行故障转移。

3. 领导选举

当主服务器被确认失效后,哨兵节点会进行领导选举,以决定哪个哨兵节点负责故障转移。选举过程使用类 Raft 算法,确保在多个哨兵节点中选出一个领导者来执行故障转移操作。

4. 自动故障转移

领导哨兵节点从现有的从服务器中选举一个新的主服务器,并更新所有其他从服务器的配置,让它们开始复制新的主服务器。故障转移完成后,领导哨兵节点会通知其他哨兵节点和 Redis 客户端新的主服务器地址。

搭建哨兵模式:

1.环境准备:
IP地址角色操作系统
99.99.10.30redis-master,sentinelCentOS Linux release 7.9.2009 (Core)
99.99.10.31redis-slave1,sentinelCentOS Linux release 7.9.2009 (Core)
99.99.10.32redis-slave2,sentinelCentOS Linux release 7.9.2009 (Core)
2.安装Redis
# 安装 C/C++ 环境,编译 Redis 安装包使用
yum -y install gcc gcc-c++ make
​
# 切换软件安装目录
cd /usr/local/
​
# 新建 redis 安装目录
mkdir redis
​
# 切换到 redis 安装目录
cd redis
​
# 下载 redis 安装包
wget http://download.redis.io/releases/redis-6.2.5.tar.gz
​
# 解压 redis 安装包
tar -zxvf redis-6.2.5.tar.gz
​
# 进入解压后的 redis 目录
cd redis-6.2.5/
​
# 编译
make
​
# 进入编译好的目录(编译成功后 src 目录下会出现编译后的 redis 服务程序 redis-server)
cd src
​
# 进入 Redis 的主目录
cd /usr/local/redis/redis-6.2.5
​
# 创建工作目录 tmp
mkdir tmp
​
# 创建日志目录 log
mkdir log
​
# 编辑 Redis 配置
vim redis.conf
​
# 编辑哨兵配置
vim sentinel.conf
​
3.配置Redis
# 表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
​
# 允许redis后台运行
daemonize yes
​
# 设置redis日志存放路径
logfile "/usr/local/redis/redis-6.2.5/log/redis_6379.log"
​
# 设置为no,允许外部网络访问
protected-mode no
​
# 修改redis监听端口(可以自定义)
port 6379
​
# pid存放目录
pidfile /var/run/redis_6379.pid
​
# 工作目录,需要创建好目录,可自定义
dir /usr/local/redis/redis-6.2.5/tmp
​
# 设置redis密码
requirepass 123456
​
# 主从同步master的密码
masterauth 123456
​
# 表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
​
# 允许redis后台运行
daemonize yes
​
# 设置redis日志存放路径
logfile "/usr/local/redis/redis-6.2.5/log/redis_6379.log"
​
# 设置为no,允许外部网络访问
protected-mode no
​
# 修改redis监听端口(可以自定义)
port 6379
​
# pid存放目录
pidfile /var/run/redis_6379.pid
​
# 工作目录,需要创建好目录,可自定义
dir /usr/local/redis/redis-6.2.5/tmp
​
# 设置redis密码
requirepass 123456
​
# 主从同步master的密码
masterauth 123456
​
# 多了这一行,用于追随某个节点的redis,被追随的节点为主节点,追随的为从节点,Redis5.0前版本可使用slaveof
replicaof 99.99.10.30 6379

从节点&哨兵sentinel.conf与主节点的sentinel.conf保持一致。

4.启动Redis
# 启动 redis 命令如下(从节点类似),下面这条命令执行后没有出错,一般就是启动成功了
/usr/local/redis/redis-6.2.5/src/redis-server /usr/local/redis/redis-6.2.5/redis.conf
​
#查看启动是否成功
ps aux | grep redis
-----------------------------------------
root     110885  0.0  0.1 162500  2884 ?        Ssl  15:58   0:00 /usr/local/redis/redis-6.2.5/src/redis-server 0.0.0.0:6379
root     110950  0.0  0.0 112808   968 pts/1    R+   15:58   0:00 grep --color=auto redis
-----------------------------------------
​
​
#查看集群信息
#切换到主库目录下
/usr/local/redis/redis-6.2.5/src
​
#连接redis
./redis-cli 
​
#验证密码
auth 123456
​
#查看集群
info replication
-----------------------------------------
[root@redis-master src]# ./redis-cli 
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:4d028dc9b02e861a7d2aa5e2cc779f24da0b4434
master_replid2:8ee54d1d08888609608c841507a08b4e53ab880b
master_repl_offset:87976
second_repl_offset:83227
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:80121
repl_backlog_histlen:7856
-----------------------------------------
5.启动哨兵
# 启动 redis 命令如下(从节点类似),下面这条命令执行后没有出错,一般就是启动成功了
/usr/local/redis/redis-6.2.5/src/redis-sentinel /usr/local/redis/redis-6.2.5/sentinel.conf
​
# 查看是否启动成功
ps aux | grep redis
-----------------------------------------
[root@redis-master src]# ps aux | grep redis
root      72040  0.5  0.1 162500  3052 ?        Ssl  15:22   0:14 /usr/local/redis/redis-6.2.5/src/redis-sentinel *:26379 [sentinel]
root     110885  0.1  0.1 240840  3124 ?        Ssl  15:58   0:00 /usr/local/redis/redis-6.2.5/src/redis-server 0.0.0.0:6379
root     117591  0.0  0.0 112808   968 pts/1    S+   16:05   0:00 grep --color=auto redis
-----------------------------------------
6.进行测试

kill掉主节点的redis之后,在从节点查看redis信息,会发现选举了一个新的主节点。

哨兵的优缺点

优点
  • 提供高可用性和自动故障转移。

  • 简单易用,适合小规模的 Redis 部署。

缺点
  • 不能水平扩展。

  • 故障转移期间可能有短暂的不可用时间。

集群模式

原理:

Redis 集群模式是一种分布式解决方案,通过数据分片和多个节点来实现水平扩展和高可用性。集群模式的核心组件包括多个主节点(Master)和从节点(Slave),每个节点存储整个数据集的一部分。以下是集群模式的详细工作原理:

1. 数据分片

Redis 集群将整个键空间划分为 16384 个哈希槽(Hash Slots),每个键根据 CRC16 哈希算法被映射到一个哈希槽。每个主节点负责管理一部分哈希槽,从而实现数据的分布式存储。

2. 主从复制

每个主节点可以有一个或多个从节点,从节点用于数据的冗余备份和故障转移。当主节点失效时,集群会自动选举一个从节点作为新的主节点。

3. 节点通信

Redis 集群节点之间通过 Gossip 协议进行通信,定期交换状态信息。每个节点都了解集群中其他节点的状态和负责的哈希槽。

4. 故障检测和恢复

Redis 集群中的节点会监控彼此的健康状况。当检测到某个主节点失效时,集群中的其他节点会协同选举一个从节点作为新的主节点,确保数据的高可用性。

5. 客户端连接和重定向

Redis 客户端连接到集群中的任意一个节点进行操作。如果请求的键不在当前节点负责的哈希槽内,节点会返回一个 MOVED 响应,指示客户端重定向到正确的节点。

搭建Redis-cluster集群:

1.环境准备:
IP地址角色操作系统
99.99.10.40:7001redis-master1CentOS Linux release 7.9.2009 (Core)
99.99.10.40:7002redis-master2CentOS Linux release 7.9.2009 (Core)
99.99.10.40:7003redis-master3CentOS Linux release 7.9.2009 (Core)
99.99.10.40:7004redis-slave1CentOS Linux release 7.9.2009 (Core)
99.99.10.40:7005redis-slave2CentOS Linux release 7.9.2009 (Core)
99.99.10.40:7006redis-slave3CentOS Linux release 7.9.2009 (Core)
2.安装Redis
# 安装 C/C++ 环境,编译 Redis 安装包使用
yum -y install gcc gcc-c++ make
​
# 切换软件安装目录
cd /usr/local/
​
# 新建 redis 安装目录
mkdir redis
​
# 切换到 redis 安装目录
cd redis
​
# 下载 redis 安装包
wget http://download.redis.io/releases/redis-6.2.5.tar.gz
​
# 解压 redis 安装包
tar -zxvf redis-6.2.5.tar.gz
​
# 进入解压后的 redis 目录
cd redis-6.2.5/
​
# 编译
make
​
# 进入编译好的目录(编译成功后 src 目录下会出现编译后的 redis 服务程序 redis-server)
cd src
3.配置Redis
# 在/usr/local/redis下创建redis-cluster目录,在其下创建7001、7002......7006目录
mkdir -p /usr/local/redis/redis-cluster
​
mkdir -v 7001 7002 7003 7004 7005 7006 
# 将redis解压路径下的配置文件redis.conf,依次拷贝到每个700X目录内,并修改每个700X目录下的redis.conf配置文件:
port 700X
bind 99.99.10.40
cluster-enabled yes (启动redis-cluster集群模式)
cluster-config-file nodes-700x.conf

daemonized yes
logfile /usr/local/redis/redis-cluster/700X/node.log 
4.启动Redis
cd /usr/local/redis/redis/src

./redis-server /usr/local/redis/7001/redis.conf
./redis-server /usr/local/redis/7002/redis.conf
./redis-server /usr/local/redis/7003/redis.conf
./redis-server /usr/local/redis/7004/redis.conf
./redis-server /usr/local/redis/7005/redis.conf
./redis-server /usr/local/redis/7006/redis.conf

-----------------------------------------
[root@redis-cluster src]# ps -ef | grep redis
root      13793      1  0 09:14 ?        00:00:03 ./redis-server 99.99.10.40:7001 [cluster]
root      31859      1  0 09:30 ?        00:00:02 ./redis-server 99.99.10.40:7002 [cluster]
root      34685      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7003 [cluster]
root      34797      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7004 [cluster]
root      34828      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7005 [cluster]
root      34907      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7006 [cluster]
root      67927   3526  0 10:00 pts/0    00:00:00 grep --color=auto redis
-----------------------------------------
5.创建集群
./redis-cli --cluster create 99.99.10.40:7001 99.99.10.40:7002 99.99.10.40:7003 99.99.10.40:7004 99.99.10.40:7005 99.99.10.40:7006 --cluster-replicas 1

-----------------------------------------
# 查看集群状态
[root@redis-cluster src]# ./redis-cli -h 99.99.10.40 -p 7001
99.99.10.40:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1651
cluster_stats_messages_pong_sent:1603
cluster_stats_messages_sent:3254
cluster_stats_messages_ping_received:1598
cluster_stats_messages_pong_received:1651
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:3254
-----------------------------------------
99.99.10.40:7001> cluster nodes
ef8f95cec7e4ecdc53bf76d3c905fa60d6ee5202 99.99.10.40:7002@17002 master - 0 1719885779875 2 connected 5461-10922
786ace6e78fb2c78966befa242aaac6a6f1a13d4 99.99.10.40:7003@17003 master - 0 1719885780000 3 connected 10923-16383
aa831e1f7eb98a51f6e4782b08961e296c16b6d4 99.99.10.40:7004@17004 slave 627a959d0a9542ecef06f1363d7521e30c753295 0 1719885779000 1 connected
0174a8f28735d92789a55badf5819e1818596a04 99.99.10.40:7005@17005 slave ef8f95cec7e4ecdc53bf76d3c905fa60d6ee5202 0 1719885780886 2 connected
b4b975788e013c8eb426a4db0526a664050576f6 99.99.10.40:7006@17006 slave 786ace6e78fb2c78966befa242aaac6a6f1a13d4 0 1719885780000 3 connected
627a959d0a9542ecef06f1363d7521e30c753295 99.99.10.40:7001@17001 myself,master - 0 1719885776000 1 connected 0-5460
-----------------------------------------

优缺点

优点
  • 支持数据的水平扩展,可以处理大规模数据。

  • 提供高可用性,节点失效时能够自动进行故障转移。

  • 高并发性能。

缺点
  • 配置和管理复杂度较高。

  • 不支持多键操作,某些命令在集群模式下受到限制。

  • 需要更多的资源和节点来维持高可用性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust借助dotenv库读取环境变量

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

信息收集---端口服务信息收集

1. 什么是端口 是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45…

欧洲智慧能源展揭幕,海博思创闪耀登场展示储能创新

近日,备受瞩目的欧洲智慧能源展(The Smarter E Europe)盛大开幕,吸引了全球能源行业的目光。在这场国际性的盛会中,中国储能行业的领军企业海博思创凭借卓越的技术实力和创新的解决方案,成为展会上一颗耀眼…

Docker 运行Nacos无法访问地址解决方法

参考我的上一篇文章去配置好镜像加速器,镜像加速器不是配置越多越好,重试次数多了会失败 Dockerhub无法拉取镜像配置阿里镜像加速器-CSDN博客 错误的尝试 最开始按照网上的方式去配了一大堆,发现下不下来。 镜像源地址:https:…

中国网络安全审查认证和市场监管大数据中心数据合规官CCRC-DCO

关于CCRC-DCO证书的颁发机构,它是由中国网络安全审查认证与市场监管大数据中心(简称CCRC)负责。 该中心在2006年得到中央机构编制委员会办公室的批准成立,隶属于国家市场监督管理总局,是其直辖的事业单位。 依据《网络…

python如何求不定积分

sympy介绍 sympy库的安装非常的简单,利用conda命令可以快速的完成安装。 conda install sympy 接下来,我们将介绍利用第三方库sympy来完成积分的计算。 python求解不定积分 接下来,我们将介绍上述的不定积分的求解。 首先导入sympy库中的…

老司机翻车,一次失败的Oracle备份恢复,核心应用彻底瘫痪...

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

亚马逊测评风控全解析:如何有效避免砍单与封号?

许多朋友都困惑,为什么在测评时频繁遭遇砍单和封号?其实,测评可不是简单地买个IP或几个买家号就能搞定的事。 首先,咱们得审视一下自己的操作环境,是不是真的安全无虞,还是经常莫名其妙就被封了号、砍了单&…

基于java+springboot+vue实现的旅游管理系统(文末源码+Lw)227

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在短时间内处理完毕庞大的数据信息&a…

三层限流:为高并发系统保驾护航

文章目录 前言第一层限流:Nginx 层面的 IP 限流第二层限流:Gateway 对用户层级的限流第三层限流:微服务限流分布式限流和单机限流的优缺点:1、RateLimiter的使用2、Hystrix的使用3、Redislua脚本4、使用Sentinel 关于为何同时使用…

力扣:LCR 024. 反转链表(Java)

目录 题目描述:示例 1:示例 2:代码实现: 题目描述: 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head [1,2,3,4,5] 输出&#x…

Python实现接糖果小游戏

介绍: 基于Pygame的糖果从屏幕顶部下落的游戏代码。这个游戏包括了一个可以左右移动的篮子来接住下落的糖果,接住糖果会增加得分。 代码: import pygame import random import os# 初始化pygame和设置屏幕大小 pygame.init() screen_width, screen_height 800, 6…

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2(全开源版)

>>>系统简述: 抖音阵营销系统多平台多账号一站式管理,一键发布作品。智能标题,关键词优化,排名查询,混剪生成原创视频,账号分组,意向客户自动采集,智能回复,多…

Python基础小知识问答系列-可迭代型变量赋值

1. 问题: 怎样简洁的把列表中的元素赋值给单个变量? 当需要列表中指定几个值时,剩余的变量都收集在一起,该怎么进行变量赋值? 当只需要列表中指定某几个值,其他值都忽略时,该怎么…

拓扑排序[讲课留档]

拓扑排序 拓扑排序要解决的问题是给一个有向无环图的所有节点排序。 即在 A O E AOE AOE网中找关键路径。 前置芝士! 有向图:有向图中的每一个边都是有向边,即其中的每一个元素都是有序二元组。在一条有向边 ( u , v ) (u,v) (u,v)中&…

数字营销执行团队的重要性及如何配置

在当今数字化商业环境中,数字营销执行团队的重要性不言而喻。 其重要性主要体现在以下几点:一是能精准触达目标客户,借助数据分析实现精准营销,提高营销效率和效果。二是紧跟数字技术发展潮流,及时采用新的营销手段和…

基于OpenCV与Keras的停车场车位自动识别系统

本项目旨在利用计算机视觉技术和深度学习算法,实现对停车场车位状态的实时自动识别。通过摄像头监控停车场内部,系统能够高效准确地辨认车位是否被占用,为车主提供实时的空闲车位信息,同时为停车场管理者提供智能化的车位管理工具…

【JVM-04】线上CPU100%

【JVM-04】线上CPU100% 1. 如何排查 1. 如何排查 ⼀般CPU100%疯狂GC,都是死循环的锅,那怎么排查呢?先进服务器,⽤top -c 命令找出当前进程的运⾏列表按⼀下 P 可以按照CPU使⽤率进⾏排序显示Java进程 PID 为 2609 的java进程消耗…

清新简约卡片风格蓝紫渐变色短视频苹果CMS模板

首途第三十三套清新简约卡片风格蓝紫渐变色短视频模板,一套苹果CMSV10主题。 这套主题是简约风格,以纯洁的白色和深邃的紫色为主色调,为您提供了一种清新、时尚的浏览体验。 在这个简洁而美丽的界面中,您可以轻松畅享各种精彩短…

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon?Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件(application.yml)说明: Feign 与 Ribbon 结合使用的应用场景1. 动态服…