mysql什么情况需要分库_一、为什么需要分库分表

6b19a7dc3f2057dc46de29e8e94baefb.png

核心思想:

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,都是属于这一层

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值