一、Mysql主从复制
1、工作原理
MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个Mysql数据库(我们称之为Master)复制到另一个Mysql数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在Slave端,另一个线程(I/O线程)在Master端。
要实现MySQL的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave从Master端获取binlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中的记录的各种SQL操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。
2、工作过程
1)在Slave 服务器上执行start slave命令开启主从复制开关,开始进行主从复制。
2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。
3)Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的IO线程。返回的信息中除了binlog中的下一个指定更新位置。
4)当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容。
5)Slave服务器端的SQL线程会实时检测本地Relay Log中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点。
3、主从复制条件
- 开启Binlog功能
- 主库要建立账号
- 从库要配置master.info(CHANGE MASTER to…相当于配置密码文件和Master的相关信息)
- start slave 开启复制功能
4、知识点
- 3个线程,主库IO,从库IO和SQL及作用
- master.info(从库)作用
- relay-log 作用
- 异步复制
- binlog作用(如果需要级联需要开启Binlog)
5、小结
- 主从复制是异步的逻辑的SQL语句级的复制;
- 复制时,主库有一个I/O线程,从库有两个线程,I/O和SQL线程;
- 实现主从复制的必要条件是主库要开启记录binlog功能;
- 作为复制的所有Mysql节点的server-id都不能相同;
- binlog文件只记录对数据库有更改的SQL语句(来自主库内容的变更),不记录任何查询(select,show)语句。
6、mysql主从复制配置
环境配置:
Linux系统版本:Redhat 6.5版本
系统防火墙关闭:selinux=disabled
server5:172.25.51.5(Master)
server6:172.25.51.6(Slave)
系统部署:
1、Master数据库的搭建
<1>下载并解压mysql安装包mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@server5 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
示图:解压后的安装包
<2>安装mysql的5个模块插件并开启服务
[root@server5 ~]# yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y
[root@server5 ~]# /etc/init.d/mysqld start
<3>查找mysql数据库原始密码
[root@server5 ~]# grep password /var/log/mysqld.log
示图:系统安全初始化原密码
<4>mysql数据库安全初始化
[root@server5 ~]# mysql_secure_installation
注意:
mysql数据库安全初始化过程中,首先输入原密码,再设定新密码,新密码设定要求:字母大小写+特殊字符+数字,此处密码设定为WESTOS.com123。
<5>修改配置文件并重新开启数据库服务
[root@server5 ~]# vim /etc/my.cnf
29 server-id=1 ##服务器标识,主从id取值不能相同
30 log-bin=mysql-bin ##二进制日志
[root@server5 ~]# /etc/init.d/mysqld restart
<6>登陆数据库
[root@server5 ~]# mysql -p
示图:查看master,此时id为154
<7>授权
授权slave以repl身份从172.25.51.0/24网段登陆,对任何数据库的任何表进行操作,密码‘WESTOS.com123‘
mysql> grant replication slave on *.* to repl@'172.25.51.%' identified by 'WESTOS.com123';
示图:授权后,master状态pos值为447
2.Slave数据库的搭建
<1>下载并解压mysql安装包mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
<2>安装mysql的5个模块插件并开启mysql服务
<3>查找mysql数据库原始密码
<4>mysql数据库安全初始化
<5>修改配置文件并重新开启数据库服务
[root@server6 ~]# vim /etc/my.cnf
29 server-id=2 ##服务器默认id,不能与mater相同
[root@server5 ~]# /etc/init.d/mysqld restart
<6>登陆数据库并与master建立认证
mysql> change master to master_host='172.25.51.5',master_user='repl',master_password='WESTOS.com123',master_log_file='mysql-bin.000001',master_log_pos=447;
注意: file和pos为Master中授权后的数值
<7>开启slave,并查看slave状态
mysql> start slave;
mysql> show slave status\G;
示图:查看IO线程和sql线程开启即可
Slave的IO线程以repl身份拷贝(多线程)Master的log-bin到自己的relay-log,Slave的sql线程(单线程)读取relay-log,并在自身Slave服务器上按解析SQL语句的位置顺序执行sql语句,完成与Master同样的操作从而达到复制。
3.测试:
<1>Master建立westos数据库并创建usertb表格,插入表格内容
mysql> create database westos;
mysql> use westos
mysql> create table usertb (
-> username varchar(20) not null,
-> password varchar(25) not null);
mysql> insert into usertb values('user1',123);
mysql> insert into usertb values('user2',456);
示图:查看Master的westos.usertb表格信息
<2>Slave登陆数据库,查看westos.usertb表格内容,Slave自动同步
示图:主从复制
二、GTID主从复制
1、Master
<1>修改配置文件并重新开启服务
[root@server5 ~]# vim /etc/my.cnf
29 server-id=1
30 log-bin=mysql-bin
31
32 gtid_mode=ON ##开启gtid模块
33 enforce-gtid-consistency=true
[root@server5 ~]# /etc/init.d/mysqld restart
<2>进入数据库,查看file和POS
2、Slave
<1>修改配置文件并重新开启服务
[root@server6 ~]# vim /etc/my.cnf
29 server-id=2
31 gtid_mode=ON
32 enforce-gtid-consistency=true
[root@server5 ~]# /etc/init.d/mysqld restart
<2>基于GTID的复制
mysql> stop slave; ##停止slave
mysql> change master to master_host='172.25.51.5',master_user='repl',master_password='WESTOS.com123',MASTER_AUTO_POSITION = 1;
<3>开启Slave,并查看其进程状态
mysql> start slave;
mysql> show slave status\G;
测试:Master数据库表中插入信息,Slave数据库表格内容复制
示图:Master端查看数据库信息
示图:Slave端同步信息