redis08 主从复制

思维草图

认识

主机更新后根据配置和策略,自动将数据同步到备机的master/slave机制,Master以写为主,Slave以读为主。

为什么要使用主从复制

  • 读写分离,性能扩展,降低主服务器的压力
  • 容灾,快速恢复,主机挂掉时,从机自动变为主机

主从复制的两种配置方式

配置文件配置

安装的redis,默认的配置端口是6379

现在再复制两份配置文件作为两台从机,端口号改成6380、6381。

使用cp命令将redis.conf复制到创建的对应文件夹中

创建3个新的配置文件,对主机和从机进行配置

第一个文件 redis-6379.conf ,里面的配置内容

# include引用redis.conf内容
include /Users/lihui/Documents/dev-tool/master-slave/redis.conf
# 是否开启后台运行
daemonize yes
# 服务器ip
bind 127.0.0.1 
# 配置密码
requirepass 123456
# 相关目录配置
dir /Users/lihui/Documents/dev-tool/master-slave/
logfile /Users/lihui/Documents/dev-tool/master-slave/6379.log
# 端口
port 6379
# rdb文件
dbfilename dump_6379.rdb
# pid文件
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/redis_6379.pid

创建第二个文件redis-6380.conf

include /Users/lihui/Documents/dev-tool/master-slave/redis.conf
daemonize yes
bind 127.0.0.1
requirepass 123456
dir /Users/lihui/Documents/dev-tool/master-slave/
port 6380
dbfilename dump_6380.rdb
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/redis_6380.pid
logfile /Users/lihui/Documents/dev-tool/master-slave/6380.log

# 指定主机:slaveof 主机ip 端口
slaveof 127.0.0.1 6379
# 主机的密码
masterauth 123456

创建第三个文件

include /Users/lihui/Documents/dev-tool/master-slave/redis.conf
daemonize yes
bind 127.0.0.1
requirepass 123456
dir /Users/lihui/Documents/dev-tool/master-slave/
port 6381
dbfilename dump_6381.rdb
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/redis_6381.pid
logfile /Users/lihui/Documents/dev-tool/master-slave/6381.log

# 指定主机:slaveof 主机ip 端口
slaveof 127.0.0.1 6379
# 主机的密码
masterauth 123456

如图

启动master

redis-server /Users/lihui/Documents/dev-tool/master-slave/redis-6379.conf

启动slave

redis-server /Users/lihui/Documents/dev-tool/master-slave/redis-6380.conf

redis-server /Users/lihui/Documents/dev-tool/master-slave/redis-6381.conf

可以看到每一台reids服务器的启动日志

客户端连接主机病查看主机信息

# 连接6379主机
redis-cli -h 127.0.0.1 -p 6379 -a 123456
# 查看6379主机信息
info Replication

# 连接6380主机并查看主机信息
redis-cli -h 127.0.0.1 -p 6380 -a 123456
info Replication

# 连接6381主机并查看主机信息
redis-cli -h 127.0.0.1 -p 6381 -a 123456
info Replication

验证主机从机同步效果

控制台命令配置

还是先复制三份conf的配置文件,但是里面的内容不需要配置主从节点关系

redis-6379.conf

include /Users/lihui/Documents/dev-tool/master-slave/redis.conf
daemonize yes
bind 127.0.0.1
requirepass 123456
dir /Users/lihui/Documents/dev-tool/master-slave/
port 6379
dbfilename dump_6379.rdb
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/redis_6379.pid
logfile /Users/lihui/Documents/dev-tool/master-slave/6379.log

redis-6380.conf

include /Users/lihui/Documents/dev-tool/master-slave/redis.conf
daemonize yes
bind 127.0.0.1
requirepass 123456
dir /Users/lihui/Documents/dev-tool/master-slave/
port 6380
dbfilename dump_6380.rdb
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/redis_6380.pid
logfile /Users/lihui/Documents/dev-tool/master-slave/6380.log

redis-6381.conf

include /Users/lihui/Documents/dev-tool/master-slave/redis.conf
daemonize yes
bind 127.0.0.1
requirepass 123456
dir /Users/lihui/Documents/dev-tool/master-slave/
port 6381
dbfilename dump_6381.rdb
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/redis_6381.pid
logfile /Users/lihui/Documents/dev-tool/master-slave/6380.log

按之前的命令正常启动三个redis服务,这时候这三个redis服务是独立没有关系的。

使用命令将6380设置为6379的从机

redis-cli -h 127.0.0.1 -p 6380 -a 123456

