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. Swift 与 Objc Exception

    一.背景 Swift具备完善的Error handle机制,对于纯Swift下面的Error,在编码的时候能够正确处理. 在使用try? 处理抛出Error的方法的时候,会忽略Error,直接返回ni ...

  2. C++笔记(7)成员初始化列表

    成员初始化列表由逗号分隔的初始化列表组成(前面带冒号),它位于参数列调的右括号之后,函数体左括号之前.如果数据成员的名称为mdata,并需要将它初始化为val,则初始化器为mdata(val). Cl ...

  3. (数据科学学习手札161)高性能数据分析利器DuckDB在Python中的使用

    本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,经过六年多的 ...

  4. .net core (.net6) 读取配置文件 appsettings.json

    .net core (.net6) 读取配置文件 appsettings.json 新建个工具类,方便其它地方使用,代码如下 AppHelper: namespace net6mvc.Utils { ...

  5. node.js常用命令总结

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,用于构建快速.可扩展的网络应用程序.它使用事件驱动.非阻塞 I/O 模型,使其非常适合构建数据密集型的实时应用 ...

  6. int类型在接收null会报错,需要使用Java包装类型Integer,且Integer不能equal String字符串

    int类型在接收null会报错,需要使用Java包装类型Integer,且Integer不能equal String字符串 package com.example.core.mydemo.json2; ...

  7. 【已结束】阿珏Blog三周年特别纪念活动

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` [已结束]阿珏Blog三周年特别纪念活动 日期:2019- ...

  8. Unity下简易字符串指令调试

    Unity下简易字符串指令调试 输入相应的字符串命令即可调用特定的方法,比如让角色等级提升,生成特定数量的Boss等 using System; using UnityEngine; using Sy ...

  9. python中dict和list的数据结构

    要理解dict的有关内容需要你理解哈希表(map)的相关基础知识,这个其实是<算法与数据结构>里面的内容. 1.list和tuple其实是用链表顺序存储的,也就是前一个元素中存储了下一个元 ...

  10. RPC和心跳机制

    hadoop在节点间的内部通讯使用的是RPC,RPC协议把消息翻译成二进制字节流发送到远程节点,远程节点再通过反序列化把二进制流转成原始的信息. namenode与datanode之间的通信,jobt ...