分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

分布式ID常见的两种方法就是UUID和snowflake算法(雪花算法)。

UUID是一种本地生成ID的方法,不需要远程调用,高性能、低延时、扩展性好,但是UUID不支持递增。

snowflake算法是twitter开源的分布式ID生成算法,其核心思想是一个long型的ID:1位标识符(始终是0)、41位时间戳毫秒数、10位机器标识码、12位毫秒内序列号,该算法单机每秒内理论上最多可以生成1000*(2^12)的ID,性能高、趋势递增、灵活度高,但snowflake依赖机器的时钟,如果服务器时钟回拨会导致生成重复的ID。

分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

分布式系统中

分布式系统中的“身份证”即分布式Id且唯一。如何生成分布式系统中的唯一Id?考虑这个问题的时候,我觉得可以从“带着问题去找方案”这个思路去聊聊,也就是说我要生成的这个分布式Id需要满足哪些条件呢?

分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

分布式Id生成需要满足的条件

  1. 全局唯一:这个不用多说了,不然还有什么分布式“身份证”?
  2. 高可用:不能有单点故障,小心引起雪崩;
  3. 安全:这个Id不能是连续的,否则让非友好人士发现规则,数据爬去、数据预测都会有一定的安全风险;
  4. 保证顺序递增:MySQL的Innodb引擎采用B+树算法存储索引数据,为了提高性能,就得要求索引的主键在一定程度上是有序的,这样不管是写入还是查询效率都很好的;
  5. 分片支持:可以根据分布式Id得到具体的业务shardingId,方便业务查询;
  6. 不要太长:64位存储最佳?

分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

大家觉得还有哪些场景或者条件需要考虑?欢迎评论区留言讨论~那么基于以上需要考虑的条件,我们日常中都有哪些分布式Id生成方案呢?

数据库生成

优点:简单粗暴,自增Id顺序递增

缺点:只有主库才能生成,容易造成单点故障;性能不足时候,无法扩展;分库分表会有很多麻烦。

UUID

优点:简单直接,无性能问题,真正的全球唯一

缺点:无规则;UUID是字符串,IO传输数据量大,存储空间大,查询效率低;基于UUID分库分表更难。

redis生成

优点:基于内存操作的reids性能比数据库好;可以基于集群做有序的数字Id生成;利于分库分表;

缺点:需要搭建一套高可用redis集群;需要基于集群编写生成Id的方案;

zookeeper生成

和redis类似

业务规则生成

分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

举例订单号的生成:10_2298765801_1565283246399_781.业务字段用于区分具体的业务,采用2-4位,可以根据不同的系统或者业务自由决定;2.用户Id,最长10位够了吧3.毫秒级时间戳:13位4.随机数:2-4位

个人还是喜欢采用业务规则生成的方案,性能肯定没的说,基于内存计算即可得到,也不存在什么单点故障,哪台机器都可以自己生成,不依赖第三方服务或者应用,也能保证顺序递增。

这样的设计能达到真正的分布式唯一Id吗?能满足上面所说的那些条件吗?大家还有什么好的生成方案?欢迎评论交流,批评指正~

负载均衡和分布式是一个意思吗,有哪些区别?

不是一个意思,下面按照我的理解说一下什么是分布式,什么是集群,如果有理解错误的地方,请大家留言指正。

 

集群

同一个业务系统,部署在多台服务器上,这个就叫做集群。

集群里面,每一台服务器实现的功能没有差别,代码都是一样的。

 

比如我有一个系统A,提供一个很简单的接口,根据员工编号查询员工姓名和他的考勤记录。

当有一个系统调用这个接口的时候,我部署一台服务器就够用了。

当有一百个系统调用这个接口的时候,我就部署十台服务器,前面挂一个负载均衡。

这就是集群部署,当一台服务器挂了以后,不影响功能使用。

我接触过的负载均衡软件有Nginx、LB、HAProxy,也有硬件诸如F5。

 

分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

 

分布式

一个业务被拆成多个子业务,部署在多台服务器上,这个就叫做分布式。

分布式里面,每一台服务器实现的功能是有差别的,代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。

 

还是这个业务场景,我有一个系统A,提供一个很简单的接口,根据员工编号查询员工姓名和他的考勤记录。

我拆开两个系统:人员管理系统B和考勤系统C,分别部署在两台服务器上。

 

这个就是分布式。

 

好处是什么呢?如果有系统D也需要使用人员信息,传统的方式系统A和D都要有人员信息管理功能,意味着两个系统各自维护人员信息,那新入职一个员工,可能要在系统A和D里面都维护;如果是有EFGHI系统都需要人员信息呢?

而分布式解决了这个问题,人员信息单独拎出来是一个系统,维护人员信息,同时对外提供查询服务。

分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

 

分布式+集群

很多时候要结合起来一起用。

 

还是这个业务场景,我有一个系统A,提供一个很简单的接口,根据员工编号查询员工姓名和他的考勤记录。

我拆开两个系统:人员管理系统B和考勤系统C。

那么系统B部署在十台服务器上,系统C部署在十台服务器上;前面分别挂负载均衡;这样保证了每个子业务功能的高可用。

分布式系统常见的数据分布方式,在分布式系统中,如何生成分布式ID?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 xxx@163.com 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论