博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql主从以及读写分离(科普)
阅读量:6332 次
发布时间:2019-06-22

本文共 1751 字,大约阅读时间需要 5 分钟。

hot3.png

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于前面我们学习过的rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

如图所示:

一、 案例前置知识点

1、 mysq支持的复制类型

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

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

3) 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

2、 复制的工作过程

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缓存中,所以中继日志的开销很小。

 

如图所示:

 

3、 mysql读写分离原理

读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

前较为常见的Mysql读写分离分为以下两种:

 1)基于程序代码内部实现

        在代码中根据select 、insert进行路由分类,这类方法也是目前生产环境下应用最广泛的。优点是性能较好,因为程序在代码中实现,不需要增加额外的硬件开支,缺点是需要开发人员来实现,运维人员无从下手。

 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应用,如果在程序代码中实现读写分离对代码的改动就较大,所以,像这种应用一般会考虑使用代理层来实现,那么今天就使用Amoeba为例,完成主从复制和读写分离。

 

MySQLProxy介绍

 

下面使用MySQL官方提供的数据库代理层产品MySQLProxy搭建读写分离。

MySQLProxy实际上是在客户端请求与MySQLServer之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer上。对于多节点Slave集群,也可以起做到负载均衡的效果。

 

 

实验图:

 

转载于:https://my.oschina.net/hfframework/blog/1814041

你可能感兴趣的文章
使用Maven Profile实现多环境构建
查看>>
<亲测>CentOS中yum安装ffmpeg
查看>>
一步一步学Silverlight 2系列(27):使用Brush进行填充
查看>>
[转载]推荐一个被大家忽视的微软的反跨站脚本库Anti-XSS V3.1
查看>>
【分享】马化腾:产品设计与用户体验
查看>>
LINQ学习笔记(8) 标准查询运算符(下)
查看>>
atmega8 IO驱动能力
查看>>
[NOIP 2014复习]第三章:动态规划——NOIP历届真题回想
查看>>
ASP.NET MVC对WebAPI接口操作(添加,更新和删除)
查看>>
php上传文件大小限制
查看>>
查找是否已安装命令
查看>>
shell 题
查看>>
内核线程与用户线程的一点小总结 《程序员的自我修养》·笔记
查看>>
Mongodb 的学习
查看>>
《Discuz安装时候出现乱码 -- 问题解决方法》
查看>>
iOS中打包.a静态库
查看>>
curl_setopt — 设置 cURL 传输选项
查看>>
CefSharp的引用、配置、实例
查看>>
Hadoop生态圈-Azkaban部署实战
查看>>
使用redis-cli --pipe快速插入数据
查看>>