• MySQL半同步复制


    l  安装配置:

    l  机器分布

    IP

    作用

    用途

    192.168.15.3

    master

    主库

    192.168.15.4

    Slave1

    备库

    192.168.15.5

    Slave2

    备库

    l  基本的MySQL主从配置

    MySQL复制过程分成三步:

    master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;

    slave将master的binary log events拷贝到它的中继日志(relay log);

    slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的

    Master配置

    1)分配复制权限

    主库和从库均需要执行

    mysql> grant replication client,replication slave on *.* to 'replck1'@'192.168.15.%' identified by "replck1#!123";

    mysql> flush privileges;

    2)将master中的数据dump到slave1 slave2中

    /opt/app/mysql/bin/mysqldump -uroot -p''  --opt --default-character-set=utf8 

    --triggers -R --master-data=2 --hex-blob --single-transaction --no-autocommit --all-databases > all.sql

    在每台机上安装

    [root@MASTER_03 ~]# yum -y install openssh-clients

    导入

    [root@SLAVE_04 ~]# /opt/app/mysql/bin/mysql < /tmp/all.sql

    [root@SLAVE_05 data]# /opt/app/mysql/bin/mysql < /tmp/all.sql

    导入后,进入master 清除日志

    mysql> reset master;

    mysql> show master status;

    +------------------+----------+--------------+------------------+-------------------+

    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

    +------------------+----------+--------------+------------------+-------------------+

    | mysql-bin.000001 |      120 |              |                  |                   |

    +------------------+----------+--------------+------------------+-------------------+

    1 row in set (0.00 sec)

    在slave1 slave2中进行指定

    mysql> change master to

        -> master_host='192.168.15.3',

        -> master_user='replck1',

        -> master_password='replck1#!123',

        -> master_port=3306,

        -> master_log_file='mysql-bin.000001',

        -> master_log_pos=120;

    Query OK, 0 rows affected, 2 warnings (0.04 sec)

    mysql> start slave;

    在master中创建一个iot2库,发现已经同步

    开启半同步

    1,在Master上装插件:
    install plugin rpl_semi_sync_master soname 'semisync_master.so';
    SET GLOBAL rpl_semi_sync_master_enabled=ON;
    在my.cnf配置文件里,加入 rpl_semi_sync_master_enabled = 1

    2,在Slave上装插件:
    install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 
    SET GLOBAL rpl_semi_sync_slave_enabled =ON;
    在my.cnf配置文件里,加入rpl_semi_sync_slave_enabled = 1

    参数:
    当所有的Slave崩溃,或则断开,甚至是只有Master没有Slave(不可能)。从而Slave接受不到Master的事务,导致M得不到S返回的确认信息。M会一直等待。这里有2个参数可以设置:
    Master上:
    rpl_semi_sync_master_enabled:表示在 master 上已经开启半同步复制模式。
    rpl_semi_sync_master_timeout :为了防止半同步复制在没有收到S发出的确认发生堵塞,该可以设置一个计时器,用来设置超时,超过这个时间值没有收到信息,则切换到异步复制,执行操作。(默认为10000毫秒,等于10秒,这个参数动态可调,表示主库在某次事务中,如果等待时间超过10秒,那么则降级为异步复制模式,不再等待SLAVE从库。如果主库再次探测到,SLAVE从库恢复了,则会自动再次回到半同步复制模式。)
    rpl_semi_sync_master_wait_no_slave :当一个事务被提交,但是Master没有Slave连接,这时M不可能收到任何确认信息,但M会在时间限制范围内继续等待。如果没有Slave链接,会切换到异步复制。(是否允许master每个事务提交后都要等待slave的接收确认信号。默认为on,每一个事务都会等待。如果为off,则slave追赶上后,也不会开启半同步复制模式,需要手工开启。)
    Slave上:
    rpl_recovery_rank:当 slave 从库宕机后,假如 Relay-Log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 MASTER 上获取日志,这样保证 relay-log 的完整。默认情况下该功能是关闭的, relay_log_recovery 的值设置为 1 时,将可在 slave从库上开启该功能。

    在master中

    mysql> show variables like 'rpl%';
    +------------------------------------+----------+
    | Variable_name | Value |
    +------------------------------------+----------+
    | rpl_semi_sync_master_enabled | ON |
    | rpl_semi_sync_master_timeout | 10000 |
    | rpl_semi_sync_master_trace_level | 32 |
    | rpl_semi_sync_master_wait_no_slave | ON |
    | rpl_stop_slave_timeout | 31536000 |
    +------------------------------------+----------+
    5 rows in set (0.00 sec)

    在slave 中

    mysql> show variables like 'rpl%';
    +---------------------------------+----------+
    | Variable_name | Value |
    +---------------------------------+----------+
    | rpl_semi_sync_slave_enabled | ON |
    | rpl_semi_sync_slave_trace_level | 32 |
    | rpl_stop_slave_timeout | 31536000 |
    +---------------------------------+----------+
    3 rows in set (0.01 sec)

    状态:
    如何知道是半同步复制?

    Rpl_semi_sync_master_clients:说明支持和注册半同步复制的已链接Slave数。
    Rpl_semi_sync_master_status:ON是活动状态(半同步),OFF是非活动状态(异步),要么是他没有启用或则已恢复到异步复制状态。用于指示主服务器使用的是异步复
    制模式,还是半同步复制模式。
    Rpl_semi_sync_master_yes_tx:成功提交数量。
    Rpl_semi_sync_master_no_tx :不成功提交数量。
    Rpl_semi_sync_slave_status :Slave上的半同步复制状态,ON表示已经被启用,OFF表示非活动状态。

    复制正常的测试

    mysql> insert into test1 values(5,'d5');
    Query OK, 1 row affected (0.00 sec)

    mysql> show global status like 'rpl_semi%';
    +--------------------------------------------+-------+
    | Variable_name | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients | 1 |
    | Rpl_semi_sync_master_net_avg_wait_time | 7022 |
    | Rpl_semi_sync_master_net_wait_time | 21066 |
    | Rpl_semi_sync_master_net_waits | 3 |
    | Rpl_semi_sync_master_no_times | 1 |
    | Rpl_semi_sync_master_no_tx | 4 |
    | Rpl_semi_sync_master_status | ON |
    | Rpl_semi_sync_master_timefunc_failures | 0 |
    | Rpl_semi_sync_master_tx_avg_wait_time | 3146 |
    | Rpl_semi_sync_master_tx_wait_time | 6293 |
    | Rpl_semi_sync_master_tx_waits | 2 |
    | Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
    | Rpl_semi_sync_master_wait_sessions | 0 |
    | Rpl_semi_sync_master_yes_tx | 2 |
    +--------------------------------------------+-------+
    14 rows in set (0.00 sec)

    停掉slave1然后在master插入

    mysql> insert into test1 values(6,'d6');
    Query OK, 1 row affected (10.01 sec)

    此时的状态

    mysql> show global status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | OFF |
    +-----------------------------+-------+
    1 row in set (0.00 sec)

    重新开启slave 查看master

    mysql> show global status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | ON |
    +-----------------------------+-------+
    1 row in set (0.00 sec)

    插入


    mysql> insert into test1 values(7,'d7');
    Query OK, 1 row affected (0.06 sec)

     没有问题

  • 相关阅读:
    C# 多线程总结 异常处理 线程取消 锁(lock)
    C# sync/async 同步/异步
    C# Parallel 多线程并发
    C# Task TaskFactory 异步线程/异步任务
    C# ThreadPool 线程池
    Nginx基础配置
    Nginx配置通用语法
    Nginx进程间的关系
    Nginx命令行控制
    Flask框架02(路由)
  • 原文地址:https://www.cnblogs.com/olinux/p/5096485.html
Copyright © 2020-2023  润新知