前言
原理总结
异步复制:在主节点写入日志即返回成功,默认情况下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的复制功能是异步的。异步复制可以实现最佳的性能,主库把binlog日志发送给从库,这一动作就结束了,并不验证从库,会造成主从库数据不一致。
GTID复制不像传统的复制方式(异步复制、半同步复制)需要找到binlog(MASTER_LOG_FILE)和POS点(MASTER_LOG_POS),只需要知道master的IP、端口、账号、密码即可。因为复制是自动的,MySQL会通过内部机制GTID自动找点同步。
GTID复制名词释义:
- 1、server-id:服务器身份id,在初始化MySQL时,会自动生成一个server-id并写到数据目录的auto.cnf文件中,官方不建议修改,并且server-id跟GTID有密切关系。
- 2、GTID:全局事务标识符,使用这个功能时,内次事务提交都会在binlog里生成一个唯一的标识符,它由UUID和事务ID组成,首次提交的事务为1,第二次为2,第三次为3,以此类推
开启GTID,无需找到binlog和POS点,直接change master to master_auto_postion=1即可,它会自动寻找同步
GTID工作流程:
- 1、在master上一个事务提交,并写入binlog里。
- 2、binlog日志发送到slave,slave接收并写入中继日志里,slave读取到这个GTID,并设置gtid_next的值。例如
set @@session。gtid_next=’=fbd841f9-5590-11e8-b819-000c29e6461e’;
然后告诉slave接下来的事务必须使用GTID,并写入它自己的binlog里。 - 3、slave检查并确认这个GTID没有被使用,如果没有被使用,那么开始执行这个事务并写入自己的binlog里
- 4、由于gtid_next的值不为空,slave不会尝试去生成一个新的gtid而是通过主从同步来获取GTID
半同步复制:一主多从模式下,有一个从节点返回成功,即成功,不必等待多个节点全部返回。
MySQL半同步,MySQL5.5由Google贡献的补丁才开始支持半同步复制(semi Replication)模式,该模式可以确保从服务器接收完主服务器发送的binlog日志文件并写入自己的中继日志(relay log)里,然后会给主服务器一个反馈,告诉对方已经接收到完毕,这时主库线程才返回当前session告知操作完成,当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。
主从同步可以同步多个数据库,也可以设置为一个数据库同步,如果设置一个数据库,在从服务器上其他数据可以写操作。
半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式。
实验环境:
- 主库:server1: 172.25.6.1
- 从库: server2:172.25.6.2
一、MYSQL的主从复制
特别提醒:在数据库中进行操作时,事实上大小写都是通用的,但是作为一个专业人士 ?? ,我们还是使用大写
主从复制的要求:
- (1)主库开启binlog日志(设置log-bin参数)
- (2)主从server-id不同
- (3)从库服务器能连同主库
主从复制的原理:
mysql的主从配置又叫replication,AB复制,基于binlog二进制日志,主数据库必须开启binlog二进制日志才能进行复制。
- (1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
- (2)从库生成两个线程,一个i/o线程,一个SQL线程,i/o线程去请求主库的binlog,
- (3) slave将master的binary log events拷贝到它的中继日志(relay log);
- (4)slave重做中继日志中的事件,将更改应用到自己的数据上。
配置主库
1.下载mysql的安装包,解压
[root@server1 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
2.选择下面五个包安装
[root@server1 ~]# yum install mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
3.将server1安装的包传给server2
[root@server1 ~]# scp mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm server2:/root ##如果你写server2的话,需要提前在本机上对server2进行地址解析
4.server2也安装mysql
[root@server2 ~]# yum install mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm