Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了不少功能特性。目前该项目在360公司内部获得了普遍应用,不少MySQL业务已经接入了Atlas平台,天天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了咱们的开发者交流群,而且这些数字还在不断增长。前端
Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增长了一些新的功能特性。360内部使用Atlas运行的mysql业务,天天承载的读写请求数达几十亿条。mysql
Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas至关于链接它的客户端,在前端应用看来,Atlas至关于一个DB。Atlas做为服务端与应用程序通信,它实现了MySQL的客户端和服务端协议,同时做为客户端与MySQL通信。它对应用程序屏蔽了DB的细节,同时为了下降MySQL负担,它还维护了链接池。Atlas的总体架构,可参考下面这两幅图:sql
由于条件限制,使用额都是vm的虚拟机数据库
主机名 | IP | 系统 | 备注 |
---|---|---|---|
SH-DATA-01 | 192.168.31.11 | CENTOS 6.8 x86-84 | 中间件端 |
SH-DATA-02 | 192.168.31.12 | CENTOS 6.8 x86-84 | 数据库主库 |
SH-DATA-03 | 192.168.31.13 | CENTOS 6.8 x86-84 | 数据库从库1 |
SH-DATA-04 | 192.168.31.14 | CENTOS 6.8 x86-84 | 数据库从库2 |
这里说明一下,第一台虚机是手动安装的的,安装的时候MySQL也已经部署上了,这样每台启动的MySQL的uuid都是同样的,同步会出现如下问题vim
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work.后端
解决方法是,删除或者备份data/ 下面的auto.cnf,而后重启数据库就能够了。架构
wget http://olvimidkv.bkt.clouddn.com/Atlas-sharding_1.0.1-el6.x86_64.rpm rpm -ivh Atlas-sharding_1.0.1-el6.x86_64.rpm
Atlas运行须要依赖一个配置文件(test.cnf)。在运行Atlas以前,须要对该文件进行配置。Atlas的安装目录是/usr/local/mysql-proxy,进入安装目录的conf目录,能够看到已经有一个test.cnf默认配置文件,咱们只须要对这个文件进行修改便可。并发
[mysql-proxy] #带#号的为非必需的配置项目 #管理接口的用户名 admin-username = user #管理接口的密码 admin-password = pwd #Atlas后端链接的MySQL主库的IP和端口,可设置多项,用逗号分隔 proxy-backend-addresses = 127.0.0.1:3306 #Atlas后端链接的MySQL从库的IP和端口,@后面的数字表明权重,用来做负载均衡,若省略则默认为1,可设置多项,用逗号分隔 #proxy-read-only-backend-addresses = 127.0.0.1:3305@1 #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码! pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc= #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,通常开发调试时设为false,线上运行时设为true,true后面不能有空格。 daemon = true #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,通常开发调试时设为false,线上运行时设为true,true后面不能有空格。 keepalive = true #工做线程数,对Atlas的性能有很大影响,可根据状况适当设置 event-threads = 8 #日志级别,分为message、warning、critical、error、debug五个级别 log-level = message #日志存放的路径 log-path = /usr/local/mysql-proxy/log #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF表明不记录SQL日志,ON表明记录SQL日志,REALTIME表明记录SQL日志且实时写入磁盘,默认为OFF #sql-log = OFF #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出所有日志。 #sql-log-slow = 10 #实例名称,用于同一台机器上多个Atlas实例间的区分 #instance = test #Atlas监听的工做接口IP和端口 proxy-address = 0.0.0.0:1234 #Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345 #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不须要设置该项 #tables = person.mt.id.3 #默认字符集,设置该项后客户端再也不须要执行SET NAMES语句 #charset = utf8 #容许链接Atlas的客户端的IP,能够是精确IP,也能够是IP段,以逗号分隔,若不设置该项则容许全部IP链接,不然只容许列表中的IP链接 #client-ips = 127.0.0.1, 192.168.1 #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),如有LVS且设置了client-ips则此项必须设置,不然能够不设置 #lvs-ips = 192.168.1.1
如下几项配置参数对性能和正常运行起到重要做用,须要正确设置。负载均衡
(1)线程数 event-threads项设置,太小没法充分发挥多核CPU的性能,过大形成没必要要的线程切换开销,推荐设置为CPU的核数。 (2)最小空闲链接数(2.x以上版本不须要该项,1.x版本须要) min-idle-connections项设置,太小则在高并发下会有报错,过大虽然不报错但在测试时不容易看出读写分离效果,推荐设置为比客户端的并发峰值稍大,详见《配置参数详解》。上面的配置范例是针对Atlas 2.X版本,没有该选项。对于Atlas 1.X版本的配置文件,须要加入该配置选项。
如下几项能够设置,也可使用默认值,区别不大。运维
(1)Atlas的工做端口 proxy-address项配置,例如proxy-address = 0.0.0.0:1234表明客户端应该使用1234这个端口链接Atlas来发送SQL请求。 (2)Atlas的管理端口 admin-address项配置,例如admin-address = 0.0.0.0:2345表明DBA应该使用2345这个端口链接Atlas来执行运维管理操做。 (3)管理接口的用户名和密码 admin-username项和admin-password项设置,这两项是用来进入Atlas的管理界面的,与后端链接的MySQL没有关系,因此能够任意设置,不须要MySQL在配置上作任何改动。 (4)日志级别 以log-level项配置,分为message、warning、critical、error、debug五个级别。 (5)日志路径 以log-path项配置,如log-path = /usr/local/mysql-proxy/log。
如下是咱们的配置
[mysql-proxy] #带#号的为非必需的配置项目 #管理接口的用户名 admin-username = admin #管理接口的密码 admin-password = admin #Atlas后端链接的MySQL主库的IP和端口,可设置多项,用逗号分隔 proxy-backend-addresses = 192.168.31.12:3306 #Atlas后端链接的MySQL从库的IP和端口,@后面的数字表明权重,用来做负载均衡,若省略则默认为1,可设置多项,用逗号分隔 #proxy-read-only-backend-addresses = 127.0.0.1:3305@1 proxy-read-only-backend-addresses = 192.168.31.13:3306@1, 192.168.31.14:3306@1 #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码! #pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc= pwds = center:/iZxz+0GRoA= #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,通常开发调试时设为false,线上运行时设为true,true后面不能有空格。 daemon = true #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,通常开发调试时设为false,线上运行时设为true,true后面不能有空格。 keepalive = true #工做线程数,对Atlas的性能有很大影响,可根据状况适当设置 event-threads = 1 #日志级别,分为message、warning、critical、error、debug五个级别 log-level = message #日志存放的路径 log-path = /usr/local/mysql-proxy/log #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF表明不记录SQL日志,ON表明记录SQL日志,REALTIME表明记录SQL日志且实时写入磁盘,默认为OFF #测试的缘由,这个打开了。 sql-log = REALTIME #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出所有日志。 #测试环境打开 sql-log-slow = 1 #实例名称,用于同一台机器上多个Atlas实例间的区分 #instance = test #Atlas监听的工做接口IP和端口 proxy-address = 0.0.0.0:1234 #Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345 #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不须要设置该项 #tables = person.mt.id.3 tables=business_center.fc_attendances.id.10 #默认字符集,设置该项后客户端再也不须要执行SET NAMES语句 charset = utf8 #容许链接Atlas的客户端的IP,能够是精确IP,也能够是IP段,以逗号分隔,若不设置该项则容许全部IP链接,不然只容许列表中的IP链接 client-ips = 192.168.31.12, 192.168.31.13, 192.168.31.14 #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),如有LVS且设置了client-ips则此项必须设置,不然能够不设置 #lvs-ips = 192.168.1.1
进入/usr/local/mysql-proxy/bin目录,执行下面的命令启动、重启或中止Atlas。
数据库的受权不要忘了
grant all privileges on *.* to 'center'@'192.168.31.%' identified by '123456';
注意
执行命令:mysql -h127.0.0.1 -P1234 -u用户名 -p密码,若是能连上则证实Atlas初步测试正常,能够再尝试发几条SQL语句看看执行结果是否正确
须要把127.0.0.1加到容许IP列表里面,用户名密码使用 加密那个。
进入Atlas的管理界面的命令:mysql -h127.0.0.1 -P2345 -uuser -ppwd,进入后执行:select * from help;查看管理DB的各种命令。
mysql -h127.0.0.1 -P2345 -uadmin -padmin
若是提示密码错误之类的,多是密码没有加密,使用/usr/local/mysql-proxy/bin/encrypt 123456 获取加密值,而后修改配置文件,并建立用户。
测试
mysql -h127.0.0.1 -P1234 -ucenter -p123456
create database hehe; create table lala ( id int not null, name varchar(20) not null); insert into lala values(1,"sunhong");
其它数据随便插入,打开日志
能够看到,查询是一比一的,插入就直连主库了,错误的也会显示出来,可是不显示错误缘由。