10.7 在分布式数据库中使用传统序列方法(函数)

全球序列提供一个主要-应用程序-透明替代品的使用偏移量步序列或 GUID/UUID 键,但它们不是缺点。

BDR 用户可以使用任何其他主机安全序列/键生成策略。不,有的是需要使用全局序列。下面介绍的方法将会带来卓越的许多应用程序的需要,和更复杂的方法也存在。

警告 应用程序不能安全地使用反表基于方法 BDR 在生成序列。因为 BDR 是异步的并不需要节点之间的行锁,将在多个节点上生成相同的值。出于同样的原因"无间隙"的序列生成的常用策略不处理 BDR。在大多数情况下应用程序应协调从某些外部源使用两阶段提交,必须是无缝的序列生成或它应当只生成它们 BDR 组中的一个节点上。

10.7.1 偏移/间隔序列

偏移量步序列中每个节点上使用是正常的 PostgreSQL 序列。每个序列递增相同的数量和在不同的偏移量开始。 为 1000年步 node1 序列示例生成 1001,2001 ,3001,等等, 节点 2 的生成 1002,2002 ,3002,等。这项计划工作即使节点不能长时间沟通, 但需要设计器时建立架构指定最大节点数和需要每个节点的配置。 错误可以容易导致重叠序列。

它是相对简单的配置此方法与 BDR 通过像一个节点上创建所需的序列

      CREATE TABLE some_table (
        generated_value bigint primary key
      );

      CREATE SEQUENCE some_seq INCREMENT 1000 OWNED BY some_table.generated_value USING local;

      ALTER TABLE some_table ALTER COLUMN generated_value DEFAULT nextval('some_seq');

......然后调用 setval 来在每个节点上设置不同的起始值偏移量,例如:

      -- On node 1
      SELECT setval('some_seq', 1);

      -- On node 2
      SELECT setval('some_seq', 2);

      -- ... etc

i你应该确保允许一个足够大的增量,离开房间,你可能想要添加,因为日后的转变是困难和破坏性的所有节点。

如果你使用 bigint 值有是没有实践关注关键用尽,即使您使用偏移量 10000 或更多。您将需要数百年来与数百台机器做数以百万计的每秒有任何机会接近枯竭的插入。

BDR 目前不提供任何自动化配置的每个节点的偏移量上这样一步/偏移量序列。

10.7.2复合键

一步/偏移量序列变异是主键的使用复合键 (node_number,generated_value) 在节点数通常主键的从一个函数返回一个不同的数字在每个节点获取组成。可能会创建这样一个函数,通过暂时禁用 DDL 复制和创建一个恒定的 SQL 函数,或使用一个行的表不是设置为不同的值存储在每个节点复制的一部分。

10.7.3 UUID

UUID 键相反完全避开序列和使用 128 位通用唯一标识符。这些都是较大的随机或伪随机值足够大,它几乎是不可能为相同的值来产生两次。就没有必要为节点时使用 UUID 键有持续的沟通。

在令人难以置信万一发生碰撞,冲突检测将选择更新两个插入的记录要保留。 如果启用,冲突日志记录,将记录此类事件,但它是非常不可能发生, 因为碰撞一次可能需要产生 2^64 个密钥产生。

UUID 键的主要缺点是空间-和网络-效率表现不佳, 需要消耗更多的空间不仅作为主键,但也在引用中的外键和传输电线上时。 此外,并非所有应用程序很好的处理 UUID 键。

PostgreSQL 拥有内置的 uuid 数据类型和 uuid ossp 拓展模块可以生成 UUID,例如

     CREATE EXTENSION "uuid-ossp";

     SELECT uuid_generate_v4();

results matching ""

    No results matching ""