首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis集群架构----主从复制

,那就得从库先清理数据了,数据清理完成后才能讲主库的数据进行本地的读取。...刚我们也有讲到的是,适用bgsave进行同步数据的,bgsave:创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。...所以又用到了另一个技术CopyOnwrite(详细的原理大家自行了解),这里还有一个点就会死fork一个子进程,我们也知道fork子进程也会阻塞住进程的,在这里我就先忽略不计这个阻塞。...还有就是如果主节点/从节点宕机了是否能自动恢复? 还有就是全量复制的问题,fork子进程导致住进程阻塞,服务缓慢。 总结 上文我们聊了主从复制的主要过程,还有一些问题点,以及优缺点。...fork子进程去哪领同步,存储log增量同步重连再增量同步。。这都是对可用性的损失。 这篇文章主要是redis 主从复制的学习,和对CAP定理的巩固和应用理解。

30110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MIT6.828实验2 —— Lab Shell

    首先需要了解几个核心的系统调用: * **fork() :** 该调用会创建一个子进程,会复制一份内存到独立的进程空间,代码中根据返回值来区分是子进程 (返回0) 还是父进程 (返回子进程的pid)。...* **wait():**该方法会阻塞父进程,等待子进程退出后再结束,注意如果fork()了多个子进程,则需要多次调用wait()才能等待所有子进程完成。且wait()是无法等待孙子进程的。...()则将所有eargv指向的末尾字符置为'\0',这样便巧妙地在源字符串中完成了参数的分割。...其中EXEC、PIPE、REDIR这三种命令和我们的nsh实现相似,其余的几种命令则比较简单: * LIST:由分号 ; 分割的顺序命令,实现方法是fork一个子进程执行左命令,wait等待其完成后再执行右命令...,从而实现顺序执行的效果; * BACK:由 & 结尾的后台命令,实现方法是fork一个子进程执行命令,父进程则直接退出。

    1.8K30

    Redis

    传统的阻塞I/O模型: 前面的没有处理完成,后面的则进行阻塞。等待前面的读写完成以后,才会执行后面的方法。...SAVE:阻塞 Redis的服务器进程,直到RDB文件被创建完毕。 BGSAVE:Fork出一个子进程来创建RDB文件,不阻塞服务器进程。...父子调用的是同一个地址空间。 如果调用者修改数据,才会创建一个新的地址空间,创建数据副本。 fork出子进程后,主进程有数据更改,则为主线程创建一新的地址空间,子进程操作的是fork时候的空间内容。...,原理如下: 调用fork( ),创建一个子进程。...子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件。 主进程持续将新的变动同时写到内存和原来的AOF里。 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动。

    17010

    Node.js的底层原理

    每个子线程本质上是一个独立的事件循环,但是所有的线程会共享底层的Libuv线程池。 ? 创建线程 接下来我们看看创建线程的过程。 ?...1 首先主进程fork多个子进程处理。 2 然后在每个子进程里调用listen。 3 调用listen函数的时候,子进程会给主进程发送一个消息。...1 首先主进程fork多个子进程处理。 2 然后在每个子进程里调用listen。 3 调用listen函数的时候,子进程会给主进程发送一个消息。...4 这时候主进程就会创建一个socket,并绑定地址。但不会把它置为监听状态,而是把这个socket通过文件描述符的方式返回给子进程。 5 当连接到来的时候,这个连接会被某一个子进程处理。...,当可写事件触发的时候,Libuv会遍历等待发送队列,逐个节点发送,成功发送后,Libuv会把节点移到发送成功队列,并往pending阶段插入一个节点,在pending阶段,Libuv就会执行发送完成队列里每个节点的会调通知调用方发送结束

    2.1K20

    字节大佬带你深入分析Node.js的底层原理

    另外 Node.js 还维护了一个 map,map 的 key 是相对超时时间,值就是对应的二叉堆节点。 堆的所有节点对应底层的一个超时节点。...Node.js 中多线程的架构如下图所示,每个子线程本质上是一个独立的事件循环,但是所有的线程会共享底层的 Libuv 线程池。 6.2 创建线程 接下来我们看看创建线程的过程。...首先主进程 fork 多个子进程处理。 然后在每个子进程里调用 listen。 调用 listen 函数的时候,子进程会给主进程发送一个消息。...首先主进程 fork 多个子进程处理。 然后在每个子进程里调用 listen。 调用listen函数的时候,子进程会给主进程发送一个消息。 这时候主进程就会创建一个 socket,并绑定地址。...节点的 pending 字段为 1,说明任务完成了。

    2.7K30

    Redis-面试

    简述Redis的RDB RDB即将当前数据生成快照,并保存于硬盘中。可以通过手动命令,也可以设置自动触发。 RDB:将服务器包含的所有数据库数据以二进制文件的形式保存到硬 盘里面。...执行BGSAVE命令的时候不会阻塞当前的Redis服务,因为当前的redis床fork()一个子线程去生成RDB文件,生成之后告诉redis主线程接受。...简述Redis的bgsave命令 bgsave命令不阻塞主进程(严格意义上也不是完全不阻塞,详看下面过程),该命令fork一个子进程用于执行RDB过程。...其具体过程为: 判断此时有没有子进程用于RDB,有的话直接返回。 redis进行fork子进程过程,此时父进程处于阻塞状态。...性能更高:父进程在保存rdb时候只需要fork一个子进程,无需父进程的进行其他io操作,也保证了服务器的性能。 缺点: 故障丢失,耐久性差。

    30530

    Redis系统学习之主从复制

    ,需要等待重启或手动切换前端ip才能恢复 主机宕机前有部分数据未能及时同步到从机,切换ip后数据不一致,降低系统可用性 redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照...数据时,应用连接从节点),分担服务器负载,尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高redis服务器的并发量 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是...6379为主节点,他的子节点是6380,6380的子节点是6381,所以他是从节点也是主节点,当然在6379还活着的时候他是从节点,如果6379宕机了,那么6380可以通过 slaveof no one...,内存中维护这个链表,一旦中间的节点宕机,我们将这个链拿出来,等待重启之后添加到最后面,并指定他的主节点为最后一个层节点 类似于 1->2->3->4->5 在这个时候3宕机了,那么4直接指定自己的父节点为...全量复制 主节点通过bgsave命令fork一个子进程进行RDB持久化,生成一个dump.rdb的全量快照文件,该过程是非常消耗CPU、内存(页表复制)、硬盘IO的 主节点通过网络将RDB文件发送给从节点

    58910

    【openwrt】【procd】Openwrt系统启动流程分析

    kernel_init 在kernel启动的尾声,内核会去查找并调用 用户空间的init进程,从而进行内核态到用户态的切换,init进程就是用户空间的第一个进程,它的进程号为1 。.../sbin/init执行流程如下: init服务首先初始化ulog,设置其log的TAG为init(debug log中带有init tag的log都是由init服务打印的) 然后挂载一些必要的文件系统...=xxx字段获取 随后初始化并启动看门狗,看门狗超时时间为30s 接下来会fork一个子进程执行/sbin/kmodloader,即加载内核模块,并且会一直等待所有模块加载完成(即子进程结束) 接着调用...preinit()一共fork了2个子进程,一个运行/sbin/procd -h /etc/hotplug-preinit.json ,另一个执行/etc/preinit脚本,这些子进程在执行完毕后,都会调用对应的.../sbin/procd -h /etc/hotplug-preinit.json 的作用是监听内核uevent事件,并根据不同事件做出相应的处理(例如创建/dev/null设备节点) plugd_proc.cb

    6400

    Java并行流Parallel Stream与Fork-Join线程池的关系,莫要乱用、滥用并行流

    假设,每个任务都只fork出两个子任务,如果负责fork子任务的当前任务不做任何事情,那么最终将只有叶子节点真正做事情,其它节点都只是负责fork子任务与合并结果(假设是有返回值的任务)。...如果是没有返回值的任务,是没有图中“合并结果”这个流程的;而且,也不是必须要等待子任务执行完成。这些都是根据自己的需求来自定义使用的。要灵活去使用。....+100的加法运算任务,就需要获取返回值,而切分任务我们可以这样切分:每次除2切分左右两个子任务,如100/2=50,1到50的相加由左子任务完成,51到100的由右子任务完成,1到50同理继续除2切分出子任务...(numbers); rightTask.fork(); // 等待子任务完成,合并结果 count += leftNextPullTask.join(); count += rightNextPullTask.join...对的,由于所有使用并行流parallerStream的地方都是使用同一个Fork-Join线程池,而线程池线程数仅为cpu的核心数。

    11.1K51

    感觉Redis变慢了,这些可能的原因你查了没 ?(下)

    不过这里有个知识点需要注意,就是:当后台线程(aof_fsync 线程)调用 fsync 函数同步 AOF 文件时,需要等待,直到写入完成。...出一条子线程来将文件重写,在执行 BGREWRITEAOF 命令时,Redis 服务器会维护一个 AOF 重写缓冲区,该缓冲区会在子线程创建新 AOF 文件期间,记录服务器执行的所有写命令。...当子线程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新的 AOF 文件保存的数据库状态与现有的数据库状态一致。...是什么fork 是unix和linux这种操作系统的一个api,而不是Redis的api,fork()用于创建一个子进程,不是子线程有一点我们可以知道的是fork 的目的最终一定是为了不阻塞主进程来提升...而Redis 开启了后台 RDB 和 AOF rewrite 后,在执行时,都需会主进程创建出一个子进程进行数据的持久化,而这个过程会调用操作系统的fork()操作。

    1K62

    服务器处理连接的架构演变

    言归正传,串行这种模式如果处理的过程中有调用了阻塞api,比如文件io,就会影响后面请求的处理。可想而知,效率是有多低。...2.1 主进程accept,子进程处理请求 这种模式下,主进程负责摘取已完成连接的节点,然后把这个节点对应的请求交给子进程处理,逻辑如下。 1. while(1) { 2....如果这时候有一个请求到来,那么所有的子进程都会被唤醒,但是首先被调度的子进程会首先摘下这个请求节点。后续的进程被唤醒后可能会遇到已经没有请求可以处理。又进入睡眠,进程被无效唤醒,这是著名的惊群现象。...2.1中,当主进程收到一个请求的时候,实时fork一个子进程,这时候,这个子进程会继承主进程中新请求对应的fd,所以他可以直接处理该fd对应的请求,在进程池的模式中,子进程是预先创建的,当主进程收到一个请求的时候...在子进程模式时,每个子进程都有自己的task_struct,这就意味着在fork之后,每个进程负责维护自己的数据,而线程则不一样,线程是共享主线程(主进程)的数据的,当主进程从accept中拿到一个fd

    93440

    Redis 知识总结

    : bgsave 会 fork() 一个子进程来执行持久化,整个过程中只有在 fork() 子进程时有短暂的阻塞,当子进程被创建之后,Redis 的主进程就可以响应其他客户端的请求了。...redis 中的数据; RDB 对 redis 对外提供读写服务的影响非常小,redis 是通过 fork 主进程的一个子进程操作磁盘 IO 来进行持久化的; 相对于 AOF,直接基于 RDB 来恢复...RDB 的缺点: 如果使用 RDB 来恢复数据,会丢失一部分数据,因为 RDB 是定时生成的快照文件; RDB 每次来 fork 出子进程的时候,如果数据文件特别大,可能会影响对外提供服务,暂停数秒(主进程需要拷贝自己的内存表给子进程...AOF rewrite 后台执行的方式和 RDB 有类似的地方,fork 一个子进程,主进程仍进行服务,子进程执行 AOF 持久化,数据被 dump 到磁盘上。...gossip 协议所有节点都持有一份元数据,不同节点的元数据发生了变更,就不断的将元数据发送给其他节点,让其他节点也进行元数据的变更。

    58771

    100个Linux命令(7)-进程管理

    后台任务表中running但没有"+"的表示处于等待队列,running且带有"+"的表示正在执行,stopped状态的表示处于睡眠状态。...比较重要的进程,应该多给它分配一些cpu的执行时间,让其尽快完成。...在cp这个子进程执行过程中,父进程bash会进入睡眠状态(不仅是因为cpu只有一颗的情况下一次只能执行一个进程,还因为进程等待),并等待被唤醒,此刻bash无法和人类交互。...假如cp这个子进程复制的是一个大文件,一个cpu时间片无法完成复制,那么在一个cpu时间片消耗尽的时候它将进入等待队列。...显然,上面所说的bash内置命令不是在子shell中运行的。其他的所有方式,都是在子shell中完成,只不过方式不尽相同。

    1.7K20

    Greenplum 架构和核心引擎

    2.2 客户端建立会话链接 7 2.3 Master fork一个进程处理客户端请求 8 2.4 QD建立和Segment的链接 8 2.5 segment fork 一个子进程处理QD的链接请求 9...可以实现集群的高可用,通过共享高速的网络传送数据,除了网络是共享的其他的都是无共享的 1.3 集群内数据分两类 集群内数据分两类:用户数据与元数据 global 日志在所有的节点上都是一样的 local...节点 2、Master 节点上postmaster 进程会监听到链接请求,并处理 2.3 Master fork一个进程处理客户端请求 1、Master 上的postmaster 进程监听到链接请求后...,fork一个子进程用于处理该客户端的所有查询请求 2、子进程在PostgrsSQL中称为backend;在Greenplum中该进程称为QD 2.4 QD建立和Segment的链接 1、QD进程使用...Segment的链接 2.5 segment fork 一个子进程处理QD的链接请求 1、Segment上的postmaster进程监听到QD的链接请求后,创建一个子进程以处理后续查询的请求 2、Segment

    1.2K70

    Greenplum 架构和核心引擎

    2.2 客户端建立会话链接 7 2.3 Master fork一个进程处理客户端请求 8 2.4 QD建立和Segment的链接 8 2.5 segment fork 一个子进程处理QD的链接请求 9...可以实现集群的高可用,通过共享高速的网络传送数据,除了网络是共享的其他的都是无共享的 1.3 集群内数据分两类 集群内数据分两类:用户数据与元数据 global 日志在所有的节点上都是一样的 local...节点 2、Master 节点上postmaster 进程会监听到链接请求,并处理 2.3 Master fork一个进程处理客户端请求 1、Master 上的postmaster 进程监听到链接请求后...,fork一个子进程用于处理该客户端的所有查询请求 2、子进程在PostgrsSQL中称为backend;在Greenplum中该进程称为QD 2.4 QD建立和Segment的链接 1、QD进程使用...Segment的链接 2.5 segment fork 一个子进程处理QD的链接请求 1、Segment上的postmaster进程监听到QD的链接请求后,创建一个子进程以处理后续查询的请求 2、Segment

    1.4K30

    Greenplum架构和核心引擎

    2.2 客户端建立会话链接 7 2.3 Master fork一个进程处理客户端请求 8 2.4 QD建立和Segment的链接 8 2.5 segment fork 一个子进程处理QD的链接请求 9...global 日志在所有的节点上都是一样的 local 日志一般都是一些统计信息等系统表 segment data 保存的用户数据信息 1.4 对用户透明 对用户可以看到以下的instance ?...1.8.1 行储存 1、访问多列时速度快 2、支持高效更新和删除 3、AO行储存主要为插入而优化 1.8.2 列储存 1、列储存更适合压缩 2、查询列子集时速度快 3、不同列可以使用不同的压缩方式:gzip...2.3 Master fork一个进程处理客户端请求 1、Master 上的postmaster 进程监听到链接请求后,fork一个子进程用于处理该客户端的所有查询请求 2、子进程在PostgrsSQL...2.5 segment fork 一个子进程处理QD的链接请求 1、Segment上的postmaster进程监听到QD的链接请求后,创建一个子进程以处理后续查询的请求 2、Segment 上创建的子进程称为

    90030

    理解服务器设计的基本模式

    那么socket的结构是。 ? 这时候进程从accept中被唤醒。然后拿到一个新的socket用于通信。 ? 这种模式就是从已完成三次握手的队列里摘下一个节点,然后处理。...再摘下一个节点,再处理。如果处理的过程中有文件io,可想而知,效率是有多低。而且大并发的时候,socket对应的队列很快就不被占满。...for (let i = 0 ; i < 进程个数; i++) { if (fork() > 0) { // 父进程负责监控子进程 } else { //...如果这时候有一个请求到来,那么所有的子进程都会被唤醒,但是首先被调度的子进程会首先摘下这个请求节点。后续的进程被唤醒后发现并没有请求可以处理。又进入睡眠。这是著名的惊群现象。...逻辑如下 for (let i = 0 ; i < 进程个数; i++) { if (fork() > 0) { // 父进程 } else { // 子进程处理请求

    74820

    个人笔记(js+css篇一)

    ("wrapper"); //返回所有带有指定class的元素的集合(返回数组形式) var tagList=document.getElementsByTagName("li");//返回所有带有指定标签的元素的集合...//返回父节点,只有父节点为元素节点时返回,否则返回null element.children //返回所有元素子节点的集合,仅包含元素节点 element.childNodes //返回当前元素所有的子节点...(注释、空格、换行等也会被当作一个节点) element.firstChild //返回当前元素的第一个子节点,该子节点可以是任意节点,如果没有则返回null element.firstElementChild...//返回当前元素的第一个子节点,该子节点只可以是元素节点,如果没有则返回null element.lastChild //返回当前元素的最后一个子节点,该子节点可以是任意节点,如果没有则返回...null element.lastElementChild //返回当前元素的最后一个子节点,该子节点只可以是元素节点,如果没有则返回null element.previousSibling

    53520

    读者诉苦:Redis 宕机,数据丢了,老板要辞退我

    主库接收到psync请求后,会响应 FULLRESYNC ,带有两个参数(主库的runID和同步进度offset) 说明:FULLRESYNC 表示采用全量复制 2、第二步 主库fork子进程,执行 bgsave...但生产环境,通常是一主多从,每个从库初始同步时,都要主库生成RDB文件,显然开销很大。有什么解决方案?...一主多从,主库减压 当从节点存在多个时,主库的压力显著增加,具体体现在两个方面: 1、当从库同步主库时,要fork子进程,有多少个从节点,就要fork多少个子进程,每个子进程都要生成RDB。...通过全量方式,一次性弥补主从间的数据大缺口。 主节点挂了怎么办 如果只是传统意义上的主从模式,主节点挂了,通常要手工完成切换。 效率不言而喻了,尤其是线上生产系统,根本没法接受这种方案。...把选举后的新主库发送给所有节点,让所有的从库执行 replicaof 命令,和master建立主从关系、数据同步复制。另外,也会把最新的主库信息同步给客户端。

    36510
    领券