← К программе курса

Модуль 17 / 24

Persistent data

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы сможете объяснить scope local volume, связать stateful task с placement и выполнить согласованный backup/restore данных приложения.

  • не путать имя volume с общей storage
  • проверять данные после reschedule
  • останавливать записи перед файловым backup
  • проверять архив и восстановление
02

2. Теория: local volume scope

Драйвер local создаёт volume на конкретном node. Одинаковое имя на другом node означает другое хранилище. Swarm service spec переносится кластером, содержимое local volume — нет.

В проверке task на manager-2 увидел пустой новый volume, а после возврата manager-1 снова прочитал исходный marker.

03

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 приложения.

04

4. Backup, consistency, RPO и RTO

Копирование файлов работающей базы может дать логически несогласованный backup. Используйте application-native dump, snapshot после quiesce или остановку writes. В лаборатории service масштабируется до нуля.

Checksum подтверждает целостность передачи, но не пригодность восстановления. Restore drill измеряет RTO и проверяет содержимое; RPO определяется моментом backup.

05

5. Методические указания

  • Записывайте node и mountpoint
  • Не считайте volume name cluster storage
  • Перед backup остановите writes
  • Монтируйте источник backup read-only
  • Проверяйте tar listing и SHA-256
  • После restore запускайте отдельную проверку приложения
06

6. Лабораторная работа: локальные данные

Создайте service на manager-1 и marker в named volume. Inspect должен показать Scope local.

terminal
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'
07

7. Лабораторная работа: перенос task

Переместите task на manager-2: marker отсутствует. Создайте node2.txt, верните manager-1 и подтвердите исходный marker и отсутствие node2.txt.

terminal
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'
08

8. Лабораторная работа: согласованный backup

Scale-to-zero останавливает writer. Одноразовый container архивирует volume read-only в `/tmp`; зафиксируйте listing и checksum.

terminal
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.tar
09

9. Лабораторная работа: restore и диагностика

Удалите service и volume manager-1, создайте volume заново, распакуйте архив и запустите новый service на том же node. Marker должен восстановиться.

terminal
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 3600
terminal
ssh 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

10. Контроль, критерии освоения и cleanup

  • Где живёт local volume?
  • Почему одинаковое имя не означает общие данные?
  • Что даёт placement constraint?
  • Почему tar работающей базы опасен?
  • Чем RPO отличается от RTO?
  • Почему checksum не заменяет restore test?

Модуль освоен, если вы демонстрируете node-local divergence и восстанавливаете marker из проверенного backup.

terminal
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