MySQL 数据库--主从复制与读写分离(大型攻略,理论详解,图文并茂)


一、案例分析

1.案例概述

  • 在实际的生产环境中,如果对 MySQL 数据库的读和写都在一台数据库服务器中操作,无论在安全性、高可用性,还是高并发性等各个方面都是完全不能满足实际需求的
  • 因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案进行部署与实施
  • 如下图所示,一台主 MySQL 带着两台从 MySQL 进行了数据复制,前端应用在进行数据库写操作时,对主设备进行操作,在进行数据库读操作时,对两台从设备进行操作,这样大量减轻了对主设备的压力
    mark

2.案例前置知识点

2.1 MySQL 主从复制原理

  • MySQL 的主从复制和 MySQL 的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离
2.1.1 MySQL 支持的复制类型
  1. 基于语句的复制;在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句;MySQL 默认采用基于语句的复制,效率比较高
  2. 基于行的复制;把改变的内容复制过去,而不是把命令在从服务器上执行一遍
  3. 混合类型的复制;默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
2.1.2 复制的工作过程
  • MySQL 复制的过程过程如下图所示
    mark
  1. 在每个事务更新数据完成之前,Master 都会在二进制日志记录这些改变;写入二进制日志完成后,Master 通知存储引擎提交事务
  2. Slave 将 Master 的 Binary log 复制到其中继日志:首先,Slave 开始一个工作线程——I/O 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process;Binlog dump process 从 Master 的二进制日志中读取时间,如果已经跟上 Master,它会睡眠并等待 Master 产生新的时间;I/O 线程将做这些事件写入中继日志
  3. SQL slave thread(SQL 从线程)处理该过程的最后一步:SQL 线程从中继日志读取事件,并重放其中的时间而更新 Slave 的数据,使其与 Master 中的数据一致;只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小
  4. 复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作

2.2 MySQL 读写分离原理

  • 简单来说,读写分离就是只在主服务器上写,只在从服务器上读
  • 基本原理就是让主数据库处理事务性(增、删、改、查等)操作,而从数据库处理 select 查询操作
  • 数据库复制被用来把事务性操作导致的变更同步到群集中的从数据库
  • 如下图所示:
    mark

2.3 常见的 MySQL 读写分离

2.3.1 基于程序代码内部实现
  • 在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的
  • 优点是性能较好,容易在程序代码中实现,不需要增加额外的设备为硬件开支
  • 缺点是需要开发人员来实现,运维人员无从下手
  • 但是并不是所有的应用都适合在程序代码中实现读写分离,比如一些大型复杂的 Java 应用,如果在程序代码中实现读写分离对代码改动就较大,比较繁琐
2.3.2 基于中间代理层实现
  • 基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客户端请求通过判断后转发到后端数据库
  • 有以下代表性程序
    • MySQL-Proxy:MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行 SQL 判断(虽然是 MySQL 的官方产品,但是官方并不建议将其用到生产环境)
    • Atlas:是由奇虎360的 Web 平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目;它是在 mysql-proxy 0.8.2 版本的基础上,对其进行了优化,增加了一些新的功能特性;360内部使用 Atlas 运行的 mysql 业务,每天承载的读写请求数达几十亿条;支持事物以及存储过程
    • Amoeba:由陈思儒开发,作者曾就职于阿里巴巴;该程序由 Java 语言进行开发,阿里巴巴将其用于生产环境;它不支持事务和存储过程
2.3.3 小结
  • 由于使用 MySQL Proxy 需要写大量的 Lua 脚本,这些 Lua 脚本不是现成的,而需要自己编写,这对于并不熟悉 MySQL Proxy 内置变量和 MySQL Protocol 的人来说是非常困难的
  • Amoeba 是一个非常容易使用,可移植性非常强的软件,因此它在生产环境中被广泛用于数据库的代理层

二、案例实施

1.案例环境

  • 本案例环境使用五台服务器模拟搭建,具体的拓扑图如下图所示:
    mark
主机名 主机
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xucf1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值