redis如何实现数据同步
redis如何实现数据同步
两种,1全同步,2部分同步
全备份:
在slave启动时会向master发送sync消息,master收到slave这条消息之后,将启动后台备份进程,备份完成之后,将备份数据发送给slave
全备份机制
1.slave向master发送SYNC指令,master接收到该指令,调用syncCommand()函数进行处理
2.在syncCommand函数中,启动一个备份进程用于数据同步,如果已有备份进程,就不再重新启动
3.备份进程将执行rdbSave(),完成将redis全部数据保存为rdb文件
4.在redis时间事件函数serverCron中,校验备份进程是否检查完毕,如果备份完成,则调用backgroundSaveDoneHandler完成后续操作
5.在backgroundSaveDoneHandler中更新master各种状态,如备份成功或失败,备份时间等,然后调用updateSlavesWaitingBgsave,将备份的rdb数据发送给等待的slave
6.在updateSlavesWaitingBgsave中遍历所有等待同步的slave,将rdb文件发送给每一个slave,并不是立即发送数据给slave,而是等slave注册写事件及响应函数sendBulkToSlave,当slave对应的socket能够发送数据时就调用sendBulkToSlave
7.sendBulkToSlave将备份文件发送给slave
数据修改操作同步
首次启动全同步,运行过程中进行更新操作(包括写、删除、更改操作)的同步,选一个单独的slave进行数据备份操作
修改操作机制
1.master接收到用户操作,将调用call函数执行的具体操作函数,在call中先通过proc执行函数操作,然后判断该操作是否需要扩散到各slave,如果需要则调用函数propagate()来执行
2.propagate函数将操作指令记录到aof中并扩散到slave,在propagate中调用feedAppendOnlyFile将操作指令记录到aof中,并通过replicationFeedSlaves将操作扩散到各个slave中
3.feedAppendOnlyFile主要将操作保存到aof中,在该函数中将操作转换为redis内部协议格式,并以字符串的形式存储,追加到aof中
4.replicationFeedSlaves将操作扩散到每一个slave中,首先遍历每一个slave,对每个slave执行以下操作,将slave切换到本操作对应的数据库(根据数据库id和当前数据id判断),写入切换数据库的命令时将调用addReply;将命令和参数按照redis协议格式写入到slave响应缓存中.写入命令和参数时将调用addReplyMultiBulkLen和addReplyBulk,这两个函数最终也将调用addReply
5.在函数addReply中将调用prepareClientToWrite,设置slave的socket写入事件处理函数sendReplyClient(通过aeCreateFileEvent设置),这样一旦slave对应的socket有空间写入数据,就调用sendReplyClient进行处理
6.sendReplyClient主要功能是将slave中药发送的数据通过socket发出去
redis如何实现数据同步的更多相关文章
- redis 学习笔记——数据同步、事务
redis主从同步 redis支持简单易用的主从复制(master-slave replication)功能,该功能也是redis高可用性实现的基础. redis复制原理 re ...
- redis与DB数据同步问题
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyt ...
- Redis单节点数据同步到Redis集群
一:Redis集群环境准备 1:需要先安装好Redis集群环境并配置好集群 192.168.0.113 7001-7003 192.168.0.162 7004-7006 2:检查redis集群 [r ...
- Redis和MySQL数据同步及Redis使用场景
1.同步MySQL数据到Redis (1) 在redis数据库设置缓存时间,当该条数据缓存时间过期之后自动释放,去数据库进行重新查询,但这样的话,我们放在缓存中的数据对数据的一致性要求不是很高才能放入 ...
- redis秒杀系统数据同步(保证不多卖)
东西不多卖 秒杀系统需要保证东西不多卖,关键是在多个客户端对库存进行减操作时,必须加锁.Redis中的Watch刚好可以实现一点.首先我们需要获取当前库存,只有库存中的食物小于购物车的数目才能对库存进 ...
- Redis和数据库 数据同步问题
Redis和数据库同步问题 缓存充当数据库 比如说Session这种访问非常频繁的数据,就适合采用这种方案:当然了,既然没有涉及到数据库,那么也就不会存在一致性问题: 缓存充当数据库热点缓存 读操作 ...
- redis竞汰数据同步问题解决
Redis 面试的时候遇到过问Redis是如何解决“竞态条件”的,相关知识点总结一下. 乐观锁 所谓竞态条件,举个例子,一个代表点击数的数值hitcount,每个客户点击一次则+1. 没有事务的时候, ...
- Redis与Mysql数据同步
后台定时任务,定时刷新Redis中信息到数据库.(即Job:定时任务)
- Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
mongodb和memcached不是一个范畴内的东西.mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.mongodb和memcached不存在谁替换谁的问题. 和 ...
随机推荐
- numpy---(上)
Numpy Numpy ndarray N维数组对象ndarray, 是一系列同类型数据的集合, 索引以0下标开始, 创建一个ndarray对象, 需调用array函数: numpy.array(ob ...
- 『现学现忘』Git基础 — 1、版本控制系统介绍
在具体了解Git之前,首先需要我们了解一下VCS,即版本控制系统(version control system) 1.什么是版本控制系统 版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版 ...
- [转载] go get 拉取第三方包过慢、卡住解决方案
修改go env,选用国内的代理地址下载.
- Fastjson tomcat-dhcp链
Fastjson tomcat-dbcp链 这条链可直接回显,可以解决fastjson在内网的情况,因为很多实战的时候,fastjson的应用部署在内网,只映射一个端口出来,导致前面学习的jdbcRo ...
- 一文读懂原子操作、内存屏障、锁(偏向锁、轻量级锁、重量级锁、自旋锁)、Disruptor、Go Context之上半部分
我不想卷,我是被逼的 在做了几年前端之后,发现互联网行情比想象的差,不如赶紧学点后端知识,被裁之后也可接个私活不至于饿死.学习两周Go,如盲人摸象般不知重点,那么重点谁知道呢?肯定是使用Go的后端工程 ...
- [AcWing 51] 数字排列
点击查看代码 class Solution { public: vector<vector<int>> res; vector<vector<int>> ...
- Hadoop(二)Hdfs基本操作
HDFS HDFS由大量服务器组成存储集群,将数据进行分片与副本,实现高容错. 而分片最小的单位就是块.默认块的大小是64M. HDFS Cli操作 官网https://hadoop.apache.o ...
- STM8S103F3P6 开发环境笔记
STM8S103F3 产品手册 https://www.st.com/resource/en/datasheet/stm8s103f2.pdf 内核 16 MHz advanced STM8 core ...
- ucore lab8 文件系统 学习笔记
最后一战果然过瘾.代码量够多,新机制够复杂度,都管饱.做这一课就像从高山上往下走,坡急且路险,还不知自己的方位,琢磨不透系统的架构.待到下了山,回头一看豁然开朗,原来方才自己所下的山是这般模样.在这里 ...
- 透过实例demo带你认识gRPC
摘要:gRPC是基于定义一个服务,指定一个可以远程调用的带有参数和返回类型的的方法.在服务端,服务实现这个接口并且运行gRPC服务处理客户端调用. 本文分享自华为云社区<gRPC介绍以及spri ...

