【引言】
Atlas是希腊神话被罚作苦役的大力神,在希腊神话中当巨人族首领泰坦反叛奥林匹斯众神战败后支持他的大多数都被打入地狱的黑暗深渊,而Atlas则被罚去西方站在地母盖娅身上并擎住天父乌拉诺斯,以免他和地母XX。
所以,Atlas具有“擎天柱”、“擎天神”之意。经常被技术厂商用作产品系统的名称,如早期centrality 的GPS芯片Atlas I 、Atlas ||、Atlas |||。华为也有Atlas系列的AI处理器,阿里巴巴移动团队自研的手机淘宝安卓客户端容器化框架也叫Atlas。
这里要介绍的Atlas是奇虎360基于MySQL proxy开发的一个中间件,Atlas位于Client和MySQL Server中间层,可以作为读写分离,分库分表中间件。对于MySQL Server而言,Atlas像是个Client,而对于Client而言,Atlas则是一个DB server。
Atlas官方链接: https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
Atlas下载链接: https://github.com/Qihoo360/Atlas/releases
下载Atlas会有两个版本,其中有个分表的版本,但是这个需要其他的依赖,我这边不需要分表这种需求,所以安装普通的版本
Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm
Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm
首先进入Linux的Home目录下,下载非分表的安装包
[root@localhost ~]# cd /home/
[root@localhost home]# wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
下载好了之后,进行安装
[root@localhost home]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:Atlas ########################################### [100%]
安装好了,它会默认在”/usr/local/mysql-proxy”下给你生成4个文件夹,以及需要配置的文件,如下:
[root@localhost home]# ll /usr/local/mysql-proxy/
total 16
drwxr-xr-x. 2 root root 4096 Dec 28 10:47 bin
drwxr-xr-x. 2 root root 4096 Dec 28 10:47 conf
drwxr-xr-x. 3 root root 4096 Dec 28 10:47 lib
drwxr-xr-x. 2 root root 4096 Dec 17 2014 log
bin目录下放的都是可执行文件
1. “encrypt”是用来生成MySQL密码加密的,在配置的时候会用到
2. “mysql-proxy”是MySQL自己的读写分离代理
3. “mysql-proxyd”是360弄出来的,后面有个“d”,服务的启动、重启、停止。都是用他来执行的
conf目录下放的是配置文件
1. “test.cnf”只有一个文件,用来配置代理的,可以使用vim来编辑
lib目录下放的是一些包,以及Atlas的依赖
log目录下放的是日志,如报错等错误信息的记录
进入bin目录,使用encrypt来对数据库的密码进行加密,我的MySQL数据的用户名是buck,密码是hello,我需要对密码进行加密
[root@localhost bin]# ./encrypt hello
RePBqJ+5gI4=
配置Atlas,使用vim进行编辑
[root@localhost conf]# cd /usr/local/mysql-proxy/conf/
[root@localhost conf]# vim test.cnf
进入后,可以在Atlas进行配置,360写的中文注释都很详细,根据注释来配置信息,其中比较重要,需要说明的配置如下:
这是用来登录到Atlas的管理员的账号与密码,与之对应的是“#Atlas监听的管理接口IP和端口”,也就是说需要设置管理员登录的端口,才能进入管理员界面,默认端口是2345,也可以指定IP登录,指定IP后,其他的IP无法访问管理员的命令界面。方便测试,我这里没有指定IP和端口登录。
[mysql-proxy] # 基础设置 # 以守护进程方式启动 daemon = true # 设置atlas的运行方式,若为true,则表示多一个monitor,该进程会在woker进程挂掉后将其重启。若为false,则只有一个工作进程woker。 keepalive = true # atlas实例名,便于区分一台机子上的不同atlas instance = test # 工作线程数,atlas开发人员推荐将其设置为CPU个数的2~4倍。 event-threads = 4 # SQL日志的开关,共有三个可选项:OFF、ON、REALTIME,分别为:不记录sql日志、记录sql日志,并等待缓冲区填满后,才会落地到磁盘、记录sql日志并实时写入磁盘。 sql-log = REALTIME # 等同于客户端连接到mysql-server后输入SET names utf8; charset = utf8 # 如果这样配置,可以通过mysql -h127.0.0.1 -P2345 -uadmin -padmin可以连接到Atlas管理界面 #管理接口的用户名 和 密码 admin-username = user admin-password = pwd # 该参数设置Atlas后台管理地址和端口, 0.0.0.0表示任意IP admin-address = 192.168.246.143:2345 #admin-address = 0.0.0.0:2345 # 设置主库和从库的地址,其中主库为写库,从库为只读库 # 主库地址, Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔 proxy-backend-addresses = 192.168.246.134:3306 # 设置读库地址和端口, # @后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔 proxy-read-only-backend-addresses = 192.168.246.135:3306@1 # 若配置为主库也分担读请求,并且设置权重为 (主:从)=(1:3),则可以写作 #proxy-read-only-backend-addresses = 192.168.246.134:3306@1, 192.168.246.135:3306@3 # 设置Atlas工作监听的地址和端口,应用程序将连接到这个地址,既然客户端把Atlas当做一个mysql-server,故此处直接写成3306端口 proxy-address = 192.168.246.143:1234 #proxy-address = 0.0.0.0:1234 # 设置用户的密码(这个密码为MySQL中dev用户通过Atlas加密程序加密后的密码),多个可以用逗号隔开 pwds = dev:A2OS3vFVUmY= # 设置Atlas日志信息,其中log-level有message、warning、critical、error、debug五个级别 log-level = message # 日志存放的路径,日志名为$instance_name.log,比如$log-path/test.log log-path = /usr/local/mysql-proxy/log # 设置允许连接Atlas的客户端ip,非必须,可以是多个,可以是精准ip也可以是ip段,比如: #client-ips = 127.0.0.1, 192.168.1 # 挂接lvs的物理网卡ip,若有lvs结构,且设置了client-ips,则必须设置此项,反之可不设置。 #lvs-ips = 192.168.1.1
这个是用来配置MySQL的账户与密码的,我的MySQL的用户是buck,密码是hello,刚刚使用Atlas提供的工具生成了对应的加密密码
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码! pwds = buck:RePBqJ+5gI4=启动Atlas
配置好后,直接启动
[root@localhost bin]# ./mysql-proxyd test start
OK: MySQL-Proxy of test is started
可用命令检查是否启动成功了
[root@localhost bin]# ./mysql-proxyd test status
MySQL-Proxy of test is running (5176)
这样就是启动成功了。
[root@localhost bin]# ./mysql-proxyd test start,启动Atlas
[root@localhost bin]# ./mysql-proxyd test restart,重启Atlas
[root@localhost bin]# ./mysql-proxyd test stop,停止Atlas
测试一下Atlas服务器的MySQL状态,要确认它是关闭状态,并且使用mysql命令,进不去数据库
[root@localhost bin]# /etc/init.d/mysqld status
mysqld is stopped
[root@localhost bin]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
确认系统中自带的MySQL进不去了,使用如下命令,进入Atlas的管理模式“mysql -h127.0.0.1 -P2345 -uuser -ppwd ”,能进去说明Atlas正常运行着呢,因为它会把自己当成一个MySQL数据库,所以在不需要数据库环境的情况下,也可以进入到MySQL数据库模式。
[root@localhost bin]# mysql -h127.0.0.1 -P2345 -uuser -ppwd
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>
可以访问“help”表,来看MySQL管理员模式都能做些什么。可以使用SQL语句来访问
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>
也可以使用工作接口来访问,使用命令“mysql -h127.0.0.1 -P1234 -ubuck -phello”
[root@localhost bin]# mysql -h127.0.0.1 -P1234 -ubuck -phello
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.81-log
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>
如果工作接口可以进入了,就可以在Windows平台下,使用Navicat来连接数据库,填写对应的host,Port,用户名,密码就可以
4. 读写分离测试
这里测试读写分离需要使用到Jmeter了,它是Java写第一套开源的压力测试工具,因为这个比较方便。他有专门测试MySQL的模块,需要使用MySQL的JDBC驱动jar包,配置很简单,东西很好很强大很好用。
Jmeter下载地址:http://jmeter.apache.org/download_jmeter.cgi
MySQL的JDBC :http://dev.mysql.com/downloads/connector/j/
下载下来后,分别都解压开来,打开Jmeter ( 在bin路面下的jmeter.bat ) ,在测试计划中,导致JDBC的jar包
配置JDBC的驱动
分别做查询与插入语句
配置好了以后,就先运行查询操作,然后分别监控主数据库与从数据库所在机器的流量,来确定是否读写,使用“sar -n DEV 1 10000”命令来监控读写
先来测试写,目前数据库里面一条信息都没有,开启配置好了的Jmeter,进行写入数据测试
主数据库 ( 192.168.246.134 )
从数据库 ( 192.168.246.135 )
可以看到测试插入数据的操作时,主数据库的网卡流量很大,从数据库的流量很小,是应为主数据是主要负责写入的,而从数据库主要是负责同步的。
查看数据库,发现已经插入了6W多条数据了。
进行读取数据的测试,只需要执行查询就好,执行“select *from sbtest;”来查询数据表
主数据库 ( 192.168.246.134 )
从数据库 ( 192.168.246.135 )
可以看到135数据库的流量非常大,134没有什么流量,这下就可以确定了数据是从数据库读取的。已经实现了读写分离。
【Atlas常见问题】:
1)使用mybatis框架之后,如果有事务存在的话,atlas就会强制走主库。除非在注解方法上加上@Transactional(propagation=Propagation.NOT_SUPPORTED)。
2)自动读写分离挺好,但有时候我写完马上就想读,万一主从同步延迟怎么办?
SQL语句前增加 /*master*/ 就可以将读请求强制发往主库, 如下: /*master*/ select 字段 from 表名
在mysql命令行测试该功能时,需要加-c选项,以防mysql客户端过滤掉注释信息。