• MySQL5.6半同步复制


    MySQL5.6半同步复制部署

    toc

    1.部署目标

    MySQL双节点部署主从半同步复制并测试

    2.系统环境(系统版本centos6.8)

    2.1 IP规划

    编号 主机名 IP 数据库版本 数据库功能
    1 mysqlnode1 192.168.1.121 mysql5.6.21源码包安装 MySQL主库
    2 mysqlnode2 192.168.1.122 mysql5.6.21源码包安装 MySQL从库

    2.2 拓扑图

    3.系统配置(系统常规初始化完成)

    3.1 修改主机名

    以下操作主从都要执行

    [root@mysqlnode1 ~]# vim /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=mysqlnode1
    NTPSERVERARGS=iburst
    NETWORKING_IPV6=off
    
    [root@mysqlnode2 mysql]# vim /etc/sysconfig/network
    NETWORKING=yes
    HOSTNAME=mysqlnode2
    NTPSERVERARGS=iburst
    NETWORKING_IPV6=off
    ~

    3.2 修改hosts文件

    以下操作主从都要执行

    [root@mysqlnode1 ~]# vim /etc/hosts
    192.168.1.121 mysqlnode1
    192.168.1.122 mysqlnode2
    
    [root@mysqlnode2 ~]# vim /etc/hosts
    192.168.1.121 mysqlnode1
    192.168.1.122 mysqlnode2
    ~

    4.数据库配置

    4.1 数据库配置主从复制

    这里我采用的是基于GTID的主从复制。具体操作请转到https://www.cnblogs.com/plutozzl/p/13217838.html

    4.2 安装半同步复制模块

    安装前首先要加载插件,由于半同步复制是一个功能模块,需要进行加载。半同步模块路径(源码包安装位置:/usr/local/mysql/lib/plugin
    以下操作在主库执行

    mysql> install plugin rpl_semi_sync_master soname '       semisync_master.so';
    Query OK, 0 rows affected (0.01 sec)
    ## 进行加载,如果目录下没有,执行不会成功
    
    mysql> select plugin_name,plugin_status from inform       ation_schema.plugins where plugin_name like '%semi%';
    +----------------------+---------------+
    | plugin_name          | plugin_status |
    +----------------------+---------------+
    | rpl_semi_sync_master | ACTIVE        |
    +----------------------+---------------+
    1 row in set (0.00 sec)
    ## 查看插件是否加载成功

    以下操作在备库执行

    mysql> install plugin rpl_semi_sync_slave soname 's       emisync_slave.so';
    Query OK, 0 rows affected (0.00 sec)
    ## 进行加载
    
    mysql> select plugin_name,plugin_status from inform       ation_schema.plugins where plugin_name like '%semi%       ';
    +---------------------+---------------+
    | plugin_name         | plugin_status |
    +---------------------+---------------+
    | rpl_semi_sync_slave | ACTIVE        |
    +---------------------+---------------+
    1 row in set (0.00 sec)
    ## 查看插件是否加载成功

    4.3 启用半同步复制

    安装完插件后半同步复制默认是关闭的,需要手动设置参数进行打开。
    启动的两种方式:
    1)登录MySQL数据库后进行命令行操作,分别在主库和备库执行。

    mysql> set global rpl_semi_sync_master_enabled=1;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set global rpl_semi_sync_slave_enabled=1;
    Query OK, 0 rows affected (0.00 sec)
    
    ##执行后查看半同步是否在运行
    mysql> show status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name               | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | ON    |
    +-----------------------------+-------+
    1 row in set (0.00 sec)
    
    mysql> show status like 'Rpl_semi_sync_slave_status';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | OFF   |
    +----------------------------+-------+
    1 row in set (0.00 sec)
    ##这里显示OFF状态是正常的,需要重启IOThread线程后才会变为ON状态

    2)修改配置文件,推荐使用这种办法。
    主库:

    [root@mysqlnode1 mysql]# vim my.cnf
    ...
    plugin-load=rpl_semi_sync_master=semisync_master.so
    rpl_semi_sync_master_enabled=1

    从库:

    [root@mysqlnode2 mysql]# vim my.cnf
    ...
    plugin-load=rpl_semi_sync_slave=semisync_slave.so
    rpl_semi_sync_slave_enabled=1

    4.4 重启从数据库的IO线程

    注意是从数据库

    mysql> stop slave IO_THREAD;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> start slave IO_THREAD;
    Query OK, 0 rows affected (0.00 sec)
    ##重启IO线程后,slave会在master上注册为半同步复制的slave角色。
    
    mysql> show status like 'Rpl_semi_sync_slave_status';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | ON    |
    +----------------------------+-------+
    1 row in set (0.00 sec)
    ##查看状态变为ON
    

    至此,半同步复制环境部署完成


    5.半同步环境测试

    5.1 测试目标

    当半同步复制发生超时的时候,会暂时关闭半同步复制,转而使用异步复制。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout(这个参数是设置超时时间的,单位毫秒默认10000)内,收到从库响应则主从重新恢复为半同步复制。

    5.2 测试过程

    #查看当前数据库半同步复制超时时间(主库操作)
    mysql>  show variables like "rpl_semi_sync_master_timeout";
    +------------------------------+-------+
    | Variable_name                | Value |
    +------------------------------+-------+
    | rpl_semi_sync_master_timeout | 10000 |
    +------------------------------+-------+
    1 row in set (0.00 sec)
    
    #关闭从库slave(从库操作)
    mysql> stop slave;
    Query OK, 0 rows affected (0.00 sec)
    
    #主库进行数据插入操作,半同步复制会发生超时,而后半同步复制关闭启用异步复制。(主库操作)
    mysql> insert into mstest values (2);
    Query OK, 1 row affected (**10.01** sec)
    
    #可以看到执行时间超过10s此时已经转为异步复制
    主库:
    mysql> show status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name               | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | OFF   |
    +-----------------------------+-------+
    1 row in set (0.01 sec)
    
    从库:
    mysql> show status like 'Rpl_semi_sync_slave_status';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | OFF   |
    +----------------------------+-------+
    1 row in set (0.00 sec)
    
    #此时将从库的slave打开,之前主库提交的数据也会同步过去
    mysql> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from mstest;
    +------+
    | id   |
    +------+
    |    1 |
    |    2 |
    +------+
    2 rows in set (0.00 sec)
    #此时半同步复制会自动开启
    mysql> show status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name               | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | ON    |
    +-----------------------------+-------+
    1 row in set (0.00 sec)
    
    mysql>  show status like 'Rpl_semi_sync_slave_status';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | ON    |
    +----------------------------+-------+
    1 row in set (0.00 sec)

    验证完成
    上述操作证明了,半同步超时后整个集群会退出半同步复制状态,转而进入异步复制状态。而当恢复正常后,半同步复制会自动恢复。

    6.删除半同步环境

    先在从库进行操作,再回到主库进行操作
    从库

    # 停止slave
    mysql> stop slave;
    Query OK, 0 rows affected (0.00 sec)
    
    # 使半同步模块失效
    mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    # 查看当前模块状态
    mysql> show status like 'Rpl_semi_sync_slave_status';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | OFF   |
    +----------------------------+-------+
    1 row in set (0.00 sec)
    
    # 卸载模块
    mysql> UNINSTALL PLUGIN rpl_semi_sync_slave;
    Query OK, 0 rows affected (0.00 sec)
    
    #再次查看模块状态
    mysql> show status like 'Rpl_semi_sync_slave_status';
    Empty set (0.00 sec)
    
    #删除my.cnf文件相关内容
    [root@mysqlnode2 ~]# vim /usr/local/mysql/my.cnf
    ...
    #plugin-load=rpl_semi_sync_slave=semisync_slave.so
    #rpl_semi_sync_slave_enabled=1
    
    #重启数据库服务
    [root@mysqlnode2 ~]# /etc/init.d/mysql restart
    Shutting down MySQL.. SUCCESS!
    Starting MySQL. SUCCESS!

    主库

    # 查看当前模块状态
    mysql> show status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name               | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | ON    |
    +-----------------------------+-------+
    1 row in set (0.00 sec)
    
    # 关闭半同步模块
    mysql>  SET GLOBAL rpl_semi_sync_master_enabled = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    # 查看当前模块状态
    mysql> show status like 'Rpl_semi_sync_master_status';
    +-----------------------------+-------+
    | Variable_name               | Value |
    +-----------------------------+-------+
    | Rpl_semi_sync_master_status | OFF   |
    +-----------------------------+-------+
    1 row in set (0.00 sec)
    
    # 确保所有从都卸载半同步模块了
    mysql> show status like '%Rpl_semi%';
    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 0     | 为0
    | Rpl_semi_sync_master_net_avg_wait_time     | 10008 |
    | Rpl_semi_sync_master_net_wait_time         | 20017 |
    | Rpl_semi_sync_master_net_waits             | 2     |
    | Rpl_semi_sync_master_no_times              | 2     |
    | Rpl_semi_sync_master_no_tx                 | 1     |
    | Rpl_semi_sync_master_status                | OFF   |
    | Rpl_semi_sync_master_timefunc_failures     | 0     |
    | Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
    | Rpl_semi_sync_master_tx_wait_time          | 0     |
    | Rpl_semi_sync_master_tx_waits              | 0     |
    | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
    | Rpl_semi_sync_master_wait_sessions         | 0     |
    | Rpl_semi_sync_master_yes_tx                | 0     |
    +--------------------------------------------+-------+
    14 rows in set (0.01 sec)
    
    # 卸载模块
    mysql> UNINSTALL PLUGIN rpl_semi_sync_master;
    Query OK, 0 rows affected (0.01 sec)
    
    # 再次查看状态为空
    mysql> show status like 'Rpl_semi_sync_master_status';
    Empty set (0.01 sec)
    
    # 删除my.cnf里面的相关配置
    [root@mysqlnode1 ~]# vim /usr/local/mysql/my.cnf
    ...
    #plugin-load=rpl_semi_sync_master=semisync_master.so
    #rpl_semi_sync_master_enabled=1
    
    # 务必重启MySQL数据库
    [root@mysqlnode1 ~]# /etc/init.d/mysql restart
    Shutting down MySQL.... SUCCESS!
    Starting MySQL. SUCCESS!
    
    # 从库重启IO线程
    mysql> stop slave IO_THREAD;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> start slave IO_THREAD;
    Query OK, 0 rows affected (0.00 sec)
    
    # 从库启动slave
    mysql> start slave IO_THREAD;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> show slave status G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.1.121
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000021
              Read_Master_Log_Pos: 271
                   Relay_Log_File: mysqlnode2-relay-bin.000013
                    Relay_Log_Pos: 441
            Relay_Master_Log_File: mysql-bin.000021
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    

    删除完毕。
    参考:https://www.cnblogs.com/kevingrace/p/6256603.html





  • 相关阅读:
    Windows下安装redis
    flask-redirect
    MySQLHelper
    配置信息
    注释习惯
    SQL2012 附加数据库提示5120错误解决方法
    Union-SQL Server学习笔记
    存储过程
    模糊查询&&日期时间操作
    数据库表的设计
  • 原文地址:https://www.cnblogs.com/plutozzl/p/13220365.html
Copyright © 2020-2023  润新知