Дискретная репликация ZFS
Идеи лежащая в основе репликации просты:
- ZFS snapshots очень "дешевы" в изготовлении
- они могут быть получены в виде бинарного потока
- они могут быть восстановлены из потока
- вместо полного потока можно получать разницу между двумя snapshots
Предлагаемый скрипт использует эти особенности и работает следующим образом:
- стартует на slave сервере
- делает detach (выполняясь в background)
- обращается к master по rsh или ssh и создает новый snapshot с именем сформированным из текущего timestamp
- запрашивает у master бинарную разницу между свежеизготовленным snapshot и последним имеющимся у slave
- применяет эту разницу к своему последнему snapshot, создавая новый snapshot
- делает операцию клонирования файловой системы по состоянию последнего snapshot
- форсированно переставляет symlink с заданным именем на клонированное состояние
- пытается удалить старые snapshots и clones (сохраняя N последних)
- "засыпает" на указанное количество секунд
- повторяет выполнение с шага 3
Примечания:
- выполнение с помощью rsh не оправдано, имеет смысл использовать ssh в связке с ControlMaster и ControlPersist
- первый snapshot приходится переносить вручную
- файловая система на slave должна быть не смонтирована и на ней имеет смысл выставить свойство readonly
- клонирование используется как workaround для решения проблемы блокировок при одновременном использовании файловой системы на чтение и ее модификации новым snapshot
- все использование файловой системы производится через обращение по имени symlink
Указанный подход успешно применялся в production на проектах компаний Rambler, Lamoda и ряда других.