1. 前言
浙江乐檬信息技术有限公司成立于2004年,是⼀家产品+定制型企业。乐檬⽴⾜于⻝品零售⾏业,提供专业的食品零售行业系统软件解决方案,包括门店收银系统、连锁ERP管理系统、WMS仓储管理系统、线上商城、全渠道会员管理系统等,为超万家食品零售企业提供了专业服务。发展至今,乐檬已为上万家客户提供零售全渠道全场景一站式解决方案,服务门店数10w+。
乐檬原先使用开源MySQL支撑以零售ERP为核心的全渠道会员、智慧收银、线上商城、订单管理、营销、移动报表等全系列业务。2023年下半年,乐檬核心业务的数据量和并发量持续上涨,对数据读写性能和分析性能提出了更高的要求。在原有数据库上得不到较好的解决,部分情况下升配资源来缓解问题效果也不是太好。
乐檬基于阿里云瑶池旗下的云原生数据库PolarDB构建新技术架构,高性能稳定支撑超过10万个门店。使用列存索引后核心功能SQL查询性能最高提升170倍,大部分复杂SQL查询性能提速10倍以上。
2. 业务挑战
2.1 智慧收银系统实时性不足
智慧收银系统是乐檬ERP系统的主要业务入口,收银速度、大客户收银并发能力、收银系统的稳定性对门店的购物体验非常重要,对数据库读写性能、并发读写能力、稳定性和健壮性提出较高要求。乐檬业务的数据量巨大,达到10亿级,开源MySQL的高并发读写遇到瓶颈,出现交易延迟、数据不一致等问题。
2.2 多个查询分析场景出现性能瓶颈
除了智慧收银的业务之外,乐檬的业务系统中还包含多个复杂查询分析场景,包括:
- 全渠道会员:包括积分商城、会员标签、客户拉新等模块,根据会员的购买行为对用户进行打标,根据不同标签进行个性化信息推送,助力精准营销,需要针对亿级订单数据以及更大规模的流量、登录日志进行多表关联聚合查询。
- 进销存单据系统:可以给门店负责人提供销售分析、商品分析等功能,需要对亿级至10亿级订单进行销售分析以及折扣分析,涉及用户、订单、商品折扣等多表关联和复杂化查询处理。
- 移动报表:可以快速发现门店和电商渠道会员量、订单量、收入、库存等波动信息,涉及1500家门店上亿订单数据5~10个表关联、聚合、子查询、排序查询、LEFT JOIN等。
这些复杂查询分析场景涉及的数据量巨大,单个OLAP查询需要执行TB级别的数据,消耗大量CPU和IO资源,伴随出现了不同客户的查询干扰问题。大客户数据量、并发量增长之后,由于单次查询慢,报表的并发能力急剧下降,使用体验下降。
3. PolarDB的解决方案
经过多轮的调研和与阿里云PolarDB团队的沟通交流,出于兼容性、易用性、查询提速能力、弹性、成本等方面的考虑,乐檬决定将数据迁移到PolarDB MySQL版来解决这些问题。乐檬主要看中PolarDB的IMCI、读写分离一致性读、Serverless、共享存储大存储等特性,在较好地解决当前问题的同时,也给乐檬未来的技术架构演进提供了较好的扩展性。
当前,乐檬使用PolarDB实例超50个,总数据量超过300TB,这些实例用于以零售ERP为核心的全渠道会员、智慧收银、线上商城、订单管理、营销、移动报表等乐檬全系列业务中。核心产品门店收银管理、连锁门店ERP管理系统、采购配送系统、客户营销分析系统、新零售管理系统、WMS仓储管理系统等主要使用PolarDB MySQL版来支撑业务的高并发读写和未来的架构扩展。
乐檬阿里云技术架构图
3.1 共享存储一写多读架构支撑收银业务
PolarDB基于云原生设计理念,采用分布式集群架构,一写多读,一个集群包含一个主节点和最多15个只读节点。主节点处理读写请求,只读节点仅处理读请求。主节点和只读节点之间采用Active-Active的Failover方式,提供数据库的高可用服务。多个计算节点共享一份数据,基于全新打造的分布式块存储(Distributed Storage)和文件系统(Distributed Filesystem),存储容量可以在线平滑扩展,不会受到单个数据库服务器的存储容量限制,可应对上百TB级别的数据规模。
PolarDB技术架构图
乐檬的智慧收银系统以PolarDB为核心组件支撑收银业务,来满足不同收银端、不同业务渠道、多个门店的收银诉求。PolarDB通过内核读写优化、物理复制和读一致性、Serverless等特性,解决了智慧收银系统高并发读写、主从数据复制延迟、业务流量波动大等问题,使得乐檬的收银流程更加顺畅和丝滑。
- 内核读写的优化
PolarDB的共享存储一写多读的架构发挥了极大的作用,垂直弹升读写节点,动态增加只读节点的操作都可以在分钟级完成。PolarIndex、热点库存更新、PolarDB Redo分散写等内核优化提高了收银的并发能力,降低每次收银查询耗时,整体提高了乐檬智慧收银系统的并发能力和扩展能力。
- 物理复制和强一致读
PolarDB采用共享存储技术架构,同时技术上读写节点和只读节点之间采用物理日志复制,读写节点和只读节点复制延迟低,延迟控制在毫秒级,能满足大部分业务场景的延迟要求,同时通过高性能全局一致性(SCC)技术提供强一致读,在收银场景下满足集群水平扩展与数据读一致性的诉求,保证了业务高峰期只读节点可以帮读写节点分流。
- Serverless
乐檬服务2B的业务,存在明显的波峰浪谷特性,PolarDB的Serverless能力支持随业务负载自动弹升弹降和增加节点,帮助乐檬从容应对业务负载的波动,更好地支持大客户的日常售卖和固定的运营活动,在保障了业务正常运行的同时,也降低了资源的持有成本,从而整体上提高了资源的使用率。同时,弹升过程对业务无感,满足收银系统对系统可用性的诉求。
3.2 IMCI助力复杂查询分析提速
IMCI是In-Memory Column Index的缩写,是在已有MySQL行存表Btree索引的基础上,扩展列存形式的索引。从其名称中也不难看出,行列索引共享了基础表的数据,从而让普通的MySQL表具备了同时支持行列场景的查询需求,可以称得上是行列共存表。列存索引特性在PolarDB MySQL引擎中的功能架构图如下:
列存索引特性在PolarDB MySQL引擎中的功能架构图
从以上架构图可以看到,PolarDB MySQL引擎从存储引擎、执行算子、优化器三个层面设计了列存索引的特性:
- 存储引擎:支持实时事务级别一致性的行列混合存储。
- 执行算子:面向列存的向量化并行执行算子,支持极速的单表和多表查询。
- SQL Parser/优化器:面向行列混合存储的CBO优化器,可以根据代价自动选择行存或者列存执行查询请求。
在此架构下,PolarDB MySQL版具备如下优势:
100%兼容MySQL:列存具有与MySQL一致的数据类型系统,支持灵活的类型转换,100%兼容MySQL协议,结合自动读写分离技术团队基本可以做到代码无改动提高查询分析速度。
自动分离:PolarDB提供的自动SQL分流功能,自动将复杂查询指向分析型只读节点,业务无需对OLTP型SQL和OLAP型SQL进行手动分流。
极致的HTAP性能:在大部分场景下IMCI可以做到提速10倍~百倍,分析性能最高是开源MySQL数据库的400倍。
行列混合存储,降低成本:同时支持行存储和列存储两种格式,且实时保证行列的事务级一致,同时,列存更具有低成本的优势。
使用简单:在业务库表上购买IMCI节点,在表上增加列存索引,通过集群地址访问即可完成标签、智能营销功能的提速。
这些能力帮助乐檬数据研发团队极大地提升研发速度,从而助力大幅度优化会员管理系统、进销存单据系统、移动报表,满足这几个业务模块对数据库提速的诉求。
使用列存索引后SQL查询性能最高提升170倍,大部分复杂SQL查询性能可以提速10倍以上。同时借助PolarDB Proxy节点的智能路由能力,OLAP查询可以自动路由至PolarDB IMCI节点并选择列存索引执行SQL,做到了OLTP和OLAP架构一体化的体验,并提高了业务系统和报表系统的复杂查询性能,其中典型功能提速效果如下:
4. 总结
2024年5月底,乐檬数据库系统正式迁移到PolarDB MySQL版,通过PolarDB IMCI对MySQL 100%兼容,帮助产品快速实现性能提升和架构扩展性的诉求。在适配PolarDB过程中通过PolarDB IMCI帮助全渠道会员、移动报表实现了数据库架构统一,并简化了乐檬的技术架构。通过本次架构升级乐檬在数据库技术上做到了以下几点:
1. 架构升级:通过PolarDB IMCI功能,在高性能、高并发支持好收银和下单之外,支持十万家门店的数据实时分析。
2. 简化开发:统一HTAP架构,OLTP+OLAP混合负载,100%兼容MySQL,无需额外组件即可完成乐檬全栈业务开发,简化开发。
3. 稳定可靠:无感秒切,实例异常秒级恢复,快速恢复收银和订单业务,Serverless无感弹升从容应对业务峰值,共享存储结合一写多读架构高效实现不同场景的业务负载隔离。