Abyssal Code
Гибридные логические часы (HLC, Hybrid Logical Clock)
Немного другая ветвь развития часов Лэмпорта, которая привязывает их к реальному времени, при этом сохраняя корректность
Каждый узел хранит два поля - физическое время (локальное время системы) и логический счетчик а-ля Лэмпорт
Далее:
- локальное событие: узел читает свое текущее системное время. Если это время больше сохраненного физического времени, то обновляем его и сбрасываем логический счетчик на 0. Иначе, то есть если системное время не сдвинулось или пошло назад, хранимое значение времени не обновляем, а лишь увеличиваем счетчик, как в часах Лэмпорта
- отправка сообщения: узел обновляет свои часы по описанному выше алгоритму, после чего прикрепляет пару их значений к сообщению
- получение сообщения: хранимое физическое время узла устанавливается равным максимуму локального времени и времени из сообщения. Если физическое время совпало, то счетчик приравнивается максимуму между счетчиком узла и счетчиком из сообщения, плюс единица. Иначе счетчик обнуляется
Такой алгоритм гарантирует, что HLC всегда возрастают, даже при обратном ходе системных часов.
Главная же особенность подхода - при условии хотя бы примерной синхронизации локальных часов узлов с реальным временем, HLC тоже всегда будут близки к реальному времени, в отличие от часов Лэмпорта или векторных часов. Это позволяет использовать их в системах, где необходимо упорядочивание по реальным таймпштампам, но требуется и надежное логическое время
HLC используются в CockroachDB, YugabyteDB, TiDB, Cassandra, MongoDB, и многих других СУБД
1 · 503 ·