`

分布式唯一主键生成策略的一种开销比较小的方法

 
阅读更多

原文链接:http://www.javaarch.net/jiagoushi/709.htm

 

分布式唯一主键生成策略的一种开销比较小的方法

分布式场景下,经常需要做分库分表,master和master结构,那么此时就会用到全局的唯一主键id。
如果使用mysql的分区策略,master到master的复制,那么此时就需要保证分区的唯一性避免主键冲突。
我们可以使用mysql的自增列,但是mysql却无法保证物理和逻辑数据库的主键唯一性。

mysql5.6以上出现了GUID,但是GUID很大,而且如果需要建索引需要拿性能会比较差。这样对于某些查询只需要索引
或者需要利用索引来满足高并发下的性能的话,GUID会是一个性能瓶颈。

一致性哈希能够来解决GUID和分片问题,在多写少读下比较好,但是mysql确实用来优化为快速的随机读。

所以我们就就试试中心化一个数据库,将单独一个数据库作为自增列生成机器,mysql的replase into和INSERT ... ON DUPLICATE KEY UPDATE是来解决主键冲突的问题,当主键存在时,当前记录会替换更新旧记录
http://dev.mysql.com/doc/refman/5.0/en/replace.html和http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
比如创建64位的自增id:

	CREATE TABLE `Tickets64` (
	  `id` bigint(20) unsigned NOT NULL auto_increment,
	  `stub` char(1) NOT NULL default '',
	  PRIMARY KEY  (`id`),
	  UNIQUE KEY `stub` (`stub`)
	) ENGINE=MyISAM
	
SELECT * from Tickets64 输出:

	+-------------------+------+
	| id                | stub |
	+-------------------+------+
	| 72157623227190423 |    a |
	+-------------------+------+
	
如果我需要一个全局的唯一的64位id,则执行:

	REPLACE INTO Tickets64 (stub) VALUES ('a');
	SELECT LAST_INSERT_ID();
	
这里flickr使用两台数据库作为自增序列生成,但是这里怎么避免单点故障问题还没有有效的方案,只是通过这两台机器做主备和负载均衡。

	TicketServer1:
	auto-increment-increment = 2
	auto-increment-offset = 1

	TicketServer2:
	auto-increment-increment = 2
	auto-increment-offset = 2
	
原文请查看:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

 

分享到:
评论

相关推荐

    Go-GolangMysql实现的分布式ID生成服务

    Twitter开源的Snowflake算法是一种常用的分布式ID生成策略,它将ID分为三部分:时间戳(41位)、工作机器ID(10位)和序列号(12位)。通过这种方式,可以保证ID的全局唯一性,并且有序。 #### 3.2 UUID UUID...

    分布式id方法

    综上所述,选择合适的分布式ID生成策略需要综合考虑系统的特定需求、可用资源以及未来的发展方向。例如,在追求性能和扩展性的场景下,可以考虑采用基于时间戳的算法(如Snowflake算法)结合UUID的优点,以平衡唯一...

    Hibernate内置标识符生成器

    4. Native 标识符生成器:这是一种灵活的策略,Hibernate 会根据底层数据库的特性自动选择合适的生成器,可能是 `identity`、`sequence` 或 `hilo`。这种方式适应性强,但在某些情况下可能无法达到最优性能,因为它...

    行业文档-设计装置-数据实时写入去重处理方法.zip

    6. **基于布隆过滤器去重**:这是一种概率型数据结构,可以快速判断数据是否可能已经存在,但存在一定的误判率。适用于空间效率优先的场景。 7. **基于分布式缓存去重**:如Redis或Memcached,将数据的哈希值或唯一...

    get-uuid.tar.gz

    在`get_uuid`程序中,可能实现了其中一种或多种UUID生成方式,根据具体需求来提供不同的UUID生成服务。例如,如果需要保证UUID在分布式环境中全局唯一,可能会选择`uuid1()`;如果需要保密性,可能会选择`uuid4()`。...

    SQL Server的六种数据移动方法

    这是另一种常见的数据移动方法,通过完全备份源数据库,然后在目标服务器上恢复。备份文件可以复制到目标服务器,使用RESTORE DATABASE命令进行恢复,确保源数据库和目标数据库的名称相同。强制恢复选项允许覆盖...

    sequential-uuids-master.zip

    该工具的工作原理可能基于一种策略,例如在UUID的特定部分嵌入时间戳信息,使得在比较时能直接反映出生成的顺序。通过这种方式,即使在分布式环境中,多个节点同时生成UUID,也可以确保整体的顺序性。 使用...

    Hibernate 性能优化

    Hibernate 提供了多种 ID 生成策略,如 `increment`、`identity`、`sequence` 和 `assigned` 等。 4. **适当的冗余数据**:在某些情况下,适度的冗余可以减少查询次数,从而提高性能。但这需要权衡存储空间和数据...

    BeginningHibernate_英文版

    通过Hibernate的注解或XML映射文件(hbm.xml),我们可以定义实体类和数据库表之间的映射关系,包括主键生成策略、字段类型、关联关系等。 五、CRUD操作 Hibernate提供了丰富的API,支持对数据库的基本操作:创建...

    50万字大厂后端面经,java生态全链路面试真题总结

    - **Snowflake算法:** 分布式环境下生成全局唯一ID的一种高效方法。 - **自增ID:** 适用于单一数据库环境,但在分布式环境中需要额外机制确保唯一性。 #### 十一、事务隔离级别 - **Read Uncommitted:** 最低...

    分库分表

    分库分表是一种数据库扩展策略,用于解决单个数据库在高并发、大数据量场景下的性能瓶颈问题。在大型系统中,随着用户数量和业务规模的增长,数据库的压力会急剧增加,这时就需要采用分库分表的方式来分散负载,提高...

    数据库常见面试题

    - **`varchar`**:可变长度字符串类型,实际占用空间为字符串的实际长度加上一个额外字节的开销。 - `varchar(50)`:表示该列可以存储最多50个字符的可变长度字符串。 #### 4、`date`、`datetime`和`timestamp`数据...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    在创建表时,经常会创建该表的主键、外键、唯一约束、Check约束等  语法结构 create table 表名( [字段名] [类型] [约束] ……….. CONSTRAINT fk_column FOREIGN KEY(column1,column2,…..column_n) ...

Global site tag (gtag.js) - Google Analytics