94

数据库中间件Atlas调研笔记

 6 years ago
source link: http://mp.weixin.qq.com/s/31WOensXaLdaAp9WRMW7PA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

假如让你来设计数据库中间件

数据库中间件TDDL调研笔记

数据库中间件cobar调研笔记

数据库中间件mysql-proxy调研笔记

13年底负责数据库中间件设计时的调研笔记,拿出来和大家分享,轻拍。

一、Atlas是什么

  • 奇虎360的一个mysql数据库中间层项目

  • 在mysql官方推出的mysql-proxy0.8.2的基础上改的

  • 基于服务端的中间件

画外音:数据库中间件有基于服务端的,也有基于客户端的,TDDL属于后者;而cobar和Atlas是一个中间层服务,属于前者。

二、Atlas相对mysql-proxy的优势

既然Atlas是基于mysql-proxy改的,有一些什么优化呢?

  • 主流程中的Lua脚本用C重写

  • 网络模型,线程模型重写

  • 实现了“真正意义”上的连接池,真正连接复用

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

画外音:性能提高数十倍是传说,用过的同学可以出来说一说。

  • 官方mysql-proxy主库宕机从库亦不可用,Atlas优化为可读不可写 

优化之外,还新增了什么特性呢?

  • dba可平滑上下线db

  • 自动摘除宕机db

三、Atlas最吸引人的分表功能

分表功能是Atlas相对于mysql-proxy最具有吸引力的功能。

分表设置

为了支持分表,需要增加分表设置

tables = $db_name

    .$table_name

    .$partition_column_name

    .$table_count

例如

tables = school:stu:id:100

  • 数据库名叫school

  • 表名叫stu

  • 分表字段叫id

  • 总共分为100张表

这100张子表需要用户手动逐个建立的,stu_0, stu_1, stu_2, … stu_99,并且所有的子表必须在一个数据库里。

画外音:额,这个需要用户手动执行,还是有点坑的。

画外音:分表并且要求子表在一个库里,如果数据量过大,无法通过扩展实例来扩容,不确定Atlas对于这个问题是如何考虑“扩展性”的。

操作支持

Atlas支持select, delete, update, insert, replace操作,它会根据$partition_column_name 的值来对表的个数进行取模,以定位到sql请求要落到哪个子表。

需要注意的是,sql语句必须带上分表id作为查询条件,如果不带上id,则会提示stu表不存在。

画外音:不支持夸库分表,不支持非partition_column上的查询,应用场景应该会比较受限。

四、Atlas的参数扩展

min-idle-connections

  • 用来实现mysq连接池功能,进行连接限制

  • Atlas为每台DB建立一个连接池

  • 当有客户端连接Atlas时,Atlas会先在第一台DB上建立连接,直到第一台DB连接池内的空闲连接数达到min-idle-connections,再在下一台DB上建立连接,直到所有DB连接池内的空闲连接数都达到min-idle-connections,便不再建立新连接,而开始复用连接池内的连接

  • Atlas启动时,配置里的所有DB会按照主库在前从库在后的顺序在内存里排好次序,所以初始阶段会先在主库上建立连接

  • Atlas在运行过程中,某连接如果触发了DB的wait_timeout,Atlas会把该连接销毁,如果因此而导致连接池内的空闲连接数低于min-idle-connections,Atlas将在客户端下一次连接时重新在该DB上建立连接

  • 初使用者常常会误认为读写分离不起作用,其实是由于min-idle-connections设置得较大,而测试时只连接了一次或几次,这样的话建立的连接都在主库上,从库上还没有建立连接,此时发送读语句,自然也只能打向主库

  • DB的wait_timeout建议不要设得太小,因为Atlas有连接池机制,不会一直新建连接导致DB上连接数过多,所以DB不需要依赖wait_timeout防止过多连接,如果wait_timeout太小会导致Atlas的一些不必要的销毁超时连接的开销 

画外音:并发量比较大的时候,连接几乎不会被销毁。

client-ips

  • 该参数用来实现多用户的权限控制功能

配置格式如下:

client-ips : 127.0.0.1, 192.168.0.*

画外音:简单而实用的功能,多少事故是因为“线下将流量压到线上”或者“ SecureCRT 窗口太多,切换错了数据库”。

lvs-ips

  • 该参数是Atlas前面挂接的LVS的物理网卡的IP,不是虚IP

  • 该参数用来实现平滑重启功能,否则在重启Atlas的瞬间的那些SQL请求都会失败

  • 平滑重启的条件:至少有两台配置相同的Atlas,且挂接在LVS之后

五、Atlas最受关注FAQ

问:Atlas是否支持多字符集?

:是,对多字符集的支持是Atlas对原版MySQL-Proxy的第一项改进。

问:Atlas是否支持事务操作?

:支持,且处于事务状态的客户端中途退出时,Atlas会销毁该客户端使用的连接,让后台的mysql回滚事务,保证了事务的完整性。

画外音:单库多表。

问:自动读写分离挺好,但有时候写完马上就想读,万一主从同步延迟怎么办?

:SQL语句前增加 /*master*/ 就可以将读请求强制发往主库,例如:

/*master*/ select * from t;

画外音:额,需要调用方自己来强制读主,说实话,不是特别实用。

问:主库宕机,读操作受影响么?

:不受影响,mysql-proxy不支持这个功能。

问:想下线一台DB, 又不想停掉server, 怎么办?

:可以通过管理接口手动上下线后端db:

remove backend i

问:想给集群中增加一台DB, 不想影响线上正常访问可以吗?

:可以通过管理接口可以实现:

add master ip:port

add slave ip:port@weight

问:Atlas支持mysql的prepare特性吗?

:不支持,但打算在后续版本中支持。

问:Altas支持多个主库的运行模式吗?

:目前还未对于Atlas后面挂接多个主库的情形进行测试过,不建议这样使用。建议使用一主一从或一主多从的模式。

问:Altas支持SQL安全性过滤吗?

:支持,不带where字句的delete可以过滤。

问:Altas未来有什么发展规划?

:支持跨机器的分库分表,将数据分不到多台机器上。

13年底的调研笔记,文中的“画外音”是我当时的批注,希望能让大家对Atlas能有一个初步的认识,有疑问之处,欢迎交流。

相关文章:

假如让你来设计数据库中间件》 <- 火

数据库中间件TDDL调研笔记

数据库中间件cobar调研笔记

数据库中间件mysql-proxy调研笔记


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK