MySQL数据复制原理
异步复制:
默认情况下,MySQL的复制是异步复制,主服务器及其从服务器是独立的。异步复制可以提供最佳的性能,主服务器将更新的数据写入二进制日志(Binlog)文件后,无需等待验证更新数据是否已经复制到从服务器中,就可以自由处理其它进入的事务处理请求。但如果在主服务器或从服务器端发生故障,会造成主从数据的不一致,甚至在恢复时造成数据丢失。
半同步复制:
半同步复制是从MySQL5.5开始引入的功能,可以确保主服务器和访问链中至少一台从服务器之间的数据一致性和冗余。一台主服务器和其许多从服务器都进行了配置,这样,至少有一台从服务器在父主服务器进行事务处理前,必须确认更新已经收到并写入了其中继日志(Relay Log)。当出现超时,主服务器必须暂时切换到异步复制模式重新复制,直到至少有一台设置为半同步复制模式的从服务器及时收到信息。
异步复制实验
普通复制转化为半同步复制:假设已经搭建完成一主一从的GTID复制环境:
master:192.168.2.77
slave:192.168.2.74
1、在主从上分别安装插件
master上
root@(none) 10:12 mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
slave上
root@(none) 10:17 mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2、查看
root@(none) 10:18 mysql>show plugins;
3、启用插件
master上
root@(none) 10:24 mysql>set global rpl_semi_sync_master_enabled=1;
Query OK, 0 rows affected (0.01 sec)
slave上
root@(none) 10:23 mysql>set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.04 sec)
4、重启
root@(none) 10:27 mysql>stop slave;
Query OK, 0 rows affected (0.19 sec)
root@(none) 10:28 mysql>start slave;
Query OK, 0 rows affected (0.05 sec)
root@(none) 10:29 mysql>show global variables like '%rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
2 rows in set (0.25 sec)
root@(none) 10:25 mysql>show global variables like '%rpl_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_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+-------------------------------------------+------------+
8 rows in set (0.31 sec)
5、验证
在master上建新库
root@(none) 10:32 mysql>create database xgy;
Query OK, 1 row affected (0.07 sec)
在slave上查看
root@(none) 10:32 mysql>show databases;
+--------------------+
| Database |
+--------------------+
| xgy |
+--------------------+
=====》成功
关闭slave验证
root@(none) 10:32 mysql>stop slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 10:32 mysql>create database xgy2;
Query OK, 1 row affected (10.04 sec)
root@(none) 10:32 mysql>show databases;
+--------------------+
| Database |
+--------------------+
| xgy |
+--------------------+
root@(none) 10:33 mysql>start slave ;
Query OK, 0 rows affected (0.04 sec)
root@(none) 10:34 mysql>show databases;
+--------------------+
| Database |
+--------------------+
| xgy |
| xgy2 |
+--------------------+
root@(none) 10:32 mysql>show processlist;
+----+----------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+----------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| 6 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 8 | cr-slave | 192.168.2.74:59272 | NULL | Binlog Dump | 58 | Master has sent all binlog to slave; waiting for more updates | NULL |
+----+----------+--------------------+------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)