А по поводу strong consistency между ДЦ?

Сделать строгую консистентность в рамках одного дата-центра — задача решаемая. Но что, если у нас реплики в Москве, Нью-Йорке и Сингапуре?

Здесь нашим главным врагом становится скорость света. Свет в оптоволокне идет долго. Пинг между США и Азией может составлять 150-200мс. Заблокировать транзакцию глобально на такое время — значит убить всю производительность.

Как это решают?

1. Читерство с физикой: Google Spanner и TrueTime

Обычный протокол NTP имеет погрешность. У разных серверов время всегда немного разъезжается. Из-за этого сложно понять, какая транзакция была первой на глобальном уровне. Google поставили в каждый свой датацентр аппаратные атомные часы и GPS-приемники (TrueTime API).

  • Система всегда знает точное время с погрешностью всего в пару миллисекунд.
  • Spanner искусственно ждет (commit wait) эти пару миллисекунд перед подтверждением транзакции, чтобы гарантировать: ни в одной точке мира время этой транзакции не окажется в прошлом.

2. Обход физики через детерминизм: FaunaDB и Calvin

Если нет денег на атомные часы, можно использовать детерминистическое выполнение (протокол Calvin).

  • Вместо того чтобы блокировать данные и долго их реплицировать, мы сначала глобально упорядочиваем сами запросы.
  • Все реплики в мире получают одинаковый, строгий лог того, что нужно сделать.
  • Поскольку все выполняют одно и то же в одном и том же порядке, результат на всех континентах будет консистентным (Strict Serializability) без необходимости постоянно пинговать друг друга для блокировок.