文章目录
- 1.Atlas读写分离简介
- 2.搭建MHA高可用MySQL主从复制集群
- 3.部署配置Atlas读写分离中间件
- 3.1.安装Atlas读写分离中间件
- 3.2.配置读写分离
- 3.3.启动Atlas读写分离
- 4.读写分离集群测试
- 5.生产环境中创建一个用户通过Atlas使用
- 6.Atlas通过管理接口实现在线管理
- 7.Atlas自动分表
1.Atlas读写分离简介
Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。
Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。
360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。
Atlas下载地址:https://github.com/Qihoo360/Atlas/releases
Atlas读写分离中间件的架构图:
业务平台直接连接Atlas中间件,由Atlas中间件连接Mysql主从复制集群,当有读取操作时,Atlas会将读取操作路由到从库进行处理,当有写入操作时,Atlas胡一江写入的操作路由到主库进行处理。
MHA+Atlas实现MySQL主从复制读写分离高可用分布式集群的规划。
IP | 主机名 | 主从复制角色 | 端口号 | 组件 |
---|---|---|---|---|
192.168.20.11 | mysql-1 | master | 3306 | mysql |
192.168.20.12 | mysql-2 | slave | 3306 | mysql |
192.168.20.13 | mysql-3 | slave | 3305 | mysql、mha、atlas |
192.168.20.15 | MHA针对主库实现的漂移IP |
2.搭建MHA高可用MySQL主从复制集群
略,查看前面的文章。
搭建MHA集群、VIP漂移、Binlog服务器、邮箱告警。
3.部署配置Atlas读写分离中间件
3.1.安装Atlas读写分离中间件
[root@mysql-3 ~]# ll Atlas-2.2.1.el6.x86_64.rpm
-rw-r--r-- 1 root root 4963681 6月 28 2019 Atlas-2.2.1.el6.x86_64.rpm
[root@mysql-3 ~]# yum install -y Atlas*
[root@mysql-3 ~]# ll /usr/local/mysql-proxy/
总用量 0
drwxr-xr-x 2 root root 75 7月 9 22:18 bin
drwxr-xr-x 2 root root 22 7月 9 22:18 conf
drwxr-xr-x 3 root root 331 7月 9 22:18 lib
drwxr-xr-x 2 root root 6 12月 17 2014 log
3.2.配置读写分离
[root@mysql-3 ~]# cd /usr/local/mysql-proxy/conf/
[root@mysql-3 conf]# cp test.cnf test.cnf.bak
[root@mysql-3 conf]# vim test.cnf
[mysql-proxy]
#管理接口的用户名和密码,非数据库用户名密码
admin-username = user
admin-password = pwd
#Atlas后端连接的MySQL主库地址,所有的写操作会路由到这个数据库中,这里我们配置MHA的漂移地址,即使主库故障,从库切换后也不会应读写分离
proxy-backend-addresses = 192.168.20.15:3306
#Atlas后端连接的Mysql从库地址,所有的读操作会路由到这个数据库中,多个地址以逗号分隔
proxy-read-only-backend-addresses = 192.168.20.12:3306,192.168.20.13:3306
#通过Atlas连接数据库的账号,也就是允许Atlas使用数据库中的那些账号登陆主从复制集群。
#将复制用户和mha用户都写进去,密码通过Atlas/bin/encrypt工具加密即可
pwds = repl:/iZxz+0GRoA=,mha:/iZxz+0GRoA=
#后台运行
daemon = true
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker
keepalive = true
#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 8
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message
#日志存放的路径
log-path = /usr/local/mysql-proxy/log
#SQL日志的开关,打开后所有被Atlas处理的SQL都会记录下来
sql-log=ON
#Atlas监听端口,程序等都是通过这个地址连接Atlas实现读写分离的
proxy-address = 0.0.0.0:33060
#Atlas监听的管理接口的端口
admin-address = 0.0.0.0:2345
charset=utf8
3.3.启动Atlas读写分离
启动Atlas时,需要指定配置文件名称的前缀。例如test.cnf就写test。
[root@mysql-3 conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started
[root@mysql-3 conf]# ps aux | grep mysql-proxy
root 23274 0.0 0.0 65832 5192 ? S 22:37 0:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
root 23275 0.0 0.3 170392 27108 ? Sl 22:37 0:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
4.读写分离集群测试
配置完读写分离集群后,要通过Atlas的33060端口进行连接,否则是没有读写分离效果的。
1)测试读操作
[root@mysql-3 ~]# mysql -umha -p123456 -h 192.168.20.13 -P 33060
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 3 |
+-------------+
1 row in set (0.01 sec)
可以看到第一次读返回的server_id是2,server_id=2也就是192.168.20.12这台从库,第二次读返回的server_id是3,也就是192.168.20.13这台从库,读操作都落在了从库上。
2)测试写操作
开启一个事务,就可以模拟出写的操作。
mysql> begin;
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
mysql> commit;
可以看到写操作返回的是server_id=1,server_id=1是192.168.20.11这台主库,读写分离成功。
5.生产环境中创建一个用户通过Atlas使用
需求:开发人员申请一个用户,用于操作预发布的数据库,需要拥有增改查的权限,并且开发人员不知道后端主从架构的数据库地址,只知道Atlas读写分离中间件的地址,这个用户需要通过Atlas中间件使用数据库。
1)在主库中创建一个用户
只需要在主库创建即可,会同步到从库上。
mysql> grant select,update,insert on *.* to ceshi@'192.168.20.%' identified by 'ceshi@123';
2)在Atlas中配置上新建的用户
首先要对ceshi这个用户的密码使用encrypt进行加密,否则是无法填写在Atlas配置文件中。
[root@mysql-3 ~]# /usr/local/mysql-proxy/bin/encrypt ceshi@123
03pnSSwackWTZ6zxvGQr9A==
然后将测试这个用户添加到Atlas配置文件中,否则是不能使用这个用户通过Atlas访问数据库。
[root@mysql-3 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
pwds = repl:/iZxz+0GRoA=,mha:/iZxz+0GRoA=,ceshi:03pnSSwackWTZ6zxvGQr9A==
重启Atlas一定要进入到conf目录。
[root@mysql-3 ~]# cd /usr/local/mysql-proxy/conf/
[root@mysql-3 conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test restart
OK: MySQL-Proxy of test is stopped
OK: MySQL-Proxy of test is started
3)测试登陆
[root@mysql-3 conf]# mysql -uceshi -pceshi@123 -h 192.168.20.13 -P 33060
mysql>
6.Atlas通过管理接口实现在线管理
通过管理接口,无需再重启Atlas,就可以实现配置的更新
1)登陆管理接口
登陆管理接口的账号面是Atlas配置文件中最顶部指定的user账号。
[root@mysql-3 ~]# mysql -uuser -ppwd -h 192.168.20.13 -P 2345
mysql>
2)查看命令帮助
可以查看命令帮助,看看在管理接口能执行什么动作
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 |
+----------------------------+---------------------------------------------------------+
3)查看后端所有节点
mysql> select * from backends;
+-------------+--------------------+-------+------+
| backend_ndx | address | state | type |
+-------------+--------------------+-------+------+
| 1 | 192.168.20.15:3306 | up | rw |
| 2 | 192.168.20.12:3306 | up | ro |
| 3 | 192.168.20.13:3306 | up | ro |
+-------------+--------------------+-------+------+
4)动态添加节点
mysql> remove backend 3;
5)动态删除节点
mysql> add slave 192.168.20.16:3306;
6)添加用户
mysql> add pwd hah:3yb5jEku5h4=;
7)删除用户
mysql> remove pwd hah:3yb5jEku5h4=;
8)保存配置到配置文件
mysql> save config;
7.Atlas自动分表
使用Atlas的分表功能时,首先需要在配置文件test.cnf设置tables参数。
tables参数设置格式:数据库名.表名.分表字段.子表数量,
比如:你的数据库名叫school,表名叫stu,分表字段叫id,总共分为2张表,那么就写为school.stu.id.2,如果还有其他的分表,以逗号分隔即可。