学习MySQL主从复制,从以下几个方面进行:

1. 什么是MySQL主从复制?
2. 为什么要使用主从复制?
3. 主从复制的原理?
4. 主从复制的劣势?
5. 主从切换
6. 实际操作

一、什么是MySQL主从复制?

顾名思义,MySQL主从复制指的是至少存在两台MySQL服务器(后续的描述中,以两台为例),一台为从机,一台为主机。从机会复制主机中的内容,从而达到主机跟从机数据一致的目的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFUxKnez-1660964331726)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/76feb57355d54cf49941dccb2b9dc45a~tplv-k3u1fbpfcp-watermark.image?)]

二、为什么要使用主从复制?

个人觉得使用MySQL主从复制的原因有以下几点:

1、容灾性

当MySQL主机宕机时,从机将成为主机,可以防止因为主机宕机而带来影响,保证服务高可用。因为从机中的数据和主机中的一致,因此也可以将从机看作是主机的备份,如果主机的数据丢失,可以使用从机的数据。

2、降低主机压力

使用MySQL主从复制,即便在不使用读写分离的情况下,将请求分摊到两台MySQL服务器上,也会大大减少主机的压力。而MySQL在一般的环境中,属于读多写少,因此可以进行读写分离,写在主机上进行,读在从机上进行,这样做可以提高从机的查询性能,也能减少主机的压力。

3、异地多活

这点跟容灾性差不多,将MySQL主从复制做成异地多活,如果主机服务器坏了,从而导致MySQL主机宕机,从机将会替代主机的工作,降低因为主机宕机所带来的影响。

三、主从复制的原理

MySQL主从复制核心在于MySQL主机的binlog日志。

1、binlog日志

MySQL的binlog是记录所有数据库表结构变更以及表数据修改(DDL、DML)的二进制日志,而对于show、select(DQL)等查询操作,binlog不会记录下来,因为这对数据并没有什么改变。

DDL:数据库定义语句,如创建库、表、修改库、表等操作。
DML:数据操作语句,如数据的增删改。
DQL:数据查询语句,如show、select之类。

binlog有三种格式,分别是:

  1. statement:基于SQL语句的模式,某些语句和函数如UUID、LOAD DATA INFILE等在复制的过程中可能导致数据不一致甚至出错。
  2. row:基于行的模式,记录的是行的变化,很安全。但是binlog会比其他两种模式大很多,在一些大表中清除大量数据时在binlog中会生成很多条语句,导致从库延迟变大。
  3. mixed:混合模式,根据语句来选择使用statement还是row模式。

2、主从复制原理

MySQL主从复制的过程:主机将binlog日志异步的方式进行记录并传输到从库上,从库通过IO线程将主库传输过来的binlog日志写入relay log日志中,再利用SQL线程来读取relay log日志中的内容,再进行执行,以做到主从数据的一致性。

详细过程如下:

  1. 主机更新DDL、DML操作语句到binlog日志中。
  2. 主机创建log dump线程来完成binlog日志的传输。
  3. 从机在连接上主机时,会创建一个IO线程。当binlog日志更新并传输过来时,IO线程会将接收到的binlog日志信息写入到relay log日志中。
  4. 从机通过SQL线程读取relay log日志中的内容,并进行执行,最终实现主从机数据的一致性。

四、主从复制的劣势

主从复制的优势在上面第二点为什么要使用主从复制中已经提到了。那主从复制有什么劣势呢?

1、劣势

个人认为,主从复制最大的劣势就是因为网络原因造成的消息延迟,从而引出了消息一致性的问题。因为网络的原因,主机在发送消息给从机时,会受到影响,从而消耗时间,当从机接收到消息时,已经是几秒之后了,如果对数据一致性要求较高的场景下,处理起来比较麻烦。MySQL主从复制消息一致性问题在网上有很多解决方法,可以通过搜索进行浏览。
还有一些问题就是,binlog开启row格式,在大数据的情况下,会产生很多数据,这些数据是持久化到磁盘的,因此会占用磁盘空间。

五、主从切换

在主从复制模式下,主机A一般负责写的业务,从机B一般负责读的业务。如果主机A发生意外宕机了,从机B则会成为主机B负责读写。当主机A修复完成之后,主机A则会变成从机A。

六、实际操作

在本文的实际操作中,MySQL是使用docker容器进行布置的,并且一台MySQL布置在一台服务器上。

1、主机配置

(1). 在docker中启动MySQL主机

docker run -d  -p 3306:3306 --name mysql-master
-v /home/mysql/master/log:/var/log/mysql
-v /home/mysql/master/data:/var/lib/mysql
-v /home/mysql/master/conf:/etc/mysql
-v /home/mysql/master/mysql-files:/var/lib/mysql-files
-e MYSQL_ROOT_PASSWORD=root
--privileged=true mysql:8.0

注意:开启容器时挂在了四个数据卷,其中data为持久化时的存储位置;log为日志;conf为配置文件存放位置;mysql-files为必须指定。此为MySQL8.0版本,MySQL5版本可能存在差异。

(2). 编写配置文件
在/home/mysql/master/conf目录下编写: vim my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启binlog日志
log-bin=mysql-bin

(3). 重启mysql-master容器:docker restart mysql-master

(4). 创建数据同步用户

## 创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
## 授予权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

(5). 进入mysql-master容器中,查看binlog日志信息

# 进入mysql-master容器
docker exec -it mysql-master bash
# 进入MySQL控制台
mysql -uroot -proot
# 查看binlog是否正确开启,ON为开启,OFF为关闭
show variables like 'log_bin';
# 打印binlog状态信息
show master status\G

注意:打印binlog状态信息时,其中的File、Position在配置从机时需要使用,需要记录下来。

2、从机配置

(1). 在docker中开启mysql从机

docker run -d -p 3306:3306 --name mysql-slave
-v /home/mysql/slave/log:/var/log/mysql
-v /home/mysql/slave/data:/var/lib/mysql
-v /home/mysql/slave/conf:/etc/mysql
-v /home/mysql/slave/mysql-files:/var/lib/mysql-files
-e MYSQL_ROOT_PASSWORD=root
--privileged=true mysql:8.0

(2). 在/home/mysql/slave/conf目录下:vim my.cnf

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=2

(3). 重启mysql-slave容器:docker restart mysql-slave

(4). 进入mysql-slave容器,配置主从复制

# 进入mysql-master容器
docker exec -it mysql-slave bash
# 进入MySQL控制台
mysql -uroot -proot
# 配置主从复制信息
change master to
master_host='主机ip地址',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=906,
master_connect_retry=30,
get_master_public_key=1;
# 配置主从复制信息详解
# master_host:主数据库的IP地址;
# master_port:主数据库的运行端口;
# master_user:在主数据库创建的用于同步数据的用户账号;
# master_password:在主数据库创建的用于同步数据的用户密码;
# master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
# master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
# master_connect_retry:连接失败重试的时间间隔,单位为秒。
# get_master_public_key:获取master主机的sha2密钥

注意:mysql8默认使用插件caching_sha2_password,需要拿到server的public key来加密password。添加参数get_master_public_key=1可以解决问题。

(5). 查看主从同步状态:show slave status\G

在显示的参数中,Slave_IO_Running、Slave_SQL_Running均为No,是因为还没开启主从同步。
(6). 开启同步状态:start slave;

注意:如果在同步时报 Slave failed to initialize relay log info structure from the repository 错误,通过 docker logs mysql-slave 可以查看出错日志,如果relay-bin.index文件的错误,通过命令 reset slave重新设置即可解决。

(7). 查看主从同步状态:show slave status\G

注意:刚开启主从同步的时候,Slave_IO_State: Connecting to source、Slave_IO_Running: Connecting表示当前从机还在连接主机的状态中,需要等待。如果等待太久没有连接上,则可能是配置的时候出错了。

成功连接之后,显示Slave_IO_State:Waiting for source to send event;Slave_IO_Running:Yes;Slave_SQL_Running:Yes。

3、主从复制测试

