Как я могу гарантировать последовательный заказ в многосерверной среде Oracle RAC

Мы используем временную метку, чтобы гарантировать, что записи в таблице журнала записываются последовательно, но мы обнаружили потенциальный недостаток. Скажем, например, у нас есть два узла в нашем RAC, и временные метки узлов отключены на 1000 мс. Наш сервер приложений вставляет две записи журнала в течение 30 мсек друг от друга. Первая вставка обслуживается Node1, а вторая Node2. При разнице в 1000 мс между двумя узлами временная метка может потенциально показывать записи журнала, происходящие в неправильном порядке! (Я бы просто использовал последовательность, но наши последовательности кэшируются по соображениям производительности...)

Синхронизация NTP не помогает в этой ситуации, потому что NTP имеет отказоустойчивость 128 мс, что оставляет дверь открытой для записей, которые будут записаны не по порядку, когда они происходят чаще, чем это.

У меня такое ощущение, что я смотрю на эту проблему неправильно. Моя конечная цель состоит в том, чтобы иметь возможность получить фактическую последовательность, в которую записываются записи журнала. Это не должно быть по столбцу отметки времени.

3 ответа

Решение

Последовательность Oracle с ORDER указанный гарантированно возвращает номера по порядку через кластер RAC. Так

create sequence my_seq
  start with 1
  increment by 1
  order;

Теперь, чтобы сделать это, это означает, что вы собираетесь осуществлять достаточное количество межузловой связи, чтобы гарантировать, что доступ к последовательности сериализован соответствующим образом. Это сделает это значительно дороже, чем обычная последовательность. Однако если вам нужно гарантировать порядок, это, вероятно, самый эффективный подход, который у вас будет.

Имейте в виду, что прикрепленная временная метка для строки генерируется во время вставки или обновления, но время, когда происходит фактическое изменение базы данных, происходит, когда происходит фиксация, которая в зависимости от сложности транзакций, строка 1 может быть вставлено до row2, но передано после.

Единственное, что мне известно в Oracle по узлам, гарантирующим порядок, - это SCN, который Oracle присоединяет к транзакции, и по которому транзакции в среде RAC можно упорядочивать для таких вещей, как репликация потоков.

1000мс? Это одна секунда, не так ли? ИМХО это много. Если вам действительно нужно точное время, просто откажитесь от идеи глобального времени. Создайте временные метки на сервере журналов и предположите, что у каждого сервера журналов есть свое местное время. Прочтите что-нибудь о времени Лампорта, если вам нужна теория. Но, возможно, источник вашей проблемы где-то еще. RAC синхронизирует время между узлами, и это будет регистрировать некоторое большее расхождение.

Если два последовательных события регистрируются двумя разными соединениями, использует ли один и тот же поток оба соединения? Или эти четности передаются в фоновые потоки, а затем эти потоки записываются в базу данных? то есть это зарегистрировано последовательно или параллельно?

Другие вопросы по тегам