config set masterauth 123456

slaveof 127.0.0.1 6379

使用命令将6381设置为6379的从机

redis-cli -h 127.0.0.1 -p 6381 -a 123456

config set masterauth 123456

slaveof 127.0.0.1 6379

然后进控制台使用命令查看redis服务的信息,可以看到和之前一样的信息。

 主从复制原理

  • slave启动成功连接到master后(第一次),会给master发送数据同步消息(发送sync命令)
  • master接收到slave发来的数据同步消息后,把主服务器的数据进行持久化到rdb文件,同时会收集接收到的用于修改数据的命令,master将传rdb文件发送给你slave,完成一次完全同步
  • 全量复制:而slave服务在接收到master发来的rdb文件后,将其存盘并加载到内存
  • 增量复制:master继续将收集到的修改命令依次传给slave,完成同步但是只要重新连接master,一次完全同步(全量复制)将会被自动执行 

第一次连接成功后进行一次全量数据复制,后续进行增量数据复制。

注意:主机挂掉后,从机会待命,小弟还是小弟,会等着大哥恢复,不会篡位。

当主机挂掉之后,我们可以手动将从机设置为主机

如,想让6380成为主机,那么在6380的控制台输入

slaveof no one

然后再去其他slave上面执行 slaveof 命令将其挂在这台服务器上。

这种主备切换有个缺点:需要手动去执行命令去操作,不是太方便。

采用另外一种方式:哨兵模式,主挂掉之后,自动从slave中选举一个作为主机,自动实现故障转 移。

哨兵(Sentinel)模式

介绍

能够自动监控master是否发生故障,如果故障了会根据投票数从slave中挑选一个作为master,其他的slave会自动转向同步新的master,实现故障自动转移。

原理

  • sentinel会按照指定的频率给master发送ping请求,看看master是否还活着,若master在指定时间内未正常响应sentinel发送的ping请求,sentinel则认为master挂掉了,但是这种情况存在误判的可能,比如:可能master并没有挂,只是sentinel和master之间的网络不通导致,导致ping失败。

  •  为了避免误判,通常会启动多个sentinel,一般是奇数个,比如3个,那么可以指定当有多个sentinel都觉得master挂掉了,此时才断定master真的挂掉了,通常这个值设置为sentinel的一半,比如sentinel 的数量是3个,那么这个量就可以设置为2个。

  • slaveof no one 当多个sentinel经过判定,断定master确实挂掉了,接下来sentinel会进行故障转移:会从slave中投票选出一个服务器,将其升级为新的主服务器, 并让失效主服务器的其他从服务器slaveof指向新的主服务器;

  • 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

配置示例

之前的一台主机,两台从机已经配置好启动了。现在来配置三台监视主机的哨兵服务。

创建sentinel-26379.conf文件

# 配置文件目录
dir "/Users/lihui/Documents/dev-tool/master-slave"

# 日志文件位置
logfile "./sentinel-26379.log"

# pid文件
pidfile "/Users/lihui/Documents/dev-tool/master-slave/var/run/sentinel_26379.pid"

# 是否后台运行
daemonize yes

# 端口
port 26379

# 监控主服务器master的名字:mymaster,IP:127.0.0.1,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 127.0.0.1 6379 2

# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000

# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败

# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制

# 指定mymaster主的密码(没有就不指定)
sentinel auth-pass mymaster 123456
# Generated by CONFIG REWRITE
protected-mode no
user default on nopass ~* &* +@all
sentinel myid be5608edf5bcb37c46af76860e005dc4b396c16a
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel current-epoch 0
sentinel known-replica mymaster 127.0.0.1 6381
sentinel known-replica mymaster 127.0.0.1 6380

sentinel-26380.conf

# 配置文件目录
dir /Users/lihui/Documents/dev-tool/master-slave/

# 日志文件位置
logfile "./sentinel-26380.log"

# pid文件
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/sentinel_26380.pid

# 是否后台运行
daemonize yes

# 端口
port 26380

# 监控主服务器master的名字:mymaster,IP:127.0.0.1,port:6379,最后的数字2表示当
Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 127.0.0.1 6379 2

# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping
不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000

# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000

# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理
解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1

# 指定mymaster主的密码(没有就不指定)
sentinel auth-pass mymaster 123456

sentinel-26381.conf

# 配置文件目录
dir /Users/lihui/Documents/dev-tool/master-slave/

# 日志文件位置
logfile "./sentinel-26381.log"

# pid文件
pidfile /Users/lihui/Documents/dev-tool/master-slave/var/run/sentinel_26381.pid

