前篇:
13年底负责数据库中间件设计时的调研笔记,拿出来和大家分享,轻拍。
画外音:数据库中间件有基于服务端的,也有基于客户端的,TDDL属于后者;而cobar和Atlas是一个中间层服务,属于前者。
既然Atlas是基于mysql-proxy改的,有一些什么优化呢?
画外音:性能提高数十倍是传说,用过的同学可以出来说一说。
优化之外,还新增了什么特性呢?
分表功能是Atlas相对于mysql-proxy最具有吸引力的功能。
分表设置
为了支持分表,需要增加分表设置
tables = $db_name
.$table_name
.$partition_column_name
.$table_count
例如
tables = 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上的查询,应用场景应该会比较受限。
min-idle-connections
画外音:并发量比较大的时候,连接几乎不会被销毁。
client-ips
配置格式如下:
client-ips : 127.0.0.1, 192.168.0.*
画外音:简单而实用的功能,多少事故是因为“线下将流量压到线上”或者“ SecureCRT 窗口太多,切换错了数据库”。
lvs-ips
问: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能有一个初步的认识,有疑问之处,欢迎交流。