Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。
主要功能有:
1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DB
Atlas相对于官方mysql-proxy的优势:
1.将主流程中所有LUA代码用C重写,Lua仅用于管理接口
2.重写网络模型、线程模型
3.实现了真正意义上的连接池
4.优化了锁机制,性能提高了数十倍
另,mysql-proxy在主库宕机后,从库无法读;而atlas在主库宕机后,从库仍可以读。
从个人角度来说,若当前的主从架构只需要读写分离,不需要其他自动分表或其他花哨的功能的话,Atlas在稳定性及可靠性方面还是优于mysql-proxy,毕竟mysql-proxy当前还没有个稳定版本。
详细请看:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
测试架构:
master:10.10.32.1 mysql5.6core2*2
slave1:10.10.32.2 mysql5.6 core2*2
slave2:10.10.32.3 mysql5.6 core2*2
atlas:10.10.32.4 mysql5.6core2*2
一.Atlas安装
1.rpm安装
在https://github.com/Qihoo360/Atlas/releases下载最新安装包Atlas-2.2.1.el6.x86_64.rpm,然后执行:
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
注意:
(1)Atlas只能安装运行在64位系统上
(2)Centos 5.X安装 Atlas-XX.el5.x86_64.rpm,Centos 6.X安装Atlas-XX.el6.x86_64.rpm(若不需要跨机器分表,请安装非sharding版本Atlas-2.2.1)
(3)后端mysql版本应大于5.1,建议使用mysql5.6
2.配置文件修改
Atlas运行需要依赖一个配置文件(test.cnf)。在运行Atlas之前,需要对该文件进行配置。Atlas的安装目录是/usr/local/mysql-proxy,进入安装目录下的conf目录,可以看到已经有一个名为test.cnf的默认配置文件,我们只需要修改里面的某些配置项,不需要从头写一个配置文件。
配置范例及说明如下:
vim /usr/local/mysql-proxy/conf/test.cnf[mysql-proxy]#带#号的为非必需的配置项目#管理接口的用户名admin-username = admin#管理接口的密码admin-password = admin#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔proxy-backend-addresses = 10.10.32.1:3306#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔#proxy-read-only-backend-addresses = 127.0.0.1:[email protected]proxy-read-only-backend-addresses = 10.10.32.2:[email protected], 10.10.32.3:[email protected]#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!#pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=pwds = atlas:/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 = 2#日志级别,分为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)pwds = atlas:/iZxz+0GRoA=
此处的用户名密码必须在master,slave1,slave2上设置,因为所有的读写是通过这个账号执行的。另/usr/local/mysql-proxy/bin/encrypt是对密码进行加密,如:
[[email protected] bin]# ./encrypt 123456/iZxz+0GRoA=(2)proxy-read-only-backend-addresses可以对后端mysql从库设置负载均衡的权重,这个根据服务器的配置更改。
(3)event-threads项设置过小无法充分发挥多核CPU的性能,过大造成不必要的线程切换开销,推荐设置为CPU的核数。
(4)client-ips可设置ip过滤。
(5)lvs-ips若有lvs对Atlas进行负载均衡时设置。
3.通过管理接口管理后端mysql
[[email protected] ~]# mysql -h10.10.32.4 -P2345 -uadmin -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1Server version: 5.0.99-agent-adminCopyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> select * from help;+----------------------------+---------------------------------------------------------+| command | description |+----------------------------+---------------------------------------------------------+| SELECT * FROM help | shows this help || SELECT * FROM backends | lists the backends and their state || SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx's id || SET ONLINE $backend_id | online backend server, ... || ADD MASTER $backend | example: "add master 127.0.0.1:3306", ... || ADD SLAVE $backend | example: "add slave 127.0.0.1:3306", ... || REMOVE BACKEND $backend_id | example: "remove backend 1", ... || SELECT * FROM clients | lists the clients || ADD CLIENT $client | example: "add client 192.168.1.2", ... || REMOVE CLIENT $client | example: "remove client 192.168.1.2", ... || SELECT * FROM pwds | lists the pwds || ADD PWD $pwd | example: "add pwd user:raw_password", ... || ADD ENPWD $pwd | example: "add enpwd user:encrypted_password", ... || REMOVE PWD $pwd | example: "remove pwd user", ... || SAVE CONFIG | save the backends to config file || SELECT VERSION | display the version of Atlas |+----------------------------+---------------------------------------------------------+16 rows in set (0.00 sec)登录管理接口后,我们可以根据提示进行mysql的上下线等操作,非常方便。
4.读写分离简单测试
[[email protected] ~]# mysql -h10.10.32.4 -P1234 -uatlas -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 257Server version: 5.0.81-log MySQL Community Server (GPL)Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> create database test;Query OK, 1 row affected (0.00 sec)mysql> show variables like 'server_id';+---------------+-------+| Variable_name | Value |+---------------+-------+| server_id | 3 |+---------------+-------+1 row in set (0.00 sec)mysql> show variables like 'server_id';+---------------+-------+| Variable_name | Value |+---------------+-------+| server_id | 2 |+---------------+-------+1 row in set (0.00 sec)mysql> show variables like 'server_id';+---------------+-------+| Variable_name | Value |+---------------+-------+| server_id | 3 |+---------------+-------+1 row in set (0.00 sec)mysql> show variables like 'server_id';+---------------+-------+| Variable_name | Value |+---------------+-------+| server_id | 2 |+---------------+-------+1 row in set (0.00 sec)mysql>登录atlas后,可以建库,我们查看slave1和slave2的server_id,发现他们是1:1平均分配的,这正符合我们设置的“proxy-read-only-backend-addresses = 10.10.32.2:[email protected], 10.10.32.3:[email protected],从库的负载均衡权重都是1,因此是平均分配。
当然,我们可以用sysbench来测试其性能。
1.安装sysbench
在此我们选择sysbench-0.4
yum install bzr cd /usr/local/srcbzr branch lp:~sysbench-developers/sysbench/0.4 sysbench-0.4 cd sysbench-0.4./configure --prefix=/usr/local/sysbench-0.4 --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib64/mysqlmakemake install注意:若找不到/usr/include/mysql需要yum install myql-devel
2.测试
在此我们主要测试配置文件中event-threads参数对Atlas的影响,并找出最优值。
mysql系统的两项数据指标:QPS和每条SQL请求平均处理时间。通过sysbench发送select请求,具体操作过程如下:
注意:event-threads的参数设置为CPU个数的1,2,3,4倍,因此为2,4,6,8。
当cpu个数分别为select-2,select-4,select-6,select-8时,sysbench并发测试线程分别为16,32,64,128
(1)prepare阶段
[[email protected] ~]# /usr/local/sysbench-0.4/bin/sysbench --test=oltp --num-threads=8 --max-requests=8000 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=test --mysql-host=10.10.32.4 --mysql-port=1234 --mysql-user=atlas --mysql-password=123456 --oltp-nontrx-mode=select --db-ps-mode=disable preparesysbench 0.4.12: multi-threaded system evaluation benchmarkCreating table 'sbtest'...Creating 10000 records in table 'sbtest'...上述命令是sysbench执行80000次随机select操作,这80000次操作都是非事务的。 通过修改 --oltp-nontrx-mode 选项,可以执行update和insert操作。 通过修改 --num-threads 参数,可以调整并发测试线程的个数。
此时sysbench会自动在test数据库里建表:
CREATE TABLE sbtest ( id int(10) unsigned NOT NULL AUTO_INCREMENT, k int(10) unsigned NOT NULL DEFAULT '0', c char(120) NOT NULL DEFAULT '', pad char(60) NOT NULL DEFAULT '', PRIMARY KEY (id), KEY k (k)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1(2)run阶段
[[email protected] ~]# /usr/local/sysbench-0.4/bin/sysbench --test=oltp --num-threads=8 --max-requests=8000 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=test --mysql-host=10.10.32.4 --mysql-port=1234 --mysql-user=atlas --mysql-password=123456 --oltp-nontrx-mode=select --db-ps-mode=disable run此时会有以下输出:
如上图所示:
12917.01是每秒事物数,代表测试结果的评判标准即TPS(QPS)
0.78是95%的平均耗时,即我们的请求平均处理时间。
(3)cleanup阶段,清除测试数据。
[[email protected] ~]# /usr/local/sysbench-0.4/bin/sysbench --test=oltp --num-threads=8 --max-requests=8000 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=test --mysql-host=10.10.32.4 --mysql-port=1234 --mysql-user=atlas --mysql-password=123456 --oltp-nontrx-mode=select --db-ps-mode=disable cleanupsysbench 0.4.12: multi-threaded system evaluation benchmarkDropping table 'sbtest'...Done.我们每次测试得到的数据通过图表得出:
QPS曲线:
平均处理时间曲线:
从以上两个表中得出以下结论(符合官方结论):
(1)当event-threads设置为CPU个数的两倍时,QPS提升比较明显;3倍4倍时QPS也有提升,但是并不非常明显;而对于SQL的处理时间,通过提高event-threads参数没有明显差别。
所以官方建议使用者:如果追求Atlas处理SQL请求时的QPS,将event-threads值设置为CPU个数的2-4倍。如果追求Atlas处理SQL请求的完成时间,将event-threads值设置为CPU个数即可。
Atlas系统属于CPU密集型任务,相对于磁盘IO和内存占用率而言,Atlas对CPU消耗显得最为明显,所以建议在部署Atlas的时候需要优先考虑服务器的CPU性能。
版权声明:本文为博主原创文章,未经博主允许不得转载。