# 是否后台运行
daemonize yes

# 端口
port 26381

# 监控主服务器master的名字:mymaster,IP:127.0.0.1,port:6379,最后的数字2表示当
Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 127.0.0.1 6379 2

# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping
不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000

# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000

# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理
解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1

# 指定mymaster主的密码(没有就不指定)
sentinel auth-pass mymaster 123456

启动三个sentinel

redis-sentinel /Users/lihui/Documents/dev-tool/master-slave/sentinel-26379.conf

redis-sentinel /Users/lihui/Documents/dev-tool/master-slave/sentinel-26380.conf

redis-sentinel /Users/lihui/Documents/dev-tool/master-slave/sentinel-26381.conf

查看3个sentinel的信息

redis-cli -p sentinel的端口
info sentinel

可以看到输出信息

现在停止主机6379服务,等待几分钟,完成故障转移

 然后在6380的主机上使用info replication查看信息

可以看到6381服务自动变成了主机

这时候当6379服务又重新连接,恢复正常

 可以看到之前的主机,自动变为从机,挂在新的主机之下了

SpringBoot整合Sentinel模式

引入对应的maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.properties中配置redis sentinel信息

# redis sentinel主服务名称,来源于:sentinel配置文件中sentinel monitor后面跟的那个名称
spring.redis.sentinel.master=mymaster
# sentinel节点列表(host:port),多个之间用逗号隔开
spring.redis.sentinel.nodes=ip:26379,ip:26380,ip:26381
# sentinel密码
#spring.redis.sentinel.password=
# 连接超时时间(毫秒)
spring.redis.timeout=60000
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
spring.redis.database=0

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[VSCode插件] 轻量级静态博客 - MDBlog

MDBlog VSCode插件&#xff0c;基于Markdown的轻量级静态博客系统&#xff0c;同时支持导出为可以部署的静态博客。 仓库 MDBlog 1. Features 博客基础功能&#xff1a;分类管理、文章管理、自动生成索引快捷指令&#xff1a;快捷输入表格、mermaid、wavedrom、代码块发布&a…

企企通龙年首秀——2024华南采购峰会,赋能企业供应链高质量发展之路

开年第一个工作日&#xff0c;广东省高质量发展大会在深圳召开&#xff0c;处在高质量发展阶段的广东&#xff0c;正加快产业和科技融合发展&#xff0c;坚持以科技创新引领现代化产业体系建设&#xff0c;勇立潮头&#xff0c;抢占先机。 一年之计在于春。迎着高质量发展大会的…

