• 05: redis 主从复制


     redis主从复制

     

    原理:

    1. 从服务器向主服务器发送 SYNC 命令。

    2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。

    3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。

    4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。

     详细的过程:

     

    主从常见架构:

    一个主服务器可以有多个从服务器。

    从服务器也可以有自己的从服务器。

    复制功能不会阻塞主服务器。

     

     

    主从数据一致性保证:

    min-slaves-to-write 1

    min-slaves-max-lag

    这个特性的运作原理:

    从服务器以每秒一次的频率 PING 主服务器一次, 并报告复制流的处理情况。

    主服务器会记录各个从服务器最后一次向它发送 PING 的时间。

    用户可以通过配置, 指定网络延迟的最大值 min-slaves-max-lag

    以及执行写操作所需的至少从服务器数量 min-slaves-to-write

    如果至少有 min-slaves-to-write 个从服务器, 并且这些服务器的延迟值都少于 min-slaves-max-lag秒,

     

    那么主服务器就会执行客户端请求的写操作。

    你可以将这个特性看作 CAP 理论中的 C 的条件放宽版本: 尽管不能保证写操作的持久性,

    但起码丢失数据的窗口会被严格限制在指定的秒数中。

    另一方面, 如果条件达不到 min-slaves-to-write min-slaves-max-lag 所指定的条件, 那么写操作就不会被执行

    主服务器会向请求执行写操作的客户端返回一个错误。

     

    ---------------------

    主库是否要开启持久化?

    如果不开有可能,主库重启操作,造成所有主从数据丢失!

     

    主从服务器数据全部丢失的例子:

    1. 假设节点A为主服务器,并且关闭了持久化。 并且节点B和节点C从节点A复制数据

    2. 节点A崩溃,然后由自动拉起服务重启了节点A. 由于节点A的持久化被关闭了,所以重启之后没有任何数据

    3. 节点B和节点C将从节点A复制数据,但是A的数据是空的, 于是就把自身保存的数据副本删除。

    在关闭主服务器上的持久化,并同时开启自动拉起进程的情况下,即便使用Sentinel来实现Redis的高可用性,也是非常危险的。 因为主服务器可能拉起得非常快,以至于Sentinel在配置的心跳时间间隔内没有检测到主服务器已被重启,然后还是会执行上面的数据丢失的流程。

    无论何时,数据安全都是极其重要的,所以应该禁止主服务器关闭持久化的同时自动拉起。

     

    ---------------------

    主从复制实现:

    1、环境:

    准备两个或两个以上redis实例

    mkdir /nosql/638{0..2}

     

    配置文件示例:

    vim   /nosql/6380/redis.conf

    port 6380

    daemonize yes

    pidfile /nosql/6380/redis.pid

    loglevel notice

    logfile "/nosql/6380/redis.log"

    dbfilename dump.rdb

    dir /nosql/6380

    protected-mode no

     

    vim   /nosql/6381/redis.conf

    port 6381

    daemonize yes

    pidfile /nosql/6381/redis.pid

    loglevel notice

    logfile "/nosql/6381/redis.log"

    dbfilename dump.rdb

    dir /nosql/6381

    protected-mode no

     

    vim   /nosql/6382/redis.conf

    port 6382

    daemonize yes

    pidfile /nosql/6382/redis.pid

    loglevel notice

    logfile "/nosql/6382/redis.log"

    dbfilename dump.rdb

    dir /nosql/6382

    protected-mode no

     

    启动:

    redis-server /nosql/6380/redis.conf

    redis-server /nosql/6381/redis.conf

    redis-server /nosql/6382/redis.conf

     主节点:6380

    从节点:63816382

     

    2、开启主从:

    6381/6382命令行:

    redis-cli -p 6381

    SLAVEOF 127.0.0.1 6380

     

    redis-cli -p 6382

    SLAVEOF 127.0.0.1 6380

     

    3、查询主从状态

    从库:

    127.0.0.1:6382> info replication

    主库:

    127.0.0.1:6380> info replication

     

    4、从库切为主库

    模拟主库故障

    redis-cli -p 6380

    shutdown

    redis-cli -p 6381

    info replication

    slaveof no one

     

    6382连接到6381

    [root@db03 ~]# redis-cli -p 6382

    127.0.0.1:6382> SLAVEOF no one

    127.0.0.1:6382> SLAVEOF 127.0.0.1 6381

     

  • 相关阅读:
    一个例子学懂搜索引擎(lucene)
    在vs2008中设置jquery智能提示
    40个有用的jQuery技术和教程
    构建高性能ASP.NET站点之三 细节决定成败
    了解搜索引擎技术
    使用微软分布式缓存服务Velocity Part 2
    【转】构建高性能ASP.NET站点 开篇
    构建高性能ASP.NET站点之二 优化HTTP请求(前端)
    笔记:深入理解JVM 第4章 JVM性能监控与故障处理工具
    javascript 继承
  • 原文地址:https://www.cnblogs.com/jim-xu/p/11671637.html
Copyright © 2020-2023  润新知