• mysql代理之Atlas


    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]
    
    #带#号的为非必需的配置项目
    
    #管理接口的username
    admin-username = admin
    
    #管理接口的密码
    admin-password = admin
    
    #Atlas后端连接的MySQL主库的IP和port,可设置多项,用逗号分隔
    proxy-backend-addresses = 10.10.32.1:3306
    
    #Atlas后端连接的MySQL从库的IP和port。@后面的数字代表权重。用来作负载均衡,若省略则默觉得1。可设置多项,用逗号分隔
    #proxy-read-only-backend-addresses = 127.0.0.1:3305@1
    proxy-read-only-backend-addresses = 10.10.32.2:3306@1, 10.10.32.3:3306@1
    
    #username与其相应的加密过的MySQL密码。密码使用PREFIX/bin文件夹下的加密程序encrypt加密,下行的user1和user2为演示样例,将其替换为你的MySQL的username和加密密码!

    #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和port proxy-address = 0.0.0.0:1234 #Atlas监听的管理接口IP和port 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=

    此处的username密码必须在master。slave1。slave2上设置。由于全部的读写是通过这个账号执行的。另/usr/local/mysql-proxy/bin/encrypt是对密码进行加密,如:

    [root@test 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

    [root@test ~]#  mysql -h10.10.32.4 -P2345 -uadmin -p
    Enter password: 
    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, 2015, 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> 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.读写分离简单測试

    [root@test ~]#  mysql -h10.10.32.4 -P1234 -uatlas -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 257
    Server 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 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> 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:3306@1, 10.10.32.3:3306@1”,从库的负载均衡权重都是1。因此是平均分配。

    当然,我们能够用sysbench来測试其性能。

    1.安装sysbench

    在此我们选择sysbench-0.4

    yum install bzr  
    cd /usr/local/src
    bzr 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/mysql
    make
    make 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阶段

    [root@test ~]#  /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 prepare
    sysbench 0.4.12:  multi-threaded system evaluation benchmark
    
    Creating 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阶段

    [root@test ~]#  /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阶段,清除測试数据。

    [root@test ~]#  /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 cleanup
    sysbench 0.4.12:  multi-threaded system evaluation benchmark
    
    Dropping 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性能。



  • 相关阅读:
    var 全局变量 局部变量
    C#的发展历程第五
    优雅的处理Redis访问超时
    《集体智慧编程》读书笔记10
    《集体智慧编程》读书笔记9
    C#码农的大数据之路
    C#码农的大数据之路
    C#码农的大数据之路
    C#码农的大数据之路
    .NET遇上Docker
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8406840.html
Copyright © 2020-2023  润新知