P9905 [COCI 2023/2024 #1] AN2DL 【矩阵区间最大值】

文章目录 题目大意1.输入格式2.输出格式3.数据范围与约定 思路维护每一行区间维护每一列区间维护区间最大值code↓ 完结撒花(&#xffe3;▽&#xffe3;) / 题目大意 给定 n , m , r , s n,m,r,s n,m,r,s 和一个 n m n\times m nm 的整数矩阵 A A A&#xff0c;求它每个 …

Spring的Bean的生命周期 | 有图有案例

Spring的Bean的生命周期 Spring的Bean的生命周期整体过程实例化初始化服务销毁循环依赖问题 完整生命周期演示 Spring的Bean的生命周期 Spring Bean的生命周期&#xff1a;从Bean的实例化之后&#xff0c;通过反射创建出对象之后&#xff0c;到Bean称为一个完整的对象&#xf…

数据中台:数字中国战略关键技术实施

这里写目录标题 前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿&#xff0c;方法论体系更新与时俱进&#xff0c;紧跟时代热点深入6大行业&#xff0c;提炼实践精华大咖推荐&#xff0c;数字化转型必备案头书 前言 在数字中国这一国家战略的牵引下&#xff0…

SpringBoot-yaml语法

1.概念 在Springboot的项目中&#xff0c;配置文件有以下几种格式&#xff1a; Application.propertiesApplication.yamlApplication.yml 其中官方推荐我们使用yaml的格式(因为能表示的数据类型很多样) 2.基本语法 # yaml形式的配置文件# 普通的key-value&#xff08;分号之后…

【AI Agent系列】【MetaGPT多智能体学习】4. 基于MetaGPT的Team组件开发你的第一个智能体团队

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第二篇笔记。主要是对MetaGPT中Team组件…

“智联招聘崩了?” 2024春招持续升温,求职者的热情“暴涨”到服务器都承受不住了!

2 月 28 日&#xff0c;”智联招聘崩了“登上微博热搜。有网友感叹&#xff0c;现在找工作太难了&#xff0c;发现有这么多人在竞争更焦虑了。 对此智联招聘回应称&#xff0c;由于求职流量新高&#xff0c;服务器过载&#xff0c;造成了短暂停用&#xff0c;但目前服务已恢复正…

设计模式(十三)抽象工厂模式

请直接看原文:设计模式&#xff08;十三&#xff09;抽象工厂模式_抽象工厂模式告诉我们,要针对接口而不是实现进行设计。( )-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- …

基于Mahout实现K-Means聚类

需求分析 需要对数据集进行预处理&#xff0c;选择合适的特征进行聚类分析&#xff0c;确定聚类的数量和初始中心点&#xff0c;调用Mahout提供的K-Means算法进行聚类计算&#xff0c;评估聚类结果的准确性和稳定性。同时&#xff0c;需要对Mahout的使用和参数调优进行深入学习…

解析社交媒体二维码生成:连接世界,拓展社交网络

随着社交媒体的普及和二维码技术的发展&#xff0c;社交媒体二维码作为一种新型的社交工具&#xff0c;逐渐受到人们的关注和喜爱。本文将探讨社交媒体二维码的定义、应用场景以及优势所在。 1. 什么是社交媒体二维码? 社交媒体二维码是将个人或企业在社交媒体平台上的信息整…

JavaSE-09(Java IO精华总结)

Java IO 简单做个总结&#xff1a; 1 .InputStream/OutputStream 字节流的抽象类。2 .Reader/Writer 字符流的抽象类。3 .FileInputStream/FileOutputStream 节点流&#xff1a;以字节为单位直接操作“文件”。4 .ByteArrayInputStream/ByteArrayOutputStream 节点流&#xff…

现在如何才能开通微信公众号留言功能?

为什么公众号没有留言功能&#xff1f;2018年2月12日之后直到现在&#xff0c;新注册公众号的运营者会发现一个问题&#xff1a;无论是个人还是企业的公众号&#xff0c;在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验&#xff0c;少了一个这么重要的功能&…

4. 编写app组件

1. 代码 main.ts // 引入createApp用于创建应用 import {createApp} from "vue"// 引入App根组件 import App from ./App.vue createApp(App).mount(#app) App.vue <!-- vue文件可以写三种标签1. template标签&#xff0c;写html结构2. script 脚本标签&…

Python实现向量自回归移动平均模型(VARMA算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 向量自回归移动平均模型&#xff08;Vector Autoregressive Moving Average, VARMA&#xff09;是一种…

GEE:使用ReLu激活函数对单波段图像进行变换(以NDVI为例)

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine (GEE)平台上,对任意单波段影像进行 ReLu 变换的代码。并以对 NDVI 影像像素值的变换为例。 文章目录 一、ReLu激活函数1.1 什么是 ReLu 激活函数1.2 用到遥感图像上有什么用?二、代码链接三、完整代码一、ReLu激活…

电脑端微信无法打开公众号/小程序?

生气了。怎么动不动电脑端微信就打不开公众号/小程序&#xff0c;每次都要搞好久 第一步&#xff1a;打开控制面板、网络和Internet&#xff0c;选中Internet选项。 第二步&#xff1a;选中连接选项&#xff0c;并打开下方的局域网设置。 第三步&#xff1a;取消 为LAN使用代理…

横幅条(自定义控件)的编写

常可以看见ViewPager翻页视图下有几个圆点&#xff0c;并随着图片变化而变化。 我们称之为横幅条&#xff0c;横幅条自定义控件的编写有两种&#xff1a;(1)使用Paint与Canvas绘制&#xff1b;(2)使用RadioButton组合。 第一种编写方法的优势是可以显示滑动过程中的位置&#…

大模型之SORA技术学习

文章目录 sora的技术原理文字生成视频过程sora的技术优势量大质优的视频预训练库算力多&#xff0c;采样步骤多&#xff0c;更精细。GPT解释力更强&#xff0c;提示词(Prompt&#xff09;表现更好 使用场景参考 Sora改变AI认知方式&#xff0c;开启走向【世界模拟器】的史诗级的…

Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行

Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行 目录 Arduino应用开发——使用GUI-Guider制作LVGL UI并导入ESP32运行前言1 使用GUI-Guider设计UI1.1 创建工程1.2 设计UI 2 ESP工程导入UI2.1 移植LVGL2.2 移植UI文件2.3 调用UI文件2.4 烧录测试 结束语 前言 GU…