← До програми курсу

Модуль 17 / 24

Persistent data

DOCKER SWARM

Зміст
01

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

Після модуля ви зможете пояснити scope local volume, пов’язати stateful task із placement і виконати узгоджений backup/restore.

  • не плутати ім’я volume зі спільним storage
  • перевіряти дані після reschedule
  • зупиняти writes перед backup
  • перевіряти archive і restore
02

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

Драйвер local створює volume на конкретному node. Те саме ім’я на іншому node означає інше сховище. Service spec переноситься кластером, вміст volume — ні.

На manager-2 task побачив порожній volume, а після повернення manager-1 прочитав marker.

03

3. Stateful placement

Service з local volume потребує constraint або label до node з даними. За втрати node scheduler може створити task із порожнім volume.

Constraint робить node/storage failure domain. Для HA потрібне distributed storage або replication застосунку.

04

4. Backup, consistency, RPO і RTO

Копіювання файлів активної бази може бути неузгодженим. Використовуйте native dump, quiesced snapshot або зупинку writes. Тут service масштабується до нуля.

Checksum перевіряє передачу, але restore drill визначає придатність. RPO — момент backup, RTO — час відновлення.

05

5. Методичні вказівки

  • Записуйте node і mountpoint
  • Не вважайте volume name cluster storage
  • Зупиняйте writes
  • Монтуйте source read-only
  • Перевіряйте 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 і перевірте розділення даних.

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; зафіксуйте 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, створіть volume, розпакуйте archive і запустіть новий 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
  • порожні дані — інший node
  • volume in use — зупиніть containers
  • битий archive — checksum
  • дані є, app не стартує — ownership/mode/format
10

10. Контроль, критерії засвоєння та cleanup

  • Де живе local volume?
  • Чому однакове ім’я не спільні дані?
  • Що дає constraint?
  • Чому tar активної бази небезпечний?
  • Чим RPO відрізняється від RTO?
  • Чому checksum не замінює restore?

Модуль засвоєно, якщо ви показуєте 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