这两天在学习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,我们可以直接修改,下面是我修改的
- [root@localhost conf]# more test.cnf
- [mysql-proxy]
-
- #带#号的为非必需的配置项目
-
- #管理接口的用户名 --进入atlas后台管理的用户
- admin-username = root
-
- #管理接口的密码 ---密码
- admin-password = haodai123
-
- #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
- proxy-backend-addresses = 192.168.6.119:3306
-
- #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号
- 分隔
- proxy-read-only-backend-addresses = 192.168.6.121:3306@1
-
- #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密(./encrypt password),下行的user1和user2为示例,
- 将其替换为你的MySQL的用户名和加密密码!
- pwds = root:osdCRatAwJoa8s/oWZlMvQ==, root:osdCRatAwJoa8s/oWZlMvQ== ---这两个是主从上面的数据库用户以及密码,我为了方便就配置的root
-
- #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为
- true,true后面不能有空格。
- daemon = true
-
- #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会
- 自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空
- 格。
- #keepalive = flase
-
- #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
- event-threads = 4
-
- #日志级别,分为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和端口 ---就是我们对主从进行sql操作的登陆端口
- proxy-address = 0.0.0.0:1234
-
- #Atlas监听的管理接口IP和端口 ---进入atlas后台管理的端口
- 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
启动
[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
登陆管理端口
- [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)
-
登陆数据库检查读写分离
- [root@localhost ~]# mysql -uroot -pESBecs00 -P1234 -h127.0.0.1 ----通过工作接口端口登陆数据库
- [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 [email protected] 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)
到此测试完毕,读写分离成功!!!!!
补充:详细的配置文件说明
参考资料:
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.不支持全表的update和delete
- 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
- 解决办法 加where
- mysql> update atltab set id=id+1 where 1>0;
- 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/,如需转载,请注明出处,否则将追究法律责任。