Atlas实现读写分离

Atlas实现读写分离

Scroll Down

Atlas读写分离总体架构

数据库读写分离通过实时(根据具体情况稍有延迟,一般都是毫秒级的)主从同步备份,通过冗余的方式保护了系统数据。提高了系统的负载能力,主库写数据从库读数据,提高了系统的性能。 读写分离的前提是保证主从库的数据同步复制,针对MySQL,MariaDB的主从同步前面已经介绍过了,网上也有很多教程,这里就不再重复了。读写分离的的实现基本上分为2种:第一种是通过应用系统的代码来实现,比如我们可以在spring中配置2个数据源,一个写的数据源和一个读的数据源。由应用系统来决定使用哪个数据源访问数据库。主库和从库对于应用程序来说不是透明的,主从库在线上切换的时候,需要修改配置文件,并重新部署启动。但是这种直连的方式效率比较高。第二种是通过代理的方式,主从库对于应用程序是透明的,应用系统只需要和数据库代理建立连接,然后代理通过分析发给它的sql语句再决定在主库或从库上执行。代理的方式屏蔽的DB层的细节,而且线上切换不需要修改应用代码,只是这种代理的方式相对直连,在效率上略低一点,是可以接受的
atlas1.png
MySQL的代理最常见的是mysql-proxy、cobar、mycat、Atlas等。mysql-proxy是一个轻量的中间代理。cobar是阿里提供的一个中间件,已经停止更新。mycat的前身就是cobar,活跃度比较高。Atlas奇虎360的一个开源中间代理,是在mysql-proxy 0.8.2的基础上进行了优化,增加一些新的功能特性
atlas2.png

Atlas安装配置

下载安装

#安装
[root@mysql-tools]#wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
[root@mysql-tools]#rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
#安装目录在/usr/local/mysql-proxy
[root@mysql-tools mysql-proxy]# ls
bin  conf  lib  log
#密码加密,假设slave的密码为123456,在配置里面需要用到
[root@mysql-tools ~]# /usr/local/mysql-proxy/bin/encrypt 123456
/iZxz+0GRoA=

编辑配置文件

[root@mysql-tools mysql-proxy]# vim /data1/mysql/atlas/conf/test.cnf
[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名
admin-username = admin

#管理接口的密码
admin-password = Ax@123456

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.200.65:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.200.66:3306@1
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = root:/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 = 8

#日志级别,分为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实例间的区分

运行Atlas

注意命令中的test是Atlas的实例名称,默认是test,而且这个名字要和配置文件名test.cnf保持一致

[root@mysql-tools ~]# cd /usr/local/mysql-proxy/bin/
[root@mysql-tools bin]# ls
encrypt  mysql-proxy  mysql-proxyd  VERSION
./mysql-proxyd test start     #启动Atlas
./mysql-proxyd test restart   #重启Atlas
./mysql-proxyd test stop      #停止Atlas

#启动报错可看日志  日志路径/usr/local/mysql-proxy/log、test.log
[root@mysql-tools bin]# tail -30 /usr/local/mysql-proxy/log/test.log
2020-01-14 11:18:24: (message) proxy listening on port 0.0.0.0:1234
2020-01-14 11:18:24: (message) added read/write backend: 192.168.200.65:3306
2020-01-14 11:18:24: (message) added read-only backend: 192.168.200.66:3306
2020-01-14 11:18:34: (critical) getaddrinfo(proxy-read-only-backend-addresses = 192.168.200.67) failed with Name or service not known
2020-01-14 11:18:34: (critical) chassis-mainloop.c:265: applying config of plugin proxy failed
2020-01-14 11:18:34: (critical) mysql-proxy-cli.c:560: Failure from chassis_mainloop. Shutting down.
2020-01-14 11:18:34: (message) Initiating shutdown, requested from mysql-proxy-cli.c:561

启动完成后可以运行mysql -h127.0.0.1 -P2345 -uuser -ppwd,进入后执行:select * from help;查看管理DB的各类命令

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> SELECT * FROM backends;
+-------------+---------------------+-------+------+
| backend_ndx | address             | state | type |
+-------------+---------------------+-------+------+
|           1 | 192.168.200.65:3306 | up    | rw   |
|           2 | 192.168.200.66:3306 | up    | ro   |
+-------------+---------------------+-------+------+
2 rows in set (0.00 sec)

参考文档:https://www.jianshu.com/p/3869b4ea7642
参考文档:https://blog.csdn.net/lylclz/article/details/78609882