我需要运行一个 sql server logging db,其中 2 个主表在 2 个单独的数据中心同时写入这两个数据中心。
我的想法是将数据库恢复到新的数据中心,然后将标识列重新设置为 -1 并将增量设置为 -1,这样当需要组合数据时就不会出现重复的 id。DATACENTRE1 是正整数,DATACENTRE2 是负整数
-1 的增量会导致任何问题吗?
我需要运行一个 sql server logging db,其中 2 个主表在 2 个单独的数据中心同时写入这两个数据中心。
我的想法是将数据库恢复到新的数据中心,然后将标识列重新设置为 -1 并将增量设置为 -1,这样当需要组合数据时就不会出现重复的 id。DATACENTRE1 是正整数,DATACENTRE2 是负整数
-1 的增量会导致任何问题吗?
倒退对我来说是错误的。
只有两个数据中心,您还可以实施身份范围。除非您以惊人的速度循环浏览身份值,否则您没有理由不能拥有:
这将允许在与数据中心 2 发生冲突之前在数据中心 1 中生成 10 亿个(嗯,999,999,999)个值。您可以在数据中心 1 中添加一个 CHECK 约束以防止重叠值,具体取决于您的优先级错误与重复。如果您担心在应用程序的生命周期中任何一个数据中心确实会产生超过十亿个值(没关系你的)。
如果约 10 亿还不够,还有另外两种选择可以提供更多喘息空间:
这将为每个数据中心提供超过 20 亿个非重叠值,在数据中心 1 接近 0 之前没有碰撞危险。如果这还不够:
或者,如果您想保持所有值 > 0,您可以将正数范围大致分成两半(如果您比我更迂腐,您可以比这更精确一些)。
我什至不知道怎么说这个数字,但它是巨大的。实际上,当您的曾曾曾曾孙从大学毕业时,您必须在一台速度非常快的计算机上非常努力地使用所有这些值。如果您使用的是企业版,则可以使用数据压缩,这样您就不必为所有 8 个字节付出代价,至少在数据中心 1 中,直到那里的数据量超过 20 亿。
在我管理的一个系统中,我采用了稍微不同的方式——我们有多个带有 Express 实例的 Web 服务器,它们负责生成需要在企业中唯一的 ID 号。所以我们只是在每台机器上设置了一个序列生成器(它们不需要实际存储值),使用 BIGINT IDENTITY 列。我们有 < 9 台服务器,所以它们都是这样播种的:
当使用这些值然后在中央系统中合并时,我们不仅可以保证没有任何重复,而且还可以很容易地立即识别它们来自哪个 Web 服务器(这有时在调试中很有用),而无需引入任何复合关键要求。我们也不担心任何一台 Web 服务器会产生超过 100 亿的价值。
在这种情况下,很多人会使用 GUID,但我认为有几个强烈的论据反对这种方法。
它不会导致问题,因为 SQL Server 允许您这样做:
但从长远来看,一个好主意可能是一个不同的问题。其他人可能最终会感到困惑(即;我不得不考虑上面查询的顺序,因为它与正常情况相反)。或者当其他人恢复数据库并
IDENTITY
以“正常”方式重新设置种子并且您的 ID 重叠时会发生什么?是否可以修改您的架构,以便您拥有一个“站点”列?那么使用站点和ID作为组合键呢?
使用此设置可能会出现一些问题:
按照@Martin Smith评论中的链接,标识列中的负值可能会导致某些应用程序出现问题:为什么数据库设计人员不让标识列从最小值而不是 1 开始?
另一个问题与值是否为负但正在减少无关,以及标识是否也是表的聚集键。当从左到右(从低到高)遍历以及在右侧(高)侧完成插入时,例如当键不断增加时,B-tree 结构更有效。这个属性对于表的聚集键更加重要。请参阅Kimberly Tripp的这篇博客文章,了解集群键的最佳属性,尤其是关于不断增加的.
使用递减键,您将始终在索引的错误(左侧)插入数据,从而导致索引碎片。这些影响可能对您的情况并不重要,但我认为如果身份也被选为集群密钥,您应该牢记这一点。
或者正如@Martin 建议的那样,将聚集索引也定义为
DESC
(-1)数据中心。这将避免上述任何碎片问题。实现相同功能并保持增加 ID 的其他选项是在一个数据中心中具有偶数值,而在另一个数据中心中具有奇数值(因此两者都具有 +2 增量)或
siteID
添加到主键,如@Stuart 建议的那样。去尝试一下!(然后在这里报告:-))。
不,我预计不会有任何问题 - 毕竟,
INT
的数据范围是 -20 亿到 +20 亿 - 我不明白为什么负数的行为应该与正IDENTITY
数有任何不同......这听起来像是按键数据分区的一种变体。另一种方法是使用种子和增量,以便每个数据中心生成交错但不冲突的值。尝试类似:
每个表中的标识值都有差距:
如果您认为您将来可能有额外的 DC,请将增量设置为您可能拥有的 DC 数量(例如 4)。滚入时,您将拥有:
我使用的方法是:
每个解决方案都有优点和缺点。