`
badqiu
  • 浏览: 670586 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

数据库sharding下的主键生成策略

阅读更多

数据库水平分区(sharding),即对同一张数据库表,按照规则将数据切分至多个数据库。

 

如上图,将user表切分至三个数据库中.

 

在对数据库水平分区的情况下,面对多个数据库,想要生成一个唯一性的主键这是一个问题。

 

通常解决办法有两种:

 

UUID:

使用UUID很容易就可以生成唯一性主键,并且不用担心主键生成效率问题,当然缺点是UUID的长度过长,浪费空间,所以下面介绍另外一种方法。

 

单独一台服务器负责主键生成:

即我们使用一台单独的服务器(如mysql) 负责主键的生成

 

如果我们是使用mysql数据库,可以创建一张表来模拟oracle的sequence:

表sql:

 

 

create table tab_sequence (value bigint not null)

 oracle数据库直接使用sequence即可.

 

 

但现在我们又会碰到单点问题,即如果master挂了,对我们的应用影响非常大。

 

所以我们可以配合使用mysql 的复制功能。

 

 

配合使用linux HA: heartbeat,就算master服务器或是硬盘故障了,我们也可以很快的切换至slave.保障高可用性。

 

 

 

  • 大小: 12.1 KB
  • 大小: 17.6 KB
  • 大小: 22.8 KB
2
1
分享到:
评论
1 楼 leeqianjun 2010-02-06  
我觉得对于一个方案的采纳要考虑性价比:
方案一:使用UUID有明显的优点,那就是使用起来非常简单、不重复,缺点就如楼主说的字段过长,但是并没有长多少,也就是说对空间和性能方面的影响很微小。
方案二:使用单独的应用的来生成的主键ID,那么该应用就是单独的系统,需要考虑维护、性能、扩张等方面的因素,导致后续的代价很大。
故我觉得小系统采用Oracle/Mysql自增序列即可,也可自定义序列,大的系统采用UUID。方案二是过度设计。

相关推荐

Global site tag (gtag.js) - Google Analytics