前言:咱们前面搭建过LAMP和LNMP,作过了web服务器群集和热备,web服务器坏了咱们是不怕了,可是咱们要知道,网站的数据有不少是存储在数据库里面的,例如注册的会员,发的文章,购物的订单等信息。固然咱们能够给数据库作备份,可是若是天天00:00作一次备份,那么若是在23:59数据丢失了,那么就会丢失一天的数据,有没有一种方法能实现实时备份,就是说有数据产生就当即备份,答案固然是有,也就是今天咱们要学习的mysql主从复制。有点相似于前面咱们学习过的rsync,可是不一样的是rsync是对磁盘文件作备份,而mysql主从复制是对数据库中的数据,语句作备份。另外读写分离主要是为了优化数据库。
1、mysql主从复制的工做原理
一、mysq支持的复制类型
1)基于语句的复制。在服务器上执行sql语句,在从服务器上执行一样的语句,mysql默认采用基于语句的复制,执行效率高。
2)基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
3)混合类型的复制。默认采用基于语句的复制,一旦发现基于语句没法精确复制时,就会采用基于行的复制。java
二、复制的工做过程
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缓存中,因此中继日志的开销很小。mysql
三、mysql读写分离原理
读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提高了服务器安全。
目前较为常见的Mysql读写分离分为两种web
1)基于程序代码内部实现
在代码中根据select 、insert进行路由分类,这类方法也是目前生产环境下应用最普遍的。优势是性能较好,由于程序在代码中实现,不须要增长额外的硬件开支,缺点是须要开发人员来实现,运维人员无从下手。sql
2)基于中间代理层实现
代理通常介于应用服务器和数据库服务器之间,代理数据库服务器接收到应用服务器的请求后根据判断后转发到,后端数据库,有如下表明性的程序。
(1)mysql_proxy。mysql_proxy是Mysql的一个开源项目,经过其自带的lua脚本进行sql判断。
(2)Atlas。是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增长了一些新的功能特性。360内部使用Atlas运行的mysql业务,天天承载的读写请求数达几十亿条。支持事物以及存储过程。
(3)Amoeba。由阿里巴巴集团在职员工陈思儒使用序java语言进行开发,阿里巴巴集团将其用户生产环境下,可是他并不支持事物以及存数过程。数据库
不是全部的应用都可以在基于程序代码中实现读写分离,像一些大型的java应用,若是在程序代码中实现读写分离对代码的改动就较大,因此,像这种应用通常会考虑使用代理层来实现。后端