你的位置:首页 > 云计算大数据

MySQL5.6基于GTID的主从复制实战

2年前 (2017-06-10) 浏览:(484) 云计算大数据 评论(0)

什么是GTID?

官方文档:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在这篇文档里,我们可以知道全局事务 ID 的官方定义是:GTID = source_id:transaction_id

MySQL 5.6 中,每一个 GTID 代表一个数据库事务。在上面的定义中,source_id 表示执行事务的主库 uuid(server_uuid),transaction_id 是一个从 1 开始的自增计数,表示在这个主库上执行的第 n 个事务。MySQL 会保证事务与 GTID 之间的 1 : 1 映射。

实验环境:

master  master.abaolan.com  centos6.8 192.168.88.60  mysql5.6.28   3306

slave     slave.abaolan.com    centos6.8 192.168.88.61  mysql5.6.28   3306

数据库安装:

mysql5.6.28数据库安装请参考https://www.601849.com/post/100.html

主从数据库配置:

文件/etc/my.cnf

要在MySQL 5.6中使用复制功能,其服务配置段[mysqld]中于少应该定义如下选项:

binlog-format:二进制日志的格式,有row、statement和mixed几种类型;

需要注意的是:当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;

log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用于启动GTID及满足附属的其它需求;

master-info-repository和relay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;

sync-master-info:启用之可确保无信息丢失;

slave-paralles-workers:设定从服务器的SQL线程数;0表示关闭多线程复制功能;

binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能;

binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度;

log-bin:启用二进制日志,这是保证复制功能的基本前提;

server-id:同一个复制拓扑中的所有服务器的id号必须惟一;

主数据库master上:

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
[mysql]
no-auto-rehash
default-character-set = utf8
 
[mysqld]
server-id = 1
port = 3306
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
default-storage-engine = INNODB
character-set-server = utf8
connect_timeout = 60
interactive_timeout = 28800
wait_timeout = 28800
back_log = 500
event_scheduler = ON
skip_name_resolve = ON;
 
###########binlog##########
log-bin = /var/mysqlLog/logs/mysql-bin
binlog_format = row
max_binlog_size = 128M
binlog_cache_size = 2M
expire-logs-days = 5
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=4
#rpl_semi_sync_master_enabled = 1
 
slow_query_log = 1
slow_query_log_file = /var/mysqlLog/logs/mysql.slow
long_query_time = 1
 
log_error = /var/mysqlLog/logs/error.log
max_connections = 3000
max_connect_errors = 32767
log_bin_trust_function_creators = 1
transaction_isolation = READ-COMMITTED

从数据库slave上:

[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
 
[mysql]
no-auto-rehash
default-character-set = utf8
 
[mysqld]
server-id = 205
port = 3306
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
default-storage-engine = INNODB
character-set-server = utf8
connect_timeout = 60
wait_timeout = 18000
back_log = 500
event_scheduler = ON
 
###########binlog##########
log-bin = /var/mysqlLog/logs/mysql-bin
binlog_format = row
max_binlog_size = 128M
binlog_cache_size = 2M
expire-logs-days = 5
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=4
#rpl_semi_sync_slave_enabled = 1
skip-slave-start
 
slow_query_log = 1
slow_query_log_file = /var/mysqlLog/logs/mysql.slow
long_query_time = 2
 
log-error = /var/mysqlLog/logs/error.log
max_connections = 3000
max_connect_errors = 10000
log_bin_trust_function_creators = 1
transaction_isolation = READ-COMMITTED

分别在主从数据库上启动mysqld服务:

[root@master ~]# service mysqld start
Starting MySQL......     [ OK ]
[root@master ~]# 
 
 
[root@slave ~]# service mysqld start
Starting MySQL......     [ OK ]
[root@slave ~]#

在主数据库上创建复制用户

mysql> GRANT REPLICATION SLAVE ON *.* TO repluser@192.168.88.61 IDENTIFIED BY 'replpassword';

说明:192.168.88.61是从节点服务器;如果想一次性授权更多的节点,可以自行根据需要修改。

启动从数据库上的复制线程

mysql> CHANGE MASTER TO MASTER_HOST='master.abaolan.com', MASTER_USER='repluser',  \
MASTER_PASSWORD='replpassword', MASTER_AUTO_POSITION=1;
mysql>start slave;

在从服务器查看状态:

mysql> show slave status\G;

 Slave_IO_Running: Yes #IO线程已正常运行

 Slave_SQL_Running: Yes #SQL线程已正常运行

测试:

在主库上创建数据库

mysql> create database abao_data;
Query OK, 1 row affected (0.11 sec)
  
mysql> use abao_data;
Database changed
到从数据库上查看abao_data是否已经复制过去
mysql> show databases;
+--------------------+
| Database  |
+--------------------+
| information_schema |
| abao_data |
| mysql  |
| performance_schema |
+--------------------+
4 rows in set (0.01 sec)
 
mysql>

可以看到abao_data数据库已经存在于从数据库上。

尊重共享,欢迎转载,请自觉添加本文链接,谢谢!本文链接:https://www.601849.com/post/237.html