create database test;use test;CREATE TABLE test_table (id int NOT NULL COMMENT '序列id',name varchar(255) DEFAULT NULL COMMENT '名称',price double  COMMENT '价格',number int COMMENT '数量',description varchar(1024) COMMENT '描述',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在从机中查看,即可查看到从机中也出现了先对应的数据库表。

参考资料

微信公众号:楼仔《MySQL主从复制原理,你知道么?》

MySQL主从复制原理相关推荐

  1. MySQL主从复制原理、半同步操作步骤及原理

    MySQL主从复制原理.半同步操作步骤及原理 1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1.scp/sftp/nc 命令可以实现远程数据同步. 2.搭建ftp/h ...

  2. MySQL主从复制原理应用基础

    mysql主从复制 mysql支持单向 双向 链式级联 实时 异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其他服务器充当从服务器(Slave) mysql主从复制的应用 ...

  3. mysql主从复制原理详解_简述 MySQL 逻辑架构与主从复制原理。

    ↑ 点击上面 "时代Java"关注我们,关注新技术,学习新知识! 1.Mysql逻辑架构图 如果能在脑海中构建出MySql各组件之间如何协同工作的架构图,就会有助于深入理解MySq ...

  4. MySQL主从复制原理(原理+实操)

    1.MySQL主从复制原理(原理+实操) 主从复制简介 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」. 比如:在复杂的业务系统中,有一句sql ...

  5. 五、MySQL主从复制原理

    MySQL主从复制原理.半同步操作步骤及原理 标签(空格分隔): mysql 1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1.scp/sftp/nc 命令可以实现远 ...

  6. MySQL主从复制原理解析

    MySQL主从复制原理 1.为什么需要MySQL的主从复制? 2.什么是MySQL的主从复制? 3.MySQL主从复制原理 原理 具体步骤 对于MySQL主从复制,我们已经在[MySQL主从复制安装配 ...

  7. mysql主从复制原理详解_MySQL主从复制没使用过?三大步骤让你从原理、业务上理解透彻...

    成长是一棵树,总是在你不知不觉的情况下快乐长大:成长是一株草,总是在你不知不觉的情况下长满大地:成长是一朵花,总是在你不知不觉的情况下开满山头. 这不,随着时间的迁移.项目网站的用户量.数据量持续上升 ...

  8. mysql主从复制原理 简书_mysql主从复制,从原理讲到安装配置,全干货

    0.为什么需要主从复制? 1.在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出 ...

  9. mysql主从复制原理分析

    1.主从复制这类NFS存储数据通过inotify+rsync同步到备份的NFS服务器,只不 过Mysql的复制方案是其自带的工具 inotify 是一种文件系统的变化通知机制,如文件增加.删除等事件可 ...

最新文章

  1. matlab练习程序(图像区域分裂)
  2. react-router 从 v2/v3 to v4 迁移(翻译)
  3. 自己的模块给其他人调用是怎么打包的_webpack实战——模块打包
  4. Growth Workshop:企业如何用数据驱动 GMV 增长
  5. python mutilprocessing多进程编程
  6. SCCM 2012 R2---安装客户端代理软件
  7. 8皇后问题--回溯法 (循环递归)
  8. Dockerfile怎么创建镜像
  9. Net::OpenSSH 模块使用实例
  10. 计算机组成原理秦磊华 pdf,_计算机组成原理_设计性实践教学模式研究_秦磊华.pdf...
  11. 小米3g刷高格固件_不走弯路:小米路由器3G 刷Padavan固件简单教程
  12. [node] 对某网站的简单爬虫
  13. Ruby方法参数默认值的一个小技巧在Rails中的应用
  14. 探索永无止境 万洲金业荣膺GMCA第三届蝉鸣奖“年度最具创新力奖”
  15. c语言求两个字符串的交集,用c语言求两个集合的交集,并集,差集
  16. python有哪些主要功能包括_python是什么 特点及功能
  17. 对Carrier IQ木马的综合分析报告
  18. 【ora】+eclp+OpM错误提示、特殊处理
  19. 2023年选go还是python?
  20. 魔法宝石(动态规划)

热门文章

  1. 是否允许多账号同时登录
  2. libusb移植到Android开发板
  3. IE设置127.0.0.1:[端口号]代理后,除IE外其他浏览器不能通过代理访问
  4. 使用Selenium中的webdriver出现浏览器闪退的原因
  5. 通过ping++平台完成移动端H5支付
  6. HoloLens2开发入门教程
  7. mqtt服务器搭建php,MQTT 服务端
  8. xshell 中文乱码
  9. 智慧农业数字物联系统ECIOT V3.0助力农业大田大棚及农业产业园数字化升级
  10. zookeeper实现服务注册与发现