一,GTID 及多线程的复制介绍
GTID 及多线程的复制是 MySQL 5.6 中增加的新特性,以此来强化数据库的主备一致性,故障恢复,以及容错能力。
GTID(Global Transaction Identifiers)是全局事务标识,每一个 GTID 代表一个数据库事务,在整个事务架构中每一个事务ID号是全局唯一的,不止是在一个节点上而是整个主从复制架构中每任何两个事务的ID号都不会相同。当使用GTIDS时,在主上提交的每一个事务都会被识别和跟踪,并且运用到所有从MySQL,而且配置主从或者主从切换时不再需要指定 master_log_files和master_log_pos,mysql通过内部机制GTID自动找点同步;GTID-base复制是完全基于事务的,简单来讲GTID能够保证让一个从服务器到其他的从服务器那里实现数据复制而且能够实现数据整合的。GTID在分布式架构中可以保证数据的一致性,从而也实现了mysql的高可用性;官方建议Binlog采用Row格式,基于行的复制更安全,更容易完成校验。
支持多线程复制,并不是对每个数据库启用多个线程进行复制而是针对每个database开启相应的独立线程。即每个数据库启动一个IO线程进行复制,这样才能保证事物能按顺序进行复制,而是对每个数据库的复制启用多个sql线程,实现并行在本地应用。
二,配置说明
以下接着前面的配置进行,基于 CentOS x86_64 并使用 mariadb-10.1.11.tar.gz ,数据库安装配置可以参考MySQL主从复制原理及配置。
master 节点:192.168.1.106 CentOS6.6 x86_64 slave 节点:192.168.1.113 CentOS6.6 x86_64
1、以下是 MySQL 5.6 主从节点的服务配置文件
1.1、配置master节点:
[mysqld] binlog-format=ROW #基于行的复制更安全,更容易完成校验 log-bin=master-bin log-slave-updates=true gtid-mode=on #启用gtid enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=2 #定义启动多线程复制 binlog-checksum=CRC32 #校验码的校验 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 server-id=1 report-port=3306 port=3306 datadir=/mydata/data socket=/tmp/mysql.sock report-host=master.feiyu.com
1.2、配置slave节点:
[mysqld] binlog-format=ROW log-slave-updates=true gtid-mode=on enforce-gtid-consistency=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-workers=2 #mariaDB需要写成slave_parallel_threads binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 server-id=11 report-port=3306 port=3306 log-bin=mysql-bin.log datadir=/mydata/data socket=/tmp/mysql.sock report-host=slave.feiyu.com
而mariadb与mysql的配置略有不同:
(1)、不支持的参数:
gtid-mode=on
enforce-gtid-consistency=true
即将这两个参数注释掉。
(2)、修改的参数:
将slave-parallel-workers参数修改为slave-parallel-threads
2,启动服务
[root@cacti data]# hostname master.feiyu.com [root@cacti data]# cat /etc/hosts 192.168.1.106 master.feiyu.com master 192.168.1.113 slave.feiyu.com slave [root@cacti data]# scp /etc/hosts root@192.168.1.113:/etc/
创建复制用户:
mysql> grant replication slave,replication client on *.* to 'repluser'@'192.168.%.%' identified by 'replpass';
备份数据库并导入到从服务器:
[root@master ~]# mysqldump --all-databases --lock-all-tables --flush-logs --master-data=2 > all.sql [root@master ~]# scp all.sql 192.168.1.113:/tmp/ mysql> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000007 | 396 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
从服务器导入数据库:
[root@localhost ~]# mysql < all.sql
启动从节点的复制线程,没启用GTID,需要使用如下命令:
MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repluser',master_password='replpass',master_log_file='master-bin.000007',master_log_pos=396; Query OK, 0 rows affected (0.02 sec) MariaDB [(none)]> start slave ;
master节点:
mysql> show slave hosts; +-----------+------------------+------+-----------+ | Server_id | Host | Port | Master_id | +-----------+------------------+------+-----------+ | 11 | slave.magedu.com | 3306 | 1 | +-----------+------------------+------+-----------+ 1 row in set (0.00 sec) MariaDB [(none)]> show processlist; +----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+----------+ | Id | User | Host | db | Command | Time | State | Info | Progress | +----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+----------+ | 3 | system user | | NULL | Connect | 5 | Waiting for work from SQL thread | NULL | 0.000 | | 4 | system user | | NULL | Connect | 5 | Waiting for work from SQL thread | NULL | 0.000 | | 5 | system user | | NULL | Connect | 5 | Waiting for master to send event | NULL | 0.000 | | 6 | system user | | NULL | Connect | 5 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | 0.000 | | 8 | root | localhost | NULL | Query | 0 | init | show processlist | 0.000 | +----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------------+------------------+----------+ 5 rows in set (0.00 sec)
上面的输出中可以看到有多个SQL线程,说明已经启用了多线程,但是gtid还不能验证
slave 节点:
MariaDB [(none)]> stop slave; Query OK, 0 rows affected (0.02 sec)
启动从节点的复制线程并启用GTID功能
MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repluser',master_password='replpass',master_use_gtid=current_pos; Query OK, 0 rows affected (0.05 sec) MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> show global variables like '%gtid%'; #此命令可以查看 gtid 等相关信息
从上图可以看出GTID已经开始工作了。
然后验证复制是否能正常进行:
在master节点删掉数据库mydb:
mysql> drop database mydb; Query OK, 2 rows affected (0.04 sec)
从节点此时也已没有mydb:
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | feiyu | | hellodb | | information_schema | | mysql | | newdb | | performance_schema | | test | +--------------------+ 7 rows in set (0.08 sec)