`

Redis主从实现原理分析

阅读更多

(1)Slave服务器连接到Master服务器.

(2)Slave服务器发送SYCN命令.

(3)Master服务器备份数据库到.rdb文件.

(4)Master服务器把.rdb文件传输给Slave服务器.

(5)Slave服务器把.rdb文件数据导入到数据库中.

 

上面的这5步是同步的第一阶段, 接下来在Master服务器上调用每一个命令都使用replicationFeedSlaves()来同步到Slave服务器.

 

, 实现细节

(1) Slave服务器连接到Master服务器 / 发送SYNC命令:

Slave服务器通过syncWithMaster()函数来连接Master服务器(如果Master服务器需要密码登陆的话,先登陆), 并且发送SYNC命令请求同步, 接着打开rdb文件(用于存储由Master发送过来的数据), 创建读rdbIO事件(readSyncBulkPayload). 代码如下:

int syncWithMaster(void) {

......

//登陆master服务器

if(server.masterauth) {

syncWrite(fd, "AUTH xxx\r\n", strlen(server.masterauth)+7, 5);

......

}

//发送SYNC命令

syncWrite(fd,"SYNC \r\n",7,5);

......

//打开rdb文件

dfd = open(tmpfile,O_CREAT|O_WRONLY|O_EXCL,0644);

......

//创建读rdbIO事件

aeCreateFileEvent(server.el, fd, AE_READABLE, readSyncBulkPayload, NULL);

......

return REDIS_OK;

}

 

(2) Master服务器备份数据库到.rdb文件:

Slave服务器发送SYNC命令到Master服务器时, Master服务器便会调用syncCommand()函数来进行同步. 同步的第一步是把数据库的数据存储为rdb文件, 存储完毕后调用updateSlavesWaitingBgsave()函数来发送rdb文件给所有的Slave服务器.代码如下:

void syncCommand(redisClient *c) {

    //如果正在保存rdb文件

if (server.bgsavechildpid != -1) {

    ......

    //主要判断当前存储rdb文件是不是由SYNC命令触发的

    //如果当前存储rdb文件不是由SYNC命令触发, 则要等到下一次

    ......

} else {//否则调用rdbSaveBackground()存储rdb文件

    rdbSaveBackground(server.dbfilename);

}

}

 

rdbSaveBackground()函数执行完毕, 就会调用updateSlavesWaitingBgsave()来发送rdb文件到所有的Slave服务器, 代码如下:

void updateSlavesWaitingBgsave(int bgsaveerr) {

    listRewind(server.slaves,&li);

while((ln = listNext(&li))) {

    slave->repldbfd = open(server.dbfilename,O_RDONLY);

    .......

    aeCreateFileEvent(server.el,slave->fd,AE_WRITABLE, sendBulkToSlave,slave);

}

}

    updateSlavesWaitingBgsave()要做的事情是, 打开rdb文件, 创建发送rdb文件IO事件(sendBulkToSlave). sendBulkToSlave()主要的工作就是把rdb文件发送给Slave服务器.

    而当Slave服务器接收rdb文件完毕之后(readSyncBulkPayload()函数处理), 会清空原来数据库的数据, 然后把rdb文件的数据导入到数据库中.

 

(3) 增量同步

完成上面的步骤之后, 同步基本完成. 接下来的工作就是增量同步, 也就是当Master服务器有数据更新的时候, 会立刻同步到所有的Slave服务器. replicationFeedSlaves()函数完成.

当我们在Master服务器增减数据的时候, 就会触发replicationFeedSlaves(), 代码如下:

void call(redisClient *c, struct redisCommand *cmd) {

    ......

    if ((dirty || cmd->flags & REDIS_CMD_FORCE_REPLICATION) &&

        listLength(server.slaves))

        replicationFeedSlaves(server.slaves,c->db->id,c->argv,c->argc);

    ......

}

call()函数就是当用户执行命令的时候触发. dirty表示是否有数据更新, 如果有数据更新而且slave服务器不为空, 就执行replicationFeedSlaves().

replicationFeedSlaves()主要做的工作就是把用户执行的命令发送到所有的Slave服务器, Slave服务器执行. 这样就可以实施同步功能.

分享到:
评论

相关推荐

    redis主存复制数据同步过程日志

    通过redis主存复制(一主两从) 数据同步过程日志,分析Redis主从复制的工作原理,Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,...

    一文带你揭开Redis复制原理的神秘面纱

    墨墨导读:本文在依托Redis主从环境下,针对访问的数据一致性进行分析,解开Redis复制原理的神秘面纱。‍ Redis作为一个非结构化的内存数据库,在某些应用场景具备相应优势,在实际的场景设计中也得到广泛的关注和...

    Redis数据库的最佳实践 19章节完全解读Redis Redis从入门到精通视频教程.txt

    <redis从入门到精通视频教程> ├REDIS 入门指南.pdf ├<1.redis的简介和安装> ├<2.redis系统命令简介> ...├<17.redis的主从复制模式> ├监控慢日志查询以及源码分析> ├项目架构之一主两从三Sentinel>

    Java思维导图xmind文件+导出图片

    Nginx Location ReWrite 等语法配置及原理分析 Nginx提供https服务 基于Nginx+lua完成访问流量实时上报Kafka的实战 Netty 高性能NIO框架 IO 的基本概念、NIO、AIO、BIO深入分析 NIO的核心设计思想 Netty产生...

    2019年 Redis从入门到高可用 分布式实战教程

    掌握redis主从、哨兵、集群 ,参数调优 目录: 9-9 原生安装-1.准备节点.mp4 9-8 原生安装.mp4 9-7 基本架构.mp4 9-6 虚拟槽哈希分布.mp4 9-5 一致性哈希分区.mp4 9-4 节点取余分区.mp4 9-3 数据分布概论....

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 03-Redis的主从架构(主从从).avi │ 04-主从出现宕机怎么办?.avi │ 05-哨兵.avi │ 06-搭建Redis的集群环境.avi │ 08-插槽的分配和key的关系.avi │ 09-新增节点.avi │ 10-移除集群中的节点.avi │ 11-集群...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    ├─面试必问-webservice原理分析 │ webservice原理分析.mp4 │ ├─面试必问-使用Springboot快速搭建SSM框架 │ 使用SpringBoot快速搭建SSM框架.mp4 │ ├─面试必问-双十一系统架构之Mysql索引技术剖析 │ 双...

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ 05redis主从和哨兵操作.mp4 │ 06reids集群创建收缩扩容.mp4 │ 07redis运维工具.mp4 │ Elasticsearch分享V2.pdf │ Elasticsearch分享V4.pdf │ ES分享试验环境.docx │ ES操作.txt │ Redis分享-张亚V2.pdf │...

    EleasticSearch基本原理及架构.pdf

    大规模数据如何检索? 当系统数据量上了10亿、100亿条...对于Nosql数据库,以redis为例,其它原理类似: 解决要点: 1)通过副本备份保证数据安全性; 2)通过节点竞选机制解决单点问题; 3)先从配置库检索分片信息,

    单点登录源码

    - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统、系统监控。 ![统一扫码支付](project-bootstrap/zheng-pay.png) > zheng-ucenter 通用用户管理系统, 实现...

    大数据与人工智能-fy.docx

    下列关于ZooKeeper集群原理的介绍,不正确的是 [单选题] A.由多个ZooKeeper SEVER组成的集群环境 B.包含一个Leader和多个Follower C.每个sever保存一个数据副本、全局数据一致 D.不采用分布式读写机制(正确答案) 7....

    基于springcloud+Netty+MQ+mysql的分布式即时聊天系统源码+数据库+项目说明.zip

    项目独立完成,包括需求分析、设计、开发实现。 关于我在项目中使用 MySQL 读写分离的总结:[MySQL主从延迟的解决方案](https://blog.csdn.net/KIMTOU/article/details/125033199) ## 用例分析 用户能够在聊天...

    2019java亲生经历面试题答案解析准备.zip

    13.RPC底层通讯原理之Netty线程模型源码分析 14.分库分表之后分布式下如何保证ID全局唯一性 10道腾讯的Java面试题.txt Dubbo面试题锦集.txt 阿里巴巴高级Java面试题(首发,70道).doc 春节跳槽最新Java面试题及答案...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    JAVA上百实例源码以及开源项目源代码

    Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...

Global site tag (gtag.js) - Google Analytics