前篇:
《假如让你来设计数据库中间件》
《数据库中间件TDDL调研笔记》
《数据库中间件cobar调研笔记》
《数据库中间件mysql-proxy调研笔记》
3年底负责数据库中间件设计时的调研笔记,拿出来和大家分享,轻拍。
一、Atlas是什么奇虎的一个mysql数据库中间层项目
在mysql官方推出的mysql-proxy0.8.2的基础上改的
基于服务端的中间件
画外音:数据库中间件有基于服务端的,也有基于客户端的,TDDL属于后者;而cobar和Atlas是一个中间层服务,属于前者。
二、Atlas相对mysql-proxy的优势既然Atlas是基于mysql-proxy改的,有一些什么优化呢?
主流程中的Lua脚本用C重写
网络模型,线程模型重写
实现了“真正意义”上的连接池,真正连接复用
优化了锁机制,性能提高数十倍
画外音:性能提高数十倍是传说,用过的同学可以出来说一说。
官方mysql-proxy主库宕机从库亦不可用,Atlas优化为可读不可写
优化之外,还新增了什么特性呢?
ip过滤
分表支持
dba可平滑上下线db
自动摘除宕机db
…
三、Atlas最吸引人的分表功能分表功能是Atlas相对于mysql-proxy最具有吸引力的功能。
分表设置
为了支持分表,需要增加分表设置
tables=$db_name
.$table_name
.$partition_column_name
.$table_count
例如
tables=school:stu:id:00
数据库名叫school
表名叫stu
分表字段叫id
总共分为00张表
这00张子表需要用户手动逐个建立的,stu_0,stu_,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:27.0.0.,92.68.0.*
画外音:简单而实用的功能,多少事故是因为“线下将流量压到线上”或者“SecureCRT窗口太多,切换错了数据库”。
lvs-ips
该参数是Atlas前面挂接的LVS的物理网卡的IP,不是虚IP
该参数用来实现平滑重启功能,否则在重启Atlas的瞬间的那些SQL请求都会失败
平滑重启的条件:至少有两台配置相同的Atlas,且挂接在LVS之后
五、Atlas最受白殿疯成都白癜风专科医院