MYSQL骚操作之第四十五话之主从复制和读写分离

前言

在实际的生产环境中,如果对MySQL数据库的读和写都在一台数据库服务中操作,无论在安全性、高可用性,还是高并发性等各个方面都是完全不能满足实际需求的,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案进行部署与实施

一、MYSQL主从复制

1、支持的复制类型

①基于语句的复制(statement):在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高

②基于行的复制(row): 把改变的内容复制过去,而不是把命令在从服务器上执行一遍

③混合类型的复制(mixed): 在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高

2、主从复制的工作过程是基于日志

①master 二进制日志
②slave中继日志

3、请求方式

①I/O线程
②dump线程
③SQL线程

4、主从复制的原理

①Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,则将其改变写入二进制日志中

②Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求 Master的二进制事件

③同时Master节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至Slave节点本地的中继日志(Relay log)中

④Slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成 sql 语句逐一执行,使得其数据和 Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒

注意:复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作

中继日志通常会位于OS缓存中,所以中继日志的开销很小

在这里插入图片描述

5、MYSQL集群和主从复制分别适合什么场景下使用

集群和主从复制是为了应对高并发、大访问量的情况,如果网站访问量和并发量太大了,少量的数据库服务器是处理不过来的,会造成网站访问慢,数据写入会造成数据表或记录被锁住,锁住的意思就是其他访问线程暂时不能读写要等写入完成才能继续,这样会影响其他用户读取速度,采用主从复制可以让一些服务器专门读,一些专门写可以解决这个问题

6、为什么使用主从复制。读写分离

主从复制、读写分离一般是一起使用的,目的很简单,就是为了提高数据库的并发性能。你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高。如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗?
所以主从复制、读写分离就是为了数据库能支持更大的并发
随着业务量的扩展、如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性

7、用途及条件

①MYSQL主从复制用途:
实时灾备,用于故障切换
读写分离,提供查询服务
备份,避免影响服务

②必要条件
主库开启binlog日志
主从server-id不同
从库服务器能够连通主库

8、MYSQL主从复制存在的问题

①主库宕机后,数据可能丢失

②从库只有一个SQL Thread,主库写压力大,复制很可能延时

③解决办法半同步复制——解决数据丢失的问题

④并行复制——解决从库复制延迟的问题

9、MYSQL主从复制延迟

①master服务器高并发,形成大量事务
②网络延迟
③主从硬件设备导致——cpu主频、内存io、硬盘io
④本来就不是同步复制、而是异步复制

*从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作

*从库使用高性能主机,包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性

*从库使用SSD磁盘

*网络优化,避免跨机房实现同步

二、主从复制的形式

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、读写分离

1、原理

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

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

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

在这里插入图片描述

2、为什么要读写分离

①因为数据库的‘写’(写10000条数据可能需要3分钟)操作是比较耗时的

②但是数据库的‘读’(读10000条数据可能只有5S)

③所以读写分离,解决的是,数据库的写入,影响了查询的效率

3、什么时候要读写分离

① 数据库不一定要读写分离,如果程序使用数据库较多,而更新少,查询多的情况下会考虑使用

②利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

4、主从复制与读写分离

在实际的生产环境中,对数据库的读写都在同一个数据库服务器中,是不能满足实际需求的

5、目前较为常见的MYSQL读写分离分为以下两种

①基于程序代码内部实现

在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的

优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手

但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大

②基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序
(1)MySQL-Proxy,MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。
(2)Atlas,是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目,它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程
(3)Amoeba,由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。

由于使用MySQL Proxy 需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写,这对于并不熟悉MySQL Proxy 内置变量和MySQL Protocol 的人来说是非常困难的

Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层

四、案例实施

1、案例环境

本案例环境使用五台服务器模拟搭建
在这里插入图片描述

2、实现思路

  1. 客户端访问代理服务器
  2. 代理服务器写入到主服务器
  3. 主服务器将增删改写入自己二进制日志
  4. 从服务器将主服务器的二进制日志同步至自己中 继日志
  5. 从服务器重放中继日志到数据库中
  6. 客户端读,则代理服务器直接访问从服务器7. 降低负载,起到负载均衡作用

3、搭建MYSQL主从复制

主服务器:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
从服务器1
在这里插入图片描述

在这里插入图片描述

从服务器2
在这里插入图片描述
在这里插入图片描述
配置MYSQL MASTER主服务器在这里插入图片描述
在这里插入图片描述
在这里插入图片描述配置从服务器1
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

配置从服务器2
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
主从复制测试
在主服务器创建表在这里插入图片描述
在从服务器1查验在这里插入图片描述
在从服务器2查验
在这里插入图片描述

4、搭建MYSQL读写分离

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述安装配置AMOEBA
在这里插入图片描述
在这里插入图片描述
配置AMOEBA读写分离
MASTER

在这里插入图片描述
Slaver1
在这里插入图片描述
Slave2
在这里插入图片描述
在主机amoeba中编辑xml配置文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述测试
在这里插入图片描述

在这里插入图片描述
两台服务器
第一台
在这里插入图片描述
第二台
在这里插入图片描述

主服务器
在这里插入图片描述

从服务器执行开启同步
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

由此验证,已经实现了 MySQL 读写分离,目前所有的写操作全部在 Master 主服务器上,用来避免数据的不同步

而所有的读操作都分摊给了 Slave 从服务器,用来分担数据库的压力

1、如何查看主从同步状态是否成功

在从服务器内输入命令 show slave status\G,查看主从信息进行查看,里面有IO线程的状态信息,还有master服务器的IP地址、端口、事务开始号当 slave_io_running 和 slave_sql_running 都显示为yes时,表示主从同步状态成功

2、如果I/O和SQL不是yes,如何排查

首先排除网络问题,使用ping命令查看从服务是否能与主服务器通信再者查看防火墙和核心防护是否关闭接着查看从服务器内的slave是否开启两个从服务器的 server-id 是否相同导致只能连上一台master_log_file 和 master_log_pos 的值要是否与Master查询的一致

3、show slave status 能看到哪些信息

I/O线程的状态信息
master服务器的IP地址,端口,事务开始位置
最近一次的报错信息和报错位置等

4、主从复制慢有哪些可能

主服务器的负载过大,被多个睡眠或者僵尸线程占用,导致系统负载过大

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

主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟·

慢SQL语句过多·

网络延迟

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值