Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了不少功能特性。目前该项目在360公司内部获得了普遍应用,不少MySQL业务已经接入了Atlas平台,天天承载的读写请求数达几十亿条。前端
主要功能:
1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DBmysql
Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas至关于链接它的客户端,在前端应用看来,Atlas至关于一个DB。Atlas做为服务端与应用程序通信,它实现了MySQL的客户端和服务端协议,同时做为客户端与MySQL通信。它对应用程序屏蔽了DB的细节,同时为了下降MySQL负担,它还维护了链接池git
Atlas相对于官方MySQL-Proxy的优点
1.将主流程中全部Lua代码用C重写,Lua仅用于管理接口
2.重写网络模型、线程模型
3.实现了真正意义上的链接池
4.优化了锁机制,性能提升数十倍github
下载Atlas会有两个版本,其中有个分表的版本,可是这个须要其余的依赖,我这边不须要分表这种需求,因此安装普通的版本sql
Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm
Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm数据库
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 后端
安装好了,它会默认在”/usr/local/mysql-proxy”下给你生成4个文件夹,以及须要配置的文件,以下:服务器
[root@localhost mysql-proxy]# ll
total 16
drwxr-xr-x 2 root root 4096 May 10 2017 bin
drwxr-xr-x 2 root root 4096 Mar 11 10:05 conf
drwxr-xr-x 3 root root 4096 May 10 2017 lib
drwxr-xr-x 2 root root 4096 Mar 11 09:10 log
bin目录下放的都是可执行文件网络
1. “encrypt”是用来生成MySQL密码加密的,在配置的时候会用到架构
2. “mysql-proxy”是MySQL本身的读写分离代理
3. “mysql-proxyd”是360弄出来的,后面有个“d”,服务的启动、重启、中止。都是用他来执行的
conf目录下放的是配置文件
1.test.cnf
[mysql-proxy]
(必备,根据实际状况配置)管理接口的用户名
• admin-username = user
(必备,根据实际状况配置)管理接口的密码
• admin-password = pwd
(必备,根据实际状况配置)主库的IP和端口
• proxy-backend-addresses = 192.168.0.12:3306
(非必备,根据实际状况配置)从库的IP和端口,@后面的数字表明权重,用来做负载均衡,若省略则默认为1,可设置多项,用逗号分隔。若是想让主库也能分担读请求的话,只须要将主库信息加入到下面的配
置项中。
• proxy-read-only-backend-addresses = 192.168.0.13:3306@2,192.168.0.14:3306
(必备,根据实际状况配置)用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,用户名与密码之间用冒号分隔。主从数据库上须要先建立该用户并设置密码(用户名和密
码在主从数据库上要一致)。好比用户名为myuser,密码为mypwd,执行./encrypt mypwd结果为HJBoxfRsjeI=。若是有多个用户用逗号分隔便可。则设置以下行所示:
• pwds = myuser: HJBoxfRsjeI=,myuser2:HJBoxfRsjeI=
(必备,默认值便可)Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,通常开发调试时设为false,线上运行时设为true
• daemon = true
(必备,默认值便可)设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,通常开发
调试时设为false,线上运行时设为true
• keepalive = true
(必备,根据实际状况配置)工做线程数,推荐设置成系统的CPU核数的2至4倍
• event-threads = 4
(必备)日志级别,分为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-logslow(单位:ms)的日志记录。不设置该参数则输出所有日志。 • sql-log-slow = 10 (可选项,可不设置)关闭不活跃的客户端链接设置。当设置了该参数时,Atlas会主动关闭通过'wait-timeout'时间后一直未活跃的链接。单位:秒 wait-timeout = 10 (必备,默认值便可)Atlas监听的工做接口IP和端口 proxy-address = 0.0.0.0:1234 (必备,默认值便可)Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345 (可选项,可不设置)默认字符集,若不设置该项,则默认字符集为latin1 charset = utf8 (可选项,可不设置)容许链接Atlas的客户端的IP,能够是精确IP,也能够是IP段,以逗号分隔,若不设置该项则容许全部IP链接,不然只容许列表中的IP链接 client-ips = 127.0.0.1, 192.168.1
lib目录下放的是一些包,以及Atlas的依赖
log目录下放的是日志,如报错等错误信息的记录
运行Atlas
进入/usr/local/mysql-proxy/bin目录,执行下面的命令启动、重启或中止Atlas。
(1). sudo ./mysql-proxyd test start,启动Atlas。
(2). sudo ./mysql-proxyd test restart,重启Atlas。
(3). sudo ./mysql-proxyd test stop,中止Atlas
执行命令:mysql -h127.0.0.1 -P1234 -u用户名 -p密码,若是能连上则证实Atlas初步测试正常,能够再尝试发几条SQL语句看看执行结果是否正确
查看主库和从库的状态:使用1234端口登陆mysql,
/home/mysql/mysql_5636/bin/mysql -uuser -ppassword -P1234 -hlocalhost
主库和从库的state 均为 ”up” 即为正常
#Atlas后端链接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.237.128:3308
#Atlas后端链接的MySQL从库的IP和端口,@后面的数字表明权重,用来做负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.237.130:3308@1
测试主从分离
• 关闭主备库复制关系,在【主库】上执行
mysql> select * from temp2;
+----+------+
| id | name |
+----+------+
| 3 | c |
| 1 | a |
• 在【从库】上查看select * from temp2结果
mysql> select * from temp2;
+----+------+
| id | name |
+----+------+
| 2 | b |
• 在Atlas所在服务器上查询
Select * from temp2;
+----+------+
| id | name |
+----+------+
| 2 | b |
• 在Atlas所在服务器上执行插入语句
Insert into temp2 values(10,’abc’);
• 在Atlas所在服务器上查询
Select * from temp2;
+----+------+
| id | name |
+----+------+
| 2 | b |
• 在MySQL主库上查询数据:
mysql> select * from temp2;
+----+------+
| id | name |
+----+------+
| 10 | abc |
| 3 | c |
| 1 | a |
• 当MySQL仅有的一个从库关闭的状况下,写操做成功,读操做也漂移到主库上执行
有两个slave时
• 当第一个从库崩溃时执行查询语句,语句都在第二个节点查询