redis之主从复制、哨兵模式

一 redis群集有三种模式

主从复制:

主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。

主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。

缺陷:

故障恢复无法自动化;

写操作无法负载均衡;

存储能力受到单机的限制。

哨兵:

在主从复制的基础上,哨兵实现了自动化的故障恢复。

缺陷:

写操作无法负载均衡;存储能力受到单机的限制;

哨兵无法对从节点进行自动故障转移,

在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。

集群:

通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了

较为完善的高可用方案。

缺陷:

成本比较高,通常至少三主三从,六台起步,成本比较高

二 Redis 主从复制 

将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主服务器

(Master),后者称为从服务器(Slave);

数据的复制是单向的,只能由主服务器到从服务器。

默认情况下,每台Redis服务器都是主节点;且一个主服务器可以有多个从服务器(或没有从节点),但一个从节点只能有一个主节点。

1 主从复制的作用:

数据冗余:

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

故障恢复

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

服务的冗余。

负载均衡

在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服

务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其

 是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

高可用基石

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

Redis高可用的基础。

2 主从复制流程:

(1)若启动一个Slave机器进程,则它会向Master机器发送一个“sync command”命令,请求同步

连接。

(2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数

 据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。

(3)后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数

据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发

送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

(4)Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果

Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后

将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。

 

sync同步 RDB(完全备份文件)给从服务器 

              AOF(增量备份)给从服务器 

主从复制过程/原理:

①从---->主发送sync同步数据请求
②主redis 会fork一个子进程,然后会产生RDB文件(完全备份的文件)的过程

2.1 客户端还在持续的写入redis
③rdb文件 持久化完成后,主redis会将RDB文件和缓存起来的命令推送给我们的从服务器
④复制、推送完后,主reids 会持续的同步操作命----->利用AOF(增备)主持久化功能
⑤在下一台redis 接入主从复制之前,会持续利用AOF的方式 同步数据给从服务器

3 实验: 搭建Redis 主从复制

master:192.168.11.4

slave1:192.168.11.3

slave1:192.168.11.14

①关闭防火墙 防护
[root@mcb-11-4 ~]# hostnamectl set-hostname master
[root@mcb-11-4 ~]# bash
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
[root@mcb-11-3 ~]# hostnamectl set-hostname slave1
[root@mcb-11-3 ~]# bash
[root@slave1 ~]# systemctl stop firewalld
[root@slave1 ~]# setenforce 0
[root@mcb-11-14 ~]# hostnamectl set-hostname slave2
[root@mcb-11-14 ~]# bash
[root@slave2 ~]# systemctl stop firewalld 
[root@slave2 ~]# setenforce 0

主从服务器三台服务器都要做以下步骤: 

-----安装 Redis-----
yum install -y gcc gcc-c++ maketar zxvf redis-5.0.7.tar.gz -C /opt/cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis installcd /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/
②安装 Redis 
yum install -y gcc gcc-c++ make

两台从服务器与主服务器都要安装

master:vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.11.4 master
192.168.11.3 slave1
192.168.11.14 slave2

远程共享 :因为从与主文本相识

[root@slave2 opt]# scp redis-5.0.7.tar.gz slave1:/opt
The authenticity of host 'slave1 (192.168.11.3)' can't be established.
ECDSA key fingerprint is SHA256:3V0GFEzP1uwGoV7NVYcUJgAu4RXc3zyAmrdK/23JPYQ.
ECDSA key fingerprint is MD5:e7:4d:a5:3d:11:8b:3b:cb:e9:81:b0:07:59:19:f7:60.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'slave1,192.168.11.3' (ECDSA) to the list of known hosts.
root@slave1's password: 
redis-5.0.7.tar.gz                                                                  100% 1938KB  39.6MB/s   00:00    
[root@slave2 opt]# 
④解压安装包 
tar zxvf redis-5.0.7.tar.gz -C /opt/

⑤切换 安装 
cd /opt/redis-5.0.7/
make
[root@master redis-5.0.7]# make

make PREFIX=/usr/local/redis install
[root@slave2 redis-5.0.7]# make PREFIX=/usr/local/redis install

./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/

 ⑦查看文件

 

3 修改 Redis 配置文件(Master节点操作) 

vim /etc/redis/6379.conf   redis.conf
bind 0.0.0.0						#70行,修改监听地址为0.0.0.0
daemonize yes						#137行,开启守护进程
logfile /var/log/redis_6379.log		#172行,指定日志文件目录
dir /var/lib/redis/6379				#264行,指定工作目录
appendonly yes						#700行,开启AOF持久化功能

 

 

 

①检测一下: 
[root@slave2-redis utils]# vim /etc/redis/6379.conf
[root@slave2-redis utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@slave2-redis utils]# netstat -anpt|grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      9933/redis-server 1 
[root@slave1-redis utils]# vim /etc/redis/6379.conf
[root@slave1-redis utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@slave1-redis utils]#  netstat -anpt|grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      15694/redis-server  
[root@master ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@master ~]#  netstat -anpt|grep redis
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      3178/redis-server 0 
tcp        0      0 192.168.11.4:6379       192.168.11.3:38993      ESTABLISHED 3178/redis-server 0 
tcp        0      0 192.168.11.4:6379       192.168.11.14:58450     ESTABLISHED 3178/redis-server 0 
[root@master ~]# 
②验证主从效果

 ③在主服务器输入文本

 二 Redis 哨兵模式 

主从切换:当服务器宕机后,需要人工手动一台从机切换为主机,为了解决主从复制的缺点,就有

了哨兵机制。

1 哨兵的核心功能:

在主从复制的基础上,哨兵引入了主服务器的自动故障转移。

2 哨兵模式原理: 

哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过

投票机制选择新的 Master并将所有slave连接到新的 Master。所以整个运行哨兵的集群的数量不得

少于3个节点。

3 哨兵模式的作用:

监控:哨兵会不断地检查主节点和从节点是否运作正常。

自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其

中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。

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

4 哨兵结构由两部分组成:

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

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

5 故障转移机制:

①由哨兵节点定期监控发现主节点是否出现了故障

每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。如

果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主

观下线了(单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。

②当主节点出现故障,此时哨兵节点会通过Raft算法(选举算法)实现选举机制共同选举出一个哨

兵节点为leader,来负责处理主节点的故障转移和通知。所以整个运行哨兵的集群的数量不得少于

3个节点。

③由leader哨兵节点执行故障转移:

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

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

6主节点的选举:

1.过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点。

2.选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)

3.选择复制偏移量最大,也就是复制最完整的从节点。

哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式

 7 实验操作

master:192.168.11.4

slave1:192.168.11.3

slave1:192.168.11.14

哨兵的启动是在主从复制之上,所以须把主从模式安装好的情况下再去做哨兵模式

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

③启动哨兵模式

先启 master,再启 slave

[root@master redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 4901
[root@master redis-5.0.7]# redis-sentinel sentinel.conf &
[2] 4906
[1]   完成                  redis-sentinel sentinel.conf[root@slave2-redis redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 12001[root@slave2-redis utils]# cd ..
[root@slave1-redis redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 17818
④ 查看哨兵信息

方法1:redis-cli -p 26379 info Sentinel

方法2:查看master的哨兵日志  redis-cli -p 26379 info Sentinel

⑤查看日志并模拟 master 故障
1)查看redis-server进程号:ps -ef | grep redis

2)杀死 Master 节点上redis-server的进程号

kill -9   3178

3)验证结果

①在哨兵节点上验证master是否转换至从服务器 

tail -f /var/log/sentinel.log

②在哨兵节点上再次查看哨兵信息,查看是否转换成功 

redis-cli -p 26379 info sentinel

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

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

相关文章

Python搭建编程环境—安装Python3解释器

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:零基础学Python 💬个人格言:不断的翻越一…

“多组数组”题的注意事项,天杀的“鲁棒性”

【题目描述】 输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000的整数。 输入包含多组数据,每组数据第一行是整数个数n,第二行是n个整数。n=0为输入结束标记&…

[C++初阶]初识C++(一)—————命名空间和缺省函数

声明: 本篇文献内容选自百度文库、比特就业课 代码内容部分选自比特就业课 一、命名空间 1.什么是命名空间 在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。命名空间的使用目…

vue3+echarts:echarts地图打点显示的样式

colorStops是打点的颜色和呼吸灯、label为show是打点是否显示数据、rich里cnNum是自定义的过滤模板用来改写显示数据的样式 series: [{type: "effectScatter",coordinateSystem: "geo",rippleEffect: {brushType: "stroke",},showEffectOn: &quo…

权限提升-Linux系统权限提升篇VulnhubRbash绕过DockerLXD容器History泄漏shell交互

知识点 1、普通用户到Linux-泄漏-History 2、普通用户到Linux-限制-Rbash绕过 3、普通用户到Linux-容器-LXD&Docker 4.Linux系统提权-web/普通用户-docker逃逸&提权&shell交互 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及…

STM32 移植 LVGL -- 教程图解

( 编辑状态中,已完成80%,估计清明假期后完成更新 ) 移植效果,先睹为快: 目录 一、LVGL 简述 二、准备一个STM32的工程 三、LVGL 官方下载 四、裁剪 源文件 五、添加 源文件 六、注册 显示 七、注册 触摸输入 八…

语言模型进化史(上)

由于篇幅原因,本文分为上下两篇,上篇主要讲解语言模型从朴素语言模型到基于神经网络的语言模型,下篇主要讲解现代大语言模型以及基于指令微调的LLM。文章来源是:https://www.numind.ai/blog/what-are-large-language-models 一、语…

【C++入门】初识C++

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

单片机家电产品--过零检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 单片机家电产品–过零检测 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1 什么是过零检测 1 过零检测指的是在交流系统中,在一个交流周期中…

第12章 集合框架

一 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用数组存储对象方面具有一些弊端,而Java 集合…

搜索--找出克隆二叉树中的相同节点

题目描述 给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target。 其中,克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中,与 target 相同 的节点&#xff…

蓝桥杯备考

目录 P8823 [传智杯 #3 初赛] 期末考试成绩 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码 P8828 [传智杯 #3 练习赛] 直角三角形 题目描述 输入格式 输出格式 输入输出样例 代码 P8833 [传智杯 #3 决赛] 课程 题目背景 题目描述 输入格式 输出格式…

vivado eFUSE 寄存器访问和编程

eFUSE 寄存器访问和编程 注释 : 在 MPSoC 和 Versal 器件上不支持以下 eFUSE 访问和编程方法。 7 系列、 UltraScale 和 UltraScale 器件具有一次性可编程位用于执行特定功能 , 称为 eFUSE 位。不同 eFUSE 位类型如 下所述: • …

突破校园网限速:使用 iKuai 多拨分流负载均衡 + Clash 代理(内网带宽限制通用)

文章目录 1. 简介2. iKuai 部署2.1 安装 VMware2.2 安装 iKuai(1) 下载固件(2) 安装 iKuai 虚拟机(3) 配置 iKuai 虚拟机(4) 配置 iKuai(5) 配置多拨分流 2.3 测试速度 3. Clash 部署3.1 准备工作(1) 配置磁盘分区(2) 安装 Docker(3) 安装 Clash(4) 设置代理 1. 简介 由于博主…

新质生产力丨zData X 数据库一体机助力财政一体化平台全面升级

在数字化转型的大潮中,某财政局积极响应国家财政管理现代化的战略部署,启动了财政一体化平台升级改造工程。该项目旨在将财政局内部各部门及其各自独立的业务系统进行全面整合,构建起一个集约化的财政管理平台,力求通过技术创新推…

字符分类函数

字符分类函数 C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似,我们就讲解⼀个函数的事情,其他的非常类似: int i…

合同约定的绩效奖金说不给就不给了, 这合法吗?

目录 一、北京海淀法院参考案例 二、关于绩效奖金的性质? 三、绩效奖金应否发放取决于哪些因素? 四、员工如何举证与质证 五、提前离职的员工 是否享受当年度绩效奖金? 一、北京海淀法院参考案例 https://mp.weixin.qq.com/s/sq0mFCC8M…

在哪申请免费IP地址证书

IP证书,也被称为IP SSL证书,是一种特殊的SSL证书,不同于传统的域名验证(DV)证书,它是通过验证公网IP地址而不是域名来确保安全连接。这种证书是用于保护IP地址,并在安装后起到加密作用。 申请条…

数据结构算法题(力扣)——链表

以下题目建议大家先自己动手练习,再看题解代码。这里只提供一种做法,可能不是最优解。 1. 移除链表元素(OJ链接) 题目描述:给一个链表的头节点 head 和一个整数 val ,删除链表中所有满足值等于 val 的节点…

全面的Docker快速入门教程(详细)

前言: 都2024年了,你还在为了安装一个开发或者部署环境、软件而花费半天的时间吗?你还在解决开发环境能够正常访问,而发布测试环境无法正常访问的问题吗?你还在为持续集成和持续交付(CI / CD)工…