MySQL半同步复制

MySQL的复制方法有异步复制,同步复制,半同步复制。
异步复制
异步复制是当用户写入一条记录时,先将数据写入到主节点,然后回复用户一个写入成功的消息,然后慢慢的将数据复制到其背后的其他从节点,这样的好处是效率比较高,但是缺点也是非常明显,主服务器和从服务器的延迟过大并且主服务器突然发生异常,此时就会造成数据的丢失。
同步复制
同步复制是当用户写入一条记录时,主节点将数据写入数据库,然后将数据复制给其后面的其他从节点,当所有的从节点返回数据复制成功后,主节点再回复用户数据接入成功的消息,这样做的好处是,确保了数据的安全性,但损失了效率。
半同步复制
半同步复制是间于同步复制和异步复制之间的一种复制方法,他的工作原理是:当用户执行写操作时,主节点会将数据发送给其后面的其他从节点,只要有一个从节点返回复制成功的消息,主节点就直接返回写入成功,如果主节点背后的从节点迟迟不返回复制成功消息,此时就会有一个超时时长,一旦达到超时时长,主节点就先返回消息告诉用户复制成功,而后将数据继续给从节点复制。

半同步复制的配置方法

半同步复制要实现方法
主服务器上安装semi_sync_master.so的插件,并启用,设置好超时的时长 从服务器上安装semi_sync_slave.so的插件,并启用

以下以两台主机来演示半同步复制的配置方法

主机 ip
Master 192.168.73.110
Slave 192.168.73.111

一、配置主从

Master配置

1.修改MySQL配置文件

[root@Master ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=1

2.启动服务

[root@Master ~]# systemctl  start mariadb

3.查看二进制日志位置

[root@Master ~]# mysql -e "SHOW MASTER LOGS;"
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |       245 |
+--------------------+-----------+

4.创建一个用户用来做主从复制

[root@Master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.73.%' IDENTIFIED BY 'centos';"

Slave配置

1.修改MySQL配置文件

[root@Slave ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=2
read_only

2.启动服务

[root@Slave ~]# systemctl start mariadb

3.写入CHANGE MASTER TO

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.73.110', MASTER_USER='repluser',MASTER_PASSWORD='centos',MASTER_PORT=3306,MASTER_LOG_FILE='mariadb-bin.000001',MASTER_LOG_POS=245;
Query OK, 0 rows affected (0.01 sec)

4.启动复制线程

MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

5.查看slave状态

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.73.110
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mariadb-bin.000001
          Read_Master_Log_Pos: 521
               Relay_Log_File: mariadb-relay-bin.000003
                Relay_Log_Pos: 531
        Relay_Master_Log_File: mariadb-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

测试

1.Master导入数据库

[root@Master ~]# mysql < hellodb_innodb.sql 
[root@Master ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

2.Slave查看库

[root@Slave ~]# mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

主从同步配置成功,接下来配置半同步 配置半同步前先将主从复制关闭

[root@Slave ~]# mysql -e "STOP SLAVE;"

二、配置半同步

Master节点配置

1.在Master节点上安装semisync_master.so的插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.01 sec)

2.查看插件是否已经安装

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |          #插件是否启用
| rpl_semi_sync_master_timeout       | 10000 |          #半同步的超时时长
| rpl_semi_sync_master_trace_level   | 32    |          #用于开启半同步复制模式时的调试级别
| rpl_semi_sync_master_wait_no_slave | ON    |          #是否允许master 每个事物提交后都要等待slave的receipt信号
+------------------------------------+-------+
4 rows in set (0.00 sec)

3.修改配置文件启用插件

[root@Master ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=1
rpl_semi_sync_master_enabled                    #启用插件

4.重启服务,查看插件是否启动

[root@Master ~]# systemctl restart mariadb
[root@Master ~]# mysql -e "SHOW VARIABLES LIKE '%semi%'";
+------------------------------------+-------+
| 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    |
+------------------------------------+-------+

5.设置超时时长

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=3000;     #此处为了方便后续测试将超时时间设置为3秒
Query OK, 0 rows affected (0.00 sec)

Slave节点配置

1.在Slave节点上安装semisync_slave.so插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.00 sec)

2.查看插件是否已经安装

MariaDB [(none)]> SHOW VARIABLES LIKE "%semi%";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.00 sec)

3.修改配置文件启用插件

[root@Slave ~]# vim /etc/my.cnf
[mysqld]
log-bin
binlog-format=row
server-id=2
read_only
rpl_semi_sync_slave_enabled

4.重启服务,查看插件是否启动

[root@Slave ~]# mysql -e "SHOW VARIABLES LIKE '%semi%'";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

5.启动复制线程

[root@Slave ~]# mysql -e "START SLAVE";

检查

1.查看主节点的状态,由于没有复制过数据所有数据都为空

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| 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      | 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.00 sec)

2.查看从节点的状态 MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+ 1 row in set (0.00 sec)

测试

1.将从节点网路掐断

[root@Slave ~]# ifdown ens33

2.在主节点添加一条记录

MariaDB [(none)]> INSERT hellodb.teachers VALUE (5,'Tang San',20,'M');
Query OK, 1 row affected (3.00 sec)        

由于无法复制到从服务器,3秒后超时回复用户写入成功