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
此时会有以下输出:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
如上图所看到的:
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曲线:
平均处理时间曲线:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
从以上两个表中得出下面结论(符合官方结论):
(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性能。
mysql代理之Atlas的更多相关文章
- 在 Pisa-Proxy 中,如何利用 Rust 实现 MySQL 代理
一.前言 背景 在 Database Mesh 中,Pisanix 是一套以数据库为中心的治理框架,为用户提供了诸多治理能力,例如:数据库流量治理,SQL 防火墙,负载均衡和审计等.在 Pisanix ...
- MySQL主从复制与Atlas读写分离
配置主从复制 1. 增加主从配置 # 主库配置文件 server-id = 1 log-bin = /var/lib/mysql/mysql-bin expire_logs_days = 10 ski ...
- mySql 数据库中间件 atlas的使用
MySQL 中间件Atlas 实现读写分离 原创 MySQL 作者:神谕丶 时间:2016-08-05 17:07:51 2410 0 〇 Atlas架构介绍 <span "=&q ...
- 关于PHP高并发抢购系统设计
内容并发抢购系统注意事项高并发架构设计描述程序端核心代码实现订单流程mysql 端并发解决方案注意事项(1)高并发环境下,对于服务器cup.内存.网络宽带使用率会瞬间暴涨,需要注意对同服务器上其他应用 ...
- Nginx配置WebService、MySQL、SQL Server、ORACLE等代理
首先介绍一下Nginx的基本使用: 注意不要直接双击nginx.exe,这样会导致修改配置后重启.停止nginx无效,需要手动关闭任务管理器内的所有nginx进程 在nginx.exe目录,打开命令行 ...
- Mysql读写分离——主从数据库+Atlas
mysql集群 最近在参加项目开发微信小程序后台,由于用户数量巨大,且后台程序并不是很完美,所以对用户的体验很是不友好(简单说就是很卡).赶巧最近正在翻阅<大型网站系统与Java中间件实践> ...
- Azure SLB + httpd + ILB + HAProxy + Atlas + MySQL
为了测试一个环境,需要在Azure上搭建高可用的LAMP架构.但要求MySQL的中间件Atlas采用主备的模式.在数据中心一般采用Keepalive+VIP的模式,通过浮动地址对外提供服务. 但在云环 ...
- MySQL 中间层 Atlas MySQL
Atlas MySQL 详细介绍 Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0. ...
- mysql主从之基于atlas读写分离
一 mysql读写分离的概念 写在主库,主库一般只有一个,读可以分配在多个从库上,如果写压力不大的话,也能把读分配到主库上. 实现是基于atlas实现的,atlas是数据库的中间件,程序只需要连接at ...
随机推荐
- LinkedList中将对象按照某一属性排序
例如,链表 treelist 声明如下: LinkedList<TreeNode> treelist = new LinkedList<TreeNode>(); 其中 Tree ...
- 通过图形化工具来画shape
前两天一个哥们分享了十分好用的图形化工具,这样我们就能实时的看到自己用代码写出来的shape是怎么样的了,更牛的是它可以让我们自己去设定值,最后生成代码,这样我们为什么要去自己写shape呢?如果一个 ...
- Android5.0新控件RecyclerVIew的介绍和兼容使用的方法
第一部分 RecyclerVIew是一个可以替代listview和Gallery的有效空间而且在support-v7中有了低版本支持,具体使用方式还是规规矩矩的适配器加控件模式.我们先来看看官网的介绍 ...
- [Android Pro] 深入理解函数的调用过程——栈帧
cp :http://blog.csdn.net/x_perseverance/article/details/78897637 每一个函数被调用时,都会为函数开辟一块空间,这块空间就称为栈帧. 首先 ...
- spring boot整合slf4j-log日志
原文地址:https://blog.csdn.net/u011271894/article/details/75735915 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...
- STM32学习笔记之EXTI(外部中断)
參考资料:STM32数据手冊.网络资料 =========================================切割线==================================== ...
- 奇怪吸引子---AnishchenkoAstakhov
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- 第二十五章 springboot + hystrixdashboard
注意: hystrix基本使用:第十九章 springboot + hystrix(1) hystrix计数原理:附6 hystrix metrics and monitor 一.hystrixdas ...
- C++ 反射机制的简单实现
C++并不支持反射机制,只能自己实现. 如果需要实现字字符串到函数到映射,一定要使用到函数指针. 简单实现反射机制,根据字符串来构造相应到类.主要有以下几点: (1) 可以使用map保存字符从到函数指 ...
- impala-shell常用命令
1.查看相关内网IP: cat /etc/hosts 2.进入impala: impala-shell; 3.显示数据库,数据表 show databases: show tables; 4.查看表结 ...