曾经有过想法用python实现一个伪mysql代理端,不求兼容mysql,只求能合理的实现数据路由。
正文开始,这段时间在尝试看kingshard代码,然后一直在思考mysql的分布式分库分表的问题。
我们知道mysql的水平分表有hash,range的时候。 而被range的字段可以是id(数字),也可以是时间段。 那么问题就来了. 当你扩展使用mycat、kingshard、atlas类型的mysql proxy或者是程序自己实现db路由都会遇到这类问题。
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。
下面是按照每月的模式进行分表.
因为数据量很大,又因为更好的管理数据,所以表按照日期放在不同的mysql上.
#blog: xiaorui.cc ec_2014-01 --> mysql-A ec_2014-02 --> mysql-B ec_2014-03 --> mysql-C ec_2014-04 --> mysql-A
对于mysql proxy来说,他会根据年月取出相关的表,然后针对年月hash得到是哪台mysql.
因为性能考虑,我又想增加一个 mysql-D 节点.
那么理论上关系成这样了. mysql-A的ec_2014-04数据需要copy到mysql-D ?
2014-04 --> mysql-A --->>>> 2014-04 --> mysql-D
难道每次增删节点,我需要平衡下数据? 或者用一个配置表来控制关系?
我以前在乐视的时候会平衡数据,好奇其他的大厂是怎么解决的? 带着这个疑问我问了一些大厂的dba高手及kingshard作者陈非,他们给我的回复是一定要预先设计好架构,如果真的因为各种情况增加或减少节点,那么需要自己平衡数据的。 做法很简单,就是复用proxy的hash调度算法,一个个的move数据。 当然这些是可以自动化运维起来的。
这么一折腾,我对于mysql按照日期分表的问题清晰了。
下面分享一个我在weibo看到的一个mysql proxy总结图,涵盖了不少有名气的proxy。 比如cobar,Mycat,kingshard,atlas 。