在上一篇文章我说到了关于如何使用GTID来做mariadb(mysql)主从,不过后面留下了一个问题就是开发人员已经将程序开发完毕所以没法再次修改对数据库进行读写请求的分离。否则就是对程序进行大规模修改时如何有效利用刚刚创建的从库?这个问题是必须考虑的!
在生产环境中一开始肯定不会创建mariadb(mysql)的主从架构,所以在程序员面前只有一个数据库所以开发程序也就对一个数据库进行创建,而在企业规模慢慢发展的路上肯定需要一个主从数据库的而那时修改程序显得是不太可能,所以当时在Mysql官方创建了一个专门用于对数据库读写分离的一个程序叫做mysql-proxy不过这个玩意经常出现bug而且用起来体验很差。后来奇虎360对mysql-proxy进行大量的改进然后将其开源叫做atlas,本文今天就说说如何使用atlas对企业小型架构进行数据库的读写分离。不过首先探讨一下什么是数据库中间件。
什么是数据库的中间件?
与atlas一样数据库中间件首先能做的就是对数据库进行读写分离,大家可以理解为像nginx haproxy之类的反向代理的机器,对sql语句进行匹配随后将增、删、改、锁表等请求交给主服务器,然后只将查询请求交给从服务器。不过在前端程序看来这个东西就是数据库,而在后端主从的数据库看来是客户端的请求。所以数据库中间件其实就是一手托两家的程序。不过数据库中间件远不止能够做读写分离,还能做分表,对垂直切分与水平切分的数据库进行操作等强大功能。所以中间件的出现大大降低了程序员的痛苦,现在的程序员连更改库都不需要直接写上数据库的主机名即可,如果需要切换直接将Hosts文件改了就行!
数据库中间件有哪些开源程序?
当然其中最著名也是国内的一款开源程序叫做mycat,里面大神集群而且程序的功能特别多不过不太适合只需要读写分离的这一个功能的企业。所以这个程序还是等企业做大有分表以后再考虑(更换中间件非常简单也不需要东后端只需让程序员将连接名字改了灰度发布即可,如果写的是主机名直接改Hosts即可!)官网是:mycat.io
接下来就是Amoebas虽然读写分离不错,但是不支持事务…那还不如用nosql呢!其他的可以自行百度,这次带了一个非常轻量级的程序就是atlas。不过没有官网只有在github上面有项目里面还有wiki 网站是https://github.com/Qihoo360/Atlas 里面的wiki写的非常详细建议先看看关于atlas的架构对中间件有个新的认知。
关于atlas的优缺点:
优点:
- 第一个优点就是支持事物功能,如果不支持还使用关系型数据库干啥?
- 第二个就是支持多字符集,这点在官方非常符合现在的国情。
- 第三个就是支持mysql的prepare特性。
- 第四个支持Mysql的分表功能,详细请看:https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E5%88%86%E8%A1%A8%E5%8A%9F%E8%83%BD%E7%AE%80%E4%BB%8B
- 第五个就是有后端控制台可以在中间件上对后端的mariadb(mysql)进行操作,比如上下线更换主从关系等!
缺点:
- 第一个就是不支持M/M多主模型的mysql
- 第二个就是自身无法做负载均衡,要前段有LVS进行负载均衡。如果要做高可用集群还得用keepalived
- 第三个就是JAVA程序员了,可能有些bug比如不支持amp这类字符详细还是看官方的wiki吧,其实我也是借鉴官方的:https://github.com/Qihoo360/Atlas/wiki/Atlas%E5%8A%9F%E8%83%BD%E7%89%B9%E7%82%B9FAQ
如何使用atlas?
其实在官方的文档说的非常详细了,不过这里为了方便大家寻找我还是一一写出来吧!首先搭建一个mysql | mariadb的主从,这个我在这边、这边都有写过请自行查阅。然后我来说说atlas支持的centos版本,其实他们支持的版本还是比较老的只支持centos5~6的版本并不支持7并且需要64位。下面说说拓扑:
首先我们先下载atlas的rpm包,地址在:https://github.com/Qihoo360/Atlas/releases 如果不需要跨机分表可以下载最新版,在下面,其中el5代表centos5而el6代表centos6。直接使用wget下载,随后使用rpm -ivh | yum localinstall进行安装!
安装完毕后生成的所有文件在/usr/local之中叫做mysql-proxy…这名字起的为啥不叫atlas…
接下来我们设置一下配置文件,配置文件在:安装位置/conf/test.cnf中其实你可以进行拷贝进行改名,最后启动的时候是需要指定配置文件的。接下来我直接使用默认的test.cnf来配置:
[root@localhost mysql-proxy] vim conf/test.cnf</pre> [mysql-proxy] #带#号的为非必需的配置项目 #管理接口的用户名 admin-username = admin #管理接口的密码 admin-password = admin #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔 proxy-backend-addresses = 172.16.1.60:3306 #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔 proxy-read-only-backend-addresses = 172.16.1.70:3306@1 #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码! pwds = root:UjfhGdjRdfsllsgionaZrsbsdffeoEQ== #设置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 = 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实例间的区分 kinstance = test #Atlas监听的工作接口IP和端口 proxy-address = 0.0.0.0:3306 #Atlas监听的管理接口IP和端口 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 = 172.16.1 ,192.168.1 ,192.168.4 , #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置 #lvs-ips = 192.168.1.1
上面都有中文注解,可以详细看看首先第一第二项主要配置atlas的管理用户名和密码,这个比较重要。主要管理后面的主库和从库而不需要登录数据库一一管理。接下来有一个设置是设置数据库使用的用户和密码,不过密码需要通过mysql-proxy/bin/encrypt 脚本来进行加密,使用也非常简单:
[root@localhost bin]# ./encrypt admin #后面的admin代表密码,随后会显示加密的结果复制到配置文件即可。 la1Ux+Bu4zo=
好了随后我们启动atlas即可,启动也非常的简单也在mysql-proxy/bin/中:
[root@localhost bin]# ./mysql-proxyd test start #记住是mysql-proxyd脚本,随后写好配置文件的.cnf前面的名字随后使用命令start即可! #还有stop restart reload等 OK: MySQL-Proxy of test is started
如果有需要可以将bin文件夹加入到profile.d/下新建一个文件写好环境变量即可!
最后一步就是安装mariadb在atlas,为什么要安装呢?否则你怎么会有mysql命令来连接数据库呢?直接使用yum install -y mariadb即可!
查看atlas是否能读写分离?
首先我们用和上一期的mariadb主从架构来作为实验的后端:
</pre> [root@localhost bin] mysql -uroot -p -h172.16.1.100 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.0.81-log MariaDB Server Copyright (c) 2000, 2017, 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 | +--------------------+ | hello_world | | information_schema | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.01 sec)
看来hello_world还在,现在我们给一个创建数据库的命令交给atlas看看主从库中是否会有新创建的数据库:
[root@localhost ~] mysql -uroot -p -h172.16.1.100 -e "CREATE DATABASE hello1;" Enter password: #随后分别去主库和从库去看看有没有hello1这个数据库 #首先是主库:</pre> [root@localhost ~] mysql -uroot -p -h172.16.1.60 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.5.5-10.1.16-MariaDB MariaDB Server Copyright (c) 2000, 2017, 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 | +--------------------+ | hello1 | | hello_world | | information_schema | | mysql | | performance_schema | | test | +--------------------+ 6 rows in set (0.01 sec) <pre>#随后再去从库看看:</pre> [root@localhost ~]# mysql -uroot -p -h172.16.1.70 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 14 Server version: 5.5.5-10.1.16-MariaDB MariaDB Server Copyright (c) 2000, 2017, 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 | +--------------------+ | hello1 | | hello_world | | information_schema | | mysql | | performance_schema | | test | +--------------------+ 6 rows in set (0.00 sec)
好了hello1这个数据库都有了,那么读写分离也就宣告结束了!
结语:
atlas不止能够对读写语句进行分离,并且还能对锁住表中的数据进行update也能进行分辨比如:set autocommit = 0;随后使用SELECT … FOR UPDATE; 进行锁数据更新,虽然前面是select但是atlas能够根据数据前后来判断是否交给主 | 从库。
虽然atlas比较强大,但是在mycat得权威下显得比较渺小很多功能不能实现,在文章头部我就已经讲过。atlas只合适单主多从的架构进行读写分离,如果是分表什么的还是着重考虑工具!
Comments