zoukankan      html  css  js  c++  java
  • MySQL--14 半同步复制

    MySQL半同步复制

    从MYSQL5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。

    半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库。
    出发点是保证主从数据一致性问题,安全的考虑。


    5.5 出现概念,但是不建议使用,性能太差
    5.6出现group commit 组提交功能,来提升开启半同步复制的性能
    5.7更加完善了,在group commit基础上出现了MGR
    5.7的增强半同步复制的新特性:after commit; after sync;


    半同步复制开启方法

    1)安装(主库)

    #登录数据库
    [root@db01 ~]# mysql -uroot -poldboy123
    #查看是否有动态支持
    mysql> show global variables like 'have_dynamic_loading';
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | have_dynamic_loading | YES   |
    +----------------------+-------+
    1 row in set (0.00 sec)
    
    #安装自带插件
    [root@db01 plugin]# pwd
    /application/mysql/lib/plugin
    #查看,主库装master, 从库装slave
    [root@db01 plugin]# ll
    total 1992
    -rwxr-xr-x 1 mysql mysql 515552 Oct 31 00:19 semisync_master.so
    -rwxr-xr-x 1 mysql mysql 276280 Oct 31 00:19 semisync_slave.so
    
    
    mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
    Query OK, 0 rows affected (0.02 sec)
    
    #启动插件
    mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
    #设置超时
    mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
    #修改配置文件
    [root@db01 ~]# vim /etc/my.cnf
    #在[mysqld]标签下添加如下内容(不用重启库)
    [mysqld]
    rpl_semi_sync_master_enabled=1
    rpl_semi_sync_master_timeout=1000
    检查安装:
    mysql> show variables like'rpl%';
    mysql> show global status like 'rpl_semi%';
    
    

    2)安装(从库)

    #登录数据库
    [root@mysql-db02 ~]# mysql -uroot -poldboy123
    #安装slave半同步插件
    mysql>  INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
    #启动插件
    mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
    #重启io线程使其生效
    mysql> stop slave io_thread;
    mysql> start slave io_thread;
    #编辑配置文件(不需要重启数据库)
    [root@mysql-db02 ~]# vim /etc/my.cnf
    #在[mysqld]标签下添加如下内容
    [mysqld]
    rpl_semi_sync_slave_enabled =1
    
    

    注:相关参数说明
    rpl_semi_sync_master_timeout=milliseconds
    设置此参数值(ms),为了防止半同步复制在没有收到确认的情况下发生堵塞,如果Master在超时之前没有收到任何确认,将恢复到正常的异步复制,并继续执行没有半同步的复制操作。

    rpl_semi_sync_master_wait_no_slave={ON|OFF}
    如果一个事务被提交,但Master没有任何Slave的连接,这时不可能将事务发送到其它地方保护起来。默认情况下,Master会在时间限制范围内继续等待Slave的连接,并确认该事务已经被正确的写到磁盘上。
    可以使用此参数选项关闭这种行为,在这种情况下,如果没有Slave连接,Master就会恢复到异步复制。


    测试半同步

    #创建两个数据库,test1和test2
    mysql> create database test1;
    Query OK, 1 row affected (0.04 sec)
    mysql> create database test2;
    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     | 768   |
    | Rpl_semi_sync_master_net_wait_time         | 1497  |
    | Rpl_semi_sync_master_net_waits             | 2     |
    | Rpl_semi_sync_master_no_times              | 0     |
    | Rpl_semi_sync_master_no_tx                 | 0     |
    | Rpl_semi_sync_master_status                | ON    |
    | Rpl_semi_sync_master_timefunc_failures     | 0     |
    | Rpl_semi_sync_master_tx_avg_wait_time      | 884   |
    | Rpl_semi_sync_master_tx_wait_time          | 1769  |
    | Rpl_semi_sync_master_tx_waits              | 2     |
    | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
    | Rpl_semi_sync_master_wait_sessions         | 0     |
    #此行显示2,表示刚才创建的两个库执行了半同步
    | Rpl_semi_sync_master_yes_tx                | 2     | 
    +--------------------------------------------+-------+
    14 rows in set (0.06 sec)
    #从库查看
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    | test1              |
    | test2              |
    +--------------------+
    #关闭半同步(1:开启 0:关闭)
    mysql> SET GLOBAL rpl_semi_sync_master_enabled = 0;
    #查看半同步状态
    mysql> show global status like 'rpl_semi%';
    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 1     |
    | Rpl_semi_sync_master_net_avg_wait_time     | 768   |
    | Rpl_semi_sync_master_net_wait_time         | 1497  |
    | Rpl_semi_sync_master_net_waits             | 2     |
    | Rpl_semi_sync_master_no_times              | 0     |
    | Rpl_semi_sync_master_no_tx                 | 0     |
    | Rpl_semi_sync_master_status                | OFF   | #状态为关闭
    | Rpl_semi_sync_master_timefunc_failures     | 0     |
    | Rpl_semi_sync_master_tx_avg_wait_time      | 884   |
    | Rpl_semi_sync_master_tx_wait_time          | 1769  |
    | 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)
    
    #再一次创建两个库
    mysql> create database test3;
    Query OK, 1 row affected (0.00 sec)
    mysql> create database test4;
    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     | 768   |
    | Rpl_semi_sync_master_net_wait_time         | 1497  |
    | Rpl_semi_sync_master_net_waits             | 2     |
    | Rpl_semi_sync_master_no_times              | 0     |
    | Rpl_semi_sync_master_no_tx                 | 0     |
    | Rpl_semi_sync_master_status                | OFF   |
    | Rpl_semi_sync_master_timefunc_failures     | 0     |
    | Rpl_semi_sync_master_tx_avg_wait_time      | 884   |
    | Rpl_semi_sync_master_tx_wait_time          | 1769  |
    | Rpl_semi_sync_master_tx_waits              | 2     |
    | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
    | Rpl_semi_sync_master_wait_sessions         | 0     |
    #此行还是显示2,则证明,刚才的那两条并没有执行半同步否则应该是4
    | Rpl_semi_sync_master_yes_tx                | 2     | 
    +--------------------------------------------+-------+
    14 rows in set (0.00 sec)
    注:不难发现,在查询半同步状态是,开启半同步,查询会有延迟时间,关闭之后则没有
    

    MySQL过滤复制

    主库:

    白名单:只记录白名单中列出的库的二进制日志

    binlog-do-db

    黑名单:不记录黑名单列出的库的二进制日志

    binlog-ignore-db

    从库:

    白名单:只执行白名单中列出的库或者表的中继日志

    --replicate-do-db=test

    --replicate-do-table=test.t1

    --replicate-wild-do-table=test.t2

    黑名单:不执行黑名单中列出的库或者表的中继日志

    --replicate-ignore-db

    --replicate-ignore-table

    --replicate-wild-ignore-table

    复制过滤配置:

    [root@db01 data]# vim /data/3307/my.cnf 
    #在[mysqld]标签下添加
    replicate-do-db=world
    replicate-do-db=test
    #关闭MySQL
    mysqladmin -S /data/3307/mysql.sock  shutdown
    #启动MySQL
    mysqld_safe --defaults-file=/data/3307/my.cnf &
    

    测试复制过滤:

    第一次测试:

    1)主库:

    [root@db02 ~]# mysql -uroot -p123 -S /data/3308/mysql.sock 
    mysql> use world
    mysql> create table t1(id int);
    

    2)从库查看结果:

    [root@db02 ~]# mysql -uroot -p123 -S /data/3307/mysql.sock 
    mysql> use world
    mysql> show tables;
    

    第二次测试:

    1)主库:

    [root@db02 ~]# mysql -uroot -p123 -S /data/3308/mysql.sock 
    mysql> use test
    mysql> create table tb1(id int); 
    

    2)从库查看结果:

    [root@db02 ~]# mysql -uroot -p123 -S /data/3307/mysql.sock 
    mysql> use test
    mysql> show tables;
    
  • 相关阅读:
    反射
    如何通过反射调用对象的方法?
    简述一下面向对象的”六原则一法则”。
    用Java写一个单例类。
    什么是UML?
    UML中有哪些常用的图?
    用Java写一个折半查找。
    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
    构造器(constructor)是否可被重写(override)?
    用最有效率的方法计算2乘以8?
  • 原文地址:https://www.cnblogs.com/gongjingyun123--/p/11885082.html
Copyright © 2011-2022 走看看