一、项目背景
公司日订单达到百万级别,我负责的广告业务,需要针对订单进行实时处理。区分出所有由广告产生的订单,并且根据订单计算应支付给广告商的佣金。
同时此部分订单需要入库,mysql里面的广告订单表数量已经达到10亿级别,无法支持正常的查询、统计、导出功能,所以需要进行分库分表。
二、拆库方案
根据数据统计,目前先拆分成32个数据库,预计可以支持两年内的数据增长。
数据分库中间件采用当当网的开源sharding-jdbc,之后会另开一篇文章单独介绍。
分库中间件支持写入、订单号查询、日期查询等各种功能。
复杂的报表和统计逻辑采用ES搜索引擎来实现。
三、数据迁移
数据迁移使用多线程查询旧数据库,然后调用中间件单订单写入接口进行,写入QPS可以达到8000
多线程中分页查询数据库订单,采用mysql的回表查询方式,达到最大的分页查询性能。
SELECT a.* FROM (
SELECT id FROM order_detail
WHERE order_time>=#{startTime}
AND order_time<=#{endTime}
ORDER BY id
LIMIT #{pageStart},#{pageSize}
)b
LEFT JOIN uws_a_order_detail a ON b.id=a.id
四、ES搜索引擎解决复杂业务逻辑和查询
ES负责实时订单查询,与复杂报表统计
数据更新分为手动全量更新索引,和实时数据更新
实时数据更新使用mysql的binlog实现,实时监听32个数据库的binlog,然后推送到kafka。多线程消费kafka数据,写入ES。