概述
嗨,大家好,我还是那个苦B的运维工程师,今天我要记录的是如何让阿里云ECS自建Mysql与RDS进行主从复制,(下面我就要讲述一下我的心酸屎了,请大家仔细审查)这还真是一个问题,当我接收到首长这条命令的时候,其实我内心是拒绝的,
但是身为一名具有绝对职业操守的运维人员来说,也要硬着头皮上,所以我就干到了凌晨三点,呵呵呵呵,此时已经是第二天的商务10:10分,我坐在办公桌上不知所措,眼皮都已经睁不开了,但是!!因为拥有运维工程师的职业操守,所以!!我就要记录一下我的过程,各位客官慢慢欣赏!
准备工作
1 RDS数据库服务器(不会操作,就去阿里提工单,他们就教你)
2 ECS自建数据库(至于建立数据库的过程,上篇文章有写,请注意,rds上的数据库版本要与ecs上的版本相同,一点都不能不一样!)
可以在rds上输入用户名和密码登录进数据库中,打开SQL窗口,执行"select version();"来查看具体版本号
3 具体没啥别的了,我在下面写一下Mysql主从复制的原理吧,不会的就认真看看,会的就随便看看
Mysql主从复制原理
上面这张图我用了某个大哥的,如果你发现了,不要生气,爱你,Mua~!(下面正式进入关于原理的主题)
1 从库会生成两个线程,一个I/O线程,一个SQL线程;
2 I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
3 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
4 SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
将RDS上面的数据导到ECS自建数据库中
1 点击RDS管理页面的"迁移数据库" --> 点击左侧列表"数据传输"列表中的"数据迁移" --> 选择你的实例所在地区
--> "创建迁移任务" --> 弹出来的页面都是自己手动填写的,一般迁移过程中建议将应用关闭,因为数据还会更新,不过阿里说
迁移过程中,DDL的指定都无效,也不知道真假的,反正我迁的时候就给关了
2 登录到rds上,点击"新建数据库用户" --> 指定用户名和密码 --> 赋予"SELECT,REPLICATION
SLAVE,REPLICATION CLIENT"权限
3 当它预检查成功的时候就证明,你的迁移可以开始了,选中你的任务,点击下方的"启动",然后等待!
4 迁移完毕后,在从库上登录查看一下迁移的库是否存在,如果存在,恭喜你,如果不存在,活该,我写这么详细还能失败?!
在ECS自建数据库上操作
1 更改/etc/my.cnf文件为以下内容
[mysqld]
user=mysql #用来启动mysql的用户
server_id = 2 #指定从库的server_id,不能与主库相同
read_only = 1 #设置从库为只读
port = 3307 #指定端口号为3307,最好不要跟主库相同
replicate-wild-ignore-table = mysql.% #主从复制的时候忽略
replicate-wild-ignore-table = test.% #主从复制的时候忽略
binlog_format = ROW #binlog的格式,ROW格式记录方式成每一行数据被修改,
然后在slave端再对相同的数据进行修改
log-bin = mysql-bin #二进制日志,记录对数据发生变化的sql语句,以二进制方式
保存在磁盘中
log-bin-index = mysql-bin.index #指定索引文件,此文件指示当前使用了哪个日志文件
relay-log = relay-log #中继日志,用来存放master的bin中的内容,看上方原理
relay_log_index = relay-log.index #指定索引文件,此文件指示当前使用哪个日志文件
gtid_mode=on #开启GTID
GTID概述
1、全局事物标识:global transaction identifieds。
2、GTID事物是全局唯一性的,且一个事务对应一个GTID
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致
4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制
5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。
6、在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)
enforce_gtid_consistency=on #只记录对基于GTID的复制安全
log-slave-updates = 1 #允许下端接入slave
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #存储引擎采用严格模式
basedir=/app/mysql/ #指定mysql的安装目录
datadir=/app/mysql/data #指定mysql数据的存放目录
socket=/tmp/mysql.sock #指定mysql的sock文件存放目录
key_buffer_size=32M #myisam索引缓冲,对myisam很重要,缓存myisam表索引数据
max_allowed_packet=8M #限制Server接受的数据包大小
[mysqldump] #数据库备份
quick #强制mysqldump从服务器一次一行地检索表中的行而不是
检索所有行并在输出前将它缓存到内存中
2 启动数据库
[root@localhost ~]# service start mysqld #Centos6上面的启动命令(前提是要将mysql.server文
件加到系统服务)
3 登录rds数据库查看信息(虽然是可视化操作,但是也能打开SQL窗口,打开SQL窗口执行以下sql)
show master status; #记录执行结果;
4 登录从数据库执行以下语句
mysql>change master to MASTER_HOST='RDS内网地址',
MASTER_USER='slave',
MASTER_PASSWORD='slave用户的密码',
MASTER_LOG_FILE='在rds上show master status的File列内容',
MASTER_LOG_POS=1;
mysql> start slave;
mysql> show slave status;(以下这两个参数显示YES则证明成功)
Slave_IO_Running:YES
Slave_SQL_Running:YES
5 有什么报错的话,可以在评论里留言,我看到了都会回答的!