当前,OceanBase已全面承载百丽订单中心、消息中枢等核心业务系统,构建起稳如磐石的技术底座。在日均海量交易处理的常态化考验之外,更在双11等流量洪峰期间展现出卓越表现:通过分布式架构的弹性扩展能力,系统成功抵御瞬时流量冲击,实现核心业务”零故障”运行,为百丽数字化转型提供了坚实的技术保障,充分验证了新一代数据库在复杂零售场景下的商业价值。
一、MyCAT使用痛点及分布式数据库选型
MyCAT 是一个开源的分布式数据库中间件,主要用于解决单机 MySQL 处理大规模数据和高并发访问时的性能瓶颈。百丽的业务系统普遍使用了 MySQL+MyCAT 的分库分表架构设计。尽管 MyCAT 在过去一直支撑着百丽的业务发展,并在某些场景下发挥了重要作用,但随着数据量日益增长和业务场景逐渐多样性,其不足开始显露。以下是百丽使用 MyCAT 时面临的常见问题。
(一)聚合性能不稳定
在 MyCAT+MySQL 分库分表的架构下,MyCAT 作为分布式中间件,在聚合查询场景下,尤其是在多个分片的数据聚合方面,性能容易抖动。MySQL 多个分片查询到数据需要汇总到 MyCAT 之后再进行统一聚合,最终返回结果,在大数据量需要聚合的场景下,性能下降比较明显。
(二)数据分片调整困难
在日常运维的过程中,经常会面临一些业务调整需求的情况,而 MySQL 的分库分表架构调整起来非常困难。一方面会涉及数据的重分布,另一方面是 DBA 实操的复杂度较高且非常繁重。
(三)水平扩容较差
受制于原生 MySQL 数据库的原因,现有架构不能进行水平扩容,无法满足不断增长的数据处理需求。
(四)硬件成本高昂
MySQL 主从+ MyCAT 分片的架构配置动辄需要几十台服务器,给企业带来了高昂的 IT 成本,不符合当前降本增效的时代背景和业务需求。
在新架构的选型过程中,我们发现 OceanBase 可以解决上述问题。
🚀 OceanBase 可以根据业务的实际需求和实际情况,灵活选择水平扩容或垂直扩容。比如可以水平做租户资源,或者在集群级别添加 OBServer 节点;再比如扩容磁盘,我们数据盘的使用率较高,对磁盘扩容后,数据文件也会自动扩展。
🚀 得益于 OceanBase 优秀的存储压缩性能,生产环境数据同步到 OceanBase 后,所需的存储减少到原先 MySQL 的 1/3 以上。
二、业务架构优化之高可用设计
基于选型结果,我们的订单中心应用率先上线了 OceanBase 数据库,上线流程如下图所示。
🚩 上线核心业务前进行灰度压测。
🚩 针对重点业务场景进行演练,如“618”大促实战演练、“双 11”预案准备及全链路演练、逃生方案演练,演练内容覆盖大促预估的订单量。
在逃生方案的选择上,通过高可用部署的 OMS 将 OceanBase 的变更实时下发到 Kafka,通过业务系统对 Kafka 的监听,并对数据进行业务组装后写入旧系统数据库,通过新旧系统的并行运行和灰度切换,保证在新系统出现问题时可以无缝切换到原来的订单系统。通过数据库和应用数据同步的双边监控,实现整个同步逃生方案的可控性。
在“双 11”实践中,通过应用的双轨运行,保证业务在 OceanBase 和 RDS 之间无缝切换,通过业务间的拆分,拉单业务等所有写入的业务迁移到 OceanBase,而订单售后等部分查询业务保留在原来 RDS 上,通过 OceanBase 到 RDS 的同步保证双边数据一致,在任何一边出现问题时都能无缝切换。
目前订单中心使用 OceanBase 的系统架构如下:
其次,和零售等有明确大区信息的业务不同,电商业务没有明确的分区字段,使用用户 ID 不能很好地分散负载,因此,我们设置 Primary Zone 为 Zone1;Zone2,Zone3,把主副本都集中到单个 Zone,尽可能地避免分布式事务。
最后,由于 OBProxy 的部署通常有集中部署、独立部署和客户端部署三种方式,为了提高性能并减少对应用的影响,我们把 OBProxy 和 OBServer 部署在同一台服务器上,减少 OBProxy 路由时的 RPC 请求时间。
自 OceanBase 上线后,我们发现,相较于原来的数据库架构,存储成本下降为原来的 1/3。另外,OceanBase 丰富的生态工具体系使我们的运维工作大幅简化,比如 OceanBase 的运维平台 OCP 提供了一系列管理和运维操作的功能,支持备份管理、监控管理和 TOP SQL 等管理展示,在一定程度上实现了运维自动化,降低了运维成本;再比如 obdiag 提供了一系列诊断功能,使故障定位的时间被大幅缩短,我们可以使用闪回技术处理数据恢复案例,相对于 MySQL 只能分析 Binlog 回滚的方式,显著提高了故障处理效率。
三、“双11”大促场景性能调优方案
电商行业中“双 11”大促是对业务和技术架构的一次考验,此前使用 MySQL 总是遇到瓶颈,具体表现在高并发、扩展性、复杂查询等方面。
👉 复杂查询处理:大促期间电商涉及的查询操作较多,当客服进行发货、统计赠品等操作时,需要进行复杂的聚合查询处理,MySQL 面对这类 AP 类的查询时,响应时间显著增高。
🔎 使用 obdiag 工具对集群进行整理巡检,以发现可能存在的隐患。
🔎 提前发起合并,避免促销时数据修改过多引发性能问题,并且调整每日自动合并的时间。
经过分析出现的 SQL,我们发现一个共同特点,即条件字段中使用 sku_no 字段,而 sku_no 字段存在严重的数据倾斜问题。在电商业务中,sku_no 代表商品的编号,商品存在热门款和普通款,当 SQL 传的参数是热门款时,由于需要扫描的行数较多,会选择其它条件字段的索引扫描作为驱动,而由于 OceanBase 的执行计划缓存机制, sku_no 的传值是普通款时也复用了该计划,而值少的正确参数应该使用该字段索引作为驱动,由于没有走到最优的执行计划,从而导致了 SQL 相应时间的整体提高。
解决办法是通过 Outline 绑定一个执行计划,实践发现,对于这部分 SQL,使用 sku_no 的索引作为驱动 SQL 的整体表现较好,即使传参为值较多的 sku_no 损失的性能也较为有限。因此,我们对这一部分的 SQL 进行 Outline 固定执行计划的处理。
问题 2:后台定时任务时间设置不合理,导致高峰期间前后台资源争抢。
OceanBase 缓存失效有以下几种原因:
💡 SQL 中涉及重新收集表的统计信息时,该 SQL 在计划缓存中所对应的执行计划会被刷新。
MONDAY_WINDOW 22:00/per week 4 hours
TUESDAY_WINDOW 22:00/per week 4 hours
WEDNESDAY_WINDOW 22:00/per week 4 hours
THURSDAY_WINDOW 22:00/per week 4 hours
FRIDAY_WINDOW 22:00/per week 4 hours
SATURDAY_WINDOW 6:00/per week 20 hours
SUNDAY_WINDOW 6:00/per week 20 hours
对应的解决办法也比较简单,我们在大促前不仅要调整每日自动合并的时间,还需要调整维护窗口的时间,以避开大促业务时间。
问题 3:下游的同步业务增加了资源消耗,导致高峰期间资源争抢。
由于业务逻辑要求,新系统写入的每一条数据都要通过特定逻辑组装后同步到旧系统,因此 OceanBase 中的每一次数据变更下游系统都需要一次或多次的查询负载。增大的数据库压力在大促业务高峰时体现得尤为明显。大促使用的 OceanBase 版本备库不支持作为 OMS 源端(新版已经支持),我们对架构进行了一定的优化。
四、总结
上线之后,OceanBase 承载了百丽所有的电商渠道订单业务,每天主单量 10万+,大促高峰每小时 50万+。总而言之,OceanBase 解决了百丽在使用 MySQL+MyCAT 架构时遇到的痛点。在性能、数据压缩上的优秀表现和丰富的生态工具给我们留下了深刻印象:
想了解更多资讯
扫码关注👇
了解更多考试相关
扫码添加上智启元官方客服微信👇