Atlas的安装与配置

这两天在学习mysql的读写分离和负载均衡,尝试了主从模式和mysql cluter,最后还是选择了一主多从,然后读写分离,这比较适合读量大的网站。然后对于mysql的负载均衡器,起先尝试了一下SQL请求路由器 Amoeba,读写分离不错,但是不支持事务,因为我测试的网站是采取spring mvc+hibernate的。然后看到了360公司的MySQL中间层 Atlas,这是支持事务的,把自己的安装和配置记录一下。

首先,先去下载Altas的rpm包,下载地址:https://github.com/Qihoo360/Atlas/releases

要看清楚版本,centos 5.x:Atlas-1.0.3.el5.x86_64.rpm    centos 6.x:

我的系统是centos 6.4 ,所以下载Atlas-1.0.3.el6.x86_64.rpm

千万别搞错了,否则最后启动会出错。大家也可以采取源码编译安装,不过rpm安装比较省时省力,而且简单。

下载rpm 
wget https://github.com/Qihoo360/Atlas/releases/download/1.0.3/Atlas-1.0.3.el6.x86_64.rpm

推荐使用2.2版本http://pan.baidu.com/s/1jGZSiwA
安装 

rpm -i Atlas-2.2.0.3.el6.x86_64.rpm

安装的目录是/usr/local/mysql-proxy

主数据库服务器:192.168.6.119   (ggggg.test1有3条数据,为了后面验证读写分离)

从数据库服务器:192.168.6.120    (ggggg.test1有2条数据)
proxy服务器:192.168.6.119(机器有限,就布置在主上面了)

conf文件夹下有一个自带的配置文件test.cnf,我们可以直接修改,下面是我修改的

  1. [root@localhost conf]# more test.cnf
  2. [mysql-proxy]

  3. #带#号的为非必需的配置项目

  4. #管理接口的用户名       --进入atlas后台管理的用户
  5. admin-username = root
  6.  
  7. #管理接口的密码        ---密码
  8. admin-password = haodai123

  9. #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
  10. proxy-backend-addresses = 192.168.6.119:3306

  11. #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号
  12. 分隔
  13. proxy-read-only-backend-addresses = 192.168.6.121:3306@1

  14. #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密(./encrypt password),下行的user1和user2为示例,
  15. 将其替换为你的MySQL的用户名和加密密码!
  16. pwds = root:osdCRatAwJoa8s/oWZlMvQ==, root:osdCRatAwJoa8s/oWZlMvQ==  ---这两个是主从上面的数据库用户以及密码,我为了方便就配置的root

  17. #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为
  18. true,true后面不能有空格。
  19. daemon = true

  20. #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会
  21. 自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空
  22. 格。
  23. #keepalive = flase

  24. #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
  25. event-threads = 4

  26. #日志级别,分为message、warning、critical、error、debug五个级别
  27. log-level = message

  28. #日志存放的路径
  29. log-path = /usr/local/mysql-proxy/log

  30. #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且
  31. 实时写入磁盘,默认为OFF
  32. #sql-log = OFF

  33. #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输
  34. 出全部日志。
  35. #sql-log-slow = 10

  36. #实例名称,用于同一台机器上多个Atlas实例间的区分
  37. instance = test

  38. #Atlas监听的工作接口IP和端口     ---就是我们对主从进行sql操作的登陆端口
  39. proxy-address = 0.0.0.0:1234

  40. #Atlas监听的管理接口IP和端口     ---进入atlas后台管理的端口
  41. admin-address = 0.0.0.0:2345

  42. #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设
  43. 置该项
  44. #tables = person.mt.id.3

  45. #默认字符集,设置该项后客户端不再需要执行SET NAMES语句
  46. charset = utf8

  47. #允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列
  48. 表中的IP连接
  49. #client-ips = 127.0.0.1, 192.168.1

  50. #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
  51. #lvs-ips = 192.168.1.1

