(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服务器执行. 这样就可以实施同步功能.
相关推荐
通过redis主存复制(一主两从) 数据同步过程日志,分析Redis主从复制的工作原理,Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,...
Redis数据结构、原理分析、应用实战 什么是Redis Redis的作用 Redis的存储结构 Redis的安装 Redis的数据类型 字符串类型 列表类型 hash类型 集合类型 有序集合 Redis原理分析 过期时间设置 过期删除的原理 发布订阅 ...
Redis数据结构、原理分析、应用实战 什么是Redis Redis的作用 Redis的存储结构 Redis的安装 Redis的数据类型 字符串类型 列表类型 hash类型 集合类型 有序集合 Redis原理分析 过期时间设置 过期删除的原理 发布订阅 ...
**主从配置** 是 Redis 实现高可用性和数据冗余的一种方式。通过设置一个或多个从节点(slave),可以从主节点(master)复制数据,实现数据备份和读写分离。 1. **主从复制原理**:当主节点接收到写操作时,会将...
- **Redis主从复制**:学习如何设置Redis主从节点,以及故障转移机制。 - **Redis集群**:如果例子中包含,可以学习如何搭建和使用Redis Cluster,了解槽的概念和分片原理。 - **Java客户端使用**:熟悉Jedis或...
本文将深入探讨Redis的基本概念、工作原理、存储机制,并总结一些常见的面试问题。 1. Redis基本概念: - 数据类型:Redis支持五大数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted...
本资料“redis的设计与实现pdf”以及带注释的源码,将深入探讨Redis的内部工作机制和设计原理。 1. **Redis的数据结构** - **字符串**:基本的数据类型,可以存储简单的文本或二进制数据。 - **哈希**:用于存储...
5. **主从复制**:设置Redis主从复制,验证数据同步效果。 6. **性能测试**:使用工具如redis-benchmark进行性能测试,评估Redis的处理能力。 7. **问题排查**:通过日志分析Redis运行中的问题,如内存使用过高、慢...
4. **主从复制**:解释 Redis 的主从复制原理,如何配置和优化复制过程,以及在高可用性架构中的作用。 5. **Sentinel 系统**:介绍 Redis Sentinel 的监控、故障检测和自动故障转移功能,用于构建高可用的 Redis ...
哨兵作为Redis的高可用解决方案,能够监控Redis主从服务器的运行状态,并在出现问题时进行自动故障转移,保证服务的持续可用性。 总结来说,《Redis开发与运维》是一本全面覆盖Redis核心技术要点和实际操作的优秀...
本书详细讲解了Redis的设计原理和实现机制,对于想要深入理解Redis的开发者来说,是一份非常宝贵的资料。 首先,书中会介绍Redis的基本概念和架构。Redis基于C语言编写,其设计简洁高效,通过单线程模型处理客户端...
Redis支持主从复制,`replication.c`实现了复制功能。主服务器通过` replicationFeedSlaves()`将命令传播给从服务器,而从服务器在`slave.c`中接收并执行这些命令。 九、模块系统 Redis 3.0引入了模块系统,允许...
4. **主从复制**:学习如何设置Redis主从节点,实现数据的实时同步,为高可用性和故障恢复提供基础。 5. **哨兵系统**:了解Sentinel的监控、故障检测和自动故障切换功能,如何构建高可用的Redis集群。 6. **...
Redis是一款高性能的键值数据库,它的源码是开源的,为开发者提供了深入理解其工作原理的机会。本资源“redis源码阅读中文分析注释”旨在帮助开发者更轻松地理解和研究Redis的内部机制,通过详尽的中文注释,使得...
它通过持久化机制将内存中的数据保存到磁盘,以防止数据丢失,并提供了主从复制和集群功能以实现高可用性。 - **Redis数据类型**:Redis提供了五种主要的数据类型:String(字符串)、Hash(哈希)、List(列表)...
在`PPT-PDF`中,可能包含有关Redis的理论讲解、最佳实践、案例分析等内容,这些资料可以帮助深入理解Redis的原理和应用。通过这些文档,你可以学习如何配置Redis服务器、优化性能、避免常见问题以及如何将Redis融入...
五、Redis主从复制 学习如何配置Redis的主从复制,以实现数据的备份和负载均衡。主节点负责写操作,从节点负责读操作,当主节点故障时,可以自动或手动将从节点提升为主节点,保证服务的连续性。 六、Redis ...