热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis6高可用之主从复制+Sentinel哨兵监控

哈喽大家好我是小三!今天要写的是面试中常常会被问到的redis主从复制和Sentinel

哈喽大家好我是小三!


今天要写的是面试中常常会被问到的redis主从复制和Sentinel哨兵监控。

GoGoGo!



主从复制的介绍

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者为主节点(master),后者成为从节点(slave);数据的复制都是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是一个主节点,且一个主节点可以有多个从节点(或者没有从节点),但一个从节点只能有一个主节点。

使用主从复制的好处:读写分离,能够扩展主节点的读能力,给主节点分担压力。容灾恢复,一旦主节点宕机,可以在从节点作为主节点的备份随时可以顶上来。

架构介绍

从节点复制了主节点的数据,复制之后我们就可以做一个读写分离。如果是单节点的话,应用程序的请求都集中在主节点,但有了从节点之后可以承担部分的读压力。主节点就可以做读写操作,而从节点只做读操作。这样便给主节点分担压力了。


Redis主从复制,一主二从架构环境准备

说了那么多概念咱们就开始动手部署Redis的主从复制架构吧,这次我们部署的是一主二从的架构。

#创建文件
mkdir -p /data/redis/master/data
mkdir -p /data/redis/slave1/data
mkdir -p /data/redis/slave2/data


#从节点开启只读模式(默认)
replica-read-only yes


#从节点访问主节点的密码,和requirepass⼀样
masterauth 123456

#哪个主节点进⾏复制
replicaof 8.129.113.233 6379

首先创建一个主节点,在data/redis/master/data目录下touch一个redis.conf文件,编辑redis.conf文件

bind 0.0.0.0
port 6379
daemonize yes
requirepass "123456"
logfile "/usr/local/redis/log/redis1.log"
dbfilename "xdclass1.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly1.aof"
masterauth "123456"

接着创建从节点1,在data/redis/slave1/data目录下建redis.conf

bind 0.0.0.0
port 6380
daemonize yes
requirepass "123456"
logfile "/usr/local/redis/log/redis2.log"
dbfilename "xdclass2.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly2.aof"
replicaof 8.129.113.233 6379
masterauth "123456"

创建从节点2,在data/redis/slave2/data目录下建redis.conf

bind 0.0.0.0
port 6381
daemonize yes
requirepass "123456"
logfile "/usr/local/redis/log/redis3.log"
dbfilename "xdclass3.rdb"
dir "/usr/local/redis/data"
appendonly yes
appendfilename "appendonly3.aof"
replicaof 8.129.113.233 6379
masterauth "123456"

注意:防火墙记得关闭,阿里云服务器记得开放网络安全组。

创建好后就开始启动已经配置好的节点

启动方式:

#启动主
./redis-server/data/redis/master/data/redis.conf
#启动从1
./redis-server/data/redis/slave1/data/redis.conf
#启动从2
./redis-server/data/redis/slave2/data/redis.conf

使用info replication可以查看当前节点的状态

主从复制和读写验证

1.在主节点创建一个key
set name jack
2.在两个从节点测试是否能拿到主节点的数据
get name
3.在从节点set key是失败的,因为从节点只支持读操作


Redis6主从架构-复制读写分离原理解析

主从复制分为两种:一种是主从刚开始连接的时候,进行全量同步;另一种是全同步结束后,进行增量同步。

全量复制:master服务器会开启一个后台的进程用于将Redis的数据生成一个rdb文件,主服务器会缓存所有接受到的来自客户端的写命令,当后台保存进程后,会将rdb文件传递给slave服务器,这时候slave服务器就有了master服务器的数据了。在此之后,master服务器会将在此期间把缓存过来的命令通过redis传输协议发送给slave服务器,然后slave服务器再将这些命令依次用于自己本地上,最终达到数据的一致性

增量复制:主节点会有不断的命令写进来,slave完成初始化后开始工作时主服务器发送写的操作同步到服务器的过程就叫增量复制。增量复制是服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接受并执行收到的写命令。

主从复制有何特点:

主从复制对于主/从 服务器来说都是非阻塞的,所有在同步数据期间都可以正常处理外界的请求,一个主节点可以包含有多个从节点,每个从节点可以接受来自其他从节点的连接。从节点不会让key过期,而是在主节点的key过期删除后,发送删除命令给从节点进行删除。

加速复制:在节点完成重新同步的时候需要在磁盘上创建一个RDB文件,然后加载这个文件来为从服务器发送数据,但如果磁盘的速率比较低呢?这就会导致主节点与从节点的数据不一致。在新版的Redis中,支持无磁盘的复制,直接将RBD文件通过网络发送的形式给从服务器,不在使用磁盘作为中间件。

如果主从连接断开的话,重新连接后可以从中断的地方继续进行复制,而不用重新同步。在2.8版本后,重新同步的这个新特性使用PSYNC命令,而旧的使用SYNC命令


什么是Sentinel哨兵监控

前面搭建了主从复制,也了解到当主服务器宕机后,需要手动的把一台从服务器切换成主服务器。是不是感觉很麻烦?没错这样的话不仅费人工,还会造成一段时间内服务不可用,这显然是不可行的。所有,Redis就有了哨兵模式。Redis提供了哨兵命令,它是一个独立的进程哨兵通过发送命令给多个节点,并让Redis的服务器响应,从而来监控Redis实例的运行情况。当哨兵检查到主节点宕机了,会自动将从节点切换成主节点,并通知其他的从服务器修改配置文件切换主机。

Sentinel有三大任务

任务一:监控,Sentinel不会断地检查你的主服务器和从服务器是否工作正常。

任务二:提醒,当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他的应用程序来发送通知,提醒发现故障了。