启动
[root@localhost conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test start      ---这个test  是test.conf
如果上面的启动不了,  最后,进入到bin文件夹下,启动Altas
./mysql-proxy --defaults-file=../conf/test.cnf


对应的log下面会生成以instance.log日志
[root@localhost log]# ls
test.log  test.pid        ---因为 instance=test


查看
[root@localhost conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test status    ---conf中instance是test所以这是test,如果是XX 这就写xx
MySQL-Proxy of test is running (5305)

关闭
[root@localhost conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test stop 


登陆管理端口

  1. [root@localhost ~]# mysql -uroot -phaodai123 -P2345 -h127.0.0.1
    Warning: Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.0.99-agent-admin


    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.


    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.


    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


    mysql> show databases;
    ERROR 1105 (07000): use 'SELECT * FROM help' to see the supported commands
    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)



登陆数据库检查读写分离

  1. [root@localhost ~]# mysql -uroot -pESBecs00 -P1234 -h127.0.0.1     ----通过工作接口端口登陆数据库
  2. [root@localhost ~]# mysql -uroot -pESBecs00 -P1234 -h192.168.6.119   -----从别的主机登陆,程序层登陆
    Warning: Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.0.81-log MySQL Community Server (GPL)


    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.


    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.


    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | amobe2             |
    | bbbbbb             |
    | ch                 |
    | ggggg              |
    | hellodb            |
    | mysql              |
    | performance_schema |
    +--------------------+
    8 rows in set (0.01 sec)


    mysql> select *  from ggggg.test1;   ---看到没。是从从库里面读出来的
    +------+
    | id   |
    +------+
    |   10 |
    |  120 |
    +------+
    2 rows in set (0.04 sec)


不信我们打开主从的general_log
altas查询多查询几遍
mysql> select *  from ggggg.test1;
+------+
| id   |
+------+
|   10 |
|  120 |
+------+
2 rows in set (0.00 sec)

查看从库的generallog
150923  6:55:39   536 Query     select *  from ggggg.test1
150923  6:57:34   536 Query     select *  from ggggg.test1
150923  6:57:35   536 Query     select *  from ggggg.test1




atlas执行insert写操作
mysql> insert into ggggg.test1 values(130);
Query OK, 1 row affected (21.94 sec)

查看主库的generallog日志
151120 15:38:08    13 Connect   root@192.168.6.119 on 
151120 15:38:10    13 Query     SET CHARACTER_SET_CONNECTION=utf8
                   13 Query     SET CHARACTER_SET_RESULTS=utf8
                   13 Query     SET CHARACTER_SET_CLIENT=utf8
                   13 Query     insert into ggggg.test1 values(130)



到此测试完毕,读写分离成功!!!!!



补充:详细的配置文件说明
  1. 配置文件

  2. Atlas运行需要依赖一个配置文件(test.cnf)。在运行Atlas之前,需要对该文件进行配置。Atlas的安装目录是/usr/local/mysql-proxy,进入安装目录下的conf目录,可以看到已经有一个名为test.cnf的默认配置文件,我们只需要修改里面的某些配置项,不需要从头写一个配置文件。

  3. 1、 配置范例及说明如下

  4. [mysql-proxy]

  5. (必备,默认值即可)管理接口的用户名

  6. admin-username= root

  7. (必备,默认值即可)管理接口的密码

  8. admin-password= password

  9. (必备,默认值即可)实现管理接口的Lua脚本所在路径

  10. admin-lua-script= /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua

  11. (必备,根据实际情况配置)主库的IP和端口,可设置多项,用逗号分隔(注:Atlas现在支持多master,但不建议使用,估计还不太完善)

  12. proxy-backend-addresses= 192.168.0.1:3306

  13. (非必备,根据实际情况配置)从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔。proxy-read-only-backend-addresses = 192.168.0.2:3306,192.168.0.3:3306

  14. (必备,根据实际情况配置)用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,用户名与密码之间用冒号分隔。主从数据库上需要先创建该用户并设置密码(用户名和密码在主从数据库上要一致)。比如用户名为myuser,密码为mypwd,执行./encryptmypwd结果为HJBoxfRsjeI=,则设置如下行所示:

  15. pwds= myuser: HJBoxfRsjeI=

  16. (必备,默认值即可)Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true

  17. daemon= true

  18. (必备,默认值即可)设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true

  19. keepalive= true

  20. (必备,根据实际情况配置)工作线程数,推荐设置成系统的CPU核数

  21. event-threads= 4

  22. (必备,默认值即可)日志级别,分为message、warning、critical、error、debug五个级别

  23. log-level= message

  24. (必备,默认值即可)日志存放的路径

  25. log-path= /usr/local/mysql-proxy/log

  26. (必备,根据实际情况配置)SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME用于调试,代表记录SQL日志且实时写入磁盘,默认为OFF

  27. sql-log= OFF

  28. (必备)实例名称,用于同一台机器上多个Atlas实例间的区分

  29. instance= test

  30. (必备,默认值即可)Atlas监听的工作接口IP和端口

  31. proxy-address= 0.0.0.0:1234

  32. (必备,默认值即可)Atlas监听的管理接口IP和端口admin-address = 0.0.0.0:2345

  33. (可选项,可不设置)分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项,子表需要事先建好,子表名称为表名数字,数字范围为[0,子表数-1],如本例里,子表名称为mt_0、mt_1、mt_2

  34. tables= person.mt.id.3

  35. (可选项,可不设置)默认字符集,若不设置该项,则默认字符集为latin1

  36. charset= utf8

  37. (可选项,可不设置)允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接

  38. client-ips= 127.0.0.1, 192.168.1.

  39. (可选项,极少需要)Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置

  40. lvs-ips= 192.168.1.1

  41.       

  42. 2、 重要配置说明

  43. 以下几项配置参数对性能和正常运行起到重要作用,需要正确设置。

  44. (1)线程数

  45. event-threads项设置,过小无法充分发挥多核CPU的性能,过大造成不必要的线程切换开销,推荐设置为CPU的核数。

  46. (2)最小空闲连接数(2.x以上版本不需要该项,1.x版本需要)

  47. min-idle-connections项设置,过小则在高并发下会有报错,过大虽然不报错但在测试时不容易看出读写分离效果,推荐设置为比客户端的并发峰值稍大。

  48. a、 该参数用来实现连接数控制功能。

  49. b、 该值应设为event-threads的整数倍(不是整数倍的情况会自动向上取整数倍),且不低于实际使用时的并发量,若小于event-threads会没有可用连接导致报错。

  50. c、 Atlas为每台DB建立一个连接池。

  51. d、 当有客户端连接Atlas时,Atlas会先在第一台DB上建立连接,直到第一台DB连接池内的空闲连接数达到min-idle-connections,再在下一台DB上建立连接,直到所有DB连接池内的空闲连接数都达到min-idle-connections,便不再建立新连接,而开始复用连接池内的连接。

  52. e、 Atlas启动时,配置里的所有DB会按照主库在前从库在后的顺序在内存里排好次序,所以初始阶段会先在主库上建立连接。

  53. f、 Atlas在运行过程中,某连接如果触发了DB的wait_timeout,Atlas会把该连接销毁,如果因此而导致连接池内的空闲连接数低于min-idle-connections,Atlas将在客户端下一次连接时重新在该DB上建立连接。

  54. g、 以上策略是因为在客户端与MySQL的交互过程中,connect和query是两个独立的阶段,在connect阶段Atlas需要决定在哪台DB上建立连接(或从哪台DB的连接里取出连接复用),而到了query阶段Atlas才能知道客户端发来的SQL语句是读还是写,这就决定了必须在主库上预留一定数量的连接供写语句使用。

  55. h、 初使用者常常会误认为读写分离不起作用,其实是由于min-idle-connections设置得较大,而测试时只连接了一次或几次,这样的话建立的连接都在主库上,从库上还没有建立连接,此时发送读语句,自然也只能打向主库。只有在连接次数超过了min-idle-connections时,从库上才开始建立连接,从库上有连接后,读语句才能打向从库,此时读写分离才能生效。

  56. i、 因此在测试读写分离时,可以将min-idle-connections设得较小,这样可以在少数几次连接后就看到读写分离的效果,而在线上运行时,应将min-idle-connections调大,防止并发量高峰时取不到可用连接导致前端报错。

  57. j、 DB的wait_timeout建议不要设得太小,因为Atlas有连接池机制,不会一直新建连接导致DB上连接数过多,所以DB不需要依赖wait_timeout防止过多连接,如果wait_timeout太小会导致Atlas的一些不必要的销毁超时连接的开销。

  58. 上面的配置范例是针对Atlas2.X版本,没有该选项。对于Atlas1.X版本的配置文件,需要加入该配置选项。

  59. (3)pwds

  60. a、该参数用来实现多用户的权限控制功能。Atlas2.x版本中必须配置该项参数。

  61. b、密码使用PREFIX/bin/encrypt程序加密,避免有人打开配置文件就能看到所有用户的密码,只是简单地防护一下,并不能防止专门的恶意破解。

  62. c、在Atlas的内存中,多个用户共用连接池,池内同时有多个用户名及使用其密码认证过的连接,在A用户连接Atlas时,从池中取出的连接有可能是B用户认证过的,这就需要使用A用户的密码将此连接change为A用户的认证连接,否则直接给A用户使用该连接就会引发权限问题。

  63. d、如果将各用户的连接池独立,则无法与min-idle-connections机制良好配合,会造成连接数一直上涨的问题。(此项说明只针对Atlas1.x版本。在Atlas2.x版本中当连接池中没有可用连接时,Atlas支持自建连接,已经不需要min-idle-connections机制。)

  64. e、官方版本中多用户也是共用连接池,但没有实现change机制,因此经常发生A用户看到B用户的库和表的现象。

  65. (4)client-ips

  66. a、该参数用来实现IP过滤功能。

  67. b、在传统的开发模式中,应用程序直接连接DB,因此DB会对部署应用的机器(比如web服务器)的IP作访问授权。

  68. c、在引入中间层后,因为连接DB的是Atlas,所以DB改为对部署Atlas的机器的IP作访问授权,如果任意一台客户端都可以连接Atlas,就会带来潜在的风险。

  69. d、client-ips参数用来控制连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔写在一行上即可,如client-ips=192.168.1.2,192.168.2,这就代表192.168.1.2这个IP和192.168.2.*这个C段的IP可以连接Atlas,其他IP均不能连接。

  70. e、如果该参数不设置,则任意IP均可连接Atlas。

  71. f、如果设置了client-ips参数,且Atlas前面挂有LVS,则必须设置lvs-ips参数,否则可以不设置lvs-ips。

  72. (5)lvs-ips

  73. a、该参数是Atlas前面挂接的LVS的物理网卡的IP,不是虚IP。

  74. b、该参数用来实现平滑重启功能,否则在重启Atlas的瞬间的那些SQL请求都会失败,如果认为应用可以接受瞬间的报错则可以直接重启。

  75. c、平滑重启的条件:至少有两台配置相同的Atlas,且挂接在LVS之后。

  76. d、平滑重启的原理:LVS周期性地对后端Atlas的存活检测有两种方式,一是直接去探测端口是否可连接,二是执行一个脚本,这个脚本会去尝试连接Atlas,通过脚本的返回值来决定每个后端是否可用。Atlas有两种运行状态,通常为online,可通过发信号将其置为offline。Atlas检测到来请求的IP是LVS的网卡IP时,如果处于online状态,就向LVS的检测脚本返回online,如果处于offline状态,就向脚本返回offline。比如我现在因为某种原因需要重启一台Atlas,但直接重启势必导致瞬间的SQL请求全部失败,对前端应用造成影响。因此我先发下线信号将Atlas置为offline状态,当LVS的检测脚本发现返回值是offline时,便将这台Atlas摘除,从此时开始便没有新的请求导向这台Atlas。等到已经打向这台Atlas的SQL请求处理完毕后(这是一个很短的时间),就可以安然重启Atlas而不必担心对前端造成影响了。

  77. e、对于大多数应用来说,可能并没有那么敏感,因此不使用平滑重启功能而直接重启也是可以接受的。但在设置了client-ips参数的情况下,必须设置lvs-ips参数,否则LVS的物理网卡的IP会被Atlas拒绝,如果未设置client-ips参数,说明不开启IP过滤功能,则lvs-ips也可以不设置。

  78.  

  79. 3、 可选配置说明

  80. 以下几项可以设置,也可以使用默认值,区别不大。

  81. (1)Atlas的工作端口

  82. proxy-address项配置,例如proxy-address= 0.0.0.0:1234代表客户端应该使用1234这个端口连接Atlas来发送SQL请求。

  83. (2)Atlas的管理端口

  84. admin-address项配置,例如admin-address= 0.0.0.0:2345代表DBA应该使用2345这个端口连接Atlas来执行运维管理操作。

  85. (3)管理接口的用户名和密码

  86. admin-username项和admin-password项设置,这两项是用来进入Atlas的管理界面的,与后端连接的MySQL没有关系,所以可以任意设置,不需要MySQL在配置上做任何改动。

  87. (4)日志级别

  88. 以log-level项配置,分为message、warning、critical、error、debug五个级别。

  89. (5)日志路径

  90. 以log-path项配置,如log-path= /usr/local/mysql-proxy/log。




参考资料:

https://github.com/Qihoo360/Atlas

https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E5%AE%89%E8%A3%85

https://github.com/Qihoo360/Atlas/wiki/Atla%E9%83%A8%E5%88%86%E9%85%8D%E7%BD%AE%E5%8F%82%E6%




 Atlas结合MHA(+keepalive)测试

由于我们数据库架构是主从复制+MHA实现主库的高可用。如果主库挂了,这时atlas怎么处理呢?经过详细的测试,大致处理步骤如下:


【说明】

1、主库上绑定vip,在atlas配置文件中主库设置为vip地址,这样无论主库怎么切换,最终的vip不会改变。atlas永远把vip对应的服务器当作主库。

2、由于备用主库原来是从库,即在atlas配置文件中是作为从库的,故当接管为主库时,这时该库既可以写入也可以读。故需要手工移除从库的读功能。(到管理界面,remove backend idx)

3、如果需要修复原主库,那么原主库作为新主库的从库存在。可以手工加入atlas中(add slave ip:port)

【结论】:可以很好的支持MHA切换,但是需要注意以上第2点内容。


五、Atlas性能测试
sysbench执行800000次随机select操作,这80000次操作都是非事务的。 通过修改 --oltp-nontrx-mode 选项,可以执行update和insert操作。 通过修改 --num-threads 参数,可以调整并发测试线程的个数。

通过atlas链接mysql加压
[root@NEW-APP-MYSQL-SLAVE yum.repos.d]# sysbench --test=oltp --max-requests=800000 --num-threads=10 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=test --mysql-host=127.0.0.1 --mysql-port=1234 --mysql-user=username --mysql-password=password--oltp-nontrx-mode=select --db-ps-mode=disable --max-time=3600 run    (preprae run cleanup)


通过直连mysql加压测试
sysbench --test=oltp --max-requests=800000 --num-threads=10 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=test --mysql-host=192.168.1.6 --mysql-port=3307 --mysql-user=atlas_user --mysql-password=ionm3aUwK98N45nH --oltp-nontrx-mode=select --db-ps-mode=disable --max-time=3600 run






从表一可以看出,当sysbench的并发测试线程较少时,连接Atlas和直连DB的QPS差距较大。 这主要是因为当sysbench并发线程少时,Atlas的性能没有得到充分的发挥, sysbench只有很少的线程向Atlas发送请求,此时网络延迟对QPS的影响是最主要的。 当sysbench的并发测试线程较大时,此时Atlas的性能就得到了充分的发挥, 此时QPS的对比是连接Atlas与直连DB性能对比的真实的反应,网络延迟对QPS的影响作用就显得很小了。 从表一数据来看,通过Atlas发送select请求时的QPS是直连DB时60%左右, 而update和insert请求对应的QPS则更高一些,相当于直连DB时的80%左右。 由此看来利用Atlas转发SQL请求带来的性能下降虽有下降,但完全可以接受。

从表二可以看出,在sysbench的并发测试线程较少的情况下,连接Atlas和直连DB时完成每条SQL操作的时间差距较大, 造成这种结果的原因也是由于Atlas性能未充分发挥,网络延迟起了主要作用。 当sysbench并发测试线程较高时,Atlas的性能充分发挥,此时完成每条SQL操作的时间差距对比,才是Atlas的真正性能反映。 通过Atlas发送SQL请求时的每条操作完成时间大约是直连DB时1.5倍,由此看来利用Atlas转发SQL请求带来的时间延迟不是非常明显,同样也是可以接受的。




六:不完善之处

  1. 1.不支持全表的update和delete
  2.    mysql> update atltab set id=id+1;
    ERROR 1105 (07000): Proxy Warning - Syntax Forbidden
    mysql> update atltab set id=578;
    ERROR 1105 (07000): Proxy Warning - Syntax Forbidden
      
  3.  解决办法 加where
  4.  mysql> update atltab set id=id+1 where 1>0;
  5. Query OK, 1 row affected (0.05 sec)
    Rows matched: 1  Changed: 1  Warnings: 0




参考文档:
https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95
http://imysql.cn/2013/10/14/360-atlas-mysql-proxy-testing.shtml



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29096438/viewspace-1842085/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29096438/viewspace-1842085/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值