Redis存储⑪主从复制_分布式系统解决单点问题

redis(主从复制)教程 负责写入操作,同时将数据同步到从节点。:从主节点获取数据副本,通常用于读操作,帮助减轻主节点的负载。 阅读详情

目录

1. 主从复制的概念

1.1 分布式解决单点问题

1.2 主从复制的特点

2. 模拟配置主从复制

2.1 建立复制

2.2 断开复制

2.3 安全性

2.4 只读

2.5 传输延迟

3. 主从复制的拓扑

3.1 一主一从结构

3.2 一主多从结构

3.3 树形主从结构

4. 主从复制的原理

4.1 复制过程

4.2 数据同步 psync

4.3 全量复制

4.4 部分复制

4.5 实时复制

本篇完。


1. 主从复制的概念

1.1 分布式解决单点问题

        在分布式系统中为了解决单点问题(某个服务器程序只有一个节点,即只搞一个物理服务器来部署这个服务器程序。可用性不高:如果这个机器挂了意味着服务就中断了;性能 / 支持的并发量比较有限)。通常会把数据复制多个副本部署到其他服务器,满足故障恢复和负载均衡等需求。在分布式系统中,往往希望有多个服务器来部署 Redis 服务,从而构成一个 Redis 集群,此时就可以让这个集群给整个分布式系统中的其他服务提供更稳定、更高效的数据存储功能。存在以下几种 Redis 的部署方式:

  • 主从复制模式
  • 主从复制 + 哨兵模式
  • 集群模式

(复制功能是高可用 Redis 的基础,哨兵和集群都是在复制的基础上构建的。)

主从复制模式:

        在若干个 Redis 节点中,有的是 “主” 节点,有的是 “从” 节点。从节点上的数据要随着主节点变化,和主节点保持一致。从节点是主节点的副本,在该模式中,从节点上的数据不允许修改,只能读取数据。后续如果有客户端来读取数据,就可以从所有节点中随机挑选一个节点,给这个客户端提供读取数据的服务。

        引入更多的计算资源,那么能够支撑的并发量也就大幅提高了。如果是挂掉了某个从节点是没有什么影响的,此时继续从主节点(如果是主节点挂掉了,那还是有一定影响的,从系欸但只能读数据,如果需要写数据就没得写了)或者其它的从节点读取数据,得到的效果是完全相同的。

        主从模式主要是针对 “读操作” 进行并发量和可用性的提高,而写操作无论是可用性还是并发都是非常依赖主节点的,但主节点又不能设置多个。在实际业务场景中,读操作往往是比写操作更频繁的。

        主从结构是分布式系统中比较经典的一种结构。不仅仅是 Redis 支持,MySQL 等其它的常用组件也是支持的。

1.2 主从复制的特点

主从复制的特点:

  • Redis 通过复制功能实现主节点的多个副本。
  • 主节点用来写,从节点用来读,这样做可以降低主节点的访问压力。
  • 复制支持多种拓扑结构,可以在适当的场景选择合适的拓扑结构。
  • 复制分为全量复制,部分复制和实时复制。
  • 主从节点之间通过心跳机制保证主从节点通信正常和数据一致性。

        Redis 为我们提供了复制的功能,实现了相同数据的多个 Redis 副本。复制功能是高可用 Redis 的基础,哨兵和集群都是在复制的基础上构建的。


2. 模拟配置主从复制

2.1 建立复制

如何在一个服务器上实现分布式呢?

        可以在一个服务器主机上运行多个 redis-server 进程,此处需要保证多个 redis-server 的端口是不相同的。例如:本来 redis-server 默认的端口是 6379,此时就不能让新启动的 redis-server 再继续使用 6379 了。

如何去指定 redis-server 的端口呢?

        可以在启动程序时,通过命令行来指定端口号,--port 选项。也可以直接在配置文件中来设定端口。(推荐,更方便) 

将 redis.conf 配置文件复制两份:slave1.conf 和 slave2.conf(准备一个主节点和两个从节点)。

修改 slave1.conf的端口号:

按照后台进程的方式来运行:

注意 :修改配置主要是修改从机的配置,主机配置不变。

修改 slave2.conf的端口号:

按照后台进程的方式来运行:

        接下来,通过命令行启动上述两个 Redis 实例作为从 Redis,并且通过 ps aux | grep redis 确保两个 Redis 均已正确启动:

        当前这几个节点并没有构成主从结构,而是各自为政。要想成为主从结构,还需要进一步的进行配置。