任务三:自动故障转移,上面我们提到需要人工进行故障转移,而使用Sentinel就可以实现自动转移了。当一个主服务器不能正常工作的时候,Sentinel会开始自动故障转移操作,它会将故障的主服务器下的其中一个从服务器升级成主服务器,并让这个故障的主服务器下的所有从服务器改为复制新的主服务器。当客户端连接失败主服务器时,也会向客户端返回一个新的服务器地址,使得可以使用新的服务器地址来代连接失败的主服务器。

思考一下,这样是否会出现问题呢?一个哨兵进程对Redis服务器进行监控,如果因为网络问题呢,哨兵得不到服务器的响应了,这时你就会想那设置多个哨兵同时进行监控不就好了。但是多个哨兵监控的话,会形成多哨兵模式,接下来讲解一下多哨兵模式。


多哨兵模式下线名称介绍

主观下线(Subjectively Down,简称SDOWN)

是单个Sentinel实例对服务器做出下线的判断,比如上面所说的网络问题接受不到通知等。在一个服务器没有在down-after-milliseconds选项的指定时间内给Sentinel进行响应,那么Sentinel就会认为主管服务器已经下线了(理解成故障也可以)。

客观下线(Objectively Down,简称ODOWN)

指的多个Sentinel在对同一个服务器做出SDOWN判断,并且哨兵通过SENTINEL is-master-down-by-addr命令进行相互交流之后,得出服务器是否是下线。

客观下线这种条件只适用于主服务器

仲裁quornm

当在Sentinel给定的时间范围内,从其他Sentinel接受到了足够数量的主服务器下线报告,那么Sentinel就会将主服务器的状态从主动下线改成客观下线。这个足够数量就是配置文件中的值,一般设置为Sentinel的个数一般加1,比如4个Sentinel就设置成3个。

Sentinel哨兵搭建环境准备

核心流程:设置每秒ping,服务器超过指定时间不响应,那么就任务该服务器是主观下线的。多个哨兵任务主服务器是下线的话,那么就认为是客观下线,然后进行投票,在该主服务器下选择从服务器变成主服务器。如果没有足够数量同意这个主服务器下线,那么该服务器的状态就会被移除。

环境准备:

第一步:配置三个哨兵,每个哨兵的配置都是一样的。

第二步:启动的先后顺序为主服务器->从服务器->哨兵。

第三部:哨兵的端口号是:26379(记得要开放)

#不限制ip
bind 0.0.0.0

# 让sentinel服务后台运⾏
daemonize yes


# 配置监听的主服务器,mymaster代表服务器的名称,⾃定义,172.18.172.109 代表监控的主服务器,6379代表端⼝,
#2代表只有两个或两个以上的哨兵认为主服务器不可⽤的时候,才会进⾏failover操作。
sentinel monitor mymaster 172.18.172.109 6379 2

# sentinel auth-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
sentinel auth-pass mymaster 123456

#超过5秒master还没有连接上,则认为master已经停⽌
sentinel down-after-milliseconds mymaster 5000

#如果该时间内没完成failover操作,则认为本次
failover失败
sentinel failover-timeout mymaster 30000

在redis/conf目录下创建三个哨兵

sentinel-1.conf

port 26379
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel-1.pid"
logfile "/var/log/redis/sentinel_26379.log"
dir "/tmp"
sentinel monitor mymaster 8.129.113.233 6379
2
sentinel down-after-milliseconds mymaster
5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000

sentinel-2.conf

port 26380
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel-2.pid"
logfile "/var/log/redis/sentinel_26380.log"
dir "/tmp"
sentinel monitor mymaster 8.129.113.233 6379
2
sentinel down-after-milliseconds mymaster
5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000

sentinel-3.conf

port 26381
bind 0.0.0.0
daemonize yes
pidfile "/var/run/redis-sentinel-3.pid"
logfile "/var/log/redis/sentinel_26381.log"
dir "/tmp"
sentinel monitor mymaster 8.129.113.233 6379
2
sentinel down-after-milliseconds mymaster
5000
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000

记得创建目录/var/log/redis文件夹,主要是用于存放哨兵的log日志文件

启动哨兵(启动哨兵失败需要开放网络安全组的端口)

./redis-server /usr/local/redis/conf/sentinel-1.conf --sentinel
./redis-server /usr/local/redis/conf/sentinel-2.conf --sentinel
./redis-server /usr/local/redis/conf/sentinel-3.conf --sentinel

优点:主从可以自动切换,可用性更高了。

缺点:主节点的写能力和存储能力受限

简单分析下日志

1.老大掉线了

2.疯狂向老大发送询问(老大,你挂掉没?没回答,就应该是挂掉了,这时哨兵就辅助从节点变成老大)

3.自己就成为了老大MASTER MODE enabled

4.跟其他小弟进行数据请求(前老大都挂了,你们还不跟我?)

5.接着就是新的主从建立好了

SpringBoot整合Redis主从+Sentinel哨兵

在上面已经清楚了解到如何在Redis中使用哨兵,并且如何搭建哨兵环境。接下来开始使用SpringBoot+Sentinel哨兵的整合。

首先在application.yml中配置中注释掉Redis的host与port

在添加新的配置(哨兵相关配置)

sentinel:
master: mymaster
nodes: 8.129.113.233:26379,8.129.113.233:26380,8.129.113.233:26381

这样就可以在项目中配置好Redis的哨兵相关配置了,哨兵在Redis里是使用得比较频繁的。


推荐阅读

对于用户微服务注册模块需求的安全攻防,你了解多少?

分布式缓存Redis常见数据结构整理

Redis核心配置整理与Key命名规范

零零后程序员整理的Redis6高并发必备核心技术干货






推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
author-avatar
丿氵小柒柒2502894463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有