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发送过来的数据), 创建读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服务器有数据更新的时候, 会立刻同步到所有的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服务器执行. 这样就可以实施同步功能.

时间: 2024-10-26 22:06:08

Redis主从实现原理分析的相关文章

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服务器上调用每一个命令都使用replicatio

Redis主从同步原理解析

redis主从同步原理 在主从数据同步过程中, master只在第一次同步时创建了RDB文件,用此做基础进行同步. 之后的同步,都是通过增量传输命令的方式(AOF)进行同步. 环境描述: master:192.168.2.100    不开启RDB和AOF slave:192.168.2.200    开启RDB和AOF 配置信息: master: # vim etc/redis.conf #save 600 5           //禁用RDB appendonly no       //禁

redis主从同步原理

redis主从: 作用: 实现数据的实时备份,可用来实现redis的读写分离及redis高可用 主从同步原理: 一主一从环境: 环境:2台redis,一台master一台slave 1,master等待命令进入 2,slave连接master,发送一个sync命令 3,master开始执行BESAVE,并使用缓冲区记录BESAVE之后所执行的所以写命令 4,slave端如果现在有请求进来,可以根据配置项来决定是继续用当前数据做处理客户端的请求还是给客户端返回报错 5,master BESAVE执

Redis主从同步原理-SYNC【转】

和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,下图为级联结构.   Redis主从复制可以根据是否是全量分为全量同步和增量同步. 1 全量同步 Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份.具体步骤如下:  1)从服务器连接主服务器,发送SYNC命令:  2)主服务器接收到SYNC命名后,开始

Redis主从同步原理-SYNC

和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构. Redis主从复制可以根据是否是全量分为全量同步和增量同步. 1 全量同步 Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份.具体步骤如下: 1)从服务器连接主服务器,发送SYNC命令: 2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成

Redis——主从同步原理

刚接触到Redis,首先对Redis有一个初步的了解. 开源,免费,遵守BSD协议,key-value数据库. 可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用. 多种key-value类型的数据. 主从模式的数据备份. 高性能读写. redis所有操作都是原子性的,单个操作的原子性可以通过multi和exec指令包起来完成多个操作的原子性. 一个key可以存储很大,可以达到1gb,不像memcached只能保存1mb的数据. 主要缺点是数据库容量受物理内存的限制,不能作海量数据的高性

Redis主从同步原理-PSYNC【转】

Reids复制数据主要有2种场景: 1. 从服务器从来第一次和当前主服务器连接,即初次复制 2. 从服务器断线后重新和之前连接的主服务器恢复连接,即断线后重复制 ??对于初次复制来说使用SYNC命令进行全量复制是合适高效的,但是对于断线后重复制来说效率就不太能接受了.举例来说:  ??如图所示,Master在断开连接期间只传播了3个写入命令,但是重新连接之后却要全量复制,显然这是低效并且不太必要的. PSYNC概念 ??为了应对这种情况,Redis在2.8版本提供了PSYNC命令来带代替SYNC

Redis主从同步分析

一.Redis主从同步原理1.1 Redis主从同步的过程配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中.同时master主进程会开始收集新的写命令并缓存起来.当后台进程完成写文件后,master就将快照文件发送给slave,slave将文件保存到磁盘上,然后加载到内存将数据库快照恢复到slave上.slave完成快照文件的恢复后

Redis主从同步分析(转)

一.Redis主从同步原理 1.1 Redis主从同步的过程 配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中.同时master主进程会开始收集新的写命令并缓存起来.当后台进程完成写文件后,master就将快照文件发送给slave,slave将文件保存到磁盘上,然后加载到内存将数据库快照恢复到slave上.slave完成快照文件的恢