本文主要是介绍多机分布式系统ID的问题与处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
起因
当数据库有单个数据库转变为水平分库,原来单个系统中的ID(Sequence)以及自增id的做法需要改变
我们主要需要解决下面的两个问题:
- 唯一性
- 连续性
问题与处理
当我们只考虑id的唯一性的问题的时候,我们可以使用UUID等方式来自动生成,虽然这样生成的id保证了唯一性,但是在分布式系统中的连续性是一个巨大的问题
进而,我们可以想到,我们可以将所有id都存放在一个地方进行集中分类管理,分布式系统中的每台单独机器使用id时都从这个id生产器中去取,这里有如下几个关键问题需要解决
- 性能问题。每次远程取id都会存在资源消耗,一种方案是一次取一段id,然后缓存到本地,这样就不需要每次都去远程的id生成器上取id了。但是如果一旦发生宕机,那么一些id就会被浪费了。
- 生成器的稳定性问题。id生成器作为一个无状态的集群存在,其可用性要靠整个集群来保证
存储的问题。底层存储的选择空间比较大,需要根据不同类型进行对应的容灾方案。下面介绍两种方式
第一种,在底层使用一个独立的存储来记录每个id序列当前的最大值,并控制并发更新,这样以来id生成器的逻辑就很简单了
第二种,直接把id生成器舍去,把相关的逻辑放到需要生成id的应用本身,就行了。即我们上述所说的,读取可用的id或者id段,然后给应用的请求使用,如图
不过因为第二种方式没有中心的控制点,并且我们不希望生成器之间还有通信(这回使得系统非常复杂),因此数据的id并不是严格的按照进入数据库的顺序而增大的。在管理上也需要有额外的功能,这些是需要权衡的地方
参考 大型网站系统与Java中间件实践
这篇关于多机分布式系统ID的问题与处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!