记一次mycat日活量数亿级别分库分表方案及数据迁移

本文介绍了在面临日活量数亿级别的短信下发业务时,如何使用mycat进行分库分表策略,包括手机号对200取模决定分库,日期决定分区。为减少多表查询,优化了字段布局。数据迁移过程中,由于mycat不支持select into,选择了load data方式进行百万级数据快速导入,并分享了数据分割与导入的脚本方法。

先说一下业务场景。项目是负责公司短信下发的,目前每日下发量大概在千万级别,采取了每天一张表的分表方案,但为了后续新的发送方接入,需要支持每日近亿级别的发送量,此时每天一张发送日志表的分表方案明显已不再支持。经过激烈讨论,我们引入了mycat的解决方案。

考虑到发送量的大小,我们对发送日志表进行了分库分区操作,保证每一个库和区能够均匀承担数据压力,我们决定对两个字段进行取模。即手机号对200取模决定在哪一个库(分了两百个库,每天一个分区),再传入日期(比如20200127),决定数据落在哪一个分区。

mycat多表查询时会先拿到数据再进行逻辑处理,所以我们设计的时候秉持着尽量分表单表定向查询的原则,把原来一些需要联合查询的字段都放到了rcs_send_log这张分库表中。

partition_name varchar(12) DEFAULT NULL COMMENT ‘表分区字段-年月日’,
db_split varchar(20) DEFAULT NULL COMMENT ‘分库字段 (手机号)’

对于知道 partition_name和db_split的增删改查语句,我们能够很快的查询出该记录。但对于批量查询,能避免则避免,无法避免时,通过查询每个库去得到执行结果。

通过在sql语句前加下面这一行,去指定库
/**mycat:dataNode=${dataNodeName}*/
类似这种
在这里插入图片描述

数据割接

因为牵扯到割接的数据量过大,且mycat不支持select into模式的批量查询。这里进行割接采用的是load data。能实现百万数据十几秒导入。
具体导入导出脚本如下。

#从原库
<think>嗯,用户想了解分库分表的适用场景和实现方案,还有分布式数据库设计。首先,我需要根据提供的引用内容来整理信息。引用1提到分库分表属于分布式架构,但可能存在冗余,而引用3比较了分库分表和MySQL MPP的适用场景。引用4则提到了TiDB的空间优势,可能涉及分布式数据库的选择。 首先,适用场景。分库分表适用于数据大的单表,比如订单、志。当单库性能达到瓶颈时,分库分表可以分散压力。高并发场景下,通过分片减少锁竞争。此外,业务需要水平扩展时,分库分表也是选择。这些点引用3有提到,需要结合引用内容。 然后是具体实现方案分库分表有两种方式,垂直拆分和水平拆分。垂直拆分按业务模块分库,比如用户库、订单库,引用2中的图可能展示了这种结构。水平拆分则按分片键进行,比如用户ID哈希或时间范围。中间件的选择,比如ShardingSphere或MyCat,引用1提到中间件和Proxy形式,可能会有SQL解析的冗余问题。 在实现步骤上,需要确定拆分策略,选择中间件,数据迁移,以及应用改造。数据迁移要保证一致性,可能需要双写或停机维护。应用层需要调整SQL,处理跨分片查询,比如JOIN操作可能变复杂,引用3提到分库分表适合中等规模数据,可能因为复杂查询处理有限。 分布式数据库设计方面,要考虑数据分布策略、一致性与可用性(CAP理论),事务处理,查询优化,以及扩展性。引用3和4提到NewSQL如TiDB的优势,比如高压缩比和自动分片,可能更适合大规模数据,而分库分表需要更多手动管理。 最后,用户可能需要对比分库分表和分布式数据库的优劣,根据业务需求选择。引用3建议根据数据规模和需求选择,分库分表适合中等规模,分布式数据库如TiDB适合大规模。同时,引用1指出NewSQL避免了中间件层的冗余,可能更高效。 总结回答结构:先分场景,再实现方案,然后设计要点,最后对比选择。注意引用标,比如适用场景引用3,中间件引用1,数据迁移引用2等。确保使用正确的LaTeX格式,变用$包围,独立公式用$$。同时生成相关问题,比如优化方法、与NewSQL对比、数据迁移挑战等。</think>### 分库分表的适用场景与实现方案 #### 一、分库分表的适用场景 1. **单表数据过大** 当单表数据超过传统数据库(如MySQL)的处理能力(例如$10^8$行级别),读写性能显著下降时,可通过水平分表分散存储压力[^3]。 2. **单库性能瓶颈** 单个数据库实例的CPU、内存或磁盘I/O达到物理极限,需要**分库**将负载分摊到多个实例[^2]。 3. **高并发写入场景** 例如电商订单系统,通过**分片键(如用户ID)**将数据分散到不同库表,减少锁竞争和I/O争用[^3]。 4. **业务需要水平扩展** 当业务需要动态扩容时,分库分表支持通过增加数据库节点实现线性扩展,而垂直扩展受硬件限制[^1]。 --- #### 二、分库分表的具体实现方案 ##### 1. **垂直拆分与水平拆分** - **垂直分库**:按业务模块划分数据库(如用户库、订单库),通过微服务架构隔离不同业务的数据访问[^2]。 - **水平分表**:将单表数据按分片规则(如哈希、范围)分布到多个物理表,例如: ```sql -- 按用户ID哈希分表 CREATE TABLE order_0 (id BIGINT, user_id INT, ...) PARTITION BY HASH(user_id % 4); ``` ##### 2. **中间件选择** - **代理层方案**:如MyCat、ShardingSphere-Proxy,通过独立服务路由SQL请求。 - **客户端SDK方案**:如ShardingSphere-JDBC,在应用层直接集成分片逻辑,减少网络开销。 ##### 3. **数据迁移与一致性** - **双写过渡**:新旧库同时写入,逐步迁移历史数据。 - **全局唯一ID生成**:采用Snowflake算法或数据库分段分配,避免主键冲突。 ##### 4. **跨分片查询处理** - **聚合查询**:通过中间件合并多个分片结果(如SUM、COUNT)。 - **JOIN操作**:需业务层改造,避免跨库JOIN,或通过冗余字段本地化关联。 --- #### 三、分布式数据库设计要点 1. **数据分布策略** - **分片算法**:一致性哈希减少数据迁移,范围分片优化范围查询。 - **多副本同步**:基于Raft/Paxos协议保证数据一致性[^4]。 2. **CAP权衡** - 金融场景优先CP(如TiDB),社交场景可选AP(如Cassandra)[^3][^4]。 3. **事务与查询优化** - 分布式事务:采用Saga模式或2PC协议。 - 查询下推:将计算任务分布到存储节点(如MPP架构)。 --- #### 四、分库分表 vs 分布式数据库 | **维度** | **分库分表+中间件** | **NewSQL(如TiDB)** | |------------------|--------------------------|---------------------------| | SQL兼容性 | 需适配分片逻辑 | 完全兼容MySQL协议 | | 扩展性 | 手动分片,扩容复杂 | 自动分片,在线扩容 | | 事务支持 | 依赖应用层补偿 | 原生分布式事务 | | 适用数据规模 | 中等规模(TB级) | 大规模(PB级) | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值