一、主从复制的原理
我们根据一张主从复制的原理图来讲解,它们主要是通过binlog日志完成同步的:
1. 主数据库更新、删除、插入数据时,将这些操作sql写入binlog日志;
2. 当从数据库正常启动后,会连接到对应的主库中;
3. 在主数据库中,有一个binlog dump thread线程会将binlog的内容发送给从库;
4. 从数据库获取到主库发送过来的binlog内容后,会通过 I/O thread 将内容l写入到relay log文件中;
5. 从数据库中有一个SQL thread线程会不停的读取relay log的内容,每次读取的位置是上一次执行的位置,如果有新的内容则开始执行,并记录下执行的位置。
通过主从复制的原理可以知道,这种复制模式是一种异步操作,主库更新后的数据只负责发送,不会关心从库是否执行成功,也不会关心数据是否有效。
但是这种复制的最大好处就是效率快,数据库能够立即响应用户的操作需求。
二、主从复制的搭建
在这里我们主要以docker的方式进行搭建主从环境。
1.主库的搭建
第一步:创建mysql配置的文件my.cnf
#创建主库的文件夹,在这里是自己创建的配置文件,也可以使用mysql自己的文件 mkdir /opt/mysql/master cd /opt/mysql/master #创建主库的配置文件文件夹,并授权 mkdir conf data chmod 777 * -R
第二步:在配置文件中开启二进制文件
[mysqld] log-bin=mysql-bin #开启二进制日志 server-id=1 #服务id,不可重复
#严格sql
sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
第三步:创建docker容器
#容器名称
docker create --name mysql-master
#挂载配置文件 -v /opt/mysql/master/data:/var/lib/mysql -v/opt/mysql/master/conf:/etc/my.cnf.d
#端口号 -p 3306:3306
#root的密码 -e MYSQL_ROOT_PASSWORD=123456 #mysql使用的版本
percona:5.7.23
第四步:启动容器
docker start mysql-master
第五步:进入mysql,创建一个同步账户并授权
create user ‘synchro‘@‘%‘ identified by ‘synchro‘; grant replication slave on *.* to ‘synchro‘@‘%‘; flush privileges;
至此,主库的搭建完毕。
2.从库的搭建
第一步:创建mysql配置的文件my.cnf
#创建从库的文件夹,在这里是自己创建的配置文件,也可以使用mysql自己的文件 mkdir /opt/mysql/slave cd /opt/mysql/slave #创建从库的配置文件文件夹,并授权 mkdir conf data chmod 777 * -R
第二步:修改从库的配置文件
[mysqld] server-id=2 #服务id,不可重复 sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION‘
第三步:创建docker容器
#容器名称 docker create --name mysql-slave #挂载配置文件 -v /opt/mysql/slave/data:/var/lib/mysql -v/opt/mysql/slave/conf:/etc/my.cnf.d #端口号 -p 3307:3306 #root的密码 -e MYSQL_ROOT_PASSWORD=123456 #mysql使用的版本 percona:5.7.23
第四步:启动容器
docker start mysql-slave
至此从库已经搭建完毕。
3.主从复制的配置
第一步,打开mysql连接工具(本文使用的是navicat),连接到主库,查看主库的属性
show master status;
输出的结果,我们主要使用的是File字段的值和position字段的值:
第二步:打开mysql连接工具(本文使用的是navicat),连接到从库,输入主从配置的sql
CHANGE MASTER TO #主库的地址 master_host=‘127.0.0.1‘, #同步账户和密码 master_user=‘synchro‘, master_password=‘synchro‘, #主库的端口号 master_port=3306, #这个是主库状态中的File字段的值 master_log_file=‘mysql-bin.000002‘, #这个是主库状态中的Position字段的值 master_log_pos=648;
第三步:启动主从复制
start slave;
至此mysql的主从复制搭建完毕。