zoukankan      html  css  js  c++  java
  • redis 和 mysql 的主从复制

    1. mysql主从复制

    (1) 为什么要做主从复制?

    1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

    2、做数据的热备

    3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

    (2) 什么是mysql的主从复制

    MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

    (3) 主从复制原理

    1. master服务器将数据的改变记录在二进制binlog日志上,当master上的数据发生改变时,将其写入二进制文件中;

    2. slave服务器会在一定时间间隔内对master二进制日志进行探测是否发生改变,如果发生改变,则开始一个I/O Thread请求master二进制事件

    3. 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制时间,并保存至 从节点 本地的中继日志中,从节点 将启动sql线程从中继日志中读取二进制日志,在本地释放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

     

    简单说:

    - 从库会生成两个线程,一个I/O线程,一个SQL线程;

    - 主库会生成一个log dump线程,用来给从库I/O线程传binlog;

    - I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;

    - SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;

    (4) 需要注意的事

    1) Master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能,通常为了数据安全考虑,salve也开启binlog功能)

    2) Slave开始俩个线程:IO线程和sql线程,其中:IO线程负责读取master的binlog内容到中继日志relay log里,sql线程负责从中继日志里读取binlog内容,并更新到slave的数据库,这样就能保持slave数据和master数据保持一致了

    3) 至少有俩个Mysql的服务

    4) 最好确保master和slave服务器上的Mysql版本相同,或者主服务器小于子服务器

    5) Master和slave 俩节点时间需同步

    (5) 主从复制延迟问题

    原因:

    mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高,

    slave的sql thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随机的,不是顺序,所以成本要高很多,

    另一方面,由于sql thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL thread所能处理的速度,

    或者当slave中有大型query语句产生了锁等待,那么延时就产生了。

    解决方案:

    1.业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力。

    2.单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。

    3.服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。

    4.不同业务的mysql物理上放在不同机器,分散压力。

    5.使用比主库更好的硬件设备作为slave,mysql压力小,延迟自然会变小。

    6.使用更加强劲的硬件设备。

    注: MySQL5.7之后使用MTS并行复制技术,永久解决复制延时问题。

     

     

    redis的主从复制

    流程

    1.全量复制

    发生节点: 在slave 从服务器初始化阶段,需要将master主服务器上的所有数据都复制一份,流程如下:

    • 从服务器连接主服务器,并发送sycn命令

    • 主服务器接收到sycn命令后,执行bgsave命令生成RDB文件,并且在缓冲区中记录之后所有的操作记录

    • master执行完bgsave后,master将RDB文件发送给slave,并在此阶段内继续在缓冲区内写操作

    • slave在接收到RDB文件前 ,会将自身的数据全部丢弃,载入RDB

    • master发送完毕,会向slave 的缓冲区发 写入执行命令

    • slave 完成对RDB的载入,开始接受命令请求,并执行缓冲区的命令

    2.增量复制

    发生节点: 在slave完成初始化且开始正常工作后,master发生的写操作会同步到slave上

    redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

    操作

    slave 执行以下命令

    SLAVEOF 127.0.0.1 6379 【ip port】 使slave成为master 的从节点

    特点

    1. 采用异步复制

    2. 一个master可以有多个slave,且一个slave下也可以有slave

    3. 在主从复制的过程中,master是非阻塞的,一直对外提供读写服务,slave只能对外提供读服务(可配置),不支持事务

    4. 当master宕机之后,整个服务停掉,只能提供读服务

    5. 当slave宕机重启之后,会向master发送sync指令进行全量同步,当有多个从服务器重启,会导致master IO剧增宕机

    6. 全量复制代价很大,所以尽力只在第一次初始化的时候做一次,在redis 2.8之后引入了部分复制

    部分复制

    部分复制是Redis 2.8以后出现的,用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销,需要注意的是,如果网络中断时间过长,造成主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制

     

    过程:

    1. 如果网络抖动(连接断开 connection lost)

    1. 主机master 还是会写 repl_back_buffer(复制缓冲区)

    1. 从机slave 会继续尝试连接主机

    1. 从机slave 会把自己当前 run_id 和偏移量传输给主机 master,并且执行 pysnc 命令同步

    1. 如果master发现你的偏移量是在缓冲区的范围内,就会返回 continue命令

    1. 同步了offset的部分数据,所以部分复制的基础就是偏移量 offset。

    转自:https://www.jianshu.com/p/4aa9591c3153

  • 相关阅读:
    Javascript高级程序设计第二版第十四章异常笔记
    九大另类中文垂直搜索引擎
    弹出拖动层
    Javascript高级程序设计第二版第十一章DOM2,DOM3笔记
    【物联网智能网关15】WAV播放器(WinForm+WavPlay库实例)
    【物联网中间件平台03】YFIOs安装指南
    【物联网中间件平台05】YFIOs策略开发指南
    【物联网中间件平台01】真正面向物联网的组态软件 YFIOs和YFHMI的前生今世
    【物联网中间件平台02】YFIOs技术白皮书(V1.1)
    【物联网中间件平台06】RFID刷卡拍照
  • 原文地址:https://www.cnblogs.com/zhixinSHOU/p/13220339.html
Copyright © 2011-2022 走看看