MySQL的主从复制与读写分离

文章详细介绍了MySQL的主从复制原理,包括二进制日志、中继日志和复制线程的工作机制,以及复制的三种方式:基于语句、行和混合复制。接着讨论了主从复制的同步策略,如异步、同步和半同步复制,并阐述了它们在性能和数据安全方面的权衡。此外,文章还涵盖了读写分离的原理和方案,以及错误排查、面试常见问题和实际操作实验,帮助读者理解并掌握相关技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、前言

二、主从复制原理

三、复制方式

四、主从复制的同步方式

五、应用场景

六、读写分离原理

七、读写分离方案

八、错误排查

九、面试题

十、主从复制实验

 十一、读写分离实验


一、前言

在企业应用中,成熟的业务通常数据量都比较大

单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求

配置多台主从数据库服务器以实现读写分离

二、主从复制原理

两个日志:① 二进制日志

                   ② 中继日志

三个线程:master dump线程和salved的I/O线程、SQL线程    三个线程如何工作以达成一致

主要原理:master将数据保存在二进制日志中,I/O向dump发出同步请求,dump把数据发送给I/O线程,I/O写入本地的中继日志,SQL线程读取本地中继日志数据,同步到自己的数据库中,完成同步

三、复制方式

基于语句的复制(statement,MySQL默认类型)

在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。

基于行的复制(row)

把改变的内容复制过去,而不是把命令在从服务器上执行一遍

混合类型的复制(mixed)

默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制

四、主从复制的同步方式

异步复制

异步复制指主库以异步的方式同步数据到一个从库或多个从库中。

这种模式下,主节点不会主动推送数据到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。

同步复制

当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。

因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。

半同步复制

在异步复制的基础上,确保任何一个主库上的事务在提交之前至少有一个从库已经收到该事务并记录下日志。

相对于异步复制,半同步复制提高了数据的安全性,一定程度的保证了数据能成功备份到从库,同时它也造成了一定程度的延迟,但是比全同步模式延迟要低,这个延迟最少是一个 TCP/IP 往返的时间。所以半同步复制最好在低延时的网络中使用。

五、应用场景

主要的性能是读和写,一般场景来说读请求更多

根据主从复制可以演变成读写分离,因为读写分离基于主从复制,使用读写分离从而解决高并发问题

六、读写分离原理

只在主服务器上写,只在从服务器上读

主数据库处理事务性查询,从数据库处理select查询

数据库复制用于将事务性查询的变更同步到集群中的从数据库

七、读写分离方案

基于程序代码内部实现

基于中间代理层实现:

MySQL-Proxy

Amoeba

八、错误排查

1. Connecting错误

排错思路如下:

二进制日志没有开启

IPTABLES 没有放开端口

对应的主机 IP地址写错了

实际操作:关闭主节点防火墙,重新开启从节点,即可连接上。

2. Slave_I/O_Running:NO

排错思路如下:

查看是否使用了nat的网络结构到导致网络有问题,连接不上。

有可能my.cnf有问题,配置文件

授权的问题,replication slave和file权限是必须的。

九、面试题

1. 如果I/O和sql不是yes呢,你是如何排查的

首先排查网络问题,使用ping命令查看从服务器是否能与主服务器同信

再查看防火墙和核心防护是否关闭(增强功能)

查看从服务slave是否开启

两个服务器的sever-id 是否相同导致只能连接一台

master_log_file  master_log_pos 的值跟master是否一致

2.show slave status \G能看到哪些信息(比较重要的)

io状态 两个线程的yes

Last_Errno,Last_Error**

slave的SQL线程读取日志参数的的错误数量和错误消息。错误数量为0并且消息为空字符串表示没有错误;

如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示。

3. 主从复制慢(延迟)有哪些可能

① 从库硬件比主库差,导致复制延迟

② 主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。从要更高版本的mysql

③ 可以支持多线程复制

④ 慢SQL语句过多

⑤ 网络延迟

⑥ master负载:主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层

⑦ slave负载:一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作.

十、主从复制实验

虚拟机服务环境

Master服务器:192.168.174.10

Slave1 服务器:192.168.174.20

Slave2 服务器:192.168.174.30

Amoeba服务器:192.168.174.40

客户端服务器:192.168.174.40

1. master服务器配置

安装ntp、修改配置文件

2.两台slave服务器配置

3. 配置主从同步

  • master服务器修改配置文件

  • 配置规则

 

  • 从服务器配置

 slave1

 slave2

 开启从服务器功能

slave1

 slave2

 查看从服务器状态

 slave1

 slave2

测试数据同步

在主服务器上创建一个数据库

 

slave1

 slave2

 十一、读写分离实验

安装java环境

一直按enter,并输入yes,结束时‘是’和‘否’都可以点

 安装Amoeba软件

 先后再master、slave1、slave2数据库里给amoeba开放访问权限

回到amoeba服务器配置服务

测试读写分离

客户端安装数据库

 在主服务器上

在两台从服务器上

slave1

 slave2

主服务器 

 客户端服务器

 

 实现分离

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值