zoukankan      html  css  js  c++  java
  • redis 主从配置

    为了实现高的QPS,可以使用主从架构。一台Master 负责写,一台或多台 Slave 负责读。

    主机(192.168.137.101)就是一般正常配置:

    protected-mode no
    port 6379
    daemonize yes
    pidfile /var/run/redis_6379.pid
    loglevel notice
    logfile "/opt/programs/redis-3.2.11/logs/6379.log"
    databases 16
    save 900 1
    save 300 10
    save 60 10000
    dbfilename 6379.rdb
    dir /opt/programs/redis-3.2.11/db/

    Slave 除了上面的配置外,还要加上:

    slaveof 192.168.137.101 6379
    slave-read-only yes

    注意:测试时,如果在主从在同一台主机上,还要更改相应的端口。

    配置完成后,Slave 总是连不上 Master,查看日志,报 “Error condition on socket for SYNC: No route to host” 的错误,上网搜了一下,说是需要关闭防火墙,或者运行 “iptables -A INPUT -ptcp --dport  6379 -j ACCEPT” 打开6379的端口,可是关闭防火墙时遇到 "Unit iptable.service could not be found" 的错误,我用的是 CentOS7,需要运行如下命令去关闭防火墙:

    systemctl stop firewalld.service

    都启动完成后,连接主节点后,运行 info 命令,可以看到有很多信息,在 Replication 部分,可以看到有几个从节点。

    主从的一些说明:

    1、复制的完整流程

    (1)slave node 启动,仅仅保存 master node 的信息,包括 master node 的 host 和 ip,但是复制流程没开始
    (2)slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立socket网络连接
    (3)slave node 发送 ping 命令给 master node
    (4)口令认证,如果master设置了requirepass,那么salve node必须发送 masterauth 的口令过去进行认证
    (5)master node 第一次执行全量复制,将所有数据发给slave node
    (6)master node 后续持续将写命令异步复制给 slave node

    2、数据同步相关的核心机制

    (1)master 和 slave 都会维护一个offset,这样 master 和 slave 都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况
    master会在自身不断累加 offset,slave也会在自身不断累加 offset
    slave 每秒都会上报自己的 offset 给 master,同时 master 也会保存每个 slave 的offset

    (2)backlog: 主要是用来做全量复制中断后的增量复制用的
    master node 有一个backlog,默认是1MB大小
    master node 给 slave node 复制数据时,也会将数据在 backlog 中同步写一份

    (3)master run id
    info server,可以看到 master run id
    如果根据 host+ip 定位 master node,是不靠谱的,如果 master node 重启或者数据出现了变化,那么slave node应该根据不同的 run id 区分,run id 不同就做全量复制
    如果需要不更改 run id 重启 redis,可以使用 redis-cli debug reload 命令

    (4)psync
    从节点使用 psync 从 master node 进行复制,psync runid offset
    master node 会根据自身的情况返回响应信息,可能是 FULLRESYNC runid offset 触发全量复制,可能是 CONTINUE触发增量复制

    3、全量复制
    (1)master 执行 bgsave,在本地生成一份 rdb 快照文件
    (2)master node 将 rdb 快照文件发送给 salve node,如果 rdb 复制时间超过 60秒(repl-timeout),那么slave node就会认为复制失败,可以适当调节大这个参数
    (3)对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s
    (4)master node 在生成 rdb 时,会将所有新的写命令缓存在内存中,在 salve node 保存了 rdb 之后,再将新的写命令复制给 salve node
    (5)client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败
    (6)slave node 接收到 rdb 之后,清空自己的旧数据,然后重新加载 rdb 到自己的内存中,同时基于旧的数据版本对外提供服务
    (7)如果slave node 开启了 AOF,那么会立即执行 BGREWRITEAOF,重写AOF

    rdb生成、rdb通过网络拷贝、slave旧数据的清理、slave aof rewrite,很耗费时间
    如果复制的数据量在4G~6G之间,那么很可能全量复制时间消耗到1分半到2分钟

    4、增量复制
    (1)如果全量复制过程中,master-slave 网络连接断掉,那么 salve 重新连接 master 时,会触发增量复制
    (2)master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是1MB
    (3)msater 就是根据 slave发送的 psync 中的 offset 来从 backlog 中获取数据的

    5、heartbeat
    主从节点互相都会发送heartbeat信息
    master 默认每隔10秒发送一次 heartbeat,salve node 每隔1秒发送一个 heartbeat

    6、异步复制
    master 每次接收到写命令之后,现在内部写入数据,然后异步发送给 slave node

  • 相关阅读:
    携程面试之后的一些感想
    Log4perl 的使用
    perl Can't use string Cxxx) as a symbol ref while "strict refs" in use at XXXX.pl错误
    selenium web driver 配合使用testng
    泡泡一分钟:Learning Motion Planning Policies in Uncertain Environments through Repeated Task Executions
    泡泡一分钟:Efficient Trajectory Planning for High Speed Flight in Unknown Environments
    运行okvis-mono
    Robotics Education and Research at Scale
    泡泡一分钟:Teaching Robots to Draw
    Gan-based zero-shot learning 论文整理
  • 原文地址:https://www.cnblogs.com/langfanyun/p/8705520.html
Copyright © 2011-2022 走看看