• redis高可用



    Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制。其中Master以写为主,Slave以读为主。

    Master&Slave的作用主要有两个:

    1. 读写分离;
    2. 容灾恢复。

    redis replication核心机制

    1. redis采用异步的形式复制数据到slave,从redis 2.8开始,slave会周期性地确认自己每次复制的数据量
    2. 一个master node可以连接多个slave node
    3. slave node 也可以连接其他slave node
    4. slave node复制数据时不会block master node的正常工作
    5. slave node 复制数时也不会block 自己的查询操作,它会用旧的数据对外提供服务,但复制完成后,需要删除旧的数据,加载新数据,这个时候会暂停对外服务
    6. slave node主要用来进行横向扩容,扩容可以提高更高的读的吞吐量

    主从复制的流程

    主要流程:

    1. 当启动一个slave node的时候,它会发送一个PSYNC命令给master
    2. 如果这是slave node重现链接master,master会将缺少的数据发送给slave,即增量复制;如果是第一次链接master,则会触发一次full resynchronization,即全量复制。
    3. 开始全量复制的时候,master启动一个后台线程执行bgsave,基于现有数据在本地生成一份rdb快照文件
    4. 生成文件后,master会将这个rdb文件发送给slave,如果rdb复制超过60秒(repl-timeout参数可以配置),那么slave就会认为复制失败,可以适当调节这个参数
    5. slave收到rdb文件后,会先把这个rdb文件存放到本地磁盘,然后再加载到内存,
    6. 然后master会将生成rdb这段时间内接收到的在内存中的数据发送给slave,slave也会接收这份数据。
    7. 如果slave开启了aof(即Append Only File持久化,将Redis执行的每次写命令记录到单独的日志文件中),那么会立即执行berewriteaof,重写aof

    增量复制子流程:

    如果全量复制过程中,master-slave网络连接断掉,salve重新连接master时,会触发增量复制。

    master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB;master就是根据slave发送的psync中的offset来从backlog中获取数据的。

    断点续传

    从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。

    master node会在内存中创建一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制;如果没有找到对应的offset,那么就会执行一次全量复制。

    过期key处理

    slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。


    其他概念

    heartbeat:主从节点互相都会发送heartbeat信息,master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat。master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node

    offset :master会在自身不断累加offset,slave也会在自身不断累加offset。
    slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset。主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况

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

    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命令

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

  • 相关阅读:
    python学习之路——数字类型字符串类型列表类型 day5(18/9/17)
    python学习之路——作业 day5(18/9/17)
    python学习之路——作业 (18/9/15)
    python学习之路——作业 day4(18/9/14)
    Flask-Migrate
    Flask-Script
    Flask-SQLAlchemy
    SQLAlchemy 增删改查 一对多 多对多
    MongoDB 基础
    Flask 模板语法
  • 原文地址:https://www.cnblogs.com/amunote/p/10381402.html
Copyright © 2020-2023  润新知