运维项目实训—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)语句。

2.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
这里写图片描述

三.半同步复制

猜你喜欢

转载自blog.csdn.net/hannah_zh/article/details/80924223
今日推荐