项目背景:
最近写了一个小程序,对订单数据处理,写入/读取次次差不多,近2月约为30W条数据(mysql存储),且在近一步快速增长中。心里很是紧张,如果超过100W了会如何?
解决问题:数据记录多时读取速度。
在网上搜索了Mysql的分表分库方案,主要有mysql proxy,Amoeba,HiveDB等。大概比较了一番,好象都不能完全达到我的
理想要求:
R1.数据库、数据表可以无限增加
R2.增加时进无需要迁移数据,或者简略简单。
R3.可以人工分配
R4.解决日期分段提历史数据查询问题,并可与主库分离(一个业务库对一个历史库2-3年数据,更早期数据归档,用户不能查询)
R5.解决主从数据库的访问,或者单点故障。
可配置,尽量不修改现在的程序。
解决办法:
为每人用户分配一个数据分区标志,终身不变以此定位数据。如user1(分区标志3)则交易数据存存在tblxx_3,历史数据存储在tblxx_3_yyyymm中,tbl_xx是开发测试时使用,也是一个真实的分表。
配置文件定义:
1. tblxx 可被替换
2. 分区标志3的数据库位置信息{3,},实际如下(php代码)
$shard['dbservers']=array(
'master'=>array(
array('1,3,70','localhost', 'eprinter', 'root', 'root', 'mysql'),
array('2,4,50','localhost', 'eprinter2', 'root', 'root', 'mysql')
),
'slave'=>array(
array('1,3,5','localhost', 'eprinter', 'root', 'root', 'mysql'),
array('2,4,50','localhost', 'eprinter2', 'root', 'root', 'mysql')
),
'history'=>array(
array('1,3,5','localhost', 'eprinter', 'root', 'root', 'mysql'),
array('2,4,50','localhost', 'eprinter2', 'root', 'root', 'mysql')
)
);
3.程序调整地方:
(1)设置用户分区代码(session启动时{user.分区码}写到数据访问类db中)
(2)拦截SQL,执行简单的SQL替换,将tblxx,替换成tblxx_分区码
(3)根据分区码,选择数据库.(这一步目前未实现,我分了10表,感觉已经够多的了,50W*10,也够我用好长时间了。)
完了!!!
附记:方案想了很久,代码花了半天时间,实际运行了几天,感觉良好。
潜在问题:可能遇到到数据库IO瓶颈(实现3.(1)后可消除),WEB服务单点故障。
结论:也算是一个可管理的分库分表方案,或者数据库透明代理了。
请大家指出不足的地方,以改进。请大家指出不足的地方,以改进。多谢,多谢,多谢!!!