运维联盟俱乐部

 找回密码
 立即注册
查看: 2640|回复: 0

mysql异步,同步,半同步复制

[复制链接]
  • TA的每日心情
    开心
    2023-8-9 11:05
  • 发表于 2020-1-3 11:39:36 | 显示全部楼层 |阅读模式
    1. MySQL演化史。
      在2000年,MySQL 3.23.15版本引入了Replication。Replication作为一种准实时同步方式,得到广泛应用。这个时候的Replicaton的实现涉及到两个线程,一个在Master,一个在Slave。Slave的I/O和SQL功能是作为一个线程,从Master获取到event后直接apply,没有relay log。这种方式使得读取event的速度会被Slave replay速度拖慢,当主备存在较大延迟时候,会导致大量binary log没有备份到Slave端。
      在2002年,MySQL 4.0.2版本将Slave端event读取和执行独立成两个线程(IO线程和SQL线程),同时引入了relay log。IO线程读取event后写入relay log,SQL线程从relay log中读取event然后执行。这样即使SQL线程执行慢,Master的binary log也会尽可能的同步到Slave。当Master宕机,切换到Slave,不会出现大量数据丢失。
      在2010年,MySQL 5.5 引入了一种半同步复制模式。该模式可以确保从库接收完主库发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给主库一个反馈,告诉主库已经接收完毕,这时主库才返回结果给客户端告知操作完成。当出现从库响应超时情况时,主库会暂时切换到异步复制模式,直到下一次同步没有超时转为半同步复制为止。

    2. 半同步的新问题:
      如果有故障发生,会切换为异步的复制。 那么从库出现数据不一致的几率会减少,并不是完全消失。
      主机dump线程承担的工作变多了(发送binlog数据到slave,接收slave的ack。两者是串行的,dump线程必须等待slave返回ack之后才会传送下一个events事务。dump线程是整个半同步提高性能的瓶颈),这样显然会降低整个数据库的性能。
      在MySQL 5.5和5.6使用after_commit的模式下, 如果slave没有收到事务,也就是还没有写入到relay log之前,网络出现异常或者不稳定,此时刚好master挂了,系统切换到从库,两边的数据就会出现不一致,slave会少一个事务的数据。
      在此情况下,MySQL5.7的半同步复制技术升级为全新的Loss-less Semi-Synchronous Replication架构,新版本的semi sync增加了rpl_semi_sync_master_wait_point参数, 来控制半同步模式下主库在返回结果给会话之前提交事务的方式。
    该参数有两个值:
      AFTER_COMMIT(5.5,5.6默认值)
    master将每个事务写入binlog之后,先提交事务,然后将binlog数据传递到slave并刷新到磁盘(relay log)。接着master等待slave反馈收到relay log,只有收到ack之后master才将commit OK结果反馈给客户端。
      AFTER_SYNC(5.7默认值)
    master将每个事务写入binlog,然后将binlog数据传递到slave并刷新到磁盘(relay log)。master等待slave反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。即使主库crash了,所有在主库上已经提交的事务都能保证已经同步到slave的relay log中。如图二所示。
     MySQL5.7的半同步复制引入after_sync模式,主要是解决了after_commit导致的主库crash后主从之间数据不一致的问题。在引入after_sync模式后,所有提交的数据都已经被复制,故障切换时数据一致性将得到提升。(另外,在5.7版本的semi sync框架中,独立出一个ack collector thread,专门用于接收slave的反馈信息。这样master上有两个线程独立工作,可以同时发送binlog到slave,和接收slave的反馈)
    3. 半同步复制安装
      开启半同步复制,必须是MySQL5.5以上版本并且已经搭建好普通的主从异步复制。此处以MySQL5.5版本演示,如下所示:
    3.1. 安装半同步插件
    #半同步功能主要是下面两个插件
    [root@master ~]# ls -l /application/mysql/lib/plugin/
    ......
    -rwxr-xr-x 1 mysql mysql 173396 Sep 15  2017 semisync_master.so
    -rwxr-xr-x 1 mysql mysql  94066 Sep 15  2017 semisync_slave.so
    #分别在主从库加载上面两个插件
    master:
    mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
    slave:
    mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
    3.2. 开启半同步复制
      在安装完插件后,半同步复制默认是关闭的,这时需设置参数来开启半同步。
    mater:
    mysql> set global rpl_semi_sync_master_enabled = 1;
    slave:
    mysql> set global rpl_semi_sync_slave_enabled = 1;
    #以上的启动方式是在命令行操作,是临时生效的;永久生效需将如下设置写在配置文件中。
    master:
    plugin-load = rpl_semi_sync_master=semisync_master.so  #此项可以让plugin在任何时候都被mysql加载
    rpl_semi_sync_master_enabled = 1
    slave:
    plugin-load = rpl_semi_sync_slave=semisync_slave.so
    rpl_semi_sync_slave_enabled = 1
    #在有的高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制
    plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
    rpl-semi-sync-master-enabled = 1
    rpl-semi-sync-slave-enabled = 1
    3.3. 重启slave上的IO
    mysql> stop slave io_thread;
    mysql> start slave io_thread;
    #如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色。
    3.4. 查看半同步状态

    master:
    mysql> show status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name              | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | ON    |
    +-----------------------------+-------+
    slave:
    mysql> show status like 'Rpl_semi_sync_slave_status';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | ON    |
    +----------------------------+--



    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    运维联盟俱乐部 ( 冀ICP备19036648号 )

    GMT+8, 2024-4-29 08:29 , Processed in 0.052992 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表