2015-12-02 56 views
1

顺序我们使用时间戳,以确保在日志表中的条目顺序记录,但我们已经找到了潜在的缺陷。比如说,我们在RAC中有两个节点,节点时间戳为1000ms。我们的应用服务器在彼此的30ms内插入两个日志条目。第一个插入由Node1服务,第二个插入由Node2服务。在两个节点之间有1000毫秒的差异时,时间戳可能会显示错误顺序的日志条目! (我只想用一个序列,但我们的序列缓存性能的原因......)我怎么能保证在多服务器Oracle RAC环境中

NTP同步不帮助这个情况,因为NTP有128ms的容错 - 它敞开了大门的记录当它们发生的频率比这更频繁时,将被记录为乱序。

我有一种感觉,我在看这个问题的错误的方式。我的最终目标是能够检索记录日志条目的实际序列。它不一定是时间戳列。

回答

3

Oracle sequence with ORDER specified一种保证,以便跨RAC簇返回的数字。所以

create sequence my_seq 
    start with 1 
    increment by 1 
    order; 

现在,为了做到这一点,这意味着你要去做,以确保获得序列节点间通信的相当数量被适当地序列化。这会使这个比正常序列昂贵得多。但是,如果您需要保证订单,那可能是您将要采用的最有效的方法。

+0

我们的DBA锁定/缓存了序列......这是我唯一的选择吗? –

+1

@BrienMalone - 这当然是最好的选择。如果这是DBA关心的问题,那么可以为指定了“order”的序列指定一个“cache”。我不确定什么是“锁定”序列。如果这是一个要求,我希望DBA能够很好地创建这个特定的序列,而不是默认的'noorder'。 –

1

记住,在一行附加时间戳在插入或更新的时间产生的,但在数据库中的实际变化发生的时间是当提交发生 - 这取决于的复杂性事务,第1行可能会在第2行之前插入,但在之后获取。

我知道Oracle中唯一确保订单的节点是Oracle附加到事务的SCN,并且通过它可以为RAC环境中的事务定购Streams复制等。

0

1000ms?这是一秒钟,不是吗?恕我直言,这是很多。如果你真的需要精确的时间,那么简单地放弃全球时间的想法。在日志服务器上生成时间戳,并假定每个日志服务器都有它自己的本地时间。如果你需要一些理论,请阅读Lamport的时间。但是,也许问题的根源在别的地方。 RAC同步节点之间的时间,并记录一些更大的差异。

如果两个连续的事件是由两种不同的连接记录,是使用两个连接在同一个线程?还是那些evens传递到后台线程,然后这些线程写入数据库?即它是按顺序还是并行记录?