MySQL主从复制

MySQL Replication

主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。

MySQL中复制的优点:

  • 横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
  • 数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
  • 分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
  • 远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。

Replication 的原理

MySQL主从复制_第1张图片

一主多从

  • 如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。工作原理图如下:

主从步骤

  • master[ 主机 ] 将写操作记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
  • slave[ 从机 ] 将master的binary log events拷贝到它的中继日志(relay log);
  • slave 重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的,而且重启后从接入点开始复制(先搭建主从复制环境,再创建数据库和表)。
    复制的最大问题(延时)

基本原则

  • 每个slave只有一个master
  • 每个slave只能有一个唯一的服务器ID
  • 每个master可以有多个salve

开始一主一从

首先准备两台MySQL服务器, 尽量版本保持一致

配置项说明:

  • [必须]主服务器唯一ID:server-id=1 [必须]启用二进制日志:log-bin=D:/mysqllog/mysqlbin
  • [可选]启用错误日志:log-err=D:/mysqllog/mysqlerr
  • [可选]临时目录:tmpdir=“D:/temp/mysql5.5” [可选]根目录:basedir=“C:/Program
    Files/MySQL/MySQL Server 5.5/”
  • [可选]数据目录:datadir=“C:/ProgramData/MySQL/MySQL Server 5.5/Data/”
  • [可选]read-only=0 (默认)表示读写(主机),1表示只读(从机)。
  • [可选]设置不要复制的数据库:binlog-ignore-db=mysql
    [可选]设置需要复制的数据库(先搭建完主从复制,再创建数据库):binlog-do-db=需要复制的主数据库名字
  • [可选]设置logbin格式: binlog_format=STATEMENT(默认):数据操作的时间,同步时不一致
  • binlog_format=ROW:批量数据操作时,效率低
  • binlog_format=MIXED:有函数用ROW,没函数用STATEMENT,但是无法识别系统变量

主机配置文件

  • 找到 MySQL安装目录:并修改my.ini 配置文件
  • 主机中添加 server-id=1 [ MySQL默认是开启的]
    MySQL主从复制_第2张图片
  • 在配置文件末尾添加一下内容, 注意 : mysql_log 文件需要提前创建好 mysqlbin 可执行文件会自动生成
log-bin=D:/mysqllog/mysqlbin
  • 排除不需要复制的文件
binlog-ignore-db=mysql
  • 配置需要复制的log文件
binlog-do-db=mydb_log
binlog_format=STATEMENT

如图
MySQL主从复制_第3张图片

从机配置文件

  • 在从机末尾添加以下内容
server-id=2
relay-log=mysql-relay
  • [必须]从服务器唯一ID:server-id=2
  • [可选]启用中继日志:relay-log=mysql-relay
    如图
    MySQL主从复制_第4张图片

重启主从的MySQL服务

  • windows:net stop mysql;[ 停止 ]
  • windows: net start mysql; [ 启动 ]
  • Linux:systemctl restart mysqld

为了防止出问题建议关闭防火墙

在主机中创建用户并授权

  1. 在主机中创建 master_user 用户
CREATE USER master_user IDENTIFIED BY '123456';
  1. 授与复制的权限
 GRANT REPLICATION SLAVE ON *.* TO 'master_user'@'%';
 flush privileges;
  1. 主机中查询master状态:
SHOW MASTER STATUS;

MySQL主从复制_第5张图片
记下 File 和 Position 的值

从机连接主机

  • 进入从机执行
  • MASTER_HOST : 主机的IP地址
  • MASTER_USER : 刚才主机创建的用户
  • MASTER_LOG_FILE : 生成的文件名
  • MASTER_LOG_POS : 生成的随机写入点
CHANGE MASTER TO MASTER_HOST='192.168.1.101',
MASTER_USER='master_user',MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysqlbin.000001',MASTER_LOG_POS=154; 

在这里插入图片描述

启动主从复制

  • 在从机执行
start slave;

在这里插入图片描述

  • 查看状态
show slave status \G;

MySQL主从复制_第6张图片

  • 可能会出现连接不成功, 请查看主机和从机IP是否可用ping通, 防火墙是否关闭

测试

  • 主机新建库、新建表、insert记录,从机复制
CREATE DATABASE mydb_log;
USE mydb_log;
CREATE TABLE mytbl(id INT,NAME VARCHAR(16));
INSERT INTO mytbl VALUES(1, 'lance');
-- @@hostname会自动获取当前主机的名字
INSERT INTO mytbl VALUES(2, @@hostname);
  • 主机查看
    MySQL主从复制_第7张图片
  • 从机查看
    MySQL主从复制_第8张图片
  • 从机查看数据
    MySQL主从复制_第9张图片

停止并重新配置

  • 停止I/O 线程和SQL线程的操作。
stop slave; 
  • 用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
reset slave;
  • 删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。[ 用于第一次进行搭建主从库时,进行主库binlog初始化工作 ]
reset master;

感谢阅读, 以上就是简单搭建MySQL主从, 如果文章对你有帮助记得点赞 !

你可能感兴趣的:(MySQL)