《Redis源码学习笔记》文章列表
由于图片较大,缩放较为模糊,请双击打开查看原图 ^_^
主从复制简单来说就是把一台redis数据库中的数据同步到另一台redis数据库,并且按照数据流向,数据的发送者我们称作master,数据的接受者我们称作slave(master/slave的划分并不是那么一定的,譬如B可以作为A的slave,但同时也可以作为C的master),下面就从slave和master的角度分别说明主从复制流程。
首先是slave端,对于slave端来说,主从复制主要经历四个阶段:
第一阶段:与master建立连接
第二阶段:向master发起同步请求(SYNC)
第三阶段:接受master发来的RDB数据
第四阶段:载入RDB文件
下面我们就通过一个图来概述在每一个阶段中,slave究竟做了些什么:
关于上图,有一点说明下:redis接收到slaveof master_host master_port命令后并没有马上与master建立连接,而是当执行服务器例行任务serverCron,发现自己正处于REDIS_REPL_CONNECT状态,这时才真正的向maser发起连接,伪代码:
def serverCron():
# 服务器处于REDIS_REPL_CONNECT状态
if redisServer.repl_state == REDIS_REPL_CONNECT:
# 向master发起连接
connectWithMaster()
# 其他例行任务(省略)...
接着我们来看下主从复制过程中,master这边的流程是如何,在具体看细节之前,我们先综合来看master这边主要做的几件事情:
看完这个图,你也许会有以下几个疑问:
1. 为什么在master发送完RDB文件后,还要定期的向slave发送PING命令?
2. 在发送完RDB文件之后,master发送的“变更”命令又是什么,有什么用?
在回答问题之前1,我们先回答问题2:
master保存RDB文件是通过一个子进程进行的,所以master依然可以处理客户端请求而不被阻塞,但这也导致了在保存RDB文件期间,“键空间”可能发生变化(譬如接收到一个客户端请求,执行"set name diaocow"命令),因此为了保证数据同步的一致性,master会在保存RDB文件期间,把接受到的这些可能变更数据库“键空间”的命令保存下来,然后放到每个slave的回复列表中,当RDB文件发送完master会发送这些回复列表中的内容,并且在这之后,如果数据库发生变更,master依然会把变更的命令追加到回复列表发送给slave,这样就可以保证master和slave数据的一致性!相关伪代码:
def processCommand(cmd, argc, argv):
# 处理命令
call(cmd, argc, argv)
# 如果该命令造成数据库键空间变化and当前redis是一个master,则同步变更命令
if redisServer.update_key_space and len(redisServer.slaves) > 0:
replicationFeedSlaves(cmd, argc, argv)
def replicationFeedSlaves(cmd, argc, argv):
# 把变更命令发送给每一个处于:REDIS_REPL_WAIT_BGSAVE_END状态的slave节点
for slave in redisServer.slaves:
if slave.replstate == REDIS_REPL_WAIT_BGSAVE_START:
continue
slave.updateNotify(cmd, argc, argv)
由于在发送完RDB文件之后,master会不定时的给slave发送“变更”命令,可能过1s,也可能过1小时,所以为了防止slave无意义等待(譬如master已经挂掉的情况),master需要定时发送“保活”命令PING,以此告诉slave:我还活着,不要中断与我的连接
现在我们就看下,当master接受到slave发送的sync同步命令后究竟发生了哪些事:
上图看似分支复杂,但我们抓住以下几点即可:
1.保存RDB文件是在一个子进程中进行的;
2.如果master已经在保存RDB文件,但是没有客户端正在等待这次BGSAVE,新添加的slave需要等到下次BGSAVE,而不能直接使用这次生成的RDB文件(原因图中已经说明)
3.master会定期检查RDB文件是否保存完毕(时间事件serverCron);
接下来我们看下,master是如何给每一个slave发送RDB文件的:
好了,至此我们已经分析完在主从复制过程中,master和slave两边分别是怎么一个处理流程;最后,我绘制了一个图,综述了主从复制这一过程(我们可以边看图,边回忆其中的具体细节):
PS:在主从复制过程中,任何一步发生错误,都会导致整个过程重头开始,所以若RDB文件很大又或是此时正处在业务高峰期,对系统性能将会有非常大的影响!
总结:
1. 了解主从复制master和slave的概念;
2. 了解主从复制执行过程,特别是其中关键的几步;
3. 了解目前主从复制过程中尚存的不足之处;
- 大小: 9.3 KB
- 大小: 58.7 KB
- 大小: 24.9 KB
- 大小: 15.6 KB
- 大小: 39.6 KB
分享到:
相关推荐
Redis Sentinel 提供主从复制和故障转移,实现高可用性。Redis Cluster 则提供了数据分片的集群解决方案,支持水平扩展。 7. 性能优化: Redis 通过内存管理、LRU淘汰策略、多路复用等手段保证高效性能。同时,...
在“狂神redis源码笔记”中,我们可以期待学习到Redis的源码分析、内部机制以及如何通过Java进行高效操作。源码分析是深入理解Redis工作原理的关键,有助于开发者优化使用方式或进行定制化开发。 Redis的核心知识点...
7. 主从复制:支持数据的主从复制,可以实现master-slave模式下的数据备份。 8. 高可用性与分布式:Redis提供了哨兵系统(Sentinel)和集群(Cluster)功能,从而支持高可用性和水平扩展。 在学习Redis时,通常...
本学习笔记将基于提供的压缩包文件,深入探讨Redis的关键特性、工作原理以及常见应用场景。 首先,"深入redis学习(一)--readme and conf.doc"介绍了Redis的安装和配置过程。在配置文件中,我们可以设置服务器的...
Redis 支持主从复制,允许数据在多个实例间同步,提高可用性和数据安全性。此外,它还提供了事务支持,允许一系列命令作为一个整体执行,确保原子性。Pipeline 功能则允许批量发送命令,减少网络通信开销,提高效率...
首先,从官方网站下载最新稳定版的Redis源码或二进制包。在Linux环境下,可以使用编译源码的方式进行安装,涉及到`make`和`make install`等命令。对于Windows用户,可直接下载预编译的二进制包,解压后配置环境变量...
主从复制(Master-Slave Replication)则用于实现数据的冗余和故障恢复,主节点的数据会实时同步到从节点。 此外,Redis 还有一些优化措施,如使用虚拟内存(Volatile LRU)策略处理内存不足的情况,将不常访问的...
此外,Redis 支持主从复制和哨兵模式,以提供高可用性和数据安全性。 总的来说,Redis 是一种强大的数据存储解决方案,尤其在处理高性能、高并发的场景下,其丰富的数据类型和命令使其成为许多项目的首选。在设计...
这份2022年的Redis学习笔记涵盖了Redis的基础概念、核心特性、使用场景以及最佳实践。 一、Redis简介 Redis是一个开源(BSD许可)的,非关系型、内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它...
### Redis学习笔记整理 #### 一、Redis环境搭建 ##### 1.1 简介 Redis是一款开源的键值(Key-Value)型数据库系统,因其高性能和丰富的数据结构而广受欢迎。它不仅可以作为数据库使用,还可以作为一种数据结构服务器...
Redis是一款高性能的键值对数据库,它以内存存储为主,数据持久...通过阅读本学习笔记和源码分析,你可以深入了解Redis的工作原理,掌握如何在实际项目中高效地使用Redis。不断实践和探索,你将成为Redis的熟练驾驭者。
在"Redis.zip学习笔记"中,我们可以预期包含以下几个主要的知识点: 1. Redis简介:Redis是一个开源(BSD许可),内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、...
为了提高可用性和读取性能,Redis 支持主从复制。主节点负责数据写入,从节点同步主节点的数据,实现读写分离。 **6. 事务** Redis 事务通过 `MULTI`、`EXEC` 命令组合实现,允许一次性执行多个命令,保证原子性。 ...
- **高可用性**:通过Redis Sentinel实现主从复制及故障转移,确保系统的稳定运行。 - **分布式部署**:Redis Cluster提供了一种简单的水平扩展方法,支持自动分区。 #### 二、Redis数据类型详解 1. **字符串**...
在深入学习Redis时,还需要掌握更多高级特性,如持久化(RDB和AOF)、事务、发布订阅、主从复制、哨兵系统和Cluster集群等。理解这些特性将有助于在实际应用中更好地利用Redis的优势。此外,了解Redis的数据结构(如...
redis阅读理解,带详细注释 说明 本份代码从 clone下来,然后自己添加自己的理解,再次基础上增加函数调用流程注释。 疑问: 1,redis选主结束后,是否添加新主节点数据恢复流程(新主例程数据并非所有从例程中数据...