分库分表
分库分表
并发量决定是否需要分库,
数据量决定是否需要分表。
分区分片
按时间范围归档分区
按用户ID取模分表,
按shardingkey来分片;
数据量太大的场景
mysql表的数据量一般控制在千万级别,如果再大的话,就要考虑分库分表。
除了分表外,列举了面对海量数据业务的一些常见优化手段
- 缓存加速
- 读写分离
- 垂直拆分
- 分库分表
- 冷热数据分离
- ES助力复杂搜索
- NoSQL
- NewSQL
分表后ID如何保证全局唯一
分库分表后,多张表共用一套全局id,原来单表主键自增方式满足不了要求。
我们需要重新设计一套id生成器。
特点:全局唯一、高性能、高可用、方便接入。
- UUID
- 数据库自增ID
- 数据库的号段模式,每个业务定义起始值、步长,一次拉取多个id号码
- 基于Redis,通过
incr命令实现ID的原子性自增。 - 雪花算法(Snowflake)
- 市面的一些开源框架,如:百度(uid-generator),美团(Leaf), 滴滴(Tinyid)等
分表后可能遇到的问题
分表后,与单表的最大区别是有分表键sharding_key,用来路由具体的物理表,以电商为例,有买家和卖家两个维度,以buyer_id路由,无法满足卖家的需求,反之同样道理。如何解决?
- 分买家库和卖家库,将买家库做为写库,保存完整的数据关系。同时将数据异构同步一份到卖家库,卖家库可以只存储
seller_id,order_id,buyer_id等几个简单关系字段即可,以seller_id作为分表键 - 多线程扫描,分段查找,然后再聚合结果
- 另外也可以存到ES中,支持多维度复杂搜索
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Michael's Blog!
评论




