MySQL+Amoeba实现数据库主从复制和读写分离

MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的。通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性。实现数据的读写分离能带来的好处有:

增加物理服务器,提升机器处理能力,也就是拿硬件换性能。

主从只负责各自的读和写,极大程度缓解X锁和S锁争用。

slave可以配置myIasm引擎,提升查询性能以及节约系统开销。

master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。

slave可以单独设置一些参数来提升其读的性能。

增加冗余,提高可用性。

常见的实现数据库读写分离的方案大致有两种:应用层,代理层

在应用层也就是在代码中进行操作,通过对数据库操作类型的不同手动指定数据源,可以通过AOP的方式进行实现,不过对于一个已经搭建起来并正在运行的系统来说,这个方案应该比较复杂。

另外一种实现方式是通过数据库代理层,代理对应用层呢个是透明的,所有的读写分离操作由代理层来完成,好处就是对于开发应用层来说是透明的,不需要管理数据源,缺点在于应用原来直接访问数据库现在变成了通过代理访问数据库,性能上肯定会有影响,不过如果代理层实现的很优秀的话这个影响应该不大。

通过代理层实现数据库读写分离又有两种方案可供选择,其一是使用MySQL-Proxy,另一种是使用Amoeba。最开始找到的实现方案是基于MySQL-Proxy的,由于它没有配置文件,所要完成的工作需要由Lua脚本来实现,这对于一个Lua门外汉来说压力不小。后来找到的Amoeba实现起来很简单,只需要简单地配置就能实现数据库的读写分离,所以这里记录我通过使用Amoeba来实现数据库读写分离的过程。

Amoeba简介:

Amoeba(变形虫)致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能。

Amoeba使用:

一、准备工作

amoeba使用java编写,所以运行amoeba的运行环境要安装好java环境,并配置好环境变量,jdk版本要在1.5以上,因为amoeba就是用jdk1.5编写的;我的服务器java版本为1.7。

amoeba是在主从同步的基础上工作的,所以要先配置好MySQL的主从同步功能,我在另一篇日志中记录了我实现Mysql主从同步的过程,可以参考:MySQL主从复制(Master-Slave)实践

  amoeba服务器 :虚拟机 ip:182.92.172.80   amoeba版本3.0.5-RC   mysql版本5. 5.32   Java环境1.7.0_60    操作系统linux

master服务器    :虚拟机 ip:182.92.172.80  mysql版本5. 5.32   操作系统centos6.5 (和amoeba在同一个服务器上,因为我只用了两个服务器)

slave服务器       :虚拟机 ip:123.57.44.85   mysql版本5.5.39   操作系统centos6.5 

二、下载安装amoeba

下载地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/,选择最新版本进行下载,我下载的版本为:amoeba-mysql-3.0.5-RC-distribution.zip

安装:把zip安装包解压到自己指定的服务器路径上就可以了,我把它放在了/usr/local/amoeba/amoeba-mysql-3.0.5-RC里面,解压后的文件结构如下图:

MySQL+Amoeba实现数据库主从复制和读写分离

三、配置amoeba

Amoeba基础配置介绍:

想象Amoeba作为数据库代理层,它一定会和很多数据库保持通信,因此它必须知道由它代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。这些信息存储在$AMOEBA_HOME/conf/dbServers.xml中。

Amoeba为了完成数据切分提供了完善的切分规则配置,为了了解如何分片数据、如何将数据库返回的数据整合,它必须知道切分规则。与切分规则相关的信息存储在$AMOEBA_HOME/conf/rule.xml中。

当我们书写SQL来操作数据库的时候,常常会用到很多不同的数据库函数,比如:UNIX_TIMESTAMP()、SYSDATE()等等。这些函数如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函数名和函数处理的关系。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzyjfg.html