redis实现主从同步分为两种:全量同步和增量同步:第一次连入集群的slave需要进行全量同步,那些断开后重连的slave需要进行增量同步

每个redis都有自己的replid,他们是master的标识,在尚未搭建集群之前,每个redis都是master,因此大家都有各自不同的replid

repl_backlog中会写入所有操作的命令,写操作会导致offset的增大,并且主从的offset会保持一致大小

全量同步:

  如果是一个新的slave连入集群,那我们就需要进行全量同步。如何判断这个slave是断后重连还是新来的呢?我们可以通过上述replid。

  slave连入集群时,会尝试向master发送psync,其中携带自己的replid。如果replid与master不相同,那么就可以说明他是新来的。除此以外,如果offset偏移丢失,已经无法通过增量同步恢复数据,也需要进行全量同步

  这时我们由master执行bgsave,生成一份RDB,再将RDB发送给slave。

  这里又翻了翻之前的笔记,1.什么是bgsave,2.为什么不用save:这两个问题的答案是:bgsave是异步的,save是同步的。使用save会造成阻塞问题。学完MQ,再加上了解了ws,我对bgsave有了新的印象

增量同步:

  master在与slave建立连接之后会生成一个repl_backlog,其中会记录master的操作。我们在master中定义了offset(偏移值),每当写入一条命令,offset就会增加,理想情况下slave的offset也会增加。一旦连接断开,主从节点的offset就会不一致。因此如果我们的slave是断开重连,需要携带offset,来告诉master他需要从哪里开始恢复数据

repl_backlog的一些问题:repl_backlog是一个环形结构,也就是说一旦从节点长时间宕机再恢复,只能进行全量同步,因为offset已经对不齐了

主从同步优化方案:

  1.   在master上启用无磁盘复制,避免大量磁盘IO。但是会加剧网络传输的负担:repl-diskless-sync yes
  2.   redis单节点不要太大,这样才是在根本上减少磁盘IO。。黑马说不要超过8G,超了可以用类似微服务的方案多建几个redis集群分离用
  3.   适当提高repl_backlog大小,尽可能避免全量同步
  4.   适当限制slave节点数量,可以采用主从从链式结构,减少master压力(本质上从节点依旧只能读,但是他能从别的从节点同步数据)。这个方法会降低时效性

之前学过一次redis,这个主从同步的机制的问题有哪些呢?

1.主节点挂了没有选新的主节点,直接不能进行写数据了,而且这样做主机鸭梨巨大。按照我的记忆来说,这里我们需要增设哨兵sentinel,让他来和主节点定时进行心跳链接,一定主节点超时未响应,这时就会选举一个新的主节点,而这又衍生了新的问题:万一主节点其实没挂,那不就成了有两个主节点了吗。后续就推出了分片集群的设置,我记得好像是每一个节点都可以读写,并且他们都有后备小弟,主节点挂了小弟顶上,主节点恢复的时候和小弟关系反转一下就好了

哨兵sentinel方案:

  •   哨兵的作用:1.监控集群健康状态,2.故障转移,选新的master,3.通知
  •   如果判断master是否健康:每秒向master ping一下,一个哨兵没收到pong,那么他会认为master是主观下线,如果超过quorum都没有收到,那就是客观下线,该换master了。quorom由我们设置大小,数值最好是超过哨兵的一半
  •   故障转移:通过一系列方案抉择出新的master,让其执行slaveof no one,然后让所有slave都slaveof新的master,修复故障问题后,老的master也执行slaveof

redistemplate怎么连接集群:

配置的时候指定哨兵和集群名

spring:
redis:
sentinel:
master: hmaster # 集群名
nodes: # 哨兵地址列表
- 192.168.150.101:27001
- 192.168.150.101:27002
- 192.168.150.101:27003

配置读写分离的bean,这里的bean用的是最优策略:先从slave里读,slave实现没有读的了才用master读

@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}

redis如何实现主从同步的更多相关文章

  1. Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步

    Redis哨兵模式主从同步不可以绑定127.0.0.1或者0.0.0.0,不然无法进行主从同步,一定要绑定内网IP,而对于跨机房的问题,可以使用iptables进行nat转发来解决.

  2. redis持久化和主从同步

    redis持久化rdb与aof 简介 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的 ...

  3. Linux下的redis的持久化,主从同步及哨兵

    redis持久化 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失, 为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. RDB持久 ...

  4. redis学习笔记——主从同步(复制)

    在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复 ...

  5. redis 分布式,主从同步

    redis和memcache比较像的,memcache可以实现服务器的集群,redis肯定也是可以的.下面在一台机,实现redis主从复制. 1,copy一下redis.conf,生成一个从机的配置 ...

  6. redis 主从同步

    修改redis.conf配置文件 vi redis.conf 在编辑模式下 输入  /slaveof 来搜索 将slaveof启用 即 将#删除 依次配置所有 slave 并将进程 kill 掉 重启 ...

  7. Redis之(七)主从同步与集群管理

    8.1 主从同步原理 像MySQL一样,Redis是支持主从同步的,而且也支持一主多从以及多级从结构. 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来 ...

  8. Redis 主从同步+哨兵

    简介 通过使用 Redis 自带“主从同步+哨兵守护”功能提高Redis稳定性. 主从同步:保障数据主从数据实时同步. 哨兵:实时监控主redis如果故障,将从redis作为主使用. 环境: 系统:C ...

  9. Redis主从同步之主库挂死解决方案

    Redis实现了主从同步,但是主库挂死了,如何处理 方案:切换主库的身份 # 连接从库 [root@localhost redis-]# redis-cli -p # 取消从库身份 > slav ...

  10. Redis系列之(二):Redis主从同步,读写分离

    1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...

随机推荐

  1. .net C# System.Text.Json 如何将 string类型的“true”转换为布尔值 解决方案

    直接上解决方法的代码 先定义一个转换顺,代码如下: public sealed class AnhBoolConverter : JsonConverter<bool?> { public ...

  2. WPF开发快速入门【3】WPF的基本特性(附加属性)

    概述 本文描述WPF的附加属性.对于使用MVVM框架的项目,附加属性是非常重要的一个特性. 在MVVM框架下,ViewModel的代码通过控件的依赖属性来控制控件的,例如: //ViewModel p ...

  3. navicat安装和破解

    navicat16.0 下载地址: https://download.navicat.com.cn/download/navicat160_premium_cs_x64.exe 破解教程&破解 ...

  4. OpenCV简单实现AR需用到的算法函数介绍

    目前的AR需求(想要达到的目标) 公司目前的需求是要能够指定一个物体开始追踪,将一张预先准备好的图像覆盖在被追踪的物体上, 然后镜头偏转缩放各类操作,再转回来仍然可以识别到,并且同样依旧覆盖图片到先前 ...

  5. kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ consumer实战

    1.上一节课我们学习了MQTT producer 生产者步骤,MQTT consumer消费者步骤.该步骤可以从支持MRQTT协议的中间件获取数据,该步骤和kafka consumer 一样可以处理实 ...

  6. 编程语言界的丐帮 C#.NET FRAMEWORK 4.6 EF 连接MYSQL

    1.nuget 引用 EntityFramework .和 MySql.Data.EntityFramework. EntityFramework  版本:6.4.4,MySql.Data.Entit ...

  7. (一)requests-实战小练习

    1.需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 (此处以抓取科幻电影分类的信息为例) import requests import json ur ...

  8. (十)selenium实现微博高级搜索信息爬取

    1.selenium模拟登陆 2.定位进入高级搜索页面 3.对高级搜索进行定位,设置. 4.代码实现 import time from selenium import webdriver from l ...

  9. Wireshark基础教程

    Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wireshark软件下载和安装以及Wiresha ...

  10. springboot之日志配置-logback

    springboot之日志配置-logback 1.为什么使用logback logback是springboot默认集成的,是基于Sl4J的日志框架. logback的内核重写了,使得在某些关键路径 ...