• 十二、 Mysql - 主从复制 - 半同步复制


    目录

    知识点1:半同步复制

    Mysql半同步复制原理

     异步复制和半同步复制的区别?

    半同步复制解决了什么问题?

     在Mysql里开启半同步复制

     步骤:

    1、首先在master上面安装插件

    2、设置master全局变量和超时时间

    查看变量是否开启 

    3、在slave上面安装插件,设置全局变量

    4、停止slave上面的I/O线程,然后重启I/O线程

    5、也可以在配置文件里面配置半同步复制(永久开启)

    6、测试数据一致性

    知识点2:同步复制

    组复制以以下不同模式运行:

    单主模式:

    一主多从,再级联

     多主模式

     主主复制

     延迟备份

    设置延迟时间:


    知识点1:半同步复制

    Mysql半同步复制原理

     在Master里面有数据改变的时候,数据会记录到二进制日志里面,然后load dump线程会通知slave机器上面的I/O线程来取二进制日志,然后将数据放到relay log(中继日志)里面

    与异步复制不一样的地方在于,半同步复制会在数据成功存入relay log以后给Master发送一个ACK确认包,Master收到以后才会进行事务的提交,同时,slave也成功将数据读取,执行,达到数据一致性,如果Master没有收到ACK确认包的话,会等待slave 10 s的时间,如果没有收到的话,就会开启异步复制模式

    ###################################################################### 

     异步复制和半同步复制的区别?

    主要区别是,数据存入slave中继日志以后,会发送一个ACK确认包给master。master收到以后才会进行事务的提交

    ###################################################################### 

    半同步复制解决了什么问题?

    解决了异步复制模式里面两边可能会存在数据不一致的问题。

            主库里面有数据,而从库里面没有接收到二进制日志,导致从库里面有数据,造成数据不一致。

    ###################################################################### 

     在Mysql里开启半同步复制

    Mysql官方文档里面有告诉我们该怎么进行半同步复制

    MySQL :: MySQL 5.7 Reference Manual :: 16.3.9.2 Semisynchronous Replication Installation and Configurationhttps://dev.mysql.com/doc/refman/5.7/en/replication-semisync-installation.html

     步骤:


    1、首先在master上面安装插件

    1. root@(none) 15:42 mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    2. Query OK, 0 rows affected (0.01 sec)

    ###################################################################### 

    2、设置master全局变量和超时时间

    1. root@(none) 15:46 mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@(none) 15:47 mysql>

    查看变量是否开启 

    1. root@(none) 15:47 mysql>show variables like "%semi_sync%";
    2. +-------------------------------------------+------------+
    3. | Variable_name | Value |
    4. +-------------------------------------------+------------+
    5. | rpl_semi_sync_master_enabled | ON |
    6. | rpl_semi_sync_master_timeout | 10000 |
    7. | rpl_semi_sync_master_trace_level | 32 |
    8. | rpl_semi_sync_master_wait_for_slave_count | 1 |
    9. | rpl_semi_sync_master_wait_no_slave | ON |
    10. | rpl_semi_sync_master_wait_point | AFTER_SYNC |
    11. +-------------------------------------------+------------+
    12. 6 rows in set (0.01 sec)
    13. root@(none) 15:48 mysql>

    ###################################################################### 

    3、在slave上面安装插件,设置全局变量

    1. root@(none) 15:51 mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@(none) 15:51 mysql>
    1. root@(none) 15:52 mysql>SET GLOBAL rpl_semi_sync_slave_enabled = 1;
    2. Query OK, 0 rows affected (0.00 sec)

    ###################################################################### 

    4、停止slave上面的I/O线程,然后重启I/O线程

    1. root@(none) 15:53 mysql>STOP SLAVE IO_THREAD;
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@(none) 15:57 mysql>START SLAVE IO_THREAD;
    4. Query OK, 0 rows affected (0.00 sec)
    5. root@(none) 15:58 mysql>

    ###################################################################### 

    5、也可以在配置文件里面配置半同步复制(永久开启)

    master: 

    1. [mysqld]
    2. rpl_semi_sync_master_enabled=1
    3. rpl_semi_sync_master_timeout=1000 # 1 second

    slave:

    1. [mysqld]
    2. rpl_semi_sync_slave_enabled=1

    ###################################################################### 

    6、测试数据一致性

    在master上面新建数据库zhaojunjie

    1. root@(none) 16:21 mysql>create database zhaojunjie;
    2. Query OK, 1 row affected (1.01 sec)
    3. root@(none) 16:21 mysql>show databases;
    4. +--------------------+
    5. | Database |
    6. +--------------------+
    7. | information_schema |
    8. | liuhongjie |
    9. | mysql |
    10. | performance_schema |
    11. | sanchuang |
    12. | student |
    13. | sys |
    14. | test |
    15. | ucar_cloud |
    16. | wangsh |
    17. | zhaojunjie |
    18. +--------------------+
    19. 11 rows in set (0.00 sec)
    20. root@(none) 16:22 mysql>use zhaojunjie;
    21. Database changed
    22. root@zhaojunjie 16:22 mysql>show tables;
    23. Empty set (0.00 sec)
    24. root@zhaojunjie 16:23 mysql>create table tt1(id int,name varchar(10));
    25. Query OK, 0 rows affected (0.00 sec)
    26. root@zhaojunjie 16:23 mysql>show tables;
    27. +----------------------+
    28. | Tables_in_zhaojunjie |
    29. +----------------------+
    30. | tt1 |
    31. +----------------------+
    32. 1 row in set (0.00 sec)
    33. root@zhaojunjie 16:23 mysql>

     在slave上面:可以看到数据同步过来了,说明数据一致

    1. root@(none) 16:21 mysql>show databases;
    2. +--------------------+
    3. | Database |
    4. +--------------------+
    5. | information_schema |
    6. | liuhongjie |
    7. | mysql |
    8. | performance_schema |
    9. | sanchuang |
    10. | student |
    11. | sys |
    12. | test |
    13. | ucar_cloud |
    14. | wangsh |
    15. | zhaojunjie |
    16. +--------------------+
    17. 11 rows in set (0.00 sec)
    18. root@(none) 16:22 mysql>use zhaojunjie;
    19. Database changed
    20. root@zhaojunjie 16:22 mysql>show tables;
    21. Empty set (0.00 sec)
    22. root@zhaojunjie 16:22 mysql>show tables;
    23. +----------------------+
    24. | Tables_in_zhaojunjie |
    25. +----------------------+
    26. | tt1 |
    27. +----------------------+
    28. 1 row in set (0.00 sec)
    29. root@zhaojunjie 16:23 mysql>

    ######################################################################

    知识点2:同步复制

    组复制以以下不同模式运行:

    组复制是一种可用于实现容错系统的技术。复制组是一组服务器,每个服务器都有自己的完整数据副本(无共享复制方案),并通过消息传递相互交互。

    复制组由多台服务器组成,组中的每台服务器都可以随时独立执行事务。但是,所有读写事务只有在得到组批准后才会提交。换句话说,对于任何读写事务,组需要决定它是否提交,因此提交操作不是来自原始服务器的单方面决定。只读事务不需要在组内协调并立即提交。 

     由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N/2 + 1)决议并通过,如下图中,由三个节点组成一个复制组,Consensus层为一致性协议层,在事务提交过程中,发送组间通讯,由两个节点决议,通过这个事务,事务最终才能提交,并响应。

    单主模式:

    默认模式是单主模式。

    不能以不同的模式部署组的成员,例如,一个配置为多主模式,而另一个配置为单主模式。要在模式之间切换,需要使用不同的操作配置重新启动组而不是服务器。

    从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。

     

    一主多从,再级联

     但是当我们需要实现级联同步时,即以这样的一个模式,A>B>C实现三级同步时,AB库除了需要设置log-bin参数还需要添加一个参数:log-slave-updates

    log-slave-updates参数默认时关闭的状态,如果不手动设置,那么bin-log只会记录直接在该库上执行的SQL语句,由replication机制的SQL线程读取relay-log而执行的SQL语句并不会记录到bin-log,那么就无法实现上述的三级级联同步。

     

     ###################################################################### 

     多主模式

    多主模式下所有数据库都是读写模式

     ###################################################################### 

     主主复制

    双主模式是指两台服务器互为主从,任何一台服务器数据变更,都会通过复制应用到另外一方的数据库中

    可以是相同的库和表,也可以是不同的库和表

    若主主双方都操作,最好设置auto-increment-offset 和 auto-increment-increment,以避免冲突。若只在其中一个库操作,可不需要设置

     如果是相同的库和表,可以给写入的表设置不同的起始值,相同的偏移量

     

    ######################################################################  

     延迟备份

    延迟备份用途:

    • 防止用户在源上出错。DBA 可以将延迟的副本回滚到灾难发生前的时间。

    • 测试存在滞后时系统的行为。例如,在应用程序中,延迟可能是由副本上的负载过重引起的。但是,生成此负载级别可能很困难。延迟复制可以模拟延迟,而无需模拟负载。它还可用于调试与滞后副本相关的条件。

    • 检查数据库很久以前的样子,而无需重新加载备份。例如,如果延迟为一周,并且 DBA 需要查看数据库在最后几天的开发价值之前的样子,则可以检查延迟的副本。

     设置延迟备份

    在slave上面添加一条:

    设置延迟时间:

    CHANGE MASTER TO MASTER_DELAY = N;

    从源接收到的事件直到在源上执行至少 几秒钟后才会执行。 

    1. root@(none) 16:37 mysql>stop slave;
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@(none) 16:37 mysql>CHANGE MASTER TO MASTER_DELAY = 10;
    4. Query OK, 0 rows affected (0.02 sec)
    5. root@(none) 16:37 mysql>start slave;
    6. Query OK, 0 rows affected (0.00 sec)
    7. root@(none) 16:37 mysql>

  • 相关阅读:
    pdf转ppt的简单方法,包你一学就会
    Swift报错:“‘nil‘ is incompatible with return type ‘User‘”
    轻量级分布式协调工具Etcd介绍和使用
    FPGA杂记
    浔川身份证号码查询——浔川python科技社
    QT软件开发-基于FFMPEG设计视频播放器-支持软解与硬解-完整例子(六)
    JAVA智能外包管理平台计算机毕业设计Mybatis+系统+数据库+调试部署
    数据流通市场中数据产品的特性及其交易模式
    Markdown
    【OpenCV图像处理14】图像分割与修复
  • 原文地址:https://blog.csdn.net/qq_48391148/article/details/126332102