现在通过数据的水平切分(sharding)来实现数据库 Scale Out 的解决方案受到了越来越多人的青睐,但是在切分过程中可能遇到的问题也肯定不在少数,如切分规则的设计,切分后的访问路由,切分后的主键的全局唯一等等。
这里我主要列举几个可以使用在 MySQL 数据库主键全局唯一方案及其优劣,供大家参考:
* 通过应用程序生成一个GUID,然后和数据一起插入切分后的集群。优点是维护简单,实现也容易。缺点是应用的计算成本较大,且GUID比较常,占用数据库存储空间较大,涉及到应用的开发。
说明:主要优势是简单,缺点是浪费存储空间,GUID:32字节,100W记录,多32兆,如果是int,4字节,会少28M。如果有外键关联,会浪费更多。
* 通过独立的应用程序事先在数据库中生成一系列唯一的 ID,各应用程序通过接口或者自己去读取再和数据一起插入到切分后的集群中。优点是全局唯一主键简单,维护相对容易。缺点是实现复杂,需要应用开发。
说明:ID表要频繁查和频繁更新,插入数据时,影响性能。
* 通过中心数据库服务器利用数据库自身的自增类型(如 MySQL的 auto_increment 字段),或者自增对象(如 Oracle 的 Sequence)等先生成一个唯一 ID 再和数据一起插入切分后的集群。优点是?好像没有特别明显的优点。缺点是实现较为复杂,且整体可用性维系在这个中心数据库服务器上,一旦这里crash 了,所有的集群都无法进行插入操作,涉及到应用开发。
说明:不推荐。
* 通过集群编号加集群内的自增(auto_increment类型)两个字段共同组成唯一主键。优点是实现简单,维护也比较简单,对应用透明。缺点是引用关联操作相对比较复杂,需要两个字段,主键占用空间较大,在使用 InnoDB 的时候这一点的副作用很明显。
说明:虽然是两个字段,但是这方式存储空间最小,仅仅多了一个smallint两个字节,100W也就多2M。
* 通过设置每个集群中自增 ID 起始点(auto_increment_offset),将各个集群的ID进行绝对的分段来实现全局唯一。当遇到某个集群数据增长过快后,通过命令调整下一个 ID 起始位置跳过可能存在的冲突。优点是实现简单,且比较容易根据 ID 大小直接判断出数据处在哪个集群,对应用透明。缺点是维护相对较复杂,需要高度关注各个集群 ID 增长状况。
说明:段满了,调整太麻烦。
* 通过设置每个集群中自增 ID 起始点(auto_increment_offset)以及 ID 自增步长(auto_increment_increment),让目前每个集群的起始点错开 1,步长选择大于将来基本不可能达到的切分集群数,达到将 ID 相对分段的效果来满足全局唯一的效果。优点是实现简单,后期维护简单,对应用透明。缺点是第一次设置相对较为复杂。
说明:避免重合需要多种方案结合
分享到:
相关推荐
一种为分布式数据库而设计的全局唯一 ID(主键)生成器。 本算法的实现参考了 Twitter Snowflake,但是在最后的 12 位您不仅仅可以使用随机数字,也可以通过指定字符串来获取哈希值。
数据库主键设计原则:我在设计主键,会采用字符型的.不采用自动递增,在新增记录时,系统生成主键值.一般为全数字进行存入,至于主键值的生成规则,可以按需求进行规则定义.如果没有特殊的要求,只是为了保持唯一...
数据库主键和外键设计的原则
介绍数据库中主键设计的方法,以及各种方法的优点和缺陷。希望大家喜欢
数据库中表的主键设计原则收藏
获取数据库所有主键获取数据库所有主键获取数据库所有主键获取数据库所有主键获取数据库所有主键获取数据库所有主键
数据库主键生成,对主键的操作,主键,标识记录,找到记录 主键
在我们的数据库设计中,不可逃避的就是数据库表的主键,可能有很多朋友没有深入思考过,主键的设计对整个数据库的设计影响很大,因此我们不得不要重视起来。
oracle数据库主键自动生成
分布式数据库唯一主键设计
数据库的主键加约束创建表创建唯一约束创建默认约束
分布式数据库中全局唯一主键生成策略的设计与实现,胡云亭,王晶,随着互联网的发展以及数据的爆炸式增长,集中式数据库已经无法满足海量数据快速存储和查询的要求了,这时分布式数据库应运而生。
数据库完整性详解,十分详细,附有详细上机图以及步骤。
主要介绍了java实现数据库主键生成示例,需要的朋友可以参考下
MySQL数据库主键重复原因分析及处理.pdf
数据库主键设计原则 或许大家都设计过数据库,也为表定义过主键,今天我想阐述的是,应该如何正确的设计一个主键,在以往的一些资料中,都没有提及到主键设计的原则. 我为此总结了一下: 1.是否要采用GUID作为主键 用GUID...
我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键是能够标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以标识某一行记录,所以可以确保执行数据更新、删除的...
关于数据库主键和外键 终于弄懂啦
1.1、直接在PLSQL中设置 1.2、命令创建 create sequence seq_users ##创建序列seq_users increment by 1 ## 步长,每次加1 start with 1 ##从1开始 minvalue 1 ##最小值 maxvalue 9999999 ##最大值 order ##确保...
高并发分布式系统中生成全局唯一Id汇总 数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。 单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 1 不能有单点故障。 2 以时间为...