У каждого сервера есть уникальный идентификатор, который задаётся через файл auto.cnf в datadir. Каждая транзакция при коммите получает GTID. GTID это UUID сервера + счётчик на этом сервере (без пропусков). Состояние сервера (слепок какие значения у полей строк) это функция от набора чисел (UUID1,seqno1);..;(UUIDN,seqnoN). Когда сервер выполняет свой запрос у него увеличивается свой seqno, когда исполняется запрос по репликации или востанавливаем весь сервер из бекапа, в наборе gtid появляется UUID мастера и изменяется номер того сервера. После выполнения транзакции сервер обновляет GTID и сохраняет его в gtid_executed. Кроме gtid executed ещё надо поддерживать gtid_purged: набор gtid в котором видно какие транзакции исполнены - это транзакции которые исполнили, но в бинарном логе сервера их уже нет (или бинарный лог был уже удалён, или мы из бекапа получили). Каждый сервер, который присоединяется как слейв может попросить бинарные логи для своей gtid_executed (которая на старте получается из gtid_purged). Таким образом бинарные логи могут храниться в файлах с любым названием и любыми смещениями по-байтовыми в файле, но слейв всё равно находит свою позицию.
Обсуждают сегодня