问题:
主库宕机之后,数据可能会丢失
从库只有一个sql Thread,主库写压力大,复制很可能延时
解决方法:
半同步复制--解决数据丢失的问题
并行复制--解决从库复制延时的问题
master用户写入数据,生成event记到binary log中.
slave接收master上传来的binlog,然后按顺序应用,重现master上的用户操作。
主从复制,默认是通过pos复制(postion),就是说在日志文档里,将用户进行的每一项操作都进行编号(pos),每一个event都有一个起始编号,一个终止编号,我们在配置主从复制时从节点时,要输入master的log_pos值就是这个原因,要求它从哪个pos开始同步数据库里的数据,这也是传统复制技术, MySQL5.6增加了GTID复制,GTID就是类似于pos的一个作用,不过它是整个mysql复制架构全局通用的,就是说在这整个mysql冗余架构中,它们的日志文件里事件的GTID值是一致的.
上面也说了,一开始是自己设置的从节点从主节点的日志文件里的pos开始复制,以后就自己去读取上一次同步到哪一块,接着同步.
两者都是日志文件里事件的一个标志,如果将整个mysql集群看作一个整体,pos就是局部的,GTID就是全局的。
global transaction identifiers
。GTID = source_id:transaction_id
source_id
,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。transaction_id
,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。#示例:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
前面的一串为服务器的server_uuid
,即3E11FA47-71CA-11E1-9E33-C80AA9429562
,后面的23
为transaction_id
(1)主机master的配置
主机server2的配置
[root@server2 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/lnmp/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#skip-grant-tables
server-id=1
log-bin=mysql-bin
gtid_mode=ON 开启GTID模式
enforce-gtid-consistency=ON 开启GTID模式
##
## include all files from the config directory
##
#!includedir /etc/my.cnf.d
[root@server2 ~]# /etc/init.d/mysqld stop
Shutting down MySQL........... SUCCESS!
[root@server2 ~]# /etc/init.d/mysqld start
[root@server2 ~]# mysql [email protected]
mysql> show variables like 'gtid%'; 查看gtid是否开启
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| gtid_executed | |
| gtid_executed_compression_period | 1000 |
| gtid_mode | ON |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
+----------------------------------+-----------+
6 rows in set (0.01 sec)
(2)slave的配置
slave的配置
[root@server1 mysql]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/lnmp/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#skip-grant-tables
server-id=2
log-bin=mysql-bin
gtid_mode=ON 开启GTID模式
enforce-gtid-consistency=ON 开启GTID模式
##
## include all files from the config directory
##
#!includedir /etc/my.cnf.d
[root@server1 mysql]# /etc/init.d/mysqld stop
CShutting down MySQL.. SUCCESS!
[root@server1 mysql]# /etc/init.d/mysqld start
mysql -P
mysql> stop slave; 先停掉slave
Query OK, 0 rows affected (0.01 sec)
mysql> change master to 配置SLAVE
-> master_host='172.25.2.3',
-> master_user='repl',
-> master_password='[email protected]',
-> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes