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.mzph.cn/news/790830.shtml

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

相关文章

VSCode安装及Python、Jupyter插件安装使用

VSCode 介绍 Visual Studio Code(简称VSCode)是一个由微软开发的免费、开源的代码编辑器。VSCode是一个轻量级但是非常强大的代码编辑器,它支持多种编程语言(如C,C#,Java,Python,PHP&#xff0…

Redis的值有5种数据结构,不同数据结构的使用场景是什么?

文章目录 字符串缓存计数共享Session限速 哈希缓存 列表消息队列文章列表栈队列有限集合 集合标签抽奖社交需求 有序集合排行榜系统 字符串 缓存 (1)使用原生字符类型缓存 优点:简单直观,每个属性都支持更新操作 缺点&#xff1…

如何在本地搭建集成大语言模型Llama 2的聊天机器人并实现无公网IP远程访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛,包括聊天机…

JAVAEE之Cookie/Session

1.Cookie HTTP 协议自身是属于 "无状态" 协议. "无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后, 第二…

自定义树形筛选选择组件

先上效果图 思路:刚开始最上面我用了el-input,选择框里面内容用了el-inputel-tree使用,但后面发现最上面那个可以输入,那岂不是可以不需要下拉就可以使用,岂不是违背了写这个组件的初衷,所以后面改成div自定…

基于springboot+vue实现的小区物业管理系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

yolov9文献阅读记录

本文记录了yolov9文献的阅读过程,对主要内容进行摘选翻译,帮助理解原理和应用,包括摘要、主要贡献、网络结构、主要模块,问题描述和试验对比等内容。 文献摘要前言摘选主要贡献相关工作可逆性结构辅助监督 问题描述信息瓶颈原理可…

Linux 恶意软件“Migo”针对 Redis 进行加密劫持攻击

安全研究人员遇到了一种新的加密劫持活动,该活动使用一种名为 Migo 的新恶意软件,该恶意软件针对 Linux 主机上的 Redis 服务器。在 Cado Security 研究人员注意到在野外利用 Redis 系统的新命令后,该活动曝光了。 初始访问 根据 Cado secu…

传统模型用腻了?GCN图卷积神经网络一键实现西储大学轴承故障诊断!发文新思路!

​ 声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 数据介绍与故障诊断讲解 1.数据…

实时获取 Pacific Time Zone (太平洋时区) 时间

实时获取 Pacific Time Zone [太平洋时区] 时间 1. Google -> Pacific Time2. Pacific Time - exact time nowReferences 1. Google -> Pacific Time 2. Pacific Time - exact time now https://time.is/zh/PT References [1] Yongqiang Cheng, https://yongqiang.blog…

原理图设计的通用规范

原理图各页内容依次为:封面、目录、电源、时钟、CPU、存储器、逻辑、背板(母板)接口等。 原理图上所有的文字方向应该统一,文字的上方应该朝向原理图的上方(正放文字)或左方(侧放文字&#xff…

文件操作详解(二)

目录 一.文件的顺序读写1.顺序读写函数(适合于所有的流)1.1 fgetc(读字符)1.2 fputc(写字符)1.3 fgets(读字符串)1.4 fput(写字符串)1.5 fscanf(格式化地读)1.6 fprintf(格式化地写) 2.顺序读写函数(只适用于文件流)2.1 fread(二进…

蓝桥杯嵌入式学习笔记(9):RTC程序设计

目录 前言 1. RTC介绍 2. 使用CubeMx进行源工程配置 3. 代码编程 3.1 准备工作 3.2 进行bsp_rtc.h编写 3.3 进行bsp_rtc.c编写 3.4 main.c编写 3.4.1 头文件引用 3.4.2 变量声明 3.4.3 子函数声明 3.4.4 函数实现 3.4.5 main函数编写 4. 代码实验 5. 总结 前言 因本人备赛蓝…

分布式链路追踪与云原生可观测性

分布式链路追踪系统历史 Dapper, a Large-Scale Distributed Systems Tracing Infrastructure - Google Dapper,大规模分布式系统的跟踪系统大规模分布式系统的跟踪系统:Dapper设计给我们的启示 阿里巴巴鹰眼技术解密 - 周小帆京东云分布式链路追踪在金…

WPS二次开发专题:如何获取应用签名SHA256值

作者持续关注WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397) 在申请WPS SDK授权版时候需要开发者提供应用包名和签…

Jmeter各组件超详细介绍

1、JMeter和Loadrunner的区别? 2、JMeter如何开发脚本的?强化脚本的技术? 代理服务器录制脚本,Fiddler录制脚本,Badboy录制脚本,根据API,手写脚本,根据抓包,手写脚本。 …

docker版Elasticsearch安装,ik分词器安装,用户名密码配置,kibana安装

1、安装es和ik分词器 创建映射目录并赋予权限: mkdir -p /docker_data/elasticsearch/conf mkdir -p /docker_data/elasticsearch/data mkdir -p /docker_data/elasticsearch/plugins chmod -R 777 /docker_data/elasticsearch编写配置文件: vi /dock…

数据结构—红黑树

红黑树介绍 红黑树(Red Black Tree)是一种自平衡二叉查找树。由于其自平衡的特性,保证了最坏情形下在 O(logn) 时间复杂度内完成查找、增加、删除等操作,性能表现稳定。 在 JDK 中,TreeMap、TreeSet 以及 JDK1.8 的 …

【C++】C++中的list

一、介绍 官方给的 list的文档介绍 简单来说就是: list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中…

帝国cms自适应html5成语大全/成语查询/成语接龙网站源码整站模板moretag插件带采集

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 帝国cms自适应html5成语大全/成语查询…