当前位置: 首页 > 工具软件 > Atlas MySQL > 使用案例 >

Mysql中间件Atlas读写分离原理与实战

暴向笛
2023-12-01

1-Atlas简介

Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。

官方链接:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

2-主要功能

1.读写分离

2.从库负载均衡

3.IP过滤

4.自动分表

5.DBA可平滑上下线DB

6.自动摘除宕机的DB

3-Atlas相对于官方MySQL-Proxy的优势

1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口

2.重写网络模型、线程模型

3.实现了真正意义上的连接池

4.优化了锁机制,性能提高数十倍

4-使用场景

Atlas是一个位于前端应用与后端MySQL数据库之间的中间件,它使得应用程序员无需再关心读写分离、分表等与MySQL相关的细节,可以专注于编写业务逻辑,同时使得DBA的运维工作对前端应用透明,上下线DB前端应用无感知。

Atlas是一个位于应用程序与MySQL之间的中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。

Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。

5-企业读写分离及分库分表其他方案介绍

    Mysql-proxy(oracle)

    Mysql-router(oracle)

    Atlas (Qihoo 360)

    Atlas-sharding (Qihoo 360)

    Cobar(是阿里巴巴(B2B)部门开发)

    Mycat(基于阿里开源的Cobar产品而研发)

    TDDL Smart Client的方式(淘宝)

    Oceanus(58同城数据库中间件)

    OneProxy(原支付宝首席架构师楼方鑫开发 )

    vitess(谷歌开发的数据库中间件)

    Heisenberg(百度)

    TSharding(蘑菇街白辉)

    Xx-dbproxy(金山的Kingshard、当当网的sharding-jdbc )

    amoeba

6-部署Atlas

Atlas部署在mha的管理节点db03上面,这样可以部署高可用,防止单点故障。

10.0.0.51  db01  #主库

10.0.0.52  db02  #从库

10.0.0.53  db03  #从库-MHA管理端

注意:

1、Atlas只能安装运行在64位的系统上

2、Centos 5.X安装 Atlas-XX.el5.x86_64.rpm,Centos 6.X安装Atlas-XX.el6.x86_64.rpm。

3、后端mysql版本应大于5.1,建议使用Mysql 5.6以上

Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm

Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm

1-安装Atlas

cd /home/oldboy/tools/

rz 上传软件

rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

2-安装目录文件说明

[root@db03 ~]# ll /usr/local/mysql-proxy/

total 16

drwxr-xr-x 2 root root 4096 May  7 16:06 bin  #可执行文件

drwxr-xr-x 2 root root 4096 May  7 16:06 conf  #代理配置文件,test.cnf

drwxr-xr-x 3 root root 4096 May  7 16:06 lib   #Atlas依赖库

drwxr-xr-x 2 root root 4096 Dec 17  2014 log  #日志文件目录

[root@db03 ~]# ls /usr/local/mysql-proxy/bin/

encrypt  mysql-proxy  mysql-proxyd  VERSION

encrypt       #生成MySQL密码,加密时使用

mysql-proxy   #MySQL自己开发出来的读写分离代理

mysql-proxyd  #360开发出来的,控制服务的启动、重启、停止,以及执行配置文件conf/test.cnf

3-创建加密密码

[root@db03 ~]# /usr/local/mysql-proxy/bin/encrypt 333333

y001tgwGmz0=

[root@db03 ~]# /usr/local/mysql-proxy/bin/encrypt mha

O2jBXONX098=

4-编辑配置文件

vim /usr/local/mysql-proxy/conf/test.cnf

[mysql-proxy]

admin-username = rep

admin-password = y001tgwGmz0=

proxy-backend-addresses = 10.0.0.55:3306

proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306

pwds=rep:y001tgwGmz0=,mha:O2jBXONX098=

daemon = true

keepalive = true

event-threads = 8

log-level = message

log-path = /usr/local/mysql-proxy/log

sql-log = REALTIME

proxy-address = 0.0.0.0:1234

admin-address = 0.0.0.0:2345

charset = utf8

配置文件详解:

[mysql-proxy]

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

#管理接口的用户名

admin-username = user

#管理接口的密码

admin-password = pwd

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔

proxy-backend-addresses = 127.0.0.1:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔

#proxy-read-only-backend-addresses = 127.0.0.1:3305@1

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!

pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=

#设置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实例间的区分

#instance = test

#Atlas监听的工作接口IP和端口

proxy-address = 0.0.0.0:1234

#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 = 127.0.0.1, 192.168.1

#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置

#lvs-ips = 192.168.1.1

5-启动Atlas服务

[root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start

OK: MySQL-Proxy of test is started

/usr/local/mysql-proxy/bin/mysql-proxyd test start    #启动

/usr/local/mysql-proxy/bin/mysql-proxyd test stop    #停止

/usr/local/mysql-proxy/bin/mysql-proxyd test restart  #重启

6-检查端口是否正常

[root@db03 ~]# netstat -lntup|grep mysql-proxy

tcp        0      0 0.0.0.0:2345                0.0.0.0:*                   LISTEN      7310/mysql-proxy    

tcp        0      0 0.0.0.0:1234                0.0.0.0:*                   LISTEN      7310/mysql-proxy   

7-Atlas管理操作

1-管理端db03登录,查看后端的代理库

[root@db03 ~]# mysql -urep -py001tgwGmz0= -h 127.0.0.1 -P2345

mysql> select * from backends;

+-------------+----------------+-------+------+

| backend_ndx | address        | state | type |

+-------------+----------------+-------+------+

|           1 | 10.0.0.55:3306 | up    | rw   |

|           2 | 10.0.0.52:3306 | up    | ro   |

|           3 | 10.0.0.53:3306 | up    | ro   |

+-------------+----------------+-------+------+

3 rows in set (0.00 sec)

2-平滑摘除mysql

mysql> remove backend 2;

Empty set (0.01 sec)

3-检查是否摘除

mysql> select * from backends;

+-------------+----------------+-------+------+

| backend_ndx | address        | state | type |

+-------------+----------------+-------+------+

|           1 | 10.0.0.55:3306 | up    | rw   |

|           2 | 10.0.0.53:3306 | up    | ro   |

+-------------+----------------+-------+------+

2 rows in set (0.00 sec)

4-保存到配置文件中

save config;

5-将节点再添加回来

add slave 10.0.0.52:3306;

6-查看是否添加成功

mysql> select * from backends;

+-------------+----------------+-------+------+

| backend_ndx | address        | state | type |

+-------------+----------------+-------+------+

|           1 | 10.0.0.55:3306 | up    | rw   |

|           2 | 10.0.0.53:3306 | up    | ro   |

|           3 | 10.0.0.52:3306 | up    | ro   |

+-------------+----------------+-------+------+

3 rows in set (0.00 sec)

7-保存到配置文件中

save config;

8-连接数据库查看负载

[root@db03 ~]# mysql -umha -pmha -h127.0.0.1 -P1234

第一次查询server_id

mysql> show variables like "server_id";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id     | 2     |

+---------------+-------+

1 row in set (0.01 sec)

第二次查询server_id

mysql> show variables like "server_id";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id     | 3     |

+---------------+-------+

1 row in set (0.00 sec)

通过上面可以看到均衡负载配置成功!

9-读写分离的说明

Atlas会透明的将事务语句和写语句发送至主库执行,读语句发送至从库执行。

具体以下语句会在主库执行:

显式事务中的语句

autocommit=0时的所有语句

含有select GET_LOCK()的语句

除SELECT、SET、USE、SHOW、DESC、EXPLAIN外的。

从库负载均衡配置:

proxy-read-only-backend-addresses=ip1:port1@权重,ip2:port2@权重

注意:先前已经在配置文件加入:

vim /usr/local/mysql-proxy/conf/test.cnf

[mysql-proxy]

admin-username = rep

admin-password = y001tgwGmz0=

proxy-backend-addresses = 10.0.0.55:3306

proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306

pwds=rep:y001tgwGmz0=,mha:O2jBXONX098=

daemon = true

keepalive = true

event-threads = 8

log-level = message

log-path = /usr/local/mysql-proxy/log

sql-log = REALTIME

proxy-address = 0.0.0.0:1234

admin-address = 0.0.0.0:2345

charset = utf8

 类似资料: