news 2026/5/1 7:22:14

淘宝返利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/4/27 11:26:28

Rust 闭包 敲黑板

在 Rust 编程中&#xff0c;闭包&#xff08;Closure&#xff09;是一种极具灵活性的可调用对象&#xff0c;它不仅具备普通函数的参数传递和返回值能力&#xff0c;还能自动捕获其定义环境中的变量&#xff0c;无需显式声明依赖。闭包的简洁语法和强大的环境捕获能力&#xff…

作者头像 李华
网站建设 2026/4/25 22:02:09

如何通过Markdown编写GLM-TTS任务脚本提升工作效率

如何通过Markdown编写GLM-TTS任务脚本提升工作效率 在一场广播剧的后期制作中&#xff0c;团队需要为15个角色生成超过200句台词&#xff0c;每句都要匹配特定音色、口音和情绪。传统做法是配音导演逐条试听、调整参数、手动点击合成——一个下午只能完成不到20条。而隔壁组用了…

作者头像 李华
网站建设 2026/4/30 19:31:29

用PHP打造高响应智能家居场景(基于真实项目的数据分析与实践)

第一章&#xff1a;PHP 智能家居场景模式概述在现代物联网&#xff08;IoT&#xff09;生态中&#xff0c;智能家居系统通过自动化场景模式提升居住体验。PHP 作为一种广泛使用的服务器端脚本语言&#xff0c;虽不直接控制硬件&#xff0c;但可通过构建后端服务协调设备行为&am…

作者头像 李华
网站建设 2026/4/21 16:09:04

书籍-《巴布尔回忆录》

《巴布尔回忆录》详细介绍 书籍基本信息 书名&#xff1a;巴布尔回忆录&#xff08;Baburnama&#xff0c;又称《瓦卡伊-巴布里》或《巴布尔自传》&#xff09; 作者&#xff1a;巴布尔&#xff08;Zahir-ud-Din Muhammad Babur&#xff0c;1483-1530年&#xff09; 成书时间&a…

作者头像 李华
网站建设 2026/4/25 3:59:53

PHP低代码权限管理系统落地案例(金融、医疗、政务三大场景曝光)

第一章&#xff1a;PHP低代码权限管理系统的时代机遇在数字化转型加速的背景下&#xff0c;企业对快速构建安全、灵活的应用系统需求日益增长。PHP作为长期活跃于Web开发领域的语言&#xff0c;结合低代码平台的可视化能力&#xff0c;正迎来重构权限管理体系的新机遇。通过将复…

作者头像 李华
网站建设 2026/4/26 9:29:19

凌晨告警不断?资深SRE教你动态调整PHP服务阈值策略

第一章&#xff1a;凌晨告警不断&#xff1f;从SRE视角看PHP服务监控的痛点对于站点可靠性工程师&#xff08;SRE&#xff09;而言&#xff0c;凌晨三点的PagerDuty告警往往意味着一场未知的战斗。当PHP服务突然响应延迟飙升、错误率陡增&#xff0c;却缺乏足够的上下文信息时&…

作者头像 李华