MySQL · MySQL 8.4.6
В Booking.com у кластера MySQL один primary на запись и от десятков до сотен реплик на чтение. Реплику, которая отстала, убирают из пула, чтобы пользователь не видел старую цену номера.
В replica_heartbeats каждые несколько секунд пишется отставание реплики lag_sec. Последний heartbeat — с самым поздним checked_at; при равном времени — с большим hb_id. Верните replica, cluster, lag_sec для реплик, у которых в последнем heartbeat отставание больше 10 секунд.
В работе: Балансировщик чтения: раз в минуту решает, на какие реплики слать SELECT.
Источник: кейс Booking.com: MySQL с сотнями реплик на чтение, SREcon24 EMEA. Условие пересказано своими словами.
Какие запросы вернут реплики, отстающие в последнем замере больше чем на 10 секунд?
- Коррелированный подзапрос с ORDER BY … LIMIT 1
- MAX(lag_sec) по реплике
- JOIN с MAX(checked_at) без учёта hb_id
- ANY_VALUE(lag_sec) рядом с MAX(checked_at)
- ROW_NUMBER() по checked_at DESC, hb_id DESC