Redis高可用主从复制与哨兵模式

前言

在生产环境中,除了采用持久化方式实现 Redis 的高可用性,还可以采用主从复制、哨兵模式和 Cluster 集群的方法确保数据的持久性和可靠性。

目录

一、主从复制

1. 概述

2. 作用

3. 主从复制流程

4. 部署

4.1 安装 redis

4.2 编辑 master 节点配置文件

4.3 编辑 slave 节点配置文件

4.4 验证主从效果

二、哨兵模式

1. 概述

2. 结构

2. 功能与原理

3. 作用

4. 故障转移机制

5. 主节点选举的过程 

6. 搭建 redis 哨兵模式 

6.1 所有节点修改哨兵模式配置文件

6.2 启动哨兵模式

6.3 查看哨兵信息

6.4 查看日志并模拟 master 故障

6.5 再次查看哨兵信息


一、主从复制

1. 概述

主从复制是高可用 Redis 的基础,将一台 Redis 服务器的数据复制到其它的 Redis 服务器。前者 为主 master,后者为 slave,单向从主到从;主可以有多个从,从只能有一个主。

2. 作用

① 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式

② 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余

③ 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量

④ 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

3. 主从复制流程

① 启动一个 slave 机器进程,从 redis 会向主发送 sync 同步数据请求

② 主 redis 会 fork 一个子进程,会产生 rdb 文件(完全备份文件的过程)

③ rdb 文件的持久化完成后,主 redis 会将 rdb 文件和缓存起来的命令推送给从服务器

④ 复制、推送完后后,主 redis 会持续的同步操作命令,利用 aof(增备)持久化功能

⑤ 在下一台 redis 接入主从复制之前,会持续利用 aof 的方式同步数据给从服务器

4. 部署

环境准备:关闭防火墙与核心防护

  • master节点: 192.168.190.100
  • slave1节点: 192.168.190.101
  • slave2节点: 192.168.190.102

4.1 安装 redis

yum install -y gcc gcc-c++ make
cd /opt/
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make -j 2 && make prefix=/usr/local/redis install
cd /opt/redis-5.0.7/utils
./install_server.sh
......
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server	
ln -s /usr/local/redis/bin/* /usr/local/bin/

4.2 编辑 master 节点配置文件

[root@master ~]# vim /etc/redis/6379.conf70 bind 0.0.0.0                    # 修改监听地址为0.0.0.0137 daemonize yes                   # 开启守护进程172 logfile /var/log/redis_6379.log # 指定日志文件目录264 dir /var/lib/redis/6379         # 指定工作目录700 appendonly yes                  # 开启AOF持久化功能
[root@master ~]# /etc/init.d/redis_6379 restart

选择配置 systemd 管理服务:

[root@master ~]# vim /usr/lib/systemd/system/redis.service
[Unit]                          # 包含了关于服务单元的描述信息
Description=Redis Server        # 描述服务
After=network.target            # 指定了服务应该在网络服务启动后启动[Service]                       # 包含了关于服务如何运行的配置信息
PIDFile=/var/run/redis_6379.pid # 方便使用pid号进行操作
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf # 指定了启动Redis服务时要执行的命令
ExecStop=/usr/local/redis/bin/redis-cli shutdown # 指定了停止Redis服务时要执行的命令,这里是使用redis-cli发送shutdown命令
Restart=always                  # 指定了服务在意外终止时应该自动重新启动[Install]                       # 定义了如何安装这个服务
WantedBy=multi-user.target      # 安装字符界面,指定了在多用户模式下启用这个服务
[root@master ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start redis.service 
[root@localhost ~]# systemctl status redis.service 
● redis.service - Redis ServerLoaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)Active: active (running) since 三 2024-04-03 17:56:18 CST; 6s agoMain PID: 5473 (redis-server)

4.3 编辑 slave 节点配置文件

[root@slave1 ~]# vim /etc/redis/6379.conf70 bind 0.0.0.0                    # 修改监听地址为0.0.0.0137 daemonize yes                   # 开启守护进程172 logfile /var/log/redis_6379.log # 指定日志文件目录264 dir /var/lib/redis/6379         # 指定工作目录288 replicaof 192.168.190.100 6379  # 指定要同步的Master节点IP和端口700 appendonly yes                  # 开启AOF持久化功能
[root@slave1 ~]# scp -p /etc/redis/6379.conf root@192.168.190.102:/etc/redis/
/etc/init.d/redis_6379 restart       # 两台从服务器均重启redis服务

4.4 验证主从效果

① 在 master 节点上验证从节点

[root@master ~]# redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.190.101,port=6379,state=online,offset=98,lag=0
slave1:ip=192.168.190.102,port=6379,state=online,offset=98,lag=1
[root@master ~]# tail -f /var/log/redis_6379.log

② 在 master 数据库存放数据

[root@master ~]# redis-cli
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> get a
"1"

③ 在 slave 数据库获取数据

[root@slave1 ~]# redis-cli
127.0.0.1:6379> get a
"1"[root@slave2 ~]# redis-cli
127.0.0.1:6379> get a
"1"
# 至此实现主从复制

二、哨兵模式

1. 概述

主从切换需要人工干预,为了解决主从复制的缺点,在主从复制的基础上,哨兵引入了主节点的自动故障转移。

2. 结构

哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 redis 节点,不存储数据

数据节点:主节点和从节点都是数据节点

2. 功能与原理

哨兵(sentinel)是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master并将所有slave连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。

3. 作用

监控:哨兵会不断地检查主节点和从节点是否运作正常(哨兵间也会监测)

自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点

通知(提醒):哨兵可以将故障转移的结果发送给客户端

4. 故障转移机制

① 由哨兵节点定期监控发现主节点是否出现了故障,每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次 ping 命令做一次心跳检测。如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

② 当主节点出现故障,此时哨兵节点会通过 Raft 算法(选举算法)实现选举机制共同选举出一个哨兵节点为 leader,来负责处理主节点的故障转移和通知。所以整个运行哨兵的集群的数量不得少于3个节点。

③ 由 leader 哨兵节点执行故障转移,过程如下:

  • 将某一个从节点升级为新的主节点,让其它从节点指向新的主节点
  • 若原主节点恢复也变成从节点,并指向新的主节点
  • 通知客户端主节点已经更换

注意:客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。 

5. 主节点选举的过程 

监控对象:

  • 哨兵对主从复制集群进行监控:所有redis数据节点 
  • 哨兵与哨兵之间进行相互监控:哨兵彼此

监控目的:

  • 哨兵监控所有的 redis 数据库的目的:为了实现故障自动故障切
  • 哨兵与哨兵之间的监控目的:检测彼此的存活状态

故障切换过程:

① 当master 挂掉,哨兵会及时发现之后 进行投票机制,选发现,举出一个新的master服务器(一定是基数)

② 完成 salve 到 master 的切换

③ 完成其他的从服务器对新的 master 配置

6. 搭建 redis 哨兵模式 

6.1 所有节点修改哨兵模式配置文件

vim /opt/redis-5.0.7/sentinel.conf17 protected-mode no               # 关闭保护模式21 port 26379                      # Redis哨兵默认的监听端口26 daemonize yes                   # 指定sentinel为后台启动36 logfile "/var/log/sentinel.log" # 指定日志存放路径65 dir /var/lib/redis/6379         # 指定数据库存放路径84 sentinel monitor mymaster 192.168.190.100 6379 2  # 修改master ip
# 指定该哨兵节点监控192.168.190.100:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
113 sentinel down-after-milliseconds mymaster 30000 # 判定服务器down掉的时间周期,默认30000毫秒(30秒)
146 sentinel failover-timeout mymaster 180000 # 故障节点的最大超时时间为180000(180秒)

6.2 启动哨兵模式

注意:先启 master,再启 slave

[root@master ~]# cd /opt/redis-5.0.7/
[root@master redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 6728[root@slave1 ~]# cd /opt/redis-5.0.7/
[root@slave1 redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 41954[root@slave2 ~]# cd /opt/redis-5.0.7/
[root@slave2 redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 8273

6.3 查看哨兵信息

[root@slave2 ~]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.190.100:6379,slaves=2,sentinels=3
# 名为 "mymaster" 的主节点的详细信息。它显示该主节点的状态正常(status=ok),地址为 192.168.190.100:6379,有 2 个从节点(slaves)和 3 个 Sentinel。

6.4 查看日志并模拟 master 故障

[root@master ~]# systemctl stop redis.service
[root@slave2 ~]# tail -f /var/log/sentinel.log
8261:X 03 Apr 2024 19:47:03.639 # +config-update-from sentinel f6084d790599b7c806cde643fcf083df6f782182 192.168.190.101 26379 @ mymaster 192.168.190.100 6379
# 表示一个 Sentinel 实例收到了来自另一个 Sentinel 实例的配置更新
8261:X 03 Apr 2024 19:47:03.639 # +switch-master mymaster 192.168.190.100 6379 192.168.190.102 6379
# 名为 "mymaster" 的主节点从地址 192.168.190.100:6379 切换到了新地址 192.168.190.102:6379。这通常代表着故障转移(failover)的发生,即主节点切换到了另一个地址上
8261:X 03 Apr 2024 19:47:03.640 * +slave slave 192.168.190.101:6379 192.168.190.101 6379 @ mymaster 192.168.190.102 6379
8261:X 03 Apr 2024 19:47:03.640 * +slave slave 192.168.190.100:6379 192.168.190.100 6379 @ mymaster 192.168.190.102 6379
# 表示两个从节点已经成功地重新连接到新的主节点地址 192.168.190.102:6379。
8261:X 03 Apr 2024 19:47:33.715 # +sdown slave 192.168.190.100:6379 192.168.190.100 6379 @ mymaster 192.168.190.102 6379

6.5 再次查看哨兵信息

[root@master ~]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.190.102:6379,slaves=2,sentinels=3

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

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

相关文章

物联网实战--入门篇之(七)嵌入式-MQTT

目录 一、MQTT简介 二、MQTT使用方法 三、MQTT驱动设计 四、代码解析 五、使用过程 六、总结 一、MQTT简介 MQTT因为其轻量、高效和稳定的特点,特别适合作为物联网系统的数据传输协议,已经成为物联网事实上的通信标准了。关于协议的具体内容看看这…

Java实现两数相除

题意 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335…

leetcode 热题 100(部分)C/C++

leetcode 热题 100 双指针 盛最多水的容器 【mid】【双指针】 思路: 好久没写代码sb了,加上之前写的双指针并不多,以及有点思维定势了。我对双指针比较刻板的印象一直是两层for循环i,j,初始时i,j都位于左界附近&…

Open CASCADE学习|刚体( TopoDS_Shape)按某种轨迹运动,停在指定位置上

今天实现如下功能:刚体做做螺旋运动,轨迹已知,求刚体在每个位置上的所占据的空间,就是把刚体从初始位置变换到该位置。 这里的刚体是一个砂轮截面,螺旋运动轨迹由B样条曲线拟合,通过Frenet标架确定运动轨迹…

iOS使用CoreML运用小型深度神经网络架构对图像进行解析

查找一个图片选择器 我用的是ImagePicker 项目有点老了,需要做一些改造,下面是新的仓库 platform :ios, 16.0use_frameworks!target learnings dosource https://github.com/CocoaPods/Specs.gitpod ImagePicker, :git > https://github.com/KevinS…

Python之Opencv进阶教程(1):图片模糊

1、Opencv提供了多种模糊图片的方法 加载原始未经模糊处理的图片 import cv2 as cvimg cv.imread(../Resources/Photos/girl.jpg) cv.imshow(girl, img)1.1 平均值 关键代码 # Averaging 平均值 average cv.blur(img, (3, 3)) cv.imshow(Average Blur, average)实现效果 1.2…

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟…

基于Spring Boot的餐厅点餐系统

基于Spring Boot的餐厅点餐系统 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 部分系统展示 管理员登录界面 用户注册登录界面 …

​如何使用ArcGIS Pro进行洪水淹没分析

洪水淹没分析是一种常见的水文地理信息系统应用,用于模拟和预测洪水事件中可能受到淹没影响的地区,这里为大家介绍一下ArcGIS Pro进行洪水淹没分析的方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据&…

Python学习笔记-Flask接收post请求数据并存储数据库

1.引包 from flask import Flask, request, jsonify from flask_sqlalchemy import SQLAlchemy 2.配置连接,替换为自己的MySQL 数据库的实际用户名、密码和数据库名 app Flask(__name__) #创建应用实列 app.config[SQLALCHEMY_DATABASE_URI] mysqlpymysql://ro…

鸿蒙OS开发实例:【应用事件打点】

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息。因此,应用开发者需要一种数据打点机制,用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent是在系统层面…

适用于 Linux 的 Windows 子系统安装初体验

1、简述 Windows Subsystem for Linux (WSL) 是 Windows 的一项功能,允许您在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双重启动。 WSL 旨在为想要同时使用 Windows 和 Linux 的开发人员提供无缝且高效的体验。 使用 WSL 安装和运行各种 L…

【javaScript】DOM编程入门

一、什么是DOM编程 概念:DOM(Document Object Model)编程就是使用document对象的API完成对网页HTML文档进行动态修改,以实现网页数据和样式动态变化的编程 为什么要由DOM编程来动态修改呢?我们就得先理解网页的运行原理: 如上图&a…

IO流:字节流、字符流、缓冲流、转换流、数据流、序列化流 --Java学习笔记

目录 IO流 IO流的分类 IO流的体系 字节流: 1、Filelnputstream(文件字节输入流) 2、FileOutputStream(文件字节输出流) 字节流非常适合做一切文件的复制操作 复制案例: try-catch-finally 和 try-with-resource 字符流 1、FileReader(文件字符…

ALPHA开发板上的PHY芯片驱动:LAN8720驱动

一. 简介 前面文章了解到,Linux内核是有提供 PHY通用驱动的。 本文来简单了解一下ALPHA开发板上的 PHY网络芯片LAN8720的驱动。是 LAN8720芯片的公司提供的 PHY驱动。 二. ALPHA开发板上的PHY芯片驱动:LAN8720驱动 我 们 来 看 一 下 LAN8720A 的 …

输入url到页面显示过程的优化

浏览器架构 线程:操作系统能够进行运算调度的最小单位。 进程:操作系统最核心的就是进程,他是操作系统进行资源分配和调度的基本单位。 一个进程就是一个程序的运行实例。启动一个程序的时候,操作系统会为该程序创建一块内存&a…

HDLbits 刷题 --Always nolatches

学习: Your circuit has one 16-bit input, and four outputs. Build this circuit that recognizes these four scancodes and asserts the correct output. To avoid creating latches, all outputs must be assigned a value in all possible conditions (See also always…

【HTML】简单制作一个3D动画效果重叠圆环

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言,本文将详细介绍一段代码,具体内容如下: 开始 首先新建文件夹,创建两个文本文档,其中HTML的文件名改为[index.html],CSS的…

搞学术研究好用免费的学术版ChatGPT网站-学术AI

学术版ChatGPThttps://chat.uaskgpt.com/mobile/?user_sn88&channelcsdn&scenelogin 推荐一个非常适合中国本科硕士博士等学生老师使用的学术版ChatGPT, 对接了超大型学术模型,利用AI技术实现学术润色、中英文翻译,学术纠错&#…

centOS如何升级python

centOS下升级python版本的详细步骤 1、可利用linux自带下载工具wget下载,如下所示: 笔者安装的是最小centos系统,所以使用编译命令前,必须安装wget服务,读者如果安装的是界面centos系统,或者使用过编译工具…