Redis从入门到放弃系列(八) 主备同步

Stella981
• 阅读 382

Redis从入门到放弃系列(八) 主备同步

本文例子基于:5.0.4

在现在不管啥应用都谈分布式的阶段下(真的有必要???),我们的redis都会做一下主备,唔,如果redis存的数据不重要的话,其实也可以不用做[手动狗头].为了能进一步上分布式,先让我们来了解一下CAP原理吧~

  • Consistent(一致性)
  • Availability(可用性)
  • Partition tolerance(容错性)

在分布式系统中,只能保证CP or AP,那么Redis里面采用哪一种机制呢?

Redis采用的是AP机制,Redis的主备是异步同步数据的。也就是说,当Redis主服务接受了客户端的修改请求之后,会立即返回,这期间就算备服务节点网络不通(嗯,绝大部分是挖断了光缆),主服务依然走得风生水起。那么此时Redis备节点就处于数据落后的一种情况,此时Redis主节点同步的时候会采用快照同步的方式去将数据发送到备节点上(下文会讲到).正常情况下的数据同步都是通过增量buffer去同步的(即我的光缆开启了无敌状态).

开启主备

replicaof <masterip> <masterport>
//当master有设置了密码的时候需要配置
masterauth <master-password>

我的光缆开启了无敌状态

当备份节点处于正常的情况下,redis会在master节点为replica节点设置一个复制缓冲区,然后每次异步将缓存区中的指令同步到replica节点上面,replica节点消费的时候会同时告知master节点消费到了那儿.

我们先来看一下复制缓存区的设置配置

//当replica节点断开一段时间之后,如果其消费的进度还在该缓存区内,那么可以继续执行增量同步。
repl-backlog-size 1mb
//当没有replica节点的时候,缓存区的设置过期时间
repl-backlog-ttl 3600

复制缓存区如果写满的话,会从头开始覆盖前面的数据,然后导致replica节点需要全量复制,所以这里需要设置一个合理的复制缓冲区的值,防止replica节点全量复制(eg: repl-backlog-size = 重启从实例时长 * 主实例offset每秒写入量).

挖掘机挖断光缆

快照同步是一个耗时操作,将数据bgsave到磁盘中,然后将快照文件传输备份节点,当备份节点过长时间没有连接上master节点/新备份节点刚增加到集群中,需要执行快照同步。

快照同步有两种策略:

  • 磁盘备份:master服务创建一个新进程,将RDB文件写入磁盘,然后父进程将文件增量传输给备节点.
  • 无盘快照:master服务创建一个新进程,直接将rdb文件写入到备节点的socket

当开启了无盘快照之后,每次传输的时候,默认不能为其他的备节点提供无盘快照,新的备节点将会排队等待下一次无盘快照,可以调整时间,达到多个副本并行传输.

当使用非SSD磁盘跟有比较大的带宽的时候,采用无盘快照会比磁盘备份好很多.

可以通过一下配置来设置无盘快照:

repl-diskless-sync no
//当收到第一个无盘快照请求时,等待多少秒之后接受其他备节点的无盘快照请求
repl-diskless-sync-delay 5

写在最后

其实写作这东西真的是花时间不过当看到有人点赞/收藏的时候还是很开心的,感觉得到了认可

谢谢关注的各位~

Redis从入门到放弃系列(八) 主备同步

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Redis从入门到放弃系列(二) Hash
Redis从入门到放弃系列(二)Hash本文例子基于:5.0.4Hash是Redis中一种比较常见的数据结构,其实现为hashtable/ziplist,默认创建时为ziplist,当到达一定量级时,redis会将ziplist转化为hashtableRedis从入门到放弃系列(一)String
Stella981 Stella981
3年前
Redis从入门到放弃系列(四) Set
Redis从入门到放弃系列(四)Set本文例子基于:5.0.4Set是Redis中一种比较常见的数据结构,当存储的member为十进制64位有符号整数范围内的整数的字符串的时候其实现为intset,其他为hashtableRedis从入门到放弃系列(三)List(https://www.osch
Stella981 Stella981
3年前
Redis从入门到放弃系列(十) Cluster
Redis从入门到放弃系列(十)Cluster本文例子基于:5.0.4RedisCluster集群高可用方案,去中心化,最基本三主多从,主从切换类似Sentinel,关于Sentinel内容可以查看编者另外一篇【Redis从入门到放弃系列(九)Sentinel(https://www.o
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Redis从入门到放弃系列(一) String
Redis从入门到放弃系列(一)String本文例子基于:5.0.4字符串是Redis中最常见的数据结构,底层是采用SDS,是可以修改的字符串,类似ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。首先让我们来看一下该如何在redis里面使用字符串这种类型//将字符
Stella981 Stella981
3年前
Redis从入门到放弃系列(九) Sentinel
Redis从入门到放弃系列(九)Sentinel本文例子基于:5.0.4RedisSentinel作为Redis高可用方案,具有监听,通知,自动故障转移等功能.这一切都是依赖主备同步的大前提(参考上一节:Redis从入门到放弃系列(八)主备同步).监听:Sentinel会不断
Stella981 Stella981
3年前
Redis从入门到放弃系列(三) List
Redis从入门到放弃系列(三)List本文例子基于:5.0.4List是Redis中一种比较常见的数据结构,其实现为quicklist,quicklist是一个ziplist的双向链表Redis从入门到放弃系列(一)String(https://www.oschina.net/action/