redis主从同步-概览

现在这世道太卷了,写点博客都有点卖艺的感觉

配置

复制代码
replicaof 192.168.3.260 6379 # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica‐read‐only yes # 配置从节点只读

原理

1、master的slave 作为附属 首先这个自觉性必须到位,发送一个psync 给master长官请求复制数据sir(借助的是socker长连接)

2、master长官接收到psync请求后,在后台(那当然是后台了,小附属还能占自己大主线打这些杂七杂八的活),在后台master通过bgsave生成最新的 rdb快照(回旋的镖请注意):这期间那我的主线任务是不能停的,仍然接受着伟大客户端的请求,so客户端那些修改 的命令呐 存在内存repl buffer中(这么关键的时候多少得占点内存repl buffer

3、bgsave持久化完了之后呢,master会把send rdb文件数据集发送给slave

4、slave呢清空老数据接收加载master的持久化数据,加载到内存

5、然后master再将存在内存中那些修改命令发送给slave :send buffer,让slave去执行写命令,这样能一定程度上保证一致性

需要注意的是如果多个slave因为各种各样的原因(👻知道什么原因)和master断开了亲子关系,当他们在"认祖归宗"的时候,master可能接收到多个slave并发连接请求,master只会进行一次持久化,毕竟错的不在master ,多份也没必要,省时省力 大家都平安

当然每次都进行全量的持久化那很多情况下是没必要的,所以从2.8开始

断点续传

他来啦,他带着全村的希望走来啦

1、master在内存中创建复制数据的缓存队列,缓存最近的数据,所有人都维护了两个至关重要(甚至一绝生死)的东西,那就是 复制的数据下标offset 和 master的进程id

2、当网络断开,slave请求mater进行未完成的复制使命 **psync(offset):**从自己记录的下标开始复制,只能是自己记录的,别人家的你又偷不来,没得手脚撒~

3、如果slave的offset在repl backlog buffer 中,master就直接从缓存中将offset之后的数据一次性同步给slave,这样多省事:既然slave觉悟高,没有落后很多那就要褒奖,相反意味着差的很多直接全量同步,这也是为了大家好,万一有多差很多,不全量那就麻烦了

4、如果mster进程id变了,不得了 原来的皇帝没了,那保守起见 直接进行全量数据复制

如果很多个从节点要求从主节点复制数据,那不得了,master要忙不过来的了(复制风暴),分散压力就让从与从之前同步数据,而不是全部都从主复制,当臣子的主动为皇帝分担也是应该的

上面主要是为了增加趣味性,好学,为什么情感含义,不喜勿喷

主体讲完了,给大家附赠一下lua管道吧

管道

客户端一次性发送多个请求,等所有命令都发送完再一次性读取服务都响应,短短一句话就出现了两个一次性,这网络传输开销降低有多低可想而知

这一切可以归功于管道pipeline,管道执行多条命令的网络开销和执行一次的开销是一样的

注意的是处理完命令前先缓存之前命令的处理结果,所以打包的命令越多,消耗的内存越多,所以一切都需要适合而止

pipeline发送的命令都会被server立即执行,如果执行失败 失败信息会保存起来返回,不影响后面命令的执行

相关推荐
木风小助理2 分钟前
PerconaXtraBackup工作原理深度解析
数据库
lkbhua莱克瓦243 分钟前
进阶-锁章节
数据库·sql·mysql·oracle·存储过程·
山峰哥5 分钟前
JOIN - 多表关联的魔法——3000字实战指南
java·大数据·开发语言·数据库·sql·编辑器
IT大白6 分钟前
4、Redis核心原理
数据库·redis·缓存
wzy06237 分钟前
Redis 集群迁移方案:从三节点到三节点的无缝过渡
数据库·redis·缓存
墨笔之风10 分钟前
MySQL与PostgreSQL选型对比及适用场景说明
数据库·mysql·postgresql
肥大毛11 分钟前
Oracle中Merge Using用法
数据库·oracle
程序员Agions16 分钟前
N+1 查询:那个让你 API 慢成 PPT 的隐形杀手
数据库·后端
banjin16 分钟前
轻量化时序数据库新选择:KaiwuDB-Lite 实战体验
数据库·oracle·边缘计算·时序数据库·kaiwudb·kwdb