一、主从复制的用途
主从复制用来建立一个与主数据库完全一致的从数据库环境,称为从数据库;主数据库一般是亚实时的业务数据库。
在生产环境中用于对用户或公司的数据做备份,且可亚实时备份多台数据服务器(并不止一台主一台从,可多台主,多台从),防止数据库服务器挂掉造成数据丢失的风险。
二、主从复制的原理
传统主从复制的基本过程如下(Master是主数据库,Slave是从数据库):
1)、Mysql Slave端的IO进程连接上Master,向Master请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2)、Master接收到来自Slave的IO进程的请求后,负责复制的IO进程根据Slave的请求信息,读取相应日志内容,返回给Slave 的IO进程。并将本次请求读取的bin-log文件名及位置一起返回给Slave端。
3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master"我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我";
4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
用白话来讲就是:
主:IO进程
从:IO进程 从服务器通过IO进程跟主服务器的IO进程通信将主服务器的binlog日志同步过来,并且根据binlog日志的内容通过SQL进程往从库写数据。
三、了解GTID的原理
在实现主从复制之前,先了解GTID(global transaction identifiers全局事务标识)
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(强制)。
GTID组成: GTID = source_id:transaction_id source_id,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。 transaction_id,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。 示例: 3E11FA47-71CA-11E1-9E33-C80AA9429562 : 23 前面的一串为服务器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23为transaction_id。
GTID的工作原理
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog
四、主从复制的实现
环境:centos7u4(实例版本,可8可9)
master 10.0.0.131 (ip地址)
slave 10.0.0.130 (ip地址)
修改主机名称 分别为:master和slave
域名解析 [root@master ~]# vim /etc/hosts (可选项,用于域名解析,方便两机域名相互连接)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.131 master
10.0.0.130 slave
关闭selinux和防火墙 # setenforce 0
systemctl stop firewalld
确保时间一致 (用nptdate更新两机时间)
下载并安装启动Mysql5.7(所有机器都做)
master配置
修改配置文件
#vim /etc/my.cnf
[mysqld]
validate_password=off (配置弱密码,可配可不配,看自身需求,但在生产环境最好不配,适用于测试阶段)
log-bin=(输入你需要放置log-bin的位置)
server-id=1(不能与slave一致)
gtid_mode=ON
enforce_gtid_consistency=1
授权远程账户
mysql> grant replication slave,super,reload on *.* to slave@'%' identified by '123';
slave配置
修改配置文件
# vim /etc/my.cnf
[mysqld]
validate_password=off
log-bin=(同上)
server-id=2(不能与master一致)
gtid_mode=ON
enforce_gtid_consistency=1
重启master和slave上的mysql
systemctl restart mysqld
继续配置slave
# mysql -u root -p123
mysql > change master to master_host='master',master_user='slave',master_password='123',master_auto_position=1;
mysql > start slave; //启动slave角色
mysql > show slave status\G //查看状态
测试
1.只要slave状态中io进程和sql进程为YES,基本可以确定成功
2.主服务器上写入数据,在从服务器上查看,如果能在从上看到数据,则成功!