MySQL-读写分离实现--Atlas


 MySQL的读写分离实现方式总的来说有两种:

1. 代码级别的实现

2. 应用中间件

使用代码来实现对于coder来说数据库集群就没有透明,有任何集群方面的修改都涉及到动代码,不灵活,所以主页君不太喜欢。

中间件的话有MySQL官方的开源项目MySQL-Proxy,阿里的Amoeba。

但是前者存在很大的性能问题,稳定性也不高,主页君的亲测中发现,它会建立大量ESTABLISHED状态的 TCP 连接,最终导致不能建立数据库连接(今天看api发现它与数据库建立的是TCP长连接,可以通过设置max-idle-connections,避免生成太多不必要的空闲连接)。

后者具备很多优点,可以自定义很多策略,数据分片,数据路由等等,但是他存在一个很大的弱点 ---- 不支持事务。

各方考察后最终启用的是360开源项目Atlas,它是将MySQL-Proxy 进行优化包装,改善其本身性能不稳定,以及不支持事务的缺点。
特性:
1.支持做LVS,方便以后做数据库方面的平行扩展
2.支持事务
3.如果需要强制到Master中读数据可以在sql前添加 标志:/*master*/
4.master宕机后,读操作不会受到影响
5.具有灵活的管理接口,可以动态添加,删除,上线下线后端的DB,不需重启proxy
6.自动分表

项目地址:
https://github.com/Qihoo360/Atlas

1.    install
下载deb安装包
 sudo dpkg -i --instdir=$atlas atlas.deb
2.    configure
修改 $atlas/conf/xx.cnf

这里的配置文件名称,配置文件中的 实例名称‘instance’配置项 及 启动proxy时的参数名称三者必须保持一致。

配置很简单,参见注释做相应修改即可。


pwds = proxy1:ZWbpeaafzJw=    # 是访问数据库用户名和密码,
密码需要使用 $atlas/bin目录下的encrypt进行加密,如encrpt 112233,加密结果为: ZWbpeaafzJw=

max-idle-connections   #  连接池的最大空闲连接数,由于MySQL-Proxy与MySQL之间建立的是tcp长连接,使用此参数可以避免建立太多空闲连接。


3.    启动:
修改 $atlas/bin/mysql-proxyd 的proxydir 参数
$atlas/bin/mysql-proxyd xx start
$atlas/bin/mysql-proxyd xx stop
$atlas/bin/mysql-proxyd xx restart
4.    使用:
数据连接:
jdbc:mysql://localhost:1234/db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    管理接口:(遵从mysql标准协议)
进入管理员界面:
mysql -h127.0.0.1  -P2345 -uuser -ppwd         #使用相应配置文件中的参数

SELECT * FROM help;        #查看各个管理命令如何使用
SELECT * FROM backends        #查看db节点
SET OFFLINE $backend_id        #下线DB
SET ONLINE $backend_id          # 上线DB                           
ADD MASTER $backend             # 添加master: "add master 127.0.0.1:3306"             
ADD SLAVE $backend             # 添加slave: "add slave 127.0.0.1:3306"              
REMOVE BACKEND $backend_id      # 移除: "remove backend 1"                     
ADD CLIENT $client          # 添加客户端: "add client 192.168.1.2"  这里的ip是用于过滤访问此Atlas实例
REMOVE CLIENT $client       # 移除客户端: "remove client 192.168.1.2"            
SAVE CONFIG        #保存修改到配置文件

Issue:
1.    error while loading shared libraries: libcrypto.so.0.9.8
sudo apt-get install libssl0.9.8

2.    缺少外部库
libmysqlclient.so.16

3.    数据库存放中文乱码:
数据连接url:
jdbc:mysql://localhost:1234/db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
使用‘&’而不是转义后的‘&’

PS:

架构图
 

 
配合lvs:
 

 

猜你喜欢

转载自bena.iteye.com/blog/2164918