阿里云RDS与ECS自建mysql数据库主从同步(GTID方式)

Posted xyz叶子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里云RDS与ECS自建mysql数据库主从同步(GTID方式)相关的知识,希望对你有一定的参考价值。

 

 

1、GTID的概念
全局事务标识:global transaction identifiers;
GTID是一个事务一一对应,并且全局唯一ID;
一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;
GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制;
MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善;
在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。

2、GTID的组成
GTID = source_id:transaction_id
source_id,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。
transaction_id,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。
示例:3D598FA47-71CA-11E1-9E88-C80AJ8Y29562:97
前面的一串为服务器的server_uuid,即3D598FA47-71CA-11E1-9E88-C80AJ8Y29562,后面的97为transaction_id

3、GTID的优势
更简单的实现failover,不用以前那样在需要找log_file和log_pos;
更简单的搭建主从复制;
比传统的复制更加安全;
GTID是连续的没有空洞的,保证数据的一致性,零丢失。

4、GTID的工作原理
当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中;
binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值;
sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID;
如果有记录,说明该GTID的事务已经执行,slave会忽略;
如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行;
在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

 

配置RDS主库

1、登录 RDS 控制台,选择目标实例。
2、配置RDS数据库账号、密码 (ecstb/ecstb) 和授权数据库rdsdb

配置ESC 从库

修改ECS从库 mysql 配置文件,在[mysqld]最后添加如下
#vi /etc/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
####RDS to mysql ####
server-id                       =1001                       #不可与RDS主库id相同
port                            = 3306                   
replicate-do-db                 =rdsdb                       #需要同步的数据库
 
binlog_format                   = row                        #日志文件格式
log-bin                         = mysql-bin
log-bin-index                   = mysql-bin.index
relay-log                       = relay-log
relay_log_index                 = relay-log.index
slave-skip-errors               = all
 
gtid_mode                       = on                          #开启gtid模式
enforce_gtid_consistency        = on
log-slave-updates               = 1
sql_mode                        = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

 保存后重启mysql服务
service mysqld restart 

systemctl start mysqld.service

5、配置主从同步
连接RDS主库,查询GTID

 

进入ECS从库,修改这个信息

1
2
3
4
5
6
mysql> stop slave;
mysql> set global gtid_purged = \'533ac4e6-9565-11e8-abb5-7cd30abca02e:1-3099396\';
 
注意:设置gtid_purged值时,gtid_executed值必须为空否则报错,该值清空的方法就是reset  master命令
 
mysql>reset master;

 

. 执行同步

CHANGE MASTER TO MASTER_HOST = \'rm-wz9523l****4ebzbso.mysql.rds.aliyuncs.com\', MASTER_USER = \'md***s\', MASTER_PASSWORD = \'tJD2****96\', MASTER_PORT = 3306, MASTER_AUTO_POSITION = 1, MASTER_RETRY_COUNT = 0, MASTER_HEARTBEAT_PERIOD = 10000;

CHANGE MASTER TO MASTER_LOG_FILE=\'mysql-bin.001646\', MASTER_LOG_POS=0; 
start slave;
show slave status\\G

 

 操作完成

 

使用阿里云ECS自建RDS MySQL从库

友情提示:安装MySQL软件步骤本文暂不介绍,安装完MySQL无需着急初始化数据库和启动服务。只需确保安装的MySQL版本不低于阿里云RDS MySQL版本,同时提前新建运行MySQL服务的mysql系统用户。出于安全,部分内容已打马赛克。采用何种模式做主从由RDS MySQL版本决定。本文主要使用RDS MySQL 5.6版作为样例说明,使用新的GTID模式做主从。5.5版配置主从更加简单,前15步操作一样,没有16、17步操作,18步使用binlog文件和位置的传统模式做主从,修改对应SQL语句即可,这里就不多加说明了。

1.阿里云使用了开源的Percona Xtrabackup工具对RDS MySQL做全量物理备份。使用阿里云ECS自建从库仍然需要使用该工具导入全量备份数据。为了解决安装时遇到的包依赖问题,推荐使用yum安装Percona Xtrabackup。

yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
yum -y install percona-xtrabackup


2.登录阿里云管理控制台,点击左侧边栏的云数据库RDS版,点击管理

技术分享


3.点选备份恢复,而后点击下载 
技术分享


4.点击复制内网地址。若打算作为从库的ECS主机和RDS不在同一个区域则点击复制外网地址 
技术分享


5.登录ECS下载备份,备份地址URL含有特殊关键字符,直接使用wget工具下载报403错误,需要使用英文单引号括起来。若备份较大可以使用screen工具后台运行下载任务。

wget -c ‘备份地址URL‘ -O full.tar.gz


6.下载阿里备份专属解压脚本。

wget ‘http://oss.aliyuncs.com/aliyunecs/rds_backup_extract.sh?spm=5176.775973700.0.0.n9b8wj&file=rds_backup_extract.sh‘ -O rds_backup_extract.sh


7.解压备份至指定目录。

bash rds_backup_extract.sh -f full.tar.gz -C 目录


8.应用日志,目录为第7步指定目录,当运行结果最后一行显示completed OK!,则表明操作成功。

innobackupex --apply-log 目录


9.将解压文件backup-my.cnf所有内容添加至对应MySQL配置文件my.cnf中,若配置冲突,使用backup-my.cnf内容替换my.cnf同名参数值。目录为第7步指定目录。

cat 目录/backup-my.cnf


10.拷贝或移动完成应用日志操作的已解压备份至MySQL数据目录,需my.cnf添加datadir参数指定,--copy-back参数为拷贝,--move-back参数为移动。目录为第7步指定目录,若第7部指定的目录即为MySQL数据目录,则无需此步操作。

innobackupex --defaults-file=/etc/my.cnf --move-back 目录


11.修改MySQL数据目录权限并启动MySQL。

chown -R mysql:mysql 数据目录
/etc/init.d/mysqld start


12.登录阿里云管理控制台,点击账号管理,而后点击页面中的创建账号 
技术分享


13.按照提示填写相关内容,复制账号只需只读权限即可,填写完后,点击确定按钮。

技术分享


14.点击数据安全性,选择修改 

技术分享


15.添加ECS从机的IP地址至组内白名单,IP地址使用英文逗号分隔。 
技术分享


16.登录MySQL终端,清理复制关系表数据。

TRUNCATE TABLE mysql.slave_relay_log_info;
TRUNCATE TABLE mysql.slave_master_info;


17.从库配置文件my.cnf添加以下内容或者替换已有参数后重启。/etc/init.d/mysqld restart重启服务开启GTID模式。

master-info-repository=file
relay-log-info_repository=file
binlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true


18.读取第7步指定目录下的xtrabackup_slave_info文件内容,文件1、2行依次对应以下4行SQL语句中的第2、3行,文件第1行无需修改,原样执行。文件第2行,添加内容修改为第3行SQL语句样式。登录MySQL终端依次执行SQL语句。

STOP SLAVE;
SET GLOBAL gtid_purged=‘49dde677-5827-11e5-8c5c-288023a0e898:1-21409262, 59bc2959-5827-11e5-8c5c-288023a0e9ac:1-8910790‘;
CHANGE MASTER TO MASTER_HOST=‘RDS访问地址‘, MASTER_PORT=3306, MASTER_USER=‘复制账号‘, MASTER_PASSWORD=‘密码‘, MASTER_AUTO_POSITION=1;
START SLAVE;


19.MySQL终端查询主从复制状态。

SHOW SLAVE STAUTS \G

Slave_IO_RunningSlave_SQL_Running两行值都为Yes则表明主从复制状态正常。


本文出自 “松松” 博客,请务必保留此出处http://dongsong.blog.51cto.com/916653/1794789

以上是关于阿里云RDS与ECS自建mysql数据库主从同步(GTID方式)的主要内容,如果未能解决你的问题,请参考以下文章

基于阿里云RDS创建ECS自建从库

RDS主库ECS自建mysql GTID 主从

RDS mysql 与ECS自建mysql做主从备份

阿里云RDS与ECS自建库搭建主从复制

从阿里云RDS MySQL在线迁移数据到本地MySQL

配置ECS上自建MySQL作为RDS从库过程中踩到的坑