【Redis 进阶之路】3. Redis 主从 以及哨兵

news2024/12/29 9:34:51

Redis 主从 以及哨兵

单实例Redis 不足:

在这里插入图片描述

上述的是一个单实例的Redis。 我们可以先分析下有哪些不足:

  1. 单点故障 (是每个单实例必须面对的问题)
  2. 容量有限 (Redis毕竟是缓存型数据库,容量取决于服务器分配的容量,但容量毕竟是有限的)
  3. 压力大(如果出现高并发的场景,所有查询的压力都集中在Redis上)

所以我们的目的就是针对每个不足进行修复。

我们先来了解下 一些前置知识。

Redis 主备 认识

在这里插入图片描述

以上示意图就是主备 大致含义。

  • 从一定程度上主备解决了单实例的单点故障。因为如果主Redis 如果因为某些原因停止提供服务,可以启动备Redis 继续工作。

  • 但是依旧无法解决容量有限 以及压力大 的问题。因为从始至终都是一台Redis实例在工作。

Redis 主从 认识

在这里插入图片描述

以上示意图就是主从的大致含义

  • 因为一旦master Redis停止服务后,slave Redis可以晋升为master,继续提供服务。所以给单点故障提供了保障
  • 部署主从后,一般来说master 节点负责写数据。slave 节点服务读数据。这样可以有效的避免所有socket请求,都访问一个节点,从而降低了压力。

一般我们生产环境中会部署主从。所以我们会以主从来做详细的讲解

数据的一致性

保证数据的一致性是分布式部署的通病。按主从部署来讲,虽然数据已经写入到master 节点,但是需要master节点往slave 节点同步数据。在这个同步的过程中可能因为网络等种种原因,无法正常的同步。这就面临着数据一致性的问题。

接下来我们分析几种数据一致性的方案:

强一致性

在这里插入图片描述

如果想要实现数据的强一致性,master节点必须等待slave节点返回正确的结果。但是实际的业务场景中,会遇到各种问题导致slave节点延迟 或是 无法返回正确的数据,所以相当于master节点写数据失败。使用这种方式会破坏高可用

弱一致性

在这里插入图片描述

其实弱一致性的本质就是:通过异步的形式给slave节点发送数据。如果数据发送失败了,会导致主从数据不一致。

最终一致性

在这里插入图片描述

其实最终一致性是在弱一致性的基础上做了升级。我们可以利用一些特殊的手段,最大可能性保证数据完整的传输。

比如:master节点可以将数据以同步阻塞的方式,传递给kafka. 由kafka给每个slave节点发送数据。有可能在某一个时点数据是不一致的,但是最终数据是一致性的。

因为kafka给slave节点传递数据是需要时间的,如果此时间段内,数据的查询是高并发的,有可能出现部分用户拿到的数据不一致,分别是同步前 以及同步后的数据。

主从配置过程

接下俩我们实操下主从的配置过程:

在这里插入图片描述

步骤1:关闭Redis

也许服务器上启动了redis,如果再配置相同的端口,会出现一些意想不到的情况,所以我们先将redis关闭掉。

在这里插入图片描述

通过上述截图中我们会发现仍然有redis 占用6379端口。所以我们需要将其关闭掉,下面列举出两种方式任意选择:

方案 1

直接通过kill命令杀死进程。

kill -9 19191

通过cli 关闭redis

[root@VM-8-3-centos bin]# pwd
/opt/redis/bin
[root@VM-8-3-centos bin]# ./redis-cli shutdown
[root@VM-8-3-centos bin]# ps aux | grep redis
root     20135  0.0  0.0 112812   980 pts/0    S+   15:40   0:00 grep --color=auto redis
[root@VM-8-3-centos bin]#

步骤2:配置主从的前置工作

创建文件

cd /opt
mkdir -p redis-replica/master
mkdir -p redis-replica/slave1
mkdir -p redis-replica/slave2

复制redis 配置文件

这里我们直接使用shell 来移动文件

  1. 创建并编辑 sh文件
vi mv-redis.sh
  1. 直接将下面的内容复制到sh中
#!/bin/bash

cp -r /opt/redis/bin/* /opt/redis-replica/master
cp -r /opt/redis/bin/* /opt/redis-replica/slave1
cp -r /opt/redis/bin/* /opt/redis-replica/slave2
  1. 通过命令执行shell
/bin/bash mv-redis.sh

在这里插入图片描述

步骤3:修改配置文件

为了不影响我们之前的单机版Redis,我们修改主从的配置

修改master 节点配置

修改前

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

修改后

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380

修改slave1 节点配置

修改前

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

修改后

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6381

指定 master节点:我们需要在slave 配置文件中指定master节点

修改前

# 3) Replication is automatic and does not need user intervention. After a
#    network partition replicas automatically try to reconnect to masters
#    and resynchronize with them.
#
# replicaof <masterip> <masterport>

修改后

# 3) Replication is automatic and does not need user intervention. After a
#    network partition replicas automatically try to reconnect to masters
#    and resynchronize with them.
#
replicaof 127.0.0.1 6380

如果是不同的服务器。此处的127.0.0.1 可以修改为 指定的IP。 但是如果服务器上有密码就需要指定字段masterauth

修改slave2 配置文件

跟slave1 修改方式保持一致。只不过端口为6382

步骤4:启动服务

这次我们还是通过shell 进行启动以及关闭

#!/bin/bash

cd /opt/redis-replica/master
./redis-server ./redis.conf


cd /opt/redis-replica/slave1
./redis-server ./redis.conf


cd /opt/redis-replica/slave2
./redis-server ./redis.conf

执行shell

cd /opt/redis-replica
/bin/bash setup.sh

在这里插入图片描述

通过上述截图中我们看到,我们的多个redis 实例是启动成功的。

步骤5:查看 启动状态

在这里插入图片描述

步骤6:查看 主从信息

我们是可以通过命令info replication 来查看在master节点中 追随了几个slave节点。

在这里插入图片描述

主节点设置值

在这里插入图片描述

从节点可以读取

在这里插入图片描述

步骤7:主从配置总结

如果看到这里,以为主从配置就结束了吗?不不不,如果以为就这样结束了, 那就大错特错了。上述步骤虽然进行了主从部署,但是master节点负责写数据,slave 节点负责读数据。如果master节点宕机了,也就是意味着Redis就不具备写的功能,基本算是废了。

如果是人工发现master节点宕机了,会将slave节点升级为master节点,其他的slave节点跟随新的master节点。

那么我们接下来分析的哨兵,就实现了该功能。应该由人做的事情,将其交给第三方插件做

哨兵

在主从部署中默认是只有主节点具备写的能力,而从节点只能读。如果主宕机,整个节点不具备写能力。但是如果这是让一个从变成主,整个节点就可以继续工作。即使之前的主恢复过来也当做这个节点的从即可。

Redis的哨兵就是帮助监控master 节点的,当节点出现宕机等情况,帮助重新选取主。

Redis中哨兵支持单哨兵和多哨兵。单哨兵是只要这个哨兵发现master宕机了,就直接选取另一个master。而多哨兵是根据我们设定,达到一定数量哨兵认为master宕机后才会进行重新选取主。我们以多哨兵演示

多哨兵模式下,选择几个合适呢???

此时我们的多哨兵节点有5个

在这里插入图片描述

全部哨兵节点

当master节点因为某种原因停止服务,可能所有的哨兵都检测到了。但是因为网络原因无法进行汇总,导致4个哨兵认为master宕机了,一个哨兵迟迟没有回应。

这种部署方式 有点类似于 数据强一致性。会破坏可用性。

一个哨兵节点

  1. 如果是一个哨兵就可以判断master 节点是否宕机的话,会造成判断结果不精准,因为会有很多原因造成哨兵判断失误,例如:网络
  2. 但是如果每个哨兵结果都不同的话,会发生一种情况:脑裂

n/2+1 节点

  1. 为了增加结果的准确性,我们建议是过半的哨兵如果判断master 节点宕机的话,那master 节点就是宕机了
  2. 这种方式也避免了脑裂的情况发生。

如果是部署4台哨兵的话,>=3台认为master宕机了,我们就认为宕机
如果是部署5台哨兵的话,>=3台认为master宕机了,我们就认为宕机

所以为了更好的分区容忍性,我们是建议部署奇数台哨兵。

哨兵配置过程

创建目录

mkdir -p /opt/redis-replica/sentinel
cp /opt/redis-replica/master/redis-sentinel /opt/redis-replica/sentinel

从之前的解压目录 复制配置文件

cp /tmp/soft/redis-5.0.14/sentinel.conf /opt/redis-replica/sentinel/

在这里插入图片描述

复制多份配置文件,修改配置文件

在这里插入图片描述
三个配置文件 修改内容类似,如下内容:

port 26379
daemonize yes
logfile "/opt/redis-replica/sentinel/26379.log"
sentinel monitor mymaster 127.0.0.1 6380 2
启动sentinel

在这里插入图片描述

杀死master节点,主动自动切换

在这里插入图片描述
在这里插入图片描述

等杀死master节点后,等待一段时间后,通过哨兵,第一个从节点升级为master节点了。

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

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

相关文章

多目标优化算法评价指标(performance metrics)

参考Performance metrics in multi-objective optimization​​​​​​​ Riquelme, N., Lcken, C. V., & Baran, B. (2015, 19-23 Oct. 2015). Performance metrics in multi-objective optimization. Paper presented at the 2015 Latin American Computing Conference…

SpringBoot整合ES 实现简单项目(七)

一直在烂尾&#xff0c;对&#xff0c;说的就是你&#xff0c;楼. 上一章简单介绍了 SpringBoot 整合 ES (六), 如果没有看过,请观看上一章 这一章节老蝴蝶做一个简单的 ES 查询项目 一. pom.xml 添加依赖 <!--引入MySql的驱动--><dependency><groupId>mys…

小林coding——图解MySQL

文章目录基础篇执行一条select语句&#xff0c;期间发生了什么&#xff1f;MySQL一行记录是怎么存储的&#xff1f;索引篇索引常见面试题什么是索引&#xff1f;索引的分类&#xff1f;小结从数据页的角度看B树为什么MySQL采用B树作为索引&#xff1f;MySQL单表不要超过2000W行…

ElasticSearch分片与Lucene Index

在ES中一个索引有一个或者多个分片构成&#xff0c;在创建索引的时候可以设置主分片和副本分片的数量&#xff0c;当主分片确定之后就不可以再修改了(因为路由需要基于这个数量来分发请求)&#xff0c;而副本分片数量随时可以修改 PUT /myIndex {"settings" : {&quo…

使用ensp软件模拟DNS服务器实验

DNS服务器介绍&#xff1a; DNS服务器&#xff08;Domain Name Server&#xff0c;域名服务器&#xff09;是进行域名和与之相对应的IP地址进行转换的服务器。它起到将人类易于记忆的域名映射到相应的机器可识别的IP地址的作用。 DNS服务器中保存了一张域名和与之相对应的IP地…

Flutter 中 Provider 基本使用

前言&#xff1a; Provider.of<XXX>(context).数据 Provider.of<XXX>(context).方法 ChangeNotifier&#xff1a;这个是真正数据&#xff08;状态&#xff09;存放的地方。我们自己创建的provider 是混入ChangeNotifier 的。 一 安装 在pub.dev 上搜索provider …

2.技巧※(0x3f:从周赛中学算法 2022下)

来自0x3f【从周赛中学算法 - 2022 年周赛题目总结&#xff08;下篇&#xff09;】&#xff1a;https://leetcode.cn/circle/discuss/WR1MJP/ 技巧指一些比较套路的算法&#xff0c;包括双指针、滑动窗口、二分&#xff08;主要指二分答案&#xff09;、前缀和、差分、前后缀分解…

TypeScript由浅到深(下篇)

目录 七、TypeScript泛型编程 泛型实现类型参数化: 泛型接口和泛型类的使用: 泛型约束: 映射类型: TypeScript条件类型&#xff08;Conditional Types&#xff09;: 在条件类型中推断&#xff08;inter&#xff09;: 分发条件类型&#xff08;Distributive Conditional …

【Java基础】day15

day15 一、为什么需要使用多线程&#xff1f; 1、资源利用率提升&#xff0c;程序处理效率提高 2、软件运行效率提升 3、使用线程可以把占据时间长的程序中的任务放到后台去处理 4、充分利用 CPU 资源&#xff0c;多核 CPU 的情况下会更高效 二、Spring Boot 的启动流程&…

搭建个人网站没有公网IP地址可以吗?

搭建网站不一定需要公网IP地址&#xff0c;甚至都不需要云服务器或虚拟主机。可以先在本地个人电脑中搭建一个网站&#xff1b;然后网站需要为公网上的其他访客提供访问&#xff1b;所以&#xff0c;需要内网穿透&#xff0c;映射公网域名进行访问。但是完全没必要&#xff0c;…

一文了解Gralde

&#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公司实习&#x1f…

python黑马程序员(单例模式工厂模式)笔记

一、单例模式 1、设计模式就是一种编程套路 使用特定的套路得到特定的效果 2、什么时单例设计模式 单例模式就是对一个类&#xff0c;只获取其唯一的类实例对象&#xff0c;持续复用它 节省内存 节省创建对象的开销 非单例模式效果&#xff1a; # 演示单例模式的效果 # 非…

chatgpt相关关键字

听了一堂chatgpt的课程&#xff0c;真假参半&#xff0c;但积累了一些关键词。不知道这些关键字会在什么时候起到作用&#xff0c;先记录下来作为灵感积累 1 自然进化的过程&#xff0c;是人选择工具&#xff0c;也是工具选择人 2 Copliot-自动编程&#xff0c;感觉适用于独立新…

安卓 Windows 通过ts链接获取m3u8视频地址进行视频下载

目录 环境&#xff1a; 解决思路及过程&#xff1a; .TS——> .m3u8 1.利用安卓视频缓存机制合成视频 1.1 找到鲨鱼浏览器目录 1.2 进入Android/data/com.zhijianzhuoyue.sharkbrowser/cashe 缓存目录 1.3 显示隐藏文件 1.4 进入可以看到两个随机生成的视频文件夹&…

傅盛“追风”GPT,猎户星空春天来了?

GPT的横空出世&#xff0c;让冷清已久的商用服务机器人市场&#xff0c;又有了“新故事”。 从技术底层逻辑而言&#xff0c;服务机器人受到这类新技术的影响会更为明显。因为抛开硬件&#xff0c;服务机器人的内核其实就是AI&#xff0c;GPT大模型的出现显然成了现阶段该产业进…

coreldraw2023安装教程及新功能讲解

coreldraw是一款非常好用的设计软件&#xff0c;功能非常强大&#xff0c;它可应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等领域&#xff0c;因此受到了不少设计师的青睐&#xff0c; CorelDRAW2023新功能有哪些&#xff1f;CorelDRAW2023最新版本更新怎么…

SpringBoot-核心技术篇

技术掌握导图 六个大标题↓ 配置文件web开发数据访问单元测试指标指控原理解析 配置文件 1.文件类型 1.1、properties 同以前的properties用法 1.2、yaml 1.2.1、简介 YAML是 “YAML Aint Markup Language”&#xff08;YAML不是一种标记语言&#xff09;的递归缩写。在…

JumpServer部署与应用实践

JumpServer部署与介绍 文章目录JumpServer部署与介绍前言堡垒机功能特点主要主件一、在线安装二、环境访问三、堡垒机的应用&#xff08;重点&#xff09;3.1用户与用户组的创建3.2资产管理3.3账号管理3.4权限管理四、应用实践前言 Jumpserver 是一款使用 Python, Django 开发…

Su+ELK实现网络监测(1)——Suricata安装与配置

Suricata安装配置文档一、环境准备1. 基础环境安装2. 安装基础组件二、Luajit部署1. LuaJIT的安装2. 需要更新动态库三、suricata部署1. 安装相关依赖2. 下载、编译并安装suricata3. 执行4. 安装其他组件5. 修改配置文件6. 启动测试7. 安装suricata-update8. 更新规则集9. 启动…

Java多线程:线程组

线程组 可以把线程归属到某一个线程组中&#xff0c;线程组中可以有线程对象&#xff0c;也可以有线程组&#xff0c;组中还可以有线程&#xff0c;这样的组织结构有点类似于树的形式&#xff0c;如图所示&#xff1a; 线程组的作用是&#xff1a;可以批量管理线程或线程组对象…