如何保证多服务器Oracle RAC环境中的顺序顺序

时间:2015-12-02 18:00:15

标签: oracle oracle-rac

我们使用时间戳来确保按顺序记录日志表中的条目,但我们发现了一个潜在的缺陷。比如说,我们的RAC中有两个节点,节点时间戳关闭1000毫秒。我们的应用服务器在30ms内互相插入两个日志条目。第一个插入由Node1提供服务,第二个插入由Node2提供服务。两个节点之间有1000毫秒的差异,时间戳可能会显示错误顺序的日志条目! (我只会使用一个序列,但出于性能原因我们的序列会被缓存...)

NTP同步对这种情况没有帮助,因为NTP具有128ms的容错能力 - 这使得记录在发生频率高于此频率时无法正常记录。

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

3 个答案:

答案 0 :(得分:3)

保证Oracle sequence with ORDER specified在RAC群集中按顺序返回数字。所以

create sequence my_seq
  start with 1
  increment by 1
  order;

现在,为了做到这一点,这意味着您将要进行大量的节点间通信,以确保对序列的访问进行适当的序列化。这将使这比正常序列显着更昂贵。但是,如果您需要保证订单,那么它可能是您将要拥有的最有效的方法。

答案 1 :(得分:1)

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

我在Oracle中了解的唯一保证顺序的节点是Oracle附加到事务的SCN,并且可以为RAC环境中的事务订购Streams复制等事务。

答案 2 :(得分:0)

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

如果两个不同的连接记录了两个连续的事件,那么使用两个连接的线程是否相同?或者那些evens传递给后台线程然后这些线程写入数据库?即是按顺序还是并行记录?

相关问题