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秒后超时回复用户写入成功