通过 redis-cli 可以连接主 Redis 实例,通过 redis-cli -p 6380 连接从 Redis,并且观察复制关系。


        参与复制的 Redis 实例划分为主节点(master)和从节点(slave)。每个从节点只能有⼀个主节点,而一个主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点到从节点。配置复制的方式有以下三种:

  • 在配置文件中加入 slaveof {masterHost} {masterPort} 随 Redis 启动生效(推荐,持久生效)。
  • 在 redis-server 启动命令时加入 --slaveof {masterHost} {masterPort} 生效。
  • 直接使用 redis 命令:slaveof {masterHost} {masterPort} 生效。

此处以 6379 为主节点,6380 和 6381 为从节点。

在 slave1.conf 和slave1.conf末尾都添加:

Redis 服务器的配置文件修改之后需要重新启动才能生效:

        从运行结果中看到复制已经工作了,针对主节点 6379 这边数据产生的任何修改,从节点都能立即感知到并同步,就是前面看到的那些 tcp 连接产生的效果。其次,从节点不能写入数据。

Redis 主从节点复制过程:

可以通过 info replication 命令查看复制相关状态:

主节点 6379 复制状态信息:

        主节点上会收到源源不断地 “修改数据” 请求,从节点就需要从主节点这里同步这些修改请求。从节点和主节点之间的数据同步不是瞬间完成的,上面的 offset 就相当于是从节点和主节点之间同步数据的进度,lag 表示延迟情况。

    从节点 6380 复制状态信息:

    repl_backlog:挤压缓冲区,支持部分同步机制的实现。


    2.2 断开复制

            slaveof 命令不但可以建立复制,还可以在从节点执行 slaveof no one 来断开与主节点复制关系。例如:在 6380 节点上执行 slaveof no one 来断开复制。

    断开复制主要流程:

    1. 断开与主节点复制关系。
    2. 从节点晋升为主节点。

            从节点断开复制后,它就不再从属于其它节点了,也并不会抛弃原有数据,后续主节点如果针对数据做出修改,从节点无法再自动获取主节点上的数据变化。

            通过 slaveof 命令还可以实现切主操作,将当前从节点的数据源切换到另一个主节点。执行 slaveof {newMasterIp} {newMasterPort} 命令即可。

    切主操作主要流程:

    1. 断开与旧主节点复制关系。
    2. 与新主节点建立复制关系。
    3. 删除从节点当前所有数据。
    4. 从新主节点行复制操作。

    命令演示:

    6381和6379区别:

            此时的 6381 只是看起来像是个主节点,但实际上并不是,它仍然是个从节点,只是作为 6380 同步数据的来源,自身仍然是不能修改数据的。

            注意:前面是通过 salveof 修改了主从结构,这个修改时临时性的。如果重新启动 Redis 服务器,仍然会按照最初在配置文件中设置的内容来建立主从关系。


    2.3 安全性

            对于数据比较重要的节点,主节点会通过设置 requirepass 参数进行密码验证,这时所有的客户端访问必须使用 auth 命令实行校验。从节点与主节点的复制连接是通过⼀个特殊标识的客户端来完成,因此需要配置从节点的 masterauth 参数与主节点密码保持一致,这样从节点才可以正确地连接到主节点并发起复制流程。


    2.4 只读

            默认情况下,从节点使用 slave-read-only=yes 配置为只读模式。由于复制只能从主节点到从节点,对于从节点的任何修改主节点都无法感知,修改从节点会造成主从数据不⼀致,所以建议线上不要修改从节点的只读模式。


    2.5 传输延迟

            主节点和从节点之间通过网络来传输(TCP),TCP 内部支持 nagle 算法(默认开启),开启后就会增加 tcp 的传输延迟,节省网络带宽;关闭就会减少 tcp 的传输延迟,增加网络带宽,从节点能够更快速的和主节点进行同步。其目的和 tcp 的捎带应答是一样的,针对小的 tcp 数据报进行合并,减少包的个数。主从节点一般部署在不同机器上,复制时的网络延迟就成为需要考虑的问题,Redis 提供了 repl-disable-tcp-nodelay 参数用来控制是否关闭 TCP_NODELAY(在主从同步通信过程中是否关闭 tcp 的 nagle 算法),默认为 no,即开启 tcp-nodelay 功能,说明如下:

    • 当关闭时,主节点产生的命令数据无论大小都会及时地发送给从节点,这样主从之间延迟会变小,但增加了网络带宽的消耗,适用于主从之间的网络环境良好的场景,如同机房部署。
    • 当开启时,主节点会合并较小的 TCP 数据包从而节省带宽。默认发送时间间隔取决于 Linux 的内核,一般默认为 40 毫秒。这种配置节省了带宽但增大主从之间的延迟,适用于主从网络环境复杂的场景,如跨机房部署。

    3. 主从复制的拓扑

            Redis 的复制拓扑结构可以支持单层或多层复制关系,根据拓扑复杂性可以分为以下三种:一主一从、一主多从、树状主从结构。


    3.1 一主一从结构

            一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持,如图所示。

    一主一从拓扑:

            当应用写命令并发量较高且需要持久化时,此时也是会给主节点造成一些压力,那么可以只在从节点上开启 AOF,这样既可以保证数据安全性同时也避免了持久化对主节点的性能干扰。但需要注意的是,这种设定方式有一个严重的缺陷:当主节点关闭持久化功能时,如果主节点宕机要避免自动重启操作,否则就会丢失数据,进一步的主从同步,也会把从节点的数据也给删了。

    改进办法:当主节点挂了之后,需要让主节点在从节点这里获取到 AOF 的文件,再重新启动。


    3.2 一主多从结构

            在实际开发中,读请求往往远超过写请求,所以一般会选择一主多从结构。一主多从结构(星形结构)使得应用端可以利用多个从节点实现读写分离,如下图所示。

    一主多从拓扑:

            主节点上的数据发生改变时,就会把改变的数据同时同步给所有的从节点。对于读比重较大的场景,可以把读命令负载均衡到不同的从节点上来分担压力。同时一些耗时的读命令可以指定一台专门的从节点执行,避免破坏整体的稳定性。对于写并发量较高的场景,多个从节点会导致主节点写命令的多次发送从而加重主节点的负载。


    3.3 树形主从结构

            树形主从结构(分层结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引⼊复制中间层,可以有效降低住系欸按负载和需要传送给从节点的数据量,如下图所示。

    树形拓扑:

            数据写如节点 A 之后会同步给 B 和 C 节点,B 节点进一步把数据同步给 D 和 E 节点。当主节点需要挂载等多个从节点时为了避免对主节点的性能干扰,可以采用这种拓扑结构。此时,主节点就不需要很高的网卡带宽了,但一旦数据进行修改,同步的延时是比之前的结构更长的。


    4. 主从复制的原理

    6380重新以6379为主节点:

    4.1 复制过程

    如下图所示,详细介绍建立复制的完整流程。从图中可以看出复制过程⼤致分为 6 个过程:

    主从节点建立复制流程图:

    4.4.1 保存主节点(master)的信息

            开始配置主从同步关系之后,从节点只保存主节点的地址信息,此时建立复制流程还没有开始,在从节点 6380 执行 info replication 可以看到如下信息:

            从统计信息可以看出,主节点的 ip 和 port 被保存下来,但是主节点的连接状态(master_link_status)是下线状态。

    4.1.2 从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑

            当定时任务发现存在新的主节点后,会尝试与主节点建立基于 TCP 的网络连接(三次握手,是为了验证(系统层面)通信双方是否能够正确读写数据)。如果从节点无法建立连接,定时任务会无限重试直到连接成功或者用户停止主从复制。

    4.1.3 发送 ping 命令

            连接建立成功之后,从节点通过 ping 命令确认主节点在应用层上是否能够正常工作。如果 ping 命令的结果 pong 回复超时,从节点会断开 TCP 连接,等待定时任务下次重新建立连接。

    4.1.4 权限验证

            如果主节点设置了 requirepass 参数,则需要密码验证,从节点通过配置 masterauth 参数来设置密码。如果验证失败,则从节点的复制将会停止。

    4.1.5 同步数据集

            对于首次建立复制的场景,主节点会把当前持有的所有数据全部发送给从节点,这步操作基本是耗时最长的,所以又划分称两种情况:全量同步和部分同步。

    4.1.6 命令持续复制

            当从节点复制了主节点的所有数据之后,针对之后的修改命令,主节点会持续的把命令发送给从节点,从节点执行修改命令,保证主从数据的一致性。


    4.2 数据同步 psync

            Redis 使用  psync 命令(不需要手动执行,Redis 服务器会在建立好主从同步关系之后自动执行。从节点负责执行 psync,从节点从主节点这边拉取数据)完成主从数据同步,同步过程分为:全量复制和部分复制。

    • 全量复制:一般用于初次复制场景,Redis 早期支持的复制功能只有全量复制,它会把主节点全部数据一次性发送给从节点,当数据量较大时,会对主从节点和网络造成很大的开销。
    • 部分复制:用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发数据给从节点。因为补发的数据远小于全量数据,可以有效避免全量复制的过高开销。

    PSYNC 的语法格式  :PSYNC replicationid offset

    • 如果 replicationid 设为 ? 并且 offset 设为 -1,就是在尝试进行全量复制。
    • 如果 replicationid offset 设为了具体的数值,则是尝试进行部分复制。 

    replicationid(也可称为replid)(复制 id)解释:

            主节点的复制 id。主节点重新启动或者从节点晋级成主节点都会生成⼀个 replicationid(同一个节点每次重启生成的 replicationid 都是不同的)。

    从节点在和主节点建立复制关系之后,就会获取到主节点的 replicationid。

    通过 info replication 即可看到 replicationid:


    replication id 对比 run id

    在一个 Redis 服务器上,replication id 和 run id 都是存在的,两个不同的 id 看起来非常像。

    二者非常相似,格式也很像。从节点 info replication:

    可以看出,每个节点的 run id 都不相同,而具有主从关系的节点的 replid 是相同的。

    官方文档明确所里,此处使用的是 replicationid:

    replid + offset 共同标识了一个数据集合。

    下面这个结构体包含了 Redis 服务器的各自重要数据:

    标识一次 Redis 的 “运行”:

    runid 主要是用在支撑实现 Redis 哨兵这个功能的,和主从复制没有什么关系。


    master_replid 和 master_replid2解释:

            通过上图可以看到每个节点需要记录两组 master_replid,这个设定解决的问题场景:

            假设有一个主节点 A 和一个从节点 B,从节点 B 获取到 A 的 replid。如果 A 和 B 在通信过程中出现了一些网络抖动,那么 B 可能就会以为 A 挂了,B 自己就会成为主节点,于是 B 给自己生成一个 master_replid。此时 B 也会记得之前旧的 replid,也就是会使用 master_replid2 来保存之前 A 的 master_replid。

    • 后续如果网络恢复稳定了,B 就可以根据 master_replid2 找回之前的主节点。(该过程要么手动干预,要么通过哨兵机制可以自动完成这个过程)
    • 后续如果网络没有恢复,B 就按照新的 master_replid 自成一派,继续处理后续的数据。

    offset(偏移量)解释

            参与复制的主从节点都会维护自身复制偏移量(整数)。主节点(master)在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在 info replication 中的 master_repl_offset 指标中。

            从节点(slave)每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量,统计指标如下:

            从节点在接受到主节点发送的命令后,也会累加记录自身的偏移量。统计信息在 info replication 中的 slave_repl_offset 指标中:

    复制偏移量的维护如图所示。通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

            replid + offset 共同标识了一个 “数据集”。如果两个节点,他们的 replid 和 offset 都相同,则这两个节点上持有的数据,就一定相同。


    psync 运行流程:

    1. 从节点发送 psync 命令给主节点,replid 和 offset 的默认值分别是 ? 和 -1。
    2. 并不是说从节点索要哪一部分,主节点就一定给哪一部分,而是主节点根据 psync 参数和自身数据情况决定响应结果:
    • 如果回复 +FULLRESYNC replid offset,则从节点需要进行全量复制流程。
    • 如果回复 +CONTINEU,从节点进行部分复制流程。
    • 如果回复 -ERR,说明 Redis 主节点版本过低,不⽀持 psync 命令(可以使用 sync 代替)。从节点可以使用 sync 命令进行全量复制。
    • psync 一般不需要手动执行,Redis 会在主从复制模式下自动调用执行。
    • sync 会阻塞 redis server 处理其他请求,psync 则不会。

    4.3 全量复制

            全量复制是 Redis 最早支持的复制方式,也是主从第一次建立复制时必须经历的阶段。全量复制的运行流程如下图所示。

    什么时候进行全量复制?

    • 首次和主节点进行数据同步。
    • 主节点不方便进行部分复制的时候。

    全量复制的流程:

    1. 从节点发送 psync 命令给主节点进行数据同步,由于是第一次进行复制,从节点没有主节点的运行 ID 和复制偏移量,所以发送 psync ? -1。
    2. 主节点根据命令,解析出要进行全量复制,回复 +FULLRESYNC 响应。
    3. 从节点接收主节点的运行信息进行保存。
    4. 主节点执行 bgsave 进行 RDB 文件的持久化。(不能使用已有的 RDB 文件,而是必须要重新生成一下,因为已有的 RDB 文件可能会和当前最新的数据存在较大差异)
    5. 主节点发送 RDB 文件给从节点,从节点保存 RDB 数据到本地硬盘。(RDB 文件更节省空间)
    6. 主节点将从生成 RDB 到接收完成期间执行的写命令写入缓冲区中,等从节点保存完 RDB 文件后,主节点再将缓冲区内的数据补发给从节点,补发的数据仍然按照 RDB 的二进制格式追加写入到收到的 RDB 文件中,保持主从一致性。
    7. 从节点清空自身原有旧数据。
    8. 从节点加载 RDB 文件得到与主节点一致的数据。
    9. 如果从节点加载 RDB 完成之后,并且开启了 AOF 持久化功能,那么在前面加载数据的过程中,从节点就会产生出很多的 AOF 日志。由于当前收到的是大批量的数据,此时产生的 AOF 日志可能会存在一定的冗余信息,因此针对 AOF 日志进行 bgrewrite 操作,得到最近的 AOF 文件也是必要的过程。

            通过分析全量复制的所有流程,会发现全量复制是一件高成本的操作:主节点 bgsave 的时间,RDB 在网络传输的时间,从节点清空旧数据的时间,从节点加载 RDB 的时间等。所以一般应该尽可能避免对已经有大量数据集的 Redis 进行全量复制。


    有磁盘复制 VS 无磁盘复制(diskless)

            默认情况下,进行全量复制需要主节点生成 RDB 文件到主节点的磁盘中,再把磁盘上的 RDB 文件通过发送给从节点。

            Redis 从 2.8.18 版本开始支持无磁盘复制。主节点在执行 RDB 生成流程时,不会生成 RDB 文件到磁盘中了,而是直接把生成的 RDB 数据通过网络发送给从节点,这样就节省了⼀系列的写硬盘和读硬盘的操作开销。

            从节点之前也是先把收到的 RDB 数据写入到硬盘中,再进行加载。现在也可以省略这个过程,直接把收到的数据进行加载了。

            但是即使引入了无硬盘模式,整个操作仍然是比较重量、耗时的,网络传输(大规模数据全量复制)的过程是没有办法省的。相比于网络传输来说,读写硬盘的开销是很小的。


    4.4 部分复制

    什么时候进行部分复制?

            从节点之前已经从主节点上复制过数据了。因为网络抖动或者从节点重启了,从节点需要重新从主节点这边同步数据,此时看看能不能只同步一小部分(大部分数据都是一致的)。 

    部分复制主要是 Redis 针对全量复制的过高开销做出的一种优化措施,使用 psync replicationId offset 命令实现。当从节点正在复制主节点时,如果出现网络闪断或者命令丢失等异常情况时,从节点会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区存在数据则直接发送给从节点,这样就可以保持主从节点复制的一致性。补发的这部分数据一般远远小于全量数据,所以开销很小。整体流程如下图所示。

    部分复制过程:

    1. 当主从节点之间出现网络中断时,如果超过 repl-timeout 时间,主节点会认为从节点故障并终端复制连接。
    2. 主从连接中断期间主节点依然响应命令,但这些复制命令都因网络中断无法及时发送给从节点,所以暂时将这些命令滞留在复制积压缓冲区(一个内存中简单的队列,会记录最近一段时间修改的数据,因为总量有限,随着时间推移就会把之前旧的数据逐渐删除)中。
    3. 当主从节点网络恢复后,从节点再次连上主节点。
    4. 从节点将之前保存的 replicationId(描述 “数据的来源”)和 复制偏移量(offset,描述 “数据复制的进度”,主节点看这个进度来判断它是否在当前的积压缓冲区内,如果是则可以直接进行部分复制)作为 psync 的参数发送给主节点,请求进行部分复制。
    5. 主节点接到 psync 请求后,进行必要的验证。随后根据 offset 去复制积压缓冲区查找合适的数据,并响应 +CONTINUE 给从节点。
    6. 主节点将需要从节点同步的数据发送给从节点,最终完成一致性。

    复制积压缓冲区

            复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为 1MB,当主节点有连接的从节点(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区,如下图所示。

            由于缓冲区本质上是先进先出的定长队列,所以能实现保存最近已复制数据的功能,用于部分复制和复制命令丢失的数据补救。复制缓冲区相关统计信息可以通过主节点的 info replication 中:

            根据统计指标,可算出复制积压缓冲区内的可用偏移量范围:[repl_backlog_first_byte_offset, repl_backlog_first_byte_offset + repl_backlog_histlen]。

    这个相当于一个基于数组实现的环形队列,上述区间中的值就是 “数组下标”。

            如果当前从节点需要的数据已经超出了主节点的积压缓冲区的范围,则无法进行部分复制,只能全量复制了。


    4.5 实时复制

            主从节点在建立复制连接后,主节点会把自己收到的修改操作,通过 tcp 长连接的方式,源源不断的传输给从节点,从节点就会根据这些请求来同时修改自身的数据,从而保持和主节点数据的一致性。在进行实时复制的时候需要保证连接处于可用状态,所以这样的长连接需要通过心跳包的方式来维护连接状态(这里的心跳是指应用层自己实现的心跳,而不是 TCP 自带的心跳)。

    1. 主从节点彼此都有心跳检测机制,各自模拟成对方的客户端进行通信。
    2. 主节点默认每隔 10 秒对从节点发送 ping 命令,从节点收到就返回 pong,以此来判断从节点的存活性和连接状态。
    3. 从节点默认每隔 1 秒向主节点发送一个 replconf ack {offset} 命令,给主节点上报自身当前的复制偏移量(offset,“进度”)。

            如果主节点发现从节点通信延迟超过 repl-timeout 配置的值(默认 60 秒,这些数据都是可以进行修改的),则判定从节点下线,断开复制客户端连接。从节点恢复连接后,心跳机制继续进行。


    本篇完。

    下一篇是Redis​⑫​存储哨兵_高可用实现方案。

    redis源码分析(8)——replication 从源码级别介绍redis的主从同步的实现机制 阅读详情

    相关推荐

    从零构建高精度温控系统:ADN8835的单电感拓扑与0.01℃稳定性实战解析

    本文深入解析了如何利用ADN8835构建高精度温控系统,重点介绍了其创新的单电感拓扑架构如何实现0.01℃的长期稳定性。内容涵盖精密PCB布局、电源滤波设计,并详细阐述了针对不同热容负载的数字PID控制参数整定策略,为开发精密仪器和医疗设备提供了实战指南。

    r2s3t4的博客 240

    【Redis】浅谈INFO replication中的两个master_replid

    首先说一下含义: master_replid是master启动时生成的40位16进制的随机字符串,用来标识master节点 master_repl_offset是复制流中的一个偏移量,master处理完写入命令后,会把命令的字节长度做累加记录,统计在该字段。该字段也是实现部分复制的关键字段。 slave_repl_offset同样也是一个偏移量,从节点收到主节点发送的命令后,累加自身的偏移量,通过比较主从节点的复制偏移量可以判断主从节点数据是否一致。 当从实例连接到主实例时,从实例会发送ma

    浩瀚宇宙的一粒尘埃 5357

    Docker “docker login“ 失败? 登录阿里云镜像仓库仓库 unauthorized: authentication required

    文章目录听说你 login fail?来,让我们解决一下!登录,撒花 听说你 login fail? 美滋滋的在服务器上安装完成Docker应用,开始配置阿里云镜像加速?然后被阿里云官方文档蹂躏?别急别急,让我来拯救你。 我们先来看看 阿里云官方文档 Docker镜像基本操作: 好家伙,emmm… 上来直接就Login Succeeded,这不简直so easy?我们也来照着操作操作: docker@default-online:~$ docker login registry.cn-hangzhou.a

    zhuzicc的博客 1万+

    redis主从复制

    在redis中实现主从复制,主数据库不需要任何配置,从数据库配置文件加上如下命令   slaveof 主数据库地址    主数据库端口   daemonize yes  后台运行   若在一个机器上测试注意改日志位置,pidfile名字,dir位置和port,这些配置多个redis实例不能重了   启动主从redis服务器 ,自己根据自己的文件位置启动->  ./redis-se...

    徐海兴的专栏 501

    Langfuse落地教程:从Docker部署到项目接入,掌控LLM调用链路

    大模型应用开发中,调用链路的透明度直接决定调试效率与成本控制。可观测性技术通过记录每次请求的输入、输出、模型参数与Token消耗,帮助开发者快速定位问题。Langfuse作为开源LLM可观测性平台,将Trace、Prompt版本管理、评分等能力集成于一体,支持Docker Compose自托管部署,并提供Python/JS SDK与REST API。借助部署后的控制台,团队能够直观追踪RAG检索、Agent工具调用等复杂流程中的每一步耗时与资源占用,实现从黑盒调用到全链路可视化的转变。无论是本地调试、线上排

    weixin_29698641的博客 308

    RustDesk网页端远程控制实战:如何用Web Client替代传统客户端(附安全配置建议)

    本文详细介绍了RustDesk网页端远程控制的实战应用,包括其核心优势、配置流程及安全加固方案。通过Web Client替代传统客户端,用户可实现跨平台无缝体验和企业级管理效率,特别适合临时协作和移动设备使用。文章还提供了JWT身份验证、LDAP集成等安全配置建议,确保网页端访问的安全性。

    weixin_30836759的博客 254

    【Redis】事务&主从复制&哨兵&集群&缓存&分布式锁

    Redis

    m0_70088010的博客 1589

    PPO(Proximal Policy Optimization)算法原理及实现,详解近端策略优化

    接着上面的讲,PG方法一个很大的缺点就是参数更新慢,因为我们每更新一次参数都需要进行重新的采样,这其实是中on-policy的策略,即我们想要训练的agent和与环境进行交互的agent是同一个agent;与之对应的就是off-policy的策略,即想要训练的agent和与环境进行交互的agent不是同一个agent,简单来说,就是拿别人的经验来训练自己。举个下棋的例子,如果你是通过自己下棋来不断提升自己的棋艺,那么就是on-policy的,如果是通过看别人下棋来提升自己,那么就是off-policy的。

    weixin_41106546的博客 9万+

    Redis-主从复制

    redis主从复制

    qq_74812898的博客 1349

    手把手教你用Python+GDAL处理0.5米吉林一号卫星影像(附代码)

    本文详细介绍了如何使用Python和GDAL处理吉林一号0.5米高分辨率卫星影像,包括环境配置、数据预处理、分辨率融合、植被指数计算及地物分类等关键步骤。通过实战代码示例,帮助开发者高效处理大尺寸遥感数据,解决资源崩溃和算法选择问题,提升遥感影像分析能力。

    weixin_30892037的博客 128

    国科大作业考试资料《人工智能原理与算法》2024新编-第三次作业整理

    1. 你的目标是让机器人走出迷宫。机器人面朝北,开始位置在迷宫中间。你可以让机器人转向面朝东、南、西或北。你可以让机器人向前走一段距离,在撞墙之前它会停步。 (1)将问题形式化。状态空间有多大? (2)在迷宫中游走,在两条路或更多路交叉的路口可以转弯。重新形式化这个问题。现在状态空间有多大? (3)从迷宫的任一点出发,我们可以朝四个方向中的任一方向前进直到可以转弯的地方,而且我们只需要这样做。重新对这个问题进行形式化。我们需要记录机器人的方向吗? 2. 传教士和野人问题

    MatsumotoChrikk 984

    吃透这份阿里P8纯手打Java面经,java冒泡排序算法

    第5章 持久化 持久化,Redis的持久化功能有效避免因进程退出造成的数据丢失问题,本章首先介绍RDB和AOF两种持久化配置和运行流程,其次对常见的持久化问题进行定位和优化,最后结合Redis常见的单机多实例部署场景进行优化。 5.1 RDB 5.2 AOF 5.3 问题定位与优化 5.4 多实例部署 Tips:由于内容过多,下面章节内容我将主要展示各个知识点以及部分截图 第6章 复制 复制,在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,用于故障恢复和负载均衡等需求,

    m0_56222134的博客 129

    手把手教你学simulink(36.1)--ACAC变换器场景示例:基于 Simulink 的矩阵变换器(Matrix Converter)

    矩阵变换器(Matrix Converter, MC)是一种直接将交流电(AC)转换为不同频率和幅值的交流电的电力电子设备。与传统的基于直流环节的变频器不同,矩阵变换器不需要中间的直流环节,而是通过双向开关直接在输入和输出之间进行能量传递。这种结构使得矩阵变换器具有更高的效率、更小的体积和更好的动态响应。在本项目中,我们将使用 MATLAB/Simulink 来建模和仿真一个矩阵变换器,并分析其性能。Simulink 是一个强大的仿真工具,特别适合用于电力电子系统的建模和仿真。

    MHD0815的博客 1066

    巩固知识体系!计算机二级java模拟考试软件

    一面(电话面+后期在线coding) ①你们为什么要使用mongdoDb?你们的这个系统中涉及到哪些表? ②hytrix 的实现原理是什么?隔离策略有哪些?你们使用的是哪一些?你们项目中哪些地方使用到了,使用场景是什么?为什么要使用? ③spirng 源码。 ④rocketMq 的设计理念,数据存储,设计思想等。 ⑤ConcurrentHashMap的底层实现原理 ⑥你线上问题解决经验是什么?遇到了什么问题?应该怎么去解决? ⑦在线编码: 两个有序链表,合并成一个链表,然后进行算法的时间复杂度,空间复杂度分

    m0_58269520的博客 167

    大中型超市收银系统(可直接运行)

    光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

    C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

    基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

    java读取txt文件内容并输出,已拿意向书!

    一面(电话面+后期在线coding) ①你们为什么要使用mongdoDb?你们的这个系统中涉及到哪些表? ②hytrix 的实现原理是什么?隔离策略有哪些?你们使用的是哪一些?你们项目中哪些地方使用到了,使用场景是什么?为什么要使用? ③spirng 源码。 ④rocketMq 的设计理念,数据存储,设计思想等。 ⑤ConcurrentHashMap的底层实现原理 ⑥你线上问题解决经验是什么?遇到了什么问题?应该怎么去解决? ⑦在线编码: 两个有序链表,合并成一个链表,然后进行算法的时间复杂度,空间复杂度分

    qq_38514574的博客 855

    LinePhone3.2.7(android端最新版本) sip客户端

    SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

    Redis - 主从复制

    以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

    weixin_73869209的博客 2155

    假人有限元模型

    假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

    Redis主从复制原理及注意事项

    主从复制特点 主从复制的作用 实现主从复制方法 replication工作原理(全量复制) replication工作原理(部分复制) 复制中几个重要概念 全量及部分复制发生的情况 psync2 主从复制常见问题 主从复制特点 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点.具有以下特点: 1.异步复制,从2.8版本开始的。 2.允许单个master配置多

    AF 505

    Redis Sentinel(哨兵) 和 Master+Slave(主从)的实现和原理分析

    Redis Sentinel(哨兵) 和 Master+Slave(主从)的实现和原理分析 * Author:QiuRiMangCao 秋日芒草*# 单节点 server01 server02 } redis 单节点 server03# master slave server01 server02 } redis (master,slave)[数据备份][读写分离] slave减轻ma

    QiuRiMangCao 5745

    Redis命令参考之复制(Replication)

    Redis 支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品。 以下是关于 Redis 复制功能的几个重要方面: Redis 使用异步复制。 从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流(replication stream...

    weixin_33671935的博客 420

    Redis学习 主从复制(master-replica)架构介绍及实现

    以下笔记以及实验皆出自于 中华石杉大佬的视频教学,我跟着做了实验,并且把课上的笔记整理了一下。 redis的主从架构 在一个项目中使用redis必然是因为我们想要做成高并发,redis是整个大型的缓存架构中,支撑高并发的非常重要的一个环节, 但是光redis是不够的。 redis不能支撑高并发的瓶颈就是 单机 单机的redis不可能说QPS超过10万+,除非你的机器性能特别好,维护做的好, 而且你...

    weixin_34284188的博客 2695

    Redis源码解析:15Resis主从复制之从节点流程

    Redis的主从复制功能,可以实现Redis实例的高可用,避免单个Redis 服务器的单点故障,并且可以实现负载均衡。 一:主从复制过程 Redis的复制功能分为同步(sync)和命令传播(commandpropagate)两个操作: 同步操作用于将从节点的数据库状态更新至主节点当前所处的数据库状态; 命令传播操作则用...

    weixin_30325793的博客 324

    Redis主从同步原理

    2.8版本以前 同步(snyc) 执行步骤: 从服务器发送snyc给主服务器 主服务器收到命令后,开始执行bgsave操作,将生成RDB文件,将生成的RDB文件同步给从服务。并使用一个缓冲区记录从现在开始的写命令 从服务载入接受到的RDB文件,期间不可进行其他操作。 主服务将缓冲区里的命令同步给从服务器 传播 同步完成之后,后续的命令都是通过传播的方式发送给从服务器的。即当主服务执行完一条命令后,将该命令发送给从服务,完成数据的同步。 缺陷 场景: 首次复制,不存在问题,毕竟新连接上一个master

    慢行的蜗牛 3422

    redis4.0.1主从配置及Sentinel配置自动Failover

    一、单机版 1、前提条件 yum install gcc-c++   2、安装redis tar -xf redis-4.0.1.tar.gz cd redis-xxxx make make install 3、测试Redis是否安装成功 后台启动redis     ./redis-server redis.conf   注:分别在每台机器上安装以上过程

    eagle89的专栏 8357

    每天认识一个组件:Redis

    Redis 是一个以内存为主要数据存储介质的数据结构服务器。它既可以用作缓存,也可以承担计数器、排行榜、会话存储、分布式协调、消息传递和实时数据处理等职责。

    weixin_47983718的博客 326

    Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

    本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

    木木的学习笔记 427

    Docker多阶段构建实现基于Alpine的Redis的编译安装

    【代码】Docker多阶段构建实现基于Alpine的Redis的编译安装。

    一直在努力学习的菜鸟 325
    上一篇: Qt开发⑥Qt常用控件_下_多元素控件+容器类控件+布局管理器
    下一篇: Qt开发⑦Qt的窗口_上_菜单栏+工具栏+状态栏
    GR鲸鱼
    GR鲸鱼 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
    博客等级 码龄4年 6227粉丝 228原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    GR鲸鱼

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值