Redis主从实现原理分析 [转]
原文地址:http://blog.sina.com.cn/s/blog_7530db6f0100vegl.html
一, 实现原理图
(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发送过来的数据), 创建读rdb的IO事件(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);
......
//创建读rdb的IO事件
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服务器有数据更新的时候, 会立刻
Redis主从实现原理分析 [转]的更多相关文章
- Redis sentinel & cluster 原理分析
1. Redis集群实现分析 1.1 sentinel 1. 功能 Sentinel实现如下功能: (1)monitoring--redis实例是否正常运行. (2)notification-- ...
- Redis主从同步原理-SYNC【转】
和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,下图为级 ...
- Redis——主从同步原理
刚接触到Redis,首先对Redis有一个初步的了解. 开源,免费,遵守BSD协议,key-value数据库. 可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用. 多种key-value类型 ...
- Redis 主从复制技术原理
基于前面介绍的 Redis 内容,Redis 只能作为一个单机内存数据库,一旦服务器宕机即不能提供服务,即便能通过持久化策略重启恢复数据,往往也做不到百分之百还原.再一个就是,单机的 Redis 需要 ...
- Redis主从同步原理-PSYNC【转】
Reids复制数据主要有2种场景: 1. 从服务器从来第一次和当前主服务器连接,即初次复制 2. 从服务器断线后重新和之前连接的主服务器恢复连接,即断线后重复制 对于初次复制来说使用SYNC命令进 ...
- Redis主从同步分析(转)
一.Redis主从同步原理 1.1 Redis主从同步的过程 配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接 ...
- Redis主从同步分析
一.Redis主从同步原理1.1 Redis主从同步的过程配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接断开 ...
- Redis主从&哨兵集群搭建
主从集群 在搭建主从集群前,我们先把Redis安装起来: #解压Redis压缩包 [root@master lf]# tar -zxvf redis-6.2.1.tar.gz -- #安装gcc [r ...
- Redis主从环境配置
1.Redis主从同步原理 redis主服务器会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,然后将数据文件同步给从服务器,从服务器加载记录文件,在内存库中更新新数据. 2.VMWar ...
随机推荐
- 02_Jquery_03_类选择器
[简述] 类选择器就是通过类名(css类名)来查询元素! $(".myClass")就可以把所有包含了class="myClass"的元素查询出来 [index ...
- OpenGL_Qt学习笔记之_05(纹理映射)(转)
转自:http://www.cnblogs.com/tornadomeet/archive/2012/08/24/2654719.html 纹理映射基础知识 什么叫纹理映射,一开始我也不明白,感觉这个 ...
- (转)怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32
问题描述 在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,那么我们有 ...
- linux shell 逻辑运算符
一.逻辑卷标 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测『档案』是否存在 eg: if [ -f filename ] -d 常用!侦测『目录』是否存在 -b 侦测是否 ...
- thinkphp ajax检测是否数据可用
模板文件:如 index.html 模板文件如:(index.html) <form><input type="text" name="username ...
- PL/SQL学习(一)
原文参考:http://plsql-tutorial.com/ 组成: 声明部分(可选) 执行部分(必选) 异常处理(可选) 声明: DECLARE 执行: ...
- 006 Python的操作符
算术操作符: + - * / % ** // 如 >>> a = 5 >>> a = a + 3 >>&g ...
- Hadoop MapReduce Next Generation - Setting up a Single Node Cluster
Hadoop MapReduce Next Generation - Setting up a Single Node Cluster. Purpose This document describes ...
- sublimeformaya
网上没有找到这样的插件自己造了一个 https://github.com/jonntd/connectionmaya 附件列表
- POJ 1837 Balance 01背包
题目: http://poj.org/problem?id=1837 感觉dp的题目都很难做,这道题如果不看题解不知道憋到毕业能不能做出来,转化成了01背包问题,很神奇.. #include < ...