news 2026/4/19 22:45:06

淘宝返利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/14 20:10:09

GLM-TTS能否用于婚礼录像后期?补录缺失旁白语音

GLM-TTS能否用于婚礼录像后期&#xff1f;补录缺失旁白语音 在一场婚礼视频剪辑过程中&#xff0c;最令人遗憾的莫过于画面清晰、情感真挚&#xff0c;却因录音设备故障或环境干扰导致关键环节——比如主持人开场、新人誓言、父母致辞——音频丢失。传统解决方案通常是请人“模…

作者头像 李华
网站建设 2026/4/15 9:56:28

target_include_directories的作用

target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})为指定的目标&#xff08;${PROJECT_NAME}&#xff09;添加一个包含目录 (${CMAKE_CURRENT_SOURCE_DIR})&#xff0c;并且作用范围是仅限于该目标的编译过程。PRIVATE表示该包含目录仅在 ${PR…

作者头像 李华
网站建设 2026/4/15 9:55:53

语音合成与知识图谱联动:实体关系转化为口语化解释

语音合成与知识图谱联动&#xff1a;实体关系转化为口语化解释 在智能教育平台开发中&#xff0c;一个常见的挑战浮现出来&#xff1a;如何让AI讲解“爱因斯坦提出相对论”这件事时&#xff0c;不只是干巴巴地读出这句话&#xff0c;而是像一位真正的老师那样&#xff0c;用合…

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

GLM-TTS能否用于军事训练模拟?战场指令语音快速生成

GLM-TTS能否用于军事训练模拟&#xff1f;战场指令语音快速生成 在一场高强度的战术推演中&#xff0c;红方指挥官突然收到警报&#xff1a;“敌方无人机群正在逼近北翼防线&#xff01;”耳机里传来的声音沉稳果断&#xff0c;带着熟悉的北方口音和特有的语调节奏——这正是他…

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

【万字长文】大模型推理加速全攻略:七大方法全面提升推理效率,从简单优化到复杂架构改进的全方位解决方案!

模型分为prefill和decoding两个阶段&#xff0c;因为特性不同&#xff0c;因此加速方式不同。prefill的加速方式主要是少算、而decoding的加速方式主要是少传输。 推理优化的方式主要有如下几种方式&#xff1a; 1、减少token输入&#xff08;少算&#xff09;。 2、量化&am…

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

语音合成SEO新玩法:用GLM-TTS生成技术文章吸引精准流量

语音合成SEO新玩法&#xff1a;用GLM-TTS生成技术文章吸引精准流量 在搜索引擎越来越偏爱多媒体内容的今天&#xff0c;单纯依赖文字输出的技术博客正面临“写得再好也难被看见”的尴尬。尤其是AI、编程、数据科学这类高门槛领域&#xff0c;读者往往需要反复阅读才能理解复杂概…

作者头像 李华