Модуль 17 / 24
Persistent data
Зміст
1. Цілі та результат модуля
Після модуля ви зможете пояснити scope local volume, пов’язати stateful task із placement і виконати узгоджений backup/restore.
- не плутати ім’я volume зі спільним storage
- перевіряти дані після reschedule
- зупиняти writes перед backup
- перевіряти archive і restore
2. Теорія: local volume scope
Драйвер local створює volume на конкретному node. Те саме ім’я на іншому node означає інше сховище. Service spec переноситься кластером, вміст volume — ні.
На manager-2 task побачив порожній volume, а після повернення manager-1 прочитав marker.
3. Stateful placement
Service з local volume потребує constraint або label до node з даними. За втрати node scheduler може створити task із порожнім volume.
Constraint робить node/storage failure domain. Для HA потрібне distributed storage або replication застосунку.
4. Backup, consistency, RPO і RTO
Копіювання файлів активної бази може бути неузгодженим. Використовуйте native dump, quiesced snapshot або зупинку writes. Тут service масштабується до нуля.
Checksum перевіряє передачу, але restore drill визначає придатність. RPO — момент backup, RTO — час відновлення.
5. Методичні вказівки
- Записуйте node і mountpoint
- Не вважайте volume name cluster storage
- Зупиняйте writes
- Монтуйте source read-only
- Перевіряйте 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 і перевірте розділення даних.
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; зафіксуйте 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, створіть volume, розпакуйте archive і запустіть новий 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- порожні дані — інший node
- volume in use — зупиніть containers
- битий archive — checksum
- дані є, app не стартує — ownership/mode/format
10. Контроль, критерії засвоєння та cleanup
- Де живе local volume?
- Чому однакове ім’я не спільні дані?
- Що дає constraint?
- Чому tar активної бази небезпечний?
- Чим RPO відрізняється від RTO?
- Чому checksum не замінює restore?
Модуль засвоєно, якщо ви показуєте 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