微服务

(3)分布式ID之数据库自增ID实现分布式ID

2020-01-04  本文已影响0人  LANSHENGYANG

数据库自增ID机制原理介绍

单机mysql数据库的自增id实现如下所示 :

`create table t_test(`
`id bigint(20)  unsigned  not  null auto_increment PRIMARY KEY,`
 `stub char(1)  not  null  default  '',`
 `unique key stub (stub)`
`)`
`replace into t_test (stub) values('b');`
`select last_insert_id();`
image

分布式id在数据库里面的实现过程:

`Server1:`
`auto-increment-increment =  1`
`auto-increment-offset =  3`

`Server2:`
`auto-increment-increment =  2`
`auto-increment-offset =  3`

`Server2:`
`auto-increment-increment =  3`
`auto-increment-offset =  3`

数据库自增ID是否适合做分布式ID:

1:系统水平扩展比较困难,比如定义好了步长和机器台数之后,如果要添加机器该怎么做?假设现在只有一台机器发号是1,2,3,4,5(步长是1),这个时候需要扩容机器一台。可以这样做:把第二台机器的初始值设置得比第一台超过很多,比如14(注意这里设置14的前提是:在扩容期间第一台机器的ID不可能增加到14),同时设置步长为2,那么这台机器下发的号码都是14以后的偶数。然后把第一台机器的ID值保留为奇数,比如7,然后修改第一台的步长为2。让它符合我们定义的号段标准。扩容方案看起来复杂吗?貌似还好,现在想象一下如果我们线上有100台机器,这个时候要扩容该怎么做?简直是噩梦。所以系统水平扩展方案复杂难以实现。
2:数据库压力还是很大,每次获取ID都得读写一次数据库,非常影响性能,不符合分布式ID里面的延迟低和要高QPS的规则(在高并发下,如果都去数据库里面获取id,那是非常影响性能的)

上一篇 下一篇

猜你喜欢

热点阅读