Модуль 17 / 24
Persistent data
Содержание
1. Цели и результат модуля
После модуля вы сможете объяснить scope local volume, связать stateful task с placement и выполнить согласованный backup/restore данных приложения.
- не путать имя volume с общей storage
- проверять данные после reschedule
- останавливать записи перед файловым backup
- проверять архив и восстановление
2. Теория: local volume scope
Драйвер local создаёт volume на конкретном node. Одинаковое имя на другом node означает другое хранилище. Swarm service spec переносится кластером, содержимое local volume — нет.
В проверке task на manager-2 увидел пустой новый volume, а после возврата manager-1 снова прочитал исходный marker.
3. Stateful placement
Stateful service с local volume требует constraint или label, связывающий task с node, где находятся данные. При потере node scheduler может создать task на другом node с пустым volume.
Constraint восстанавливает предсказуемость, но превращает node/storage в failure domain. Для HA нужен подходящий distributed storage или replication приложения.
4. Backup, consistency, RPO и RTO
Копирование файлов работающей базы может дать логически несогласованный backup. Используйте application-native dump, snapshot после quiesce или остановку writes. В лаборатории service масштабируется до нуля.
Checksum подтверждает целостность передачи, но не пригодность восстановления. Restore drill измеряет RTO и проверяет содержимое; RPO определяется моментом backup.
5. Методические указания
- Записывайте node и mountpoint
- Не считайте volume name cluster storage
- Перед backup остановите writes
- Монтируйте источник backup read-only
- Проверяйте tar listing и SHA-256
- После restore запускайте отдельную проверку приложения
6. Лабораторная работа: локальные данные
Создайте service на manager-1 и marker в named volume. Inspect должен показать Scope local.
ssh swarm-manager-3 docker service create --detach=true --name swarm-m17-store --replicas 1 --constraint node.hostname==swarm-manager-1 --mount type=volume,source=swarm-m17-data,target=/data alpine:3.22 sleep 3600
ssh swarm-manager-1 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m17-store); docker exec "$id" sh -c "printf manager-1-persistent > /data/marker.txt"; docker exec "$id" cat /data/marker.txt; docker volume inspect swarm-m17-data'7. Лабораторная работа: перенос task
Переместите task на manager-2: marker отсутствует. Создайте node2.txt, верните manager-1 и подтвердите исходный marker и отсутствие node2.txt.
ssh swarm-manager-3 docker service update --detach=false --constraint-rm node.hostname==swarm-manager-1 --constraint-add node.hostname==swarm-manager-2 swarm-m17-store
ssh swarm-manager-2 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m17-store); docker exec "$id" test ! -e /data/marker.txt; docker exec "$id" sh -c "printf manager-2-local > /data/node2.txt"'
ssh swarm-manager-3 docker service update --detach=false --constraint-rm node.hostname==swarm-manager-2 --constraint-add node.hostname==swarm-manager-1 swarm-m17-store
ssh swarm-manager-1 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m17-store); docker exec "$id" cat /data/marker.txt; docker exec "$id" test ! -e /data/node2.txt'8. Лабораторная работа: согласованный backup
Scale-to-zero останавливает writer. Одноразовый container архивирует volume read-only в `/tmp`; зафиксируйте listing и checksum.
ssh swarm-manager-3 docker service scale swarm-m17-store=0
ssh swarm-manager-1 docker run --rm -v swarm-m17-data:/data:ro -v /tmp:/backup alpine:3.22 tar -C /data -cf /backup/swarm-m17-backup.tar .
ssh swarm-manager-1 tar -tf /tmp/swarm-m17-backup.tar
ssh swarm-manager-1 sha256sum /tmp/swarm-m17-backup.tar9. Лабораторная работа: restore и диагностика
Удалите service и volume manager-1, создайте volume заново, распакуйте архив и запустите новый service на том же node. Marker должен восстановиться.
ssh swarm-manager-3 docker service rm swarm-m17-store
ssh swarm-manager-1 docker volume rm swarm-m17-data
ssh swarm-manager-1 docker volume create swarm-m17-data
ssh swarm-manager-1 docker run --rm -v swarm-m17-data:/data -v /tmp:/backup:ro alpine:3.22 tar -C /data -xf /backup/swarm-m17-backup.tar
ssh swarm-manager-3 docker service create --detach=true --name swarm-m17-restore --replicas 1 --constraint node.hostname==swarm-manager-1 --mount type=volume,source=swarm-m17-data,target=/data alpine:3.22 sleep 3600ssh swarm-manager-1 'id=$(docker ps -q --filter label=com.docker.swarm.service.name=swarm-m17-restore); docker exec "$id" cat /data/marker.txt'
ssh swarm-manager-3 docker service ps swarm-m17-restore
ssh swarm-manager-1 docker volume inspect swarm-m17-data- пустые данные — task на другом node
- volume in use — остановите containers
- битый archive — checksum/transport
- данные есть, приложение не стартует — ownership, mode и format
10. Контроль, критерии освоения и cleanup
- Где живёт local volume?
- Почему одинаковое имя не означает общие данные?
- Что даёт placement constraint?
- Почему tar работающей базы опасен?
- Чем RPO отличается от RTO?
- Почему checksum не заменяет restore test?
Модуль освоен, если вы демонстрируете node-local divergence и восстанавливаете marker из проверенного backup.
ssh swarm-manager-3 docker service rm swarm-m17-restore
sleep 5
ssh swarm-manager-1 docker volume rm swarm-m17-data
ssh swarm-manager-2 docker volume rm swarm-m17-data
ssh swarm-manager-1 sudo rm -f /tmp/swarm-m17-backup.tar
ssh swarm-manager-3 docker service ls