唯's Blog

笔者是一个热爱编程的 Java 程序员。

0%

分库分表

分库分表是解决大流量、大数据量系统数据库层面的优化。

分为两种类型

  • Client :Sharding-jdbc

  • Server:Mycat、sharding-proxy

带来的问题

  1. 深度分页、查询性能低下(多表,甚至跨库):使用ES的宽表、通过 ETL 将数据清洗到 ES

  2. 数据倾斜:跟分表分库策略有关系。超级用户

  3. 分布式事务:例 使用消息中间件保证最终一致性

  4. 深分页问题:。。

如何平缓迁移老系统的数据?

目前大多数公司的数据库方案都不是一来就上分库分表(当然如果能够预料到数据体量,一开始就设计好这样最好,但是新业务的不确定性还是很大),因此存在老数据往新的分库分表数据库迁移的情况。

方案:双写不中断迁移

历史数据量大,肯定不能停机迁移。

方案1:

  • 线上系统里所有写库的地方,增删改操作,除了对老库增删改,都加上对新库的增删改,使用方

  • 系统部署以后,还需要跑程序读老库数据写新库,写的时候需要判断updateTime

  • 循环执行,直至两个库的数据完全一致,最后重新部署分库分表的代码就行了

方案2:

新老服务均支持运行:

流量染色灰度发布,区分新、老服务。数据同步:定时同步、实时异步同步。稳定后网关将流量切换到新服务。

如何扩容?

2*n 参考 hashmap 的扩容机制