多机分布式系统ID的问题与处理

来源:互联网 发布:泛泰主义知乎 编辑:程序博客网 时间:2024/06/06 15:46

起因

当数据库有单个数据库转变为水平分库,原来单个系统中的ID(Sequence)以及自增id的做法需要改变
我们主要需要解决下面的两个问题:

  • 唯一性
  • 连续性

问题与处理

  • 当我们只考虑id的唯一性的问题的时候,我们可以使用UUID等方式来自动生成,虽然这样生成的id保证了唯一性,但是在分布式系统中的连续性是一个巨大的问题

  • 进而,我们可以想到,我们可以将所有id都存放在一个地方进行集中分类管理,分布式系统中的每台单独机器使用id时都从这个id生产器中去取,这里有如下几个关键问题需要解决

    • 性能问题。每次远程取id都会存在资源消耗,一种方案是一次取一段id,然后缓存到本地,这样就不需要每次都去远程的id生成器上取id了。但是如果一旦发生宕机,那么一些id就会被浪费了。
    • 生成器的稳定性问题。id生成器作为一个无状态的集群存在,其可用性要靠整个集群来保证
    • 存储的问题。底层存储的选择空间比较大,需要根据不同类型进行对应的容灾方案。下面介绍两种方式

      • 第一种,在底层使用一个独立的存储来记录每个id序列当前的最大值,并控制并发更新,这样以来id生成器的逻辑就很简单了
        这里写图片描述

      • 第二种,直接把id生成器舍去,把相关的逻辑放到需要生成id的应用本身,就行了。即我们上述所说的,读取可用的id或者id段,然后给应用的请求使用,如图
        这里写图片描述

不过因为第二种方式没有中心的控制点,并且我们不希望生成器之间还有通信(这回使得系统非常复杂),因此数据的id并不是严格的按照进入数据库的顺序而增大的。在管理上也需要有额外的功能,这些是需要权衡的地方

参考 大型网站系统与Java中间件实践

原创粉丝点击