MySQL的主从复制
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的主从复制相关的知识,希望对你有一定的参考价值。
mysql的主从复制
Why we need 主从复制 ?
当单台 MYSQL 服务器无法满足当前网站流量时的优化方案。需要搭建 mysql 集群技术。
复制功能
- 数据分布
- 负载均衡(读)
- 备份
- 高可用和故障切换
- MySQL升级测试
复制方式
- 主–从复制
- 主–主复制
- 半同步复制
复制原理
Mysql 中有一种日志叫做 bin 日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL 语句(insert,update,delete,create/alter/drop table, grant 等等)。
主从复制的原理其实就是把主服务器上的 bin 日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
复制流程图
复制过程
- 主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
- 从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql协议,请求主节点的二进制日志文件中的事件
- 主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
- 从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个,在后面详细讲解)
- 从节点启动另外一个线程(sql Thread ),把 Relay log 中的事件读取出来,并在本地再执行一次。
复制中线程的作用
从节点
- I/O Thread: 从 Master 节点请求二进制日志事件,并保存于中继日志中。
- Sql Thread: 从Relay log 中读取日志事件并在本地完成重放。
主节点
- Dump Thread:为每个 Slave 的 I/O Thread 启动一个 dump 线程,用于向从节点发送二进制事件。
从节点需要建立二进制日志文件吗?
看情况,如果从节点需要作为其他节点的主节点时,是需要开启二进制日志文件的。这种情况叫做级联复制。如果只是作为从节点,则不需要创建二进制文件。
Mysql复制特点
- 异步复制:主节点中一个用户请求一个写操作时,主节点不需要把写的数据在本地操作完成同时发送给从服务器并等待从服务器反馈写入完成,再响应用户。主节点只需要把写入操作在本地完成,就响应用户。但是,从节点中的数据有可能会落后主节点,可以使用(很多软件来检查是否落后)
- 主从数据不一致。
主从复制配置过程
主节点
- 启用二进制日志。
- 为当前节点设置一个全局唯一的server_id。
- 创建有复制权限的用户账号 REPLIACTION SLAVE ,REPLIATION CLIENT。
从节点
- 启动中继日志。
- 为当前节点设置一个全局唯一的server_id。
- 使用有复制权限的用户账号连接至主节点,并启动复制线程。
配置演示
环境:
主机: windows , mysql 5.7 ip:192.168.14.165
从机: Linux, mysql 5.7 , ip: 192.168.14.167
主从都配置在[mysqld]节点下,都是小写
主机修改my.ini配置文件(Windows)
- 主服务器唯一id :server-id=1
- 启用二进制日志
log-bin=自己本地的路径/mysqlbin
log-err=自己本地的路径/mysqlerr
从机修改my.cnf配置文件(Linux)
- 配置从服务器id: server-id=2
- 启动二进制日志 :log-bin=mysql-bin
因为修改过配置文件,主机和从机都需要重启mysql服务
主机和从机都关闭防火墙
- windows手动关闭
- 关闭虚拟机linux防火墙,service iptables stop
在windows主机上建立账户,并授权给slave
GRANT REPLICATION SLAVE ON *.* TO 'dhy'@'从机数据库IP' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
查询master状态
SHOW MASTER STATUS;
记录File和position的值
在LInux从机上配置需要复制的主机
CHANGE MASTER TO MASTER_HOST ='192.168.14.165',
MASTER_USER ='zhangsan',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysqlbin.具体数字',MASTER_LOG_POS=具体值; #二进制文件的位置,从哪一行开始复制
启动从服务器复制功能
start slave
查看从机状态
停止从服务器复制功能
stop slave
注意
每一次开启从机复制功能前,先查看当前主机状态,得到最新的position位置,即从哪一行开始进行复制
以上是关于MySQL的主从复制的主要内容,如果未能解决你的问题,请参考以下文章