2013年底,我负责数据库中间件设计的研究笔记,分享给大家。1.什么是阿特拉斯?奇虎360的mysql数据库中间层项目是基于mysql官方推出的mysql-proxy0.8.2,基于服务端中间件。最后,TDDL属于后者;而cobar和Atlas属于中间层服务,属于前者。2.Atlas相对于mysql-proxy的优势既然Atlas是基于mysql-proxy,那么有哪些优化呢?主进程中的Lua脚本使用C改写网络模型,改写线程模型实现“真正意义上”的连接池,真正的连接复用优化锁机制,性能提升数十倍画外音:性能提升数十倍oftimes是个传说,用过的同学可以出来说说。官方mysql-proxy主库宕机,从库也不可用。除了可读不可写的图集优化外,还增加了哪些特性?ip过滤分表支持dba,可以流畅的登出db,宕机db自动移除...3.Atlas最吸引人的分表功能分表功能最吸引人Atlas相对于mysql-proxy的功能。1、分表设置为了支持分表,需要添加分表设置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,并且所有子表必须在一个数据库中。画外音:嗯,这个需要用户手动执行,还是有点tricky的。画外音:分表要求分表在库中。如果数据量太大,则无法通过扩展实例进行扩展。我不确定Atlas如何考虑这个问题的“可扩展性”。2.操作支持Atlas支持select、delete、update、insert、replace操作,它会根据$partition_column_name的值对表的个数取模来定位SQL请求会落入哪个子表。需要注意的是,sql语句必须携带分表id作为查询条件。如果不带id,会提示stu表不存在。画外音:不支持数据库分表,不支持非partition_column的查询。应用场景应该比较有限。四、atlas参数扩展1、min-idle-connections用于实现mysq连接池功能,限制连接数。Atlas为每个数据库创建一个连接池。当客户端连接到Atlas时,Atlas将首先连接到第一个DB。建立连接直到第一个DB连接池中的空闲连接数达到min-idle-connections,然后在下一个DB上建立连接直到所有DB连接池中的空闲连接数达到min-idle-connections,并且然后不再建立新的连接,开始重用连接池中的连接。Atlas启动时,configuration中的所有DB都会按照主库在从库前的顺序在内存中排列,所以初始阶段会先建立在主库上。在连接Atlas的运行过程中,如果一个连接触发了DB的wait_timeout,Atlas会销毁这个连接。如果连接池中的空闲连接数低于min-idle-connections,Atlas会在客户端下次连接时关闭连接。初次使用的用户在DB上重新建立连接时,往往会误认为读写分离不起作用。其实是因为min-idle-connections设置的比较大,测试的时候只建立了一个或者几个连接。这种情况下,建立的连接都在主库上,从库还没有建立连接。这时候发送read语句自然只能调用主库DB的wait_timeout了。建议不要设置得太小,因为Atlas有连接池机制,不会一直新建连接。导致DB上连接过多,所以DB不需要依赖wait_timeout来防止连接过多。如果wait_timeout太小,会在Atlas中造成一些不必要的销毁超时连接的开销。破坏。2.client-ips该参数用于实现多用户权限控制功能。配置格式如下:client-ips:127.0.0.1,192.168.0.*画外音:简单实用的功能,多少意外是“离线流量压到线上”或者“SecureCRT窗口太多,并切换了错误的数据库”。3.lvs-ips这个参数是Atlas前面连接的LVS的物理网卡的IP,不是虚拟IP。该参数用于实现平滑重启功能,否则重启Atlas那一刻的那些SQL请求会失败。顺利重启的条件:至少有两台相同配置的Atlas,并且经过LVS连接。5.Atlas是最受关注的FAQ1。Q:Atlas支持多字符集吗?答:是的,对多字符集的支持是Atlas对原有MySQL-Proxy的第一步改进。2.问:Atlas支持事务操作吗?答:可以,而且当一个处于事务状态的client中途退出时,Atlas会销毁client使用的连接,让后台的mysql回滚事务,保证事务的完整性。画外音:单库多表。3、问题:自动读写分离很好,但是有时候写完了就想读,主从同步延迟了怎么办?答:在SQL语句前加上/*master*/,强制读请求到master库,例如:/*master*/select*fromt;画外音:嗯,来电者需要强制读主控。说实话,不是特别实用。4.问:主库宕机,读操作会受影响吗?答:不可以,mysql-proxy不支持这个功能。5、Q:我想注销一个DB,又不想停止服务器怎么办?A:您可以通过管理界面:removebackendi6手动登录和退出后台数据库。Q:我想在集群中添加一个DB,但是不想影响线上可以正常访问吗?答:可以通过管理接口实现:addmasterip:portaddslaveip:port@weight7。问:Atlas支持mysql的prepare特性吗?答:没有,但计划在后续版本中支持。8.问:Altas是否支持多主库运行模式?答:目前还没有测试过Atlas后面挂着多个主库的情况,不建议这样使用。推荐使用一主一从或一主多从的模式。9.Q:Altas是否支持SQL安全过滤?答:可以,不带where子句的delete是可以过滤的。10、Q:Altas未来的发展规划是怎样的?答:支持跨机器分库分表,数据不能分到多台机器。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
