AB复制又称主从复制,实现的是数据同步。如果要做MySQL AB复制,数据库版本尽量保持一致。如果版本不一致,从服务器版本高于主服务器,但是版本不一致不能做双向复制。MySQL AB复制有什么好处呢?有两点,第一是解决宕机带来的数据不一致,因为MySQL AB复制可以实时备份数据;第二点是减轻数据库服务器压力,这点很容易想到,多台服务器的性能一般比单台要好。但是MySQL AB复制不适用于大数据量,如果是大数据环境,推荐使用集群。
然后我们来看看MySQL复制的 3 个主要步骤:
1)主服务器把数据更改记录到二进制日志中,这个操作叫做二进制日志事件;
2)从服务器把主服务器的二进制日志事件拷贝到自己的中继日志(relay log)中;
3)从服务器执行中继日志中的事件,把更改应用到自己的数据上。
主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。 从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的
更新之间的冲突。
先用老版的mysql进行实验。
在server3(主机)上
#yum install mysql-server -y //rhel6.5系统自带的时5.1.71的老版本
#service mysqld start //mysql初始化
#vim /etc/my.cnf //编辑mysql配置文件
在最后添加
server-id=1 //添加server-id,主从必须不同,如果设置多个从服务器,每个从服务器必须有一个唯一的 server-id 值,必须与主服务器的以及其它从服务器的不相同。可以认为 server-id 值类似于 IP 地址:这些 ID 值能唯一识别复制服务器群集中的每个服务器实例。
log-bin=mysql-bin //开启日志二进制文件mysql-bin
#service mysql restart
#mysql_secure_installation
添加root密码redhat
#cd /var/lib/mysql
#mysqlbinlog msql-bin.000001 //查看日志信息
#mysql -predhat
grant replication slave on *.* to [email protected] identified by ‘redhat’;
show master status;
在server4(从机)上
#yum install -y mysql-server
#service mysql start
#vim /etc/my.cnf
添加server-id=2
#mysql_secure_installation
添加root密码为redhat
#change master to master_host=’172.25.0.2’;master_user=’AB’;master_password=’redhat’;master_log_file=’mysql-bin.000001’;mysql_log_pos=’254’;
start slave
show slave status\G;
出现2个YES则连接成功。
在server3上,创建库:create database redhat,能实时同步到server3上
添加表:use redhat;
create table usertb(username varchar(25) not null;password varchar(25) not null);
insert into usertb value (‘user1’,’123’);
server4上也能看到。
下面实现A-->B-->C复制
增加从机server5
在server4的my.cnf中,添加log-bin=mysql-bin
log-slave-updates,
然后执行上面的操作,只是将server4作为主机,server5作为从机。
AB复制只能实时复制,不能将之前的复制过去,为了将server3的之前数据复制到server5上,可以将server3的mysql-bin.000001复制到server5中,在server5上,执行
#mysqlbinlog mysql-bin.000001
查看起始pos id与结束pos id。
#mysqlbinlog mysql-bin.000001 --start-position=起始id --stop-position=结束id //恢复这两id之间的数据
在对server3的mysql进行操作,在server5上能实时看到变化,
由于mysql是5.1的老版本,主机向从机发送数据时,从机是单线程接受的,速度很慢。新版本5.7能多线程接收,效率能提升80%。它不再通过二进制日志文件来匹配,而是通过gtid。
首先,移除所有老版本mysql。
#service mysqld stop
#rm -fr /var/lib/mysql/*
#rpm -e mysql
#yum remove mysql
直到#rpm -qa | grep mysql 下再无信息出现。
安装
#service mysqld start
#less /var/log/mysqld.log
查看临时root密码
#mysql -p临时密码
修改密码
在server3中
#vim /etc/my.cnf
在最后添加
gtid-mod=on
enforce-gtid-consistency=on //开启gtid,并强制持续开启。
#service mysqld restart
在mysql中,grant replication slave on *.* to [email protected] identified by ‘redhat’;
在server4中,
进入mysql
change master to master host=’172.25.0.3’,master_user=’AB’,master_password=’redhat’;,master_auto_position=1;
在server3中,创建表usertb,添加值user1、123
在server4中
AB复制成功。
下面对新版本mysql的并行多线程进行实验。
在server4上的my.cnf中,添加
slave-parallel-type=LOGICAL CLOCK //从机并行方式为逻辑时钟
slave-parallel-worker=16 //并行进程为16
进入mysql,在mysql中show slave\G可看到master uuid
为使实验明显,创建触发器add.sql实现大的数据库。代码为
在server3上
#mysql -p密码 redhat < add.sql
#mysql -p密码
use redhat;
call test1;
在server4上,因为一个表对应一个sql进程,由于采用并发多线程,进入mysql,在mysql中show slave\G可看到gtid增加很快,second_behind_master(延时)很小。
mysqlpump多线程备份:
mysqlpump相对于之前的逻辑备份工具mysqldump来说,优势如下:
- 支持基于表的并行导出功能(参数–default-parallelism,默认为2,参数–parallel-schemas,控制并行导出的库)
- 导出的时候带有进度条(参数–watch-progress,默认开启)
- 支持直接压缩导出导入(参数–compress-output,支持ZLIB和LZ4)
mysqlpump的并行导出功能的架构为:队列+线程,允许有多个队列,每个队列下有多个线程,而一个队列可以绑定1个或者多个数据库。但是,对于每张表的导出只能是单个线程的, 这和mydumper工具是不一样的 ,因为mydumper支持一张表多个线程以chunk的方式批量导出,这在主键是随机的情况下,导出速度还能有提升。
#time mysqlpump -p密码 redhat > redhat.sql
几秒内很快备份完成
#time mysqlpump -p密码 --default-parallelism=2 --compress-out=lz4 redhat > redhat
默认双线程且压缩为lz4的格式