1 MySQL的主从复制
1.1 主从复制的形成原因
在企业应用中,成熟的业务通常数据流都比较大
单台MySQL在安全性、高可用性和高并发方面都无法满足时实际的需求
配置多台主从数据库服务器以实现读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论在安全性、高可用性还是在高并发等各个方面都是完全不能满足实际需求的。因此通过主从复制的方式来同步数据,在通过读写分离提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库的数据、语句做备份。
1.2 mysql的二进制日志文件类型
1)statement:基于语句的复制。在服务器上执行sql语句,在从服务器上执行统一的语句,mysql默认采用基于语句的复制,执行效率高。日志文件通常比较小,但是在高并发的时候记录sql顺 序可能不精确,恢复的时候容易出错
2)row:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。所以日志文件占用空间比较大,恢复的时候 效率也比较慢,但是非常精确
3)mixed:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
1.3 主从复制的工作过程
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第1张图片](http://img.e-com-net.com/image/info8/14205ced333f4d87aab678789c1187cc.jpg)
1)Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,则将其改变写入二进制日志中。
2)Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求Master的二进制时间。
3)同时Master节点为没一个I/O线程启动一个dump线程,用于向其发送二进制时间,并保存slave节点的中继日志(Relay log)中,Slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句注意执行,是的其数据和Master节点保存一致,最后IO线程和SQL线程将进入睡眠状态,等待下一次被唤醒。
Tip:
●中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。 ●复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行更新操作不能在 Slave上并行操作。
1.4 主从复制的实验搭建
主服务器:192.168.111.5 (mysql)
从服务器1:192.168.111.6 (mysql)
从服务器2:192.168.111.7 (mysql)
主从服务器时间同步
主服务器安装时间服务ntp
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第2张图片](http://img.e-com-net.com/image/info8/61a0c3a91c574814bf075692da94257b.jpg)
修改ntp配置文件
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第3张图片](http://img.e-com-net.com/image/info8/73c90de04ea848e286b1da73d12139da.jpg)
启动时间服务
![](http://img.e-com-net.com/image/info8/524b581421a645cea7de70ce7d10b3c8.jpg)
从服务器1安装ntp服务并启动
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第4张图片](http://img.e-com-net.com/image/info8/eb287cd7400645c9ac91ef6ecc4084eb.jpg)
设置时间同步为主服务器地址,并设置定时任务
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第5张图片](http://img.e-com-net.com/image/info8/6465f47b25574c518b398f34ff177f28.jpg)
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第6张图片](http://img.e-com-net.com/image/info8/3834eadb0e514b01b8761039b7bb40b0.jpg)
从服务器2同上配置
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第7张图片](http://img.e-com-net.com/image/info8/850d197a1e00428690af01e9224216d9.jpg)
主从服务器数据同步
主武器修改配置文件添加二进制日志模块(log没有s)
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第8张图片](http://img.e-com-net.com/image/info8/4b1a834911904b808140336fa311c4a7.jpg)
"双1设置"适合数据安全性要求非常高,而且磁盘IO写能力足够支持的业务,比如订单、交易、充值、支付消费系统。"双1模式"下,当磁盘IO无法满足业务需求时,比如11.11活动的压力。推荐一下性能较快的设置,并使用带蓄电池后备电源,防止系统断电异常。 innodb_flush_logs_at_trx_commit=2 每次事务提交时MySQL都会把日志缓存区的数据写入日志文件中,但
重启服务并修改mysql用户密码,进入mysql数据库
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第9张图片](http://img.e-com-net.com/image/info8/047c4f2c847f419db8298f9e60c2d773.jpg)
给从服务器授权并查看主服务器状态
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第10张图片](http://img.e-com-net.com/image/info8/dc85defcdd0b4ea5925a1d93d0f91b47.jpg)
修改从服务器mysql配置
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第11张图片](http://img.e-com-net.com/image/info8/08fb37699b4e4732a367915e3e9b8aaa.jpg)
重启服务并进入mysql数据库
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第12张图片](http://img.e-com-net.com/image/info8/8a3340e6640d477aacfb90ab17813625.jpg)
同步配置实现主从同步
![](http://img.e-com-net.com/image/info8/708a2b1d43a74c8f8cffe53c91c3d10c.jpg)
启动同步,并查看同步状态
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第13张图片](http://img.e-com-net.com/image/info8/141f19668f06433786c9ae8f478cfaca.jpg)
从服务器2同上配置
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第14张图片](http://img.e-com-net.com/image/info8/4f61bf1d55254762bfa2886ac3df5be3.jpg)
验证是否可以实现主从复制
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第15张图片](http://img.e-com-net.com/image/info8/60dac491285548d3946a97e67e4675df.jpg)
1.5 主从复制的同步模式
异步复制:MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
全同步复制:指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
半同步复制:介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
1.6 半同步复制实验
配置主数据库文件,并重启服务
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第16张图片](http://img.e-com-net.com/image/info8/31c10c13839245b09d06e76ff8d9686c.jpg)
配置两台从服务器,添加半同步复制插件并开启,设置完重启
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第17张图片](http://img.e-com-net.com/image/info8/995f5927368440bc9c9b35f8fa746faf.jpg)
主数据库进入mysql,查看半同步插件状态和超时时间
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第18张图片](http://img.e-com-net.com/image/info8/8506f32459c647d08d272f5e12485c37.jpg)
重启两台从服务器同步功能
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第19张图片](http://img.e-com-net.com/image/info8/baf371ac1b29479d933fdf6d69133aa5.jpg)
从主库查看同步状态
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第20张图片](http://img.e-com-net.com/image/info8/bd7c8124d9144a6db9992c15623e4c8f.jpg)
当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。
当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制。
注: 1) 在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。 2) MySQL 5.7极大的提升了半同步复制的性能。 5.6 版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:传送binlog 给 slave ,还需要等待 slave 反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的系统吞吐量(TPS)。 5.7 版本的半同步复制中,独立出一个 ack collector thread ,专门用于接收 slave 的反馈信息。这样 master 上有两个线程独立工作,可以同时发送 binlog 到 slave ,和接收 slave 的反馈。
2 读写分离
2.1 读写分离的概念
什么是读写分离
读写分离,基本的原理是让主数据库处理事务性增、改、删操作,而从数据库处理select查询操作。数据库复制被用来把事务性操作导致的变更同步到急群众的从数据库。
为什么要做读写分离
因为数据库的“写”操作是比较耗时的
单属数据库“读”的操作很快,所以读写分离解决的是,数据库的些人,影响了查询的效率
什么时候要做读写分离
数据库不一定要读写分离,如果程序使用数据较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。
2.2 读写分离的工作原理
读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库
2.3 读写分离的类型
1)基于程序代码内部实现
在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。 优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。 但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。
2)基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。 (1)MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。 (2)Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。 (3)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。 (4)Mycat。是一款流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。
由于使用MySQL Proxy 需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy 内置变量和MySQL Protocol 的人来说是非常困难的。 Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。
2.4 读写分离实验
主服务器:192.168.111.5 (mysql)
从服务器1:192.168.111.6 (mysql)
从服务器2:192.168.111.7 (mysql)
Amoeba服务器:192.168.111.99 (jdk1.6、Amoeba)
Amoeba服务器配置
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
安装java环境
![](http://img.e-com-net.com/image/info8/1b7fa08e6c874114b7ddd17e013662fd.jpg)
将软件包改名并添加系统服务
![](http://img.e-com-net.com/image/info8/8e329f40f2a8417a8164177477a1715c.jpg)
添加系统服务配置
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第21张图片](http://img.e-com-net.com/image/info8/72839fd1ff724f6cb56aa280f3f10d8a.jpg)
执行脚本查看java版本
![](http://img.e-com-net.com/image/info8/46d34135bb8b454d907d3f95b6daa9cc.jpg)
安装Amoeba软件,并查看是否安装成功
![](http://img.e-com-net.com/image/info8/a24b3b32b976413382578879116cb07b.jpg)
配置Amoeba读写分离,两个Slave读负载均衡
在主服务器和两个从服务器的mysql上开放权限给Amoeba访问
![](http://img.e-com-net.com/image/info8/9f5a071ebfb14555a382b13af1a10661.jpg)
配置amoeba服务器,先备份方便还原
![](http://img.e-com-net.com/image/info8/b928209798324d2b82607e4094ef378d.jpg)
设置登录amoeba的账号密码
![](http://img.e-com-net.com/image/info8/0359c7086e1146469e6fe337217459ac.jpg)
设置读写库
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第22张图片](http://img.e-com-net.com/image/info8/726137e2946a4f308051d167d77967c4.jpg)
配置读写库和负载均衡
备份配置文件并配置
![](http://img.e-com-net.com/image/info8/6f97e4a26e914716a234a70da48796a1.jpg)
修改配置文件
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第23张图片](http://img.e-com-net.com/image/info8/0cdedd9b43b1470897b2487b29e45906.jpg)
复制52-57行至57行下
![](http://img.e-com-net.com/image/info8/42d58f86ffbc40d48da2e807e2e52c8d.jpg)
配置主从服务器库
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第24张图片](http://img.e-com-net.com/image/info8/58f7e38a527444e2bfbb4557a9b05b41.jpg)
配置从服务器组和负载均衡
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第25张图片](http://img.e-com-net.com/image/info8/434f996f7489480f9e42daef3be79aad.jpg)
启动软件并查看8066端口是否开启(8066为amoeba服务默认TCP端口)
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第26张图片](http://img.e-com-net.com/image/info8/d9b9f039657f4c76ac9150de62a9c617.jpg)
连接上amoeba服务器进行测试负载均衡
关闭从服务器同步,主服务器两台从服务器分别进行写操作
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第27张图片](http://img.e-com-net.com/image/info8/95556f9e83fe42e5b170309749b5522c.jpg)
Amoeba服务器会以轮询的方式查看两台备数据库
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第28张图片](http://img.e-com-net.com/image/info8/96fed254e1214a86a603e9abfb74dabd.jpg)
主服务库写入数据,再开启两个从服务器同步
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第29张图片](http://img.e-com-net.com/image/info8/795fedc5ccf3453289664037f9235c5b.jpg)
![](http://img.e-com-net.com/image/info8/07ca2fd74f2b4f03a5c101c7274c03b9.jpg)
从amoeba服务器查看两个备服务器是否同步,如果已同步说明读取只从被服务器中读取,写入只会同步主服务器的写入,实现读写分离
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第30张图片](http://img.e-com-net.com/image/info8/757f66828b7c4f17a7a172cbf72cb033.jpg)
2.5 主从复制延迟现象及解决方法
## 如何判断是否有延迟
show slave status\G;
查看 seconds_behind_master 参数,单位以秒计,表示延迟的时长, 0 表示无延迟,大于 0 表示有延
迟,小于 0 有 bug;
## 还可以使用 pt_heartbeat 、 zabbix 等监控工具来监控主备复制的延迟。
============MySQL 主从复制延迟可能原因 =============
1 、 master 服务器高并发,形成大量事务(大事务中有多 sql 语句,高并发复制的时候用 row 格式,那么
就会导致从库复制的时候很慢)
2 、网络延迟
3 、主从硬件设备导致( cpu 、内存 io 、硬盘 io )
4 、是同步复制、而不是异步复制
============MySQL 主从复制延迟解决办法 =============
硬件方面,主从服务器采用同样的配置,最好用 ssd ;内存加大。避免使用虚拟云主机,使用物理主机,
等用于提升从库 io 读写速度。
网络方面,尽量在同一局域网,尽量不要跨机房 跨网,使用稳定的网;
大事务尽量改为小事务,优化 SQL 语句,二进制日志的格式使用 mixed 尽量使用 SQL 语句,提高效率
负载比较大的时候 修改数据库配置文件加缓存空间 (innodb_buffer_pool_size) 让更多操作在
Mysql 内存中完成,减少磁盘操作 或者加数据库缓存 (redis)
使用半同步复制,如果对数据一致要求不高,可以采用异步复制
![为了让老板给你涨工资让你的mysql数据库实现主从复制和动静分离吧_第31张图片](http://img.e-com-net.com/image/info8/8be757f7289a4b9b8008cf9864c143e2.jpg)