1. 什么是MySQL主从复制
MySQL复制:
MySQL内建的复制功能是构建大型,高性能应用程序的基础。将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将mysql的某一台主机的数据复制到其它主机(slave)上,并重新执行一遍来实现。
复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循坏,这些日志可以记录发送到从服务器的更新。当一个从服务器
连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知的更新。
需注意的是:
在进行mysql复制时,所有对复制中的表的更新必须在主服务器上进行。否则必须要小心,以避免用户对主服器上的表进行更新与对从服务器上的表所进行更新之间的冲突。
(1)mysql复制解决的问题
a.数据分布(data distribution)
b.负载平衡(load balancing)
c.数据备份(backup),保证数据安全
d.高可用性与容错行(high availability and failover)
e.实现读写分离,缓解数据库压力
(2)mysql主从复制原理
master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,
如果发生改变,则开始一个I/O Thread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志
中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。
注意几点:
Mysql复制的流程图如下:

如上图所示: Mysql复制过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。 第二部分就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。 此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
2. 搭建环境
(1)实验机器:
master(hostname:master ip:192.168.253.187 OS:centos 7.4)
slave (hostname:sla ve ip:192.168.253.214 OS:centos 7.4)
(2)安装包下载解压
https://mirror.tuna.tsinghua.edu.cn/mysql/downloads/MySQL-5.7/mysql-5.7.31-1.el7.x86_64.rpm-bundle.tar 可以在windos中下载好然后传到Linux中,也可以直接使用wget download。
解压:

(3)检查机器有没有自带MySQL和mariadb

如果有则需要使用rpm -e +包名卸载,如果使用rpm -e 卸载不了mariadb,可以使用yum -y remove +包名卸载,上图显示我已经安装mysql。
(4)安装MySQL
rpm -ivh mysql-community-server-5.7.31-1.el7.x86_64.rpm --force --nodeps
rpm -ivh mysql-community-client-5.7.31-1.el7.x86_64.rpm --force --nodeps

安装成功!
(5)修改MySQL配置文件/etc/my.cnf并修改root密码
在配置文件中加入skip-grant-tables,可以在第一次连接数据库时跳过密码验证。

开启mysql服务:
systemctl start mysqld.service:

连接数据库:
mysql -uroot -p

执行’flush privileges;’ 刷新权限:

修改root密码为123456(这个密码设置为自己需要的):

输入exit退出MySQL,停止MySQL后将skip-grant-tables从/etc/my.cnf注释掉:

重新打开数据库服务,并用新密码连接:
master和slave都安装好MySQL后,可以配置主从同步
3. 配置主从同步
在master和slave数据库中创建一个数据库:
create database Arm_China;
show databases;

修改配置文件:
(1) master server:

给从服务器登录主服务器的授权:
grant replication slave,replication client on *.* to 'root'@'192.168.253.214' identified by 'Qw123456@#';
注意:MySQL5.7对密码复杂度有要求,不能使用简单密码设置授权:

(2) 配置从服务器
修改从服务器(slave)配置文件:
(3) 重启主服务器MySQL
systemctl restart mysqld.service
查看master状态:
show master status;

(4) 继续配置从服务器
先重启从服务器的MySQL,然后配置:
change master to master_host='192.168.253.187',master_user='root',master_password='Qw123456@#',master_port=3306,master_log_file='master-a-bin.000003',master_log_pos=154;
#注意:这个命令必须是在slave线程关闭的时候执行的,如果开启了slave线程,那么将会使这个命令执行失败,关闭slave线程命令:stop slave;

注意:master_password为授权登录的密码,master_log_file为上图中show master status里的File值,master_log_pos的值为上图中Position的值。
(5) 开启从服务器并查看
start slave;

查看:show slave status \G;
Slave_IO_Running :YES
Slave_SQL_Running:YES

如果不是YES,可能是grant配置权限的时候没配置好,需要重新配置并flush privileges;
(6) 测试
在主从MySQL中查看创建的数据库,可以看到没有表存在:

在主数据库中写入一张表,然后到从库中查看:
创建表:
create table test( id INT, title VARCHAR(100) NOT NULL, date DATE, author VARCHAR(40) NOT NULL);

从库查看:

OK,主从同步配置完成。
(7) 双主配置
双主配置就是两个MySQL数据库都是主数据库(master),两台数据库都需要配置为对方的slave。上面已经把其中一台配置好了,现在配置另外一台即可:
在slave上给master配置连接权限:
grant replication slave,replication client on *.* to 'test'@'192.168.253.217' identified by 'Qw123456@#';

在master上change master to:

启动slave线程:

(2) 测试
在原来的slave上创建一个新的数据库:

然后在master上可以看到。
4. 配置高可用
下一篇继续搞MySQL的高可用配置。




