分表分库动态扩容方案

8 篇文章 0 订阅
7 篇文章 0 订阅

MYSQL数据库经常要分表分库,提高性能,和容量问题。

分表分库方案

1、取模。

就是用一个字段 比如userId=101,分成十张表 101%10=1。最后放在user_01表中。扩容困难,需要把所有数据重新分配

2、一致性哈西算法(自己百度下)

扩容较好,每次加一个,只需要把顺时针的库拆分即可。但是分布会不 均匀。要不然就要所有的库都变动部分数据,虽然不是所有的数据。

 

以上都不是重点。因为他们扩容都需要变动数据,操作不当就会有错。

重点如下

3、籍贯定位法

众所周知,每个人出生的时候就有自己的籍贯。比如广西桂林。然后我们都有自己的身份证号,代表着你是唯一的。从身份证号上就能知道你的籍贯。那么数据也可以这样,在你创建这条数据的时候,分配身份证号,就知道它是哪张表哪张库了。步骤如下

1、表中添加一个籍贯字段,每次创建数据时,分配全局唯一ID(全局唯一ID生成方式百度吧)。大多分布式系统都会有全局唯一ID功能。在这个ID上,加库后辍和表后辍。(以下只做分表,分库同理)比如user_info分成了3张表00~02。全局唯一ID生成时,我们在00~02随机选择一个数字。随机一定要按一定比例,比如权重 00-33% 01-33% 02-34%,这样保证公平性。

2、比如我们的全局唯一ID是  00XXXXXXX 那么我们就知道他属于 user_info_00这张表。插入这张表中

3、当数据达到一定量时,比如每张表已经使用50%,我们扩容了03这个表。那么我们现在的表是00~03,接着重新分配权重。我们都知道现在总容量是250 (00+01+02+03),算法是:表容量/总容量 00的权重就是 50/250=20% 就是他的新权重,而03同理是40%的权重。这样达到平衡。

(如果分库,在全局唯一ID里加上库的后辍)

权重的计算,也可以很灵活。比如每天凌晨,给这些库重新做一次权重计算。一些库满了,就让他权重为0,等于关闭,或者不让它参与选举。

 

具体我也还没实现,哈哈哈哈哈。等实现完了再写上去。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值