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.自动分表
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: