如何保证多服务器 Oracle RAC 环境中的顺序
How can I guarantee sequential order in multi-server Oracle RAC environment
我们正在使用时间戳来确保日志 table 中的条目按顺序记录,但我们发现了一个潜在的缺陷。比方说,我们的 RAC 中有两个节点,节点时间戳相差 1000 毫秒。我们的应用服务器在 30 毫秒内插入两个日志条目。第一个插入由 Node1 提供服务,第二个由 Node2 提供服务。由于两个节点之间存在 1000 毫秒的差异,时间戳可能会显示以错误顺序出现的日志条目! (我只想使用一个序列,但出于性能原因我们的序列被缓存了......)
NTP 同步对这种情况无济于事,因为 NTP 具有 128 毫秒的容错能力——当记录发生频率高于此频率时,这为记录乱序记录打开了大门。
我觉得我看待这个问题的方式是错误的。我的最终目标是能够检索记录日志条目的实际顺序。它不必按时间戳列。
请记住,行上附加的时间戳是在插入或更新时生成的,但对数据库的实际更改发生的时间是提交发生的时间 - 这取决于事务,第 1 行可能在第 2 行之前插入,但在之后提交。
我在 Oracle 中唯一知道的保证顺序的节点是 Oracle 附加到事务的 SCN,RAC 环境中的事务可以通过它来排序以进行 Streams 复制。
Oracle sequence with ORDER
specified 保证 return 个数字在 RAC 集群中按顺序排列。所以
create sequence my_seq
start with 1
increment by 1
order;
现在,为了做到这一点,这意味着您将进行大量的节点间通信,以确保对序列的访问被适当地序列化。这将使它比正常序列昂贵得多。不过,如果您需要保证顺序,这可能是您将拥有的最有效的方法。
1000 毫秒?是一秒钟,不是吗?恕我直言,这是很多。如果你真的需要精确时间,那么干脆放弃全球时间的想法。在日志服务器上生成时间戳,并假设每个日志服务器都有自己的本地时间。如果您需要一些理论,请阅读有关 Lamport 时代的内容。但也许问题的根源在其他地方。 RAC 同步节点之间的时间,它会记录一些更大的差异。
如果两个连续的事件由两个不同的连接记录,是否是同一个线程使用两个连接?还是将这些事件传递给后台线程,然后这些线程写入数据库?即它是顺序记录还是并行记录?
我们正在使用时间戳来确保日志 table 中的条目按顺序记录,但我们发现了一个潜在的缺陷。比方说,我们的 RAC 中有两个节点,节点时间戳相差 1000 毫秒。我们的应用服务器在 30 毫秒内插入两个日志条目。第一个插入由 Node1 提供服务,第二个由 Node2 提供服务。由于两个节点之间存在 1000 毫秒的差异,时间戳可能会显示以错误顺序出现的日志条目! (我只想使用一个序列,但出于性能原因我们的序列被缓存了......)
NTP 同步对这种情况无济于事,因为 NTP 具有 128 毫秒的容错能力——当记录发生频率高于此频率时,这为记录乱序记录打开了大门。
我觉得我看待这个问题的方式是错误的。我的最终目标是能够检索记录日志条目的实际顺序。它不必按时间戳列。
请记住,行上附加的时间戳是在插入或更新时生成的,但对数据库的实际更改发生的时间是提交发生的时间 - 这取决于事务,第 1 行可能在第 2 行之前插入,但在之后提交。
我在 Oracle 中唯一知道的保证顺序的节点是 Oracle 附加到事务的 SCN,RAC 环境中的事务可以通过它来排序以进行 Streams 复制。
Oracle sequence with ORDER
specified 保证 return 个数字在 RAC 集群中按顺序排列。所以
create sequence my_seq
start with 1
increment by 1
order;
现在,为了做到这一点,这意味着您将进行大量的节点间通信,以确保对序列的访问被适当地序列化。这将使它比正常序列昂贵得多。不过,如果您需要保证顺序,这可能是您将拥有的最有效的方法。
1000 毫秒?是一秒钟,不是吗?恕我直言,这是很多。如果你真的需要精确时间,那么干脆放弃全球时间的想法。在日志服务器上生成时间戳,并假设每个日志服务器都有自己的本地时间。如果您需要一些理论,请阅读有关 Lamport 时代的内容。但也许问题的根源在其他地方。 RAC 同步节点之间的时间,它会记录一些更大的差异。
如果两个连续的事件由两个不同的连接记录,是否是同一个线程使用两个连接?还是将这些事件传递给后台线程,然后这些线程写入数据库?即它是顺序记录还是并行记录?