• 5.redis-复制的原理与优化


    1.什么是主从复制
    2.单机有什么问题?
    (1)机器故障
    (2)容量瓶颈
    (3)QPS瓶颈
    3.主从复制的模型:
    (1)一主一从模型

    (2)一主多从模型

    4.主从复制的作用
    (1)数据副本
    (2)扩展读性能
    5.主从复制需要注意的地方:
    一个master可以有多个slave
    一个slave只能有一个master
    数据流向是单向的,master到slave
    6.复制的配置
    (1)两种实现方式
    方式一:slaveof命令(优点:无需重启,缺点:不变于管理)
    <1>设置:
    master(主):127.0.0.1端口6379
    slave(从):127.0.0.1端口6380
    127.0.0.1:6379> slaveof 127.0.0.1 6380
    OK
    <2>取消:
    master(主):127.0.0.1端口6379
    slave(从):127.0.0.1端口6380
    通过命令在slave:127.0.0.1端口6380上取消掉主从复制
    127.0.0.1:6380> slaveof no one
    OK
    方式二:配置文件(优点:统一配置,缺点:需要重启)
    <1>在从配置文件配将要同步的主ip和端口
    slaveof 127.0.0.1 6379
    #从节点只做读的操作
    slave-read-noly yes
    <2>启动主从
    启动主:./redis-server ../data/redis-6379.conf
    启动从:./redis-server ../data/redis-6380.conf
    <3>
    master(主):127.0.0.1端口6379
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=127.0.0.1,port=6380,state=online,offset=15,lag=1
    master_repl_offset:15(偏移量)
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:14
    在主节点写入一条命令:
    127.0.0.1:6379> set xixi 18
    OK
    127.0.0.1:6379> get xixi
    "18"
    <4>
    slave(从):127.0.0.1端口6380
    127.0.0.1:6380> info replication
    # Replication
    role:slave
    master_host:127.0.0.1(主ip)
    master_port:6379(主端口)
    master_link_status:up(成功)
    master_last_io_seconds_ago:8
    master_sync_in_progress:0
    slave_repl_offset:15(从节点会向主节点做一个上报,会把从节点的状态同步给主节点,这样主节点就知道从节点的偏移量)
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_repl_offset:0
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    从节点查看是否同步成功
    127.0.0.1:6380> get xixi
    "18"
    从节点是不可以自己写入任何
    127.0.0.1:6380> set xixia 18a
    (error) READONLY You can't write against a read only slave.
    从节点取消对主节点的关系
    127.0.0.1:6380> slaveof no one
    OK
    查看取消后
    127.0.0.1:6380> info replication
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:1301
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    7.全量复制
    (1)全量复制:
    (2)全量复制的流程
    首先slave内部向master发送一条命令psync ? -1,master接收到命令能感觉到需要做全量复制的,因为跟本不知道我是谁也没有传偏移量,然后master告诉slave自己的偏移量和run_id是多少,slave会保存master的基本信息,master会做一个bgsave快照,master将本身的RDB文件同步到slave,在此期间,master会通过send buffer记录最新写入的命令,当slave的接收完RDB文件后紧接着收master传来的最新写入的命令,等都接收完毕后,清空本地内容,加载RDB文件和最新的命令,最后,master会通过偏移量的对比,将这个期间产生的值同步到slave
    (3)全量复制的开销
    <1>master节点bgsaver时间(对CPU,内存,硬盘都会有一定开销)
    <2>>master节点RDB文件网络传输时间(占用网络带宽资源)
    <3>从节点清空数据时间
    <4>从节点加载RDB的时间
    <5>从节点如果AOF开启,AOF重写的时间
    8.部分复制:如果发生网络抖动造成主从复制长期没有复制成功,可以使用部分复制
    (1)部分复制的流程
    当slave跟master发生网络抖动,slave连接master失败,master会写入一份repl_back_buffer复制缓冲区的命令。当slave再次连接master成功的时候,会执行一条命令pysnc{offset}{runid},把自己的offset和runid给master,告诉当前偏移量是多少,master接收到发现如果偏移量在当前repl_back_buffer的范围内的,如果在这个队列内,会返回continue,将数据发给slave,如果超过范围会执行全量复制
    9.故障处理-自动故障转移
    主从结构-故障转移
    (1)slave宕掉
    主从复制,一主两从,做读写分离

     


    如果一个slave宕,把一个客户端改到另一个slave上
    (2)master宕掉
    主从复制,一主两从,做读写分离

     


    主客户端从两个从客户端找一个客户端做主客户端
    10.开发运维常见问题
    (1)读写分离:读流量分摊到从节点
    <1>可能遇到的问题:
    复制数据延迟
    读到过期数据
    从节点故障
    (2)主从配置不一致
    例如maxmemory不一致:丢失数据
    例如数据结构化参数(列如hash-max-ziplist-entries):内存不一致
    (3)规避全量复制
    <1>第一次全量复制
    第一次不可避免
    小主节点,低峰
    <2>节点运行ID不匹配
    主节点重启(运行ID变化)
    故障转移
    <3>复制积压缓冲区不足
    网络中断,部分复制无法满足
    增大复制缓冲区配置rel_backlog_size,网络,"增强"
    (4)规避复制风暴
    <1>单主节点复制风暴:
    问题:主节点重启,多从节点复制
    解决:更换复制拓扑
    <2>单机器复制风暴
    机器宕机后,大量全量复制
    主节点分散多机器

  • 相关阅读:
    乔治·奥威尔的六条有效写作的规则
    读书:《个人形成论》 Carl R. Rogers
    想想体制性的生存法则
    每一个山峰都建立在同一座山上
    读书笔记:这些道理没有人告诉过你(二)
    举国的不仅仅是运动员
    参加了一个社会化营销策划比赛整理一下参考资料
    读书:《个人形成论》2 Carl R. Rogers
    前端避坑指南丨辛辛苦苦开发的 APP 竟然被判定为简单网页打包?
    Entify Framework 4.1[问题集] 一个实体的双向依赖引起的错误
  • 原文地址:https://www.cnblogs.com/xixi18/p/11137281.html
Copyright © 2020-2023  润新知