news 2026/5/21 8:04:00

淘宝返利app多数据源设计:基于MyCat的分库分表与读写分离

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
淘宝返利app多数据源设计:基于MyCat的分库分表与读写分离

淘宝返利app多数据源设计:基于MyCat的分库分表与读写分离

大家好,我是省赚客APP研发者阿宝!

在省赚客这类高并发返利应用中,用户订单、佣金记录、推广关系等核心数据量增长迅猛。单库单表在日均百万级订单下已出现性能瓶颈。为保障系统稳定性和扩展性,我们采用MyCat作为中间件,实现分库分表 + 读写分离的多数据源架构,支撑当前千万级用户规模下的高效数据访问。

整体架构设计

系统部署4个MySQL实例(2主2从),通过MyCat逻辑库rebate_db对外提供统一入口:

  • 写操作:路由至主库(dn1_master,dn2_master);
  • 读操作:负载均衡至从库(dn1_slave,dn2_slave);
  • 分片规则:按用户ID哈希分片,确保同一用户数据落在同一库。

MyCat配置文件关键部分如下:

<!-- schema.xml --><schemaname="rebate_db"checkSQLschema="false"sqlMaxLimit="100"><tablename="user_order"dataNode="dn1,dn2"rule="user_id_mod"/><tablename="commission_record"dataNode="dn1,dn2"rule="user_id_mod"/></schema><dataNodename="dn1"dataHost="host1"database="rebate_01"/><dataNodename="dn2"dataHost="host2"database="rebate_02"/><dataHostname="host1"maxCon="1000"minCon="10"balance="1"><writeHosthost="master"url="192.168.1.10:3306"user="root"password="xxx"><readHosthost="slave"url="192.168.1.11:3306"user="root"password="xxx"/></writeHost></dataHost>

分片规则定义在rule.xml

<tableRulename="user_id_mod"><rule><columns>user_id</columns><algorithm>mod-long</algorithm></rule></tableRule><functionname="mod-long"class="io.mycat.route.function.PartitionByMod"><propertyname="count">2</property></function>

Java应用连接配置

Spring Boot项目通过JDBC URL直连MyCat(端口8066),无需感知底层分片:

# application.ymlspring:datasource:url:jdbc:mysql://mycat.juwatech.cn:8066/rebate_db?useUnicode=true&characterEncoding=utf8username:app_userpassword:secure_passworddriver-class-name:com.mysql.cj.jdbc.Driver

业务代码保持透明,例如订单创建:

packagejuwatech.cn.order.mapper;importorg.apache.ibatis.annotations.Insert;importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Options;@MapperpublicinterfaceUserOrderMapper{@Insert("INSERT INTO user_order (user_id, order_no, amount, status) VALUES (#{userId}, #{orderNo}, #{amount}, #{status})")@Options(useGeneratedKeys=true,keyProperty="id")intinsert(UserOrderorder);}

MyCat根据user_id自动路由到dn1dn2,开发者无需编写分库逻辑。

强制走主库场景处理

对于“下单后立即查询”等强一致性场景,需强制读主库。MyCat支持注解式路由:

packagejuwatech.cn.order.service;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;@ServicepublicclassOrderQueryService{@Transactional(readOnly=false)publicUserOrdercreateAndQuery(StringuserId,StringorderNo){// 插入订单(写主库)orderMapper.insert(newUserOrder(userId,orderNo,100L,"PENDING"));// 强制读主库:MyCat注解 /*balance*/ 或 /*master*/returnorderMapper.selectByOrderNoWithHint(orderNo);}}

对应Mapper方法:

@Select("/*master*/ SELECT * FROM user_order WHERE order_no = #{orderNo}")UserOrderselectByOrderNoWithHint(StringorderNo);

该注释将绕过读写分离,直接查询主库,避免主从延迟导致查不到数据。

全局自增ID生成

由于分库后MySQL自增主键不再全局唯一,我们采用Snowflake算法生成分布式ID:

packagejuwatech.cn.common.id;@ComponentpublicclassSnowflakeIdGenerator{privatefinalSnowflakesnowflake=IdUtil.createSnowflake(1,1);publiclongnextId(){returnsnowflake.nextId();}}

在实体插入前赋值:

UserOrderorder=newUserOrder();order.setId(idGenerator.nextId());order.setUserId(userId);orderMapper.insert(order);

跨分片查询优化

对于运营后台的全局统计需求(如“昨日总佣金”),避免全表扫描。我们采用以下策略:

  1. 冗余汇总表:每日凌晨通过Flink聚合写入daily_commission_summary(不分片);
  2. 异步导出:大数据量查询走离线数仓,不压在线库。

示例汇总任务:

@Scheduled(cron="0 0 2 * * ?")publicvoidaggregateDailyCommission(){List<CommissionSummary>summaries=commissionMapper.sumByDate(LocalDate.now().minusDays(1));summaryMapper.batchInsert(summaries);// 写入非分片表}

监控与故障切换

MyCat提供JDBC连接池监控和心跳检测。当主库宕机时,自动切换至备用主库(需配合MHA或Orchestrator)。我们还通过Prometheus采集MyCat指标:

# mycat_exporter配置metrics_path:/actuator/prometheusstatic_configs:-targets:['mycat-metrics:9104']

关键告警项包括:连接池耗尽、SQL执行超时、主从延迟>5s。

上线后,系统写入TPS提升3倍,复杂查询响应时间从2s降至200ms以内,有效支撑大促期间流量洪峰。

本文著作权归聚娃科技省赚客app开发者团队,转载请注明出处!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 15:19:21

京东返利app分布式追踪系统:基于SkyWalking的全链路问题定位

京东返利app分布式追踪系统&#xff1a;基于SkyWalking的全链路问题定位 大家好&#xff0c;我是省赚客APP研发者阿宝&#xff01; 在省赚客这类对接京东联盟API的返利应用中&#xff0c;一次用户下单返现操作可能涉及订单同步服务 → 佣金计算引擎 → 用户账户系统 → 消息通知…

作者头像 李华
网站建设 2026/5/20 16:53:12

cmake 里 add_library 怎么理解

一、基本介绍add_library 是 CMake 中创建库文件&#xff08;静态库或动态库&#xff09;的核心命令。它的主要作用是将源代码文件编译成库&#xff0c;以便在项目中复用或被其他目标链接。基本语法如下所示&#xff1a;add_library(<name> [STATIC | SHARED | MODULE][E…

作者头像 李华
网站建设 2026/5/20 16:53:22

GLM-TTS能否用于宠物语音翻译器?拟人化叫声生成脑洞

GLM-TTS能否用于宠物语音翻译器&#xff1f;拟人化叫声生成脑洞 在智能音箱已经能读懂你心情的今天&#xff0c;我们是不是离“听懂猫主子心里话”也只差一步了&#xff1f; 这听起来像科幻桥段——你的猫咪跳上沙发&#xff0c;喵呜一声&#xff0c;设备立刻播报&#xff1a;“…

作者头像 李华
网站建设 2026/5/20 21:37:35

为什么90%的PHP开发者不会写扩展?揭开ZEND引擎背后的神秘面纱

第一章&#xff1a;为什么90%的PHP开发者不会写扩展&#xff1f;PHP作为广泛使用的服务器端脚本语言&#xff0c;其生态中绝大多数开发者停留在使用函数、类库和框架的层面。尽管PHP提供了强大的C语言扩展机制&#xff0c;允许开发者深入内核实现高性能模块&#xff0c;但真正掌…

作者头像 李华
网站建设 2026/5/20 16:53:19

Kanass快速上手指南:如何进行迭代管理

kanass是一款国产开源免费、简洁易用的项目管理工具&#xff0c;包含项目管理、项目集管理、事项管理、版本管理、迭代管理、计划管理等相关模块。工具功能完善&#xff0c;用户界面友好&#xff0c;操作流畅。本文主要介绍迭代管理。1、添加迭代进入项目->迭代->添加迭代…

作者头像 李华