为什么需要分库分表
Posted flgb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么需要分库分表相关的知识,希望对你有一定的参考价值。
核心思想:
a)使用 41bit 作为毫秒数,可以使用 69 年
b)10bit 作为机器的 ID(5bit 是数据中心,5bit 的机器 ID),支持 1024 个 节点
c)12bit 作为毫秒内的流水号(每个节点在每毫秒可以产生 4096 个 ID)
d)最后还有一个符号位,永远是 0。
代码:snowflake.SnowFlakeTest
优点:毫秒数在高位,生成的 ID 整体上按时间趋势递增;不依赖第三方系统,稳定 性和效率较高,理论上 QPS 约为 409.6w/s(1000*2^12),并且整个分布式系统内不会 产生 ID 碰撞;可根据自身业务灵活分配 bit 位。
不足就在于:强依赖机器时钟,如果时钟回拨,则可能导致生成 ID 重复。
当我们对数据做了切分,分布在不同的节点上存储的时候,是不是意味着会产生多 个数据源?既然有了多个数据源,那么在我们的项目里面就要配置多个数据源。
现在问题就来了,我们在执行一条 SQL 语句的时候,比如插入,它应该是在哪个数 据节点上面执行呢?又比如查询,如果只在其中的一个节点上面,我怎么知道在哪个节 点,是不是要在所有的数据库节点里面都查询一遍,才能拿到结果?
那么,从客户端到服务端,我们可以在哪些层面解决这些问题呢?
2.4 多数据源/读写数据源的解决方案
我们先要分析一下 SQL 执行经过的流程。 DAO——Mapper(ORM)——JDBC——代理——数据库服务
2.4.1 客户端 DAO 层
第一个就是在我们的客户端的代码,比如 DAO 层,在我们连接到某一个数据源之前, 我们先根据配置的分片规则,判断需要连接到哪些节点,再建立连接。
Spring 中提供了一个抽象类 AbstractRoutingDataSource,可以实现数据源的动态 切换
。。。
2.4.4 代理层
前面三种都是在客户端实现的,也就是说不同的项目都要做同样的改动,不同的编 程语言也有不同的实现,
所以我们能不能把这种选择数据源和实现路由的逻辑提取出来, 做成一个公共的服务给所有的客户端使用呢?
这个就是第四层,代理层。比如 Mycat 和 Sharding-Proxy,都是属于这一层
以上是关于为什么需要分库分表的主要内容,如果未能解决你的问题,请参考以下文章