一、数据库读写分离

读写分离就是指在高并发查询场景下,为了满足应用的访问需求,通常都会部署多个从库提供查询服务以提升数据库的查询的扩展性,将查询分发到从库,让从库分担主库查询负载的技术。之所以要进行读写分离是因为当系统的访问量增长到一定程度时应用服务器可以通过负载均衡的方式来实现扩容,但是数据库因为其中的数据有一致性的要求,因此无法简单的扩展。而一般的互联网系统中都有写少读多的情况,针对这种情况就提出了读写分离技术,这样就可以实现数据库对于大访问量的适应。举例来说,在一般的电商系统中系统的销售管理人员经常会进行一些非常复杂且涉及到大量数据的查询,这种查询如果放在主库上很容易将主库拖垮,因此这种操作应该放到专用的从库上进行。

读写分离的实现方法一般有两种方式,一种是在应用层实现,就是程序员在开发应用程序的时候指定每个操作具体访问哪个数据源,当然数据源是可以在配置文件中修改的;另一种方法就是在应用服务器和数据库服务器之间架设一个中间件服务器,在这个服务器上部署读写分离程序,分离程序通过分析sql语句从而将应用服务器的请求分发到不同的数据源上。这样数据库的读写分离就被透明化了,应用层的开发就不用去关注读写分离的实现了,可以极大的减少应用层开发人员的工作。

虽然读写分离可以提高数据库的访问性能,但是其还是有着一定的缺点的,主要有两个缺点:第一,因为主从复制间存在延迟,所以可能有一些数据无法实时的从从库上查询到;第二,读写分离的实现会增加应用开发的复杂性(如果是在应用层上实现)或数据库部署的复杂性(如果是用中间层服务器实现)。

二、mysql的读写分离工具

mysql有很多实现读写分离的工具,这里简单介绍几种。

1. Mysql Proxy

这是mysql最早提供的一个读写分离工具,但是有很多的bug且官方已经停止维护了。这个工具实现就是基于mysql的协议来分析应用层发送过来的请求具体是读请求还是写请求,然后再将不同的请求分发到不同的数据库服务器上。这个工具的服务端程序是使用C和C++来实现的,而对于sql语句的分析和读写分离逻辑的实现使用lua脚本实现的,因此对于其读写分离的逻辑可以比较简单的进行扩展和二次开发,但是其代码的性能是比较低的。总的来说这个工具基本上已经没什么人用了。

2. Atlas

这个工具是由360公司开发的,是mysql proxy的一个分支版本,是基于mysql proxy0.8.2版本开发的,修改了大量的bug,并添加了许多新功能。这个工具在360的很多业务中得到了应用,因此可以说是经过了线上高并发的考验的,同时这个工具也是现在国内开发者和使用者都比较活跃的一个工具。具体而言这个工具有一下几点提升。

1. 将mysql proxy中用lua实现的sql分析改为了用c语言来实现,提高的sql分析的性能。

2. 解决了并发下的字符集问题,在mysql proxy中如果客户端使用的字符集不同会造成符文错乱的问题。

3. 避免死等待。

4. 主库宕机认可读,在mysql proxy中如果主库宕机了那么从库也是不能访问的。而在atlas中即使主库宕机了,从库仍然是能提供读取服务的。

5. mysql新版本的兼容。

6. 添加了从库动态上下线的功能。

7. 提供了分库分表的功能。

8. 从库可以指定负载权重,就是指定请求分配到每个从库的比例。

9. 添加了IP过滤的功能。

因此线上推荐使用atlas来实现读写分离。

3. Amoeba for Mysql

Amoeba for Mysql是国产的一款读写分离工具,实现逻辑和mysql proxy基本是一样的,它是通过java来开发的。但是有两个缺点,一个是对事物的支持不好,还有一个是数据请求的拆分逻辑比较简单。而且这个工具也基本上已经停止开发和维护了。

4. mysql router

这个时mysql官方最新推出的一个轻量级的来实现高可用和可扩展的一个工具,同时支持读写分离。这个工具提供两个端口,一个是读写端口,一个是只读端口,因此它的读写分离是需要应用层上的开发来支持的。此外这个工具刚刚出来,其稳定性可能还无法保证。

更多相关文章

  1. 如何在VB.net中进行备份和恢复mysql数据库
  2. 关于Mysql的图形化管理工具sqlyog的注册码以及主键自增问题
  3. mysql客户端工具使用
  4. mysql数据库之单表查询
  5. 我需要PHP页面显示mysql数据库中的BLOB图像
  6. mysql数据库utf-8编码
  7. JAVA使用JDBC连接MySQL数据库
  8. mysql 数据库整体运行状态确认思路
  9. 有没有办法确定是由Web应用程序(php进程)执行数据库行更新,还是通过

随机推荐

  1. 生成真值组合【Java实现】
  2. 我精通delphi,asp,java,c++bulider这些工
  3. “不是抽象的,也不重写抽象的方法”错误
  4. Android高手进阶教程(二十)之---Android
  5. ArcGIS Server Java -- 动态添加图层
  6. 用Java近似求pi,利用公式pi=4*(1-1/3+1/5-
  7. 如何通过Java将Digital Persona的模板保
  8. java十进制字符串转十六进制字符串
  9. Java Executor多线程框架
  10. 命运被转折改变--掌握java高性能分布式服