Kiwango cha Uzalishaji wa Docker au Kubernetes Imefutwa: Kuokoa docker system prune --volumes, overlay2 Inodes, na etcd Vijipicha¶
Nambari za dharura hutofautiana baina ya nchi. Ukurasa huu unatumia 911, nambari ya Marekani na Kanada. Nchi nyingine nyingi hutumia 112, 999, au nambari nyingine. Tafuta nambari ya nchi yako.
Kukimbia docker compose down -v, docker system prune -a --volumes, docker volume rm, au kubectl delete pvc kwenye kichupo kibaya cha terminal katika uzalishaji ni mojawapo ya njia za haraka zaidi za kufuta PostgreSQL moja kwa moja, MySQL, MariaDB, Redis, MongoDB, au ujazo wa hifadhidata wa SQLite. Tofauti na vijisehemu vya mashine ya wingu vinavyohamia kwenye pipa la kusaga tena la siku 7, kiendesha kiasi cha ndani cha Docker (/var/lib/docker/volumes/<name>/_data) na Kubernetes local-path / hostPath watoa huduma wanatoa mara moja POSIX ya kawaida unlink() na rmdir() hupiga simu moja kwa moja dhidi ya mfumo wa faili wa mwenyeji wa Linux (ext4, XFS, au Btrfs) Kila maandishi yanayotokea kwenye seva pangishi ya Linux baada ya amri kukamilika inaweza kubatilisha vizuizi vya hifadhidata vilivyotolewa kwenye diski. Ikiwa diski yako ya seva imejaa hadi asilimia 100 (0 bytes free) kabla ya mtu kukimbia docker system prune --volumes kwa hofu, shauriana seva diski 100% imejaa, hifadhidata ya WAL logi bloat, na uokoaji wa nafasi sifuri; kwa kufutwa kwa faili za Linux nje ya vyombo, ona ajali rm -rf au Shift-Delete kwenye ext4, XFS, APFS, na NTFS: weka upya tu kusoma na kuchonga ingizo na mashine virtual VMDK, VHDX, na qcow2 snapshot mnyororo rushwa na uokoaji hypervisor. Ikiwa hitilafu hii ya uzalishaji itaathiri utunzaji wa wagonjwa hospitalini, upelekaji wa dharura, au mifumo ya usalama ya huduma za umma, piga simu kwa nambari yako ya dharura ya eneo lako (911 nchini Marekani na Kanada, 112 katika Umoja wa Ulaya, 999 nchini Uingereza) au angalia saraka yetu ya nambari za dharura.
Fanya hivi sasa¶
- USIKIMBIE
docker compose up -d,systemctl restart docker, au tuma tena ganda la Kubernetes: Kuunda tena kontena au kuwasha tena daemon ya Docker huandika megabaiti mpyaoverlay2metadata, kumbukumbu za kontena za JSON, na faili za hifadhidata zilizoanzishwa upya (initdb) moja kwa moja juu ya halisiext4auXFShuzuia sauti yako iliyofutwa ikikaa sekunde chache zilizopita. - Angalia baada ya sekunde 5 ikiwa mchakato wa kontena (
postgres,mysqld,redis-server,node,python) bado inaendelea kwenye kumbukumbu (ps auxnasudo lsof +L1): Iwapo mtu alifuta faili ndani ya sauti iliyopachikwa au kutenganisha sauti isiyojulikana wakati chombo kinaendelea kufanya kazi, kinu cha Linux huhifadhi asilimia 100 ya faili za hifadhidata ambazo hazijaunganishwa zikiwa hai kwenye diski mradi tu Kitambulisho cha Mchakato wa mpangishi wa chombo.PID) inashikilia maelezo ya faili wazi (FD) Unaweza kunakili faili hizo moja kwa moja kutoka/proc/<PID>/fd/au/proc/<PID>/root/bila kupoteza data kabla ya kontena kusimama. - ** Ikiwa chombo tayari kimesimamishwa na kiasi kilifutwa (
docker compose down -vaudocker system prune --volumes), fungia diski ya mwenyeji inaandika mara moja**: Acha daemon ya Docker (sudo systemctl stop docker.socket docker.service containerd) kwa hivyo vyombo vya mandharinyuma na ukaguzi wa afya huacha kuandika kumbukumbu/var/lib/docker, basi ama weka tena/var/lib/docker(au mzizi/kizigeu) kusoma tu (sudo mount -o remount,ro /) au piga picha ya haraka ya kiwango cha wingu (AWS EBS Snapshot,GCP Persistent Disk Snapshot,DigitalOcean Volume Snapshot) kabla ya kugusa chochote. - Ikiwa uko kwenye Kubernetes (
kubectl delete pvcaukubectl delete namespace), angalia PersistentVolume (PV)ReclaimPolicy(kubectl get pv) mara moja: - Ikiwa
PValikuwapersistentVolumeReclaimPolicy: Retain, data yako haijafutwa: thePVtu kuhamiaReleasedhali na diski yako ya wingu (EBS,Azure Disk,Ceph RBD,NFS) iko sawa kwa asilimia 100. - Hata kama
kubectl delete pvcamekwamaTerminating, Kubernetes Wakamilishaji (kubernetes.io/pvc-protection) zuia kiendesha CSI kufuta hifadhi ya msingi mradi tu Pod yoyote irejelee PVC. Usifute Pod hadi unakili data kutoka kwa Pod inayoendesha. - Picha kizigeu cha msingi cha kizuizi (
dd/ddrescuejuu ya SSH) kwa diski ya nje au kiasi tofauti cha wingu kabla ya kukimbiaext4magic,extundelete, auPhotoRec: Kamwe usiendeshe vichonga faili vinavyoandika faili za towe kwenye kizigeu sawa cha diski ambako unarejesha/var/lib/docker/volumes. - Kwa hali ya nguzo ya Kubernetes iliyoharibika au iliyofutwa kwa bahati mbaya (
kubectl delete crd/namespace), achakube-apiserverna kurejesha yako ya hivi karibunietcdpicha (etcdctl snapshot restore): Ikiwa nguzo ikoetcdilifutwa wakati kiasi cha msingi cha hifadhi ya wingu bado kipo, inarejeshwaetcdhuponya yotePV,PVC,Secret, naConfigMapvitu kwa wakati mmoja.
Danger
Usiondoe kamwe kubernetes.io/pvc-protection au kubernetes.io/pv-protection finalizer na kubectl patch ... -p '{"metadata":{"finalizers":null}}' wakati PVC imekwama Terminating: Kikamilishaji hicho ndio kitu pekee kinachoweka kiendeshaji chako cha wingu CSI (aws-ebs-csi-driver, pd.csi.storage.gke.io, Longhorn, Rook-Ceph) kutokana na kutoa vifaa DeleteVolume Simu ya API ili kuharibu diski yako ya uzalishaji. Wakati PVC imekwama Terminating, Pod bado inafanya kazi na sauti bado imewekwa: run kubectl exec au kubectl cp (au pg_dump / mysqldump) mara moja kuokoa asilimia 100 ya hifadhidata yako kabla ya Pod kusitishwa.
Mti wa uamuzi: kiasi cha Docker kilichofutwa, overlay2 layer, au Kubernetes PVC triage¶
Tumia chati hii ya mtiririko kuchagua njia ya urejeshaji ya haraka zaidi ya sifuri-hasara kulingana na kama mchakato wa kontena ungali hai, iwe sauti iliungwa mkono na diski ya ndani au hifadhi ya CSI ya wingu, na mfumo wa faili unaopangisha. /var/lib/docker:
flowchart TD
Start["Data ya Uzalishaji Haipo Baada ya Docker au Kubernetes Futa Amri"] --> WhichEnv{"Ni Jukwaa & Amri gani Ilisababisha Hasara?"}
WhichEnv -->|"Docker: Chombo Bado Kinaendelea (Faili Zisizounganishwa Ndani ya Kiasi/Kontena)"| ProcRescue["Okoa Vielelezo vya Faili Visivyounganishwa kupitia sudo lsof +L1 na /proc/PID/fd/N au /proc/PID/root/"]
WhichEnv -->|"Docker: Chombo Kimesimamishwa & Kiasi Kimefutwa (tunga chini -v / prune --volumes)"| StopDocker["Endesha Mara Moja: sudo systemctl stop docker.socket docker imebeba"]
WhichEnv -->|"Kubernetes: kubectl kufuta pvc / pv / statefulset / namespace"| K8sCheck{"Pod Bado Inaendesha AU PVC Imekwama Katika Kusitisha?"}
K8sCheck -->|"Ndiyo: Pod Bado Inaendelea (Finalizer Inazuia CSI Futa)"| K8sExec["USIFUTE Pod -> Endesha kubectl exec / pg_dump / tar juu ya stdout kwa Diski ya Ndani Mara moja"]
K8sCheck -->|"Hapana: Pod Gone -> Angalia kubectl kupata pv"| ReclaimCheck{"Sera ya Kurudisha PV Ilikuwa Nini?"}
ReclaimCheck -->|"Hifadhi (Hali ya PV = Imetolewa)"| ClearClaimRef["100% Data Imbayo -> Hariri PV ili Kuondoa spec.claimRef.uid -> Funga tena kwa PVC Mpya"]
ReclaimCheck -->|"Futa (Cloud EBS / PD / Longhorn / Njia ya Ndani)"| CloudOrLocal{"Kiasi cha Wingu CSI au Diski ya Mwenyeji wa Ndani?"}
CloudOrLocal -->|"Cloud CSI (AWS EBS / GCP / Azure / Ceph)"| CloudSnap["Angalia Bin ya Usafishaji ya Dashibodi ya Wingu / Vijipicha vya EBS vya Kiotomatiki / Tupio la Ceph RBD (rbd takataka ls)"]
CloudOrLocal -->|"Diski ya Nodi ya Ndani (njia ya ndani / Njia ya mwenyeji)"| StopDocker
StopDocker --> RemountRO["Remount Host Partition Soma-Pekee (mount -o remount,ro) AU Tiririsha Picha ya Zuia kupitia SSH"]
RemountRO --> HostFS{"Ni Majeshi gani ya Mfumo wa faili /var/lib/docker?"}
HostFS -->|"ext4"| Ext4Rec["Tumia debugfs / ext4magic Journal Inode Transaction Rollback (-muhuri wa muda)"]
HostFS -->|"XFS / Btrfs"| CarveRec["Tumia Btrfs Roots / xfs_irecover / Uchongaji Sahihi Maalum kwa SQLite, Postgres Heap, au InnoDB .ibd"]
Awamu ya 1: Jinsi Docker na Kubernetes hufuta kiasi kwenye diski¶
Kabla ya kutekeleza amri yoyote ya uokoaji, elewa mahali data yako iliishi kwenye seva pangishi ya Linux na amri ya kufuta iligusa nini hasa:
| Aina ya Hifadhi & Futa Amri | Njia ya mfumo wa faili ya mwenyeji kwenye Nodi ya Linux | Nini hasa Amri ya Kufuta Ilifanya | Njia ya Urejeshaji wa Haraka |
|---|---|---|---|
Inaitwa Kiasi cha Docker (docker volume rm au docker compose down -v) |
/var/lib/docker/volumes/<vol_name>/_data |
Imetenganisha faili zilizo ndani _data/ na kuondoa ingizo la saraka kutoka /var/lib/docker/volumes/metadata.db (boltdb) |
Acha Docker mara moja, weka tena /var/lib/docker soma pekee, na urejeshe ingizo ambazo hazijaunganishwa kupitia ext4magic / debugfs au kuchora saini. |
** Kiasi cha Docker kisichojulikana (docker run -v /var/lib/mysql + docker rm -v au docker system prune --volumes)** |
/var/lib/docker/volumes/<64-char-hex-id>/_data |
docker system prune --volumes hufuta kila sauti isiyojulikana na iliyotajwa ambayo haijarejelewa kwa sasa na angalau kontena moja iliyopo. |
Acha Docker mara moja; kama ulikuwa nyingine zilizosimamisha vyombo ambavyo ujazo wake haukukatwa, angalia iliyosalia /var/lib/docker/volumes/*/_data folda kwanza kabla ya kuchonga vizuizi ambavyo havijatengwa. |
Safu inayoweza Kuandikwa ya Chombo (docker rm <container> data ilipoandikwa nje ya juzuu) |
/var/lib/docker/overlay2/<layer-id>/diff/ |
Imetenganisha sehemu ya juu ya chombo diff/ saraka ndani ya overlay2 dereva wa kuhifadhi. |
Acha Docker mara moja na upate mti wa saraka ambao haujaunganishwa kutoka kwa faili ya ext4 jarida au XFS vitalu. |
** Desktop ya Docker kwenye macOS au Windows (docker system prune --volumes)** |
Ndani ya picha ya diski ya mashine moja: -/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw (macOS) au %LocalAppData%\Docker\wsl\disk\docker_data.vhdx (Windows WSL2). |
Imetumwa unlink() ndani ya Linux VM, na ikiwa discard/TRIM inawashwa Docker.raw / docker_data.vhdx, ilitoboa mashimo machache kwenye faili ya mwenyeji. |
Ondoka kwenye Eneo-kazi la Doka ndani ya sekunde 5, nakala Docker.raw au docker_data.vhdx kwa gari la nje, na kukimbia ext4magic / PhotoRec dhidi ya picha ya diski halisi. |
Kubernetes PVC na Delete Sera ya Kudai tena kwenye Ceph RBD (Rook-Ceph) au Longhorn |
Dimbwi la Ceph OSD (rbd) au /var/lib/longhorn/replicas/. |
Kama csi-rbdplugin ina trash imewezeshwa (rbd trash), picha ya RBD inahamishwa hadi kwenye pipa la taka la Ceph; vinginevyo vizuizi havijapangwa. |
Kimbia rbd trash ls --pool <pool> ndani ya rook-ceph-tools ganda na kurejesha na rbd trash restore. |
Awamu ya 2: Kuokoa faili za hifadhidata wazi kutoka kwa chombo ambacho bado kinafanya kazi (/proc/<pid>/fd/)¶
Subiri: je chombo bado kinaendelea kufanya kazi sasa hivi?
Mara kwa mara, mhandisi huendesha hati ya uhamishaji wa programu, kazi ya kusafisha cron, au mwongozo rm -rf /var/lib/postgresql/data/* au rm /app/data/production.sqlite3 ndani ya chombo kinachoendesha, au kufuta folda ya msingi ya bind-mount /opt/app/data wakati chombo chenyewe (postgres, mysqld, mariadbd, redis-server, mongod, gunicorn, node) ni bado inaendelea na inaendelea.
Katika Linux, faili haifutwa kutoka kwa diski wakati rm au unlink() inaitwa. Vizuizi vyake vya diski na ingizo hubaki Asilimia 100 imetengwa na kusomeka hadi mchakato wa mwisho ukishikilia maelezo ya faili wazi (FD) kwa ingizo hilo huifunga au kutoka.
Hatua ya 1: Tafuta kitambulisho cha Mchakato wa mwenyeji (PID) ya mchakato wa kontena¶
Kwenye nodi ya mwenyeji wa Linux (sio ndani ya kontena), pata mwenyeji PID ya hifadhidata yako au mchakato wa maombi:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
mysqld 18492 999 14u REG 259,1 482344960 0 1849201 /var/lib/mysql/app_prod/users.ibd (deleted)
mysqld 18492 999 15u REG 259,1 125829120 0 1849202 /var/lib/mysql/app_prod/orders.ibd (deleted)
mysqld 18492 999 16u REG 259,1 79691776 0 1849190 /var/lib/mysql/ibdata1 (deleted)
python3 22104 1000 4u REG 259,1 89128960 0 3102944 /data/production.sqlite3 (deleted)
NLINK: inasema 0, na jina la faili linaisha na (deleted). Faili imetoka kabisa ls /var/lib/docker/volumes/..., bado kila baiti moja (482 MB katika users.ibd, 89 MB katika production.sqlite3) bado yuko hai ndani /proc/<PID>/fd/<FD>.
Hatua ya 2: Nakili faili za hifadhidata ambazo hazijaunganishwa moja kwa moja /proc/<PID>/fd/¶
usisitishe au uwashe tena chombo. Wakati mchakato bado unaendelea, nakili maelezo ya faili mbichi moja kwa moja kwenye folda salama kwenye mwenyeji wako:
sudo mkdir -p /root/proc_emergency_rescue
# Example 1: Rescuing an unlinked SQLite3 database (PID 22104, FD 4)
sudo cp /proc/22104/fd/4 /root/proc_emergency_rescue/production.sqlite3
# Check if PID 22104 also holds the -wal file open (e.g. FD 5) and copy it too:
sudo cp /proc/22104/fd/5 /root/proc_emergency_rescue/production.sqlite3-wal
# Example 2: Automatically rescuing ALL open (deleted) MySQL/Postgres files for PID 18492
for fd in /proc/18492/fd/*; do
target=$(sudo readlink "$fd" 2>/dev/null)
if echo "$target" | grep -q "(deleted)"; then
fd_num=$(basename "$fd")
clean_name=$(echo "$target" | sed 's/ (deleted)//; s/\//_/g')
echo "Rescuing FD $fd_num -> $clean_name"
sudo cp "$fd" "/root/proc_emergency_rescue/${fd_num}${clean_name}"
fi
done
Hatua ya 3: Bora zaidi: Tekeleza utupaji wa moja kwa moja wa kimantiki (pg_dump / mysqldump / .backup) kabla ya kontena kufunga FDs¶
Kama postgres au mysqld bado inaendelea na faili zake za data zimefunguliwa kwenye kumbukumbu na /proc/<PID>/fd/, jaribu kuendesha utupaji wa moja kwa moja wa kimantiki juu ya tundu la unix lililopo au muunganisho wa TCP kwanza:
# If the database engine can still read its open file descriptors:
docker exec <container_name> pg_dumpall -U postgres > /root/proc_emergency_rescue/live_dump.sql
# Or for MySQL:
docker exec <container_name> mysqldump -u root -p --all-databases --single-transaction > /root/proc_emergency_rescue/live_mysql.sql
.1, .2 faili za sehemu katika michakato ya wafanyikazi kwa nguvu, kwa hivyo pg_dump inaweza kushindwa kwenye meza ambazo hazijafungwa; kuchanganya swala moja kwa moja la SQL na kunakili kila wazi /proc/<pid>/fd/* kote zote postgres PID za nyuma za watoto huhifadhi data ya juu iwezekanavyo ya lundo la jedwali.)
Awamu ya 3: Kurejesha kiasi cha Docker kilichofutwa ext4 au XFS baada ya kontena kusimama¶
Nini kama wewe mbio docker compose down -v au docker system prune --volumes, kwa hivyo kontena tayari imesimamishwa na yote /proc/<pid>/fd/ maelezo yamefungwa? Sasa uko kwenye mbio dhidi ya diski ya usuli huandika kwenye mwenyeji wa Linux.
Hatua ya 1: Fanya mfumo wa faili wa mwenyeji wa Linux ndani ya sekunde 10¶
- Simamisha Doka, iliyo na kontena, kubelet, na cron mara moja kwa hivyo hakuna kontena, ukaguzi wa afya, au kizungusha logi kinachoandika baiti nyingine kwa
/var/lib/docker: - Angalia ni kifaa gani cha kuzuia na mfumo wa faili unashikilia
/var/lib/docker: - Weka upya kizigeu cha Kusoma Pekee (au tiririsha taswira ya kizigeu mbichi juu ya SSH hadi kwa mashine nyingine):
- Kama
/var/lib/dockeriko kwenye kizigeu chake kilichojitolea au kiasi cha LVM (kwa mfano/dev/nvme0n1p2au/dev/mapper/vg0-docker), weka tena usomaji pekee mara moja: - Kama
/var/lib/dockeriko kwenye mizizi/kizigeu (/), jaribu kulazimisha kizigeu cha mizizi kusoma tu kwa kutumia kichocheo cha Uchawi cha kernel SysRq (echo u | sudo tee /proc/sysrq-trigger) ausudo mount -o remount,ro /. - Ikiwa uko kwenye VPS ya wingu (AWS EC2, GCP, DigitalOcean, Hetzner, Linode): Nenda mara moja kwenye kiweko chako cha wavuti na ubofye Unda Picha kwenye sauti ya kuzuia ya seva (au tiririsha kifaa kibichi cha kuzuia juu ya SSH hadi seva ya pili:
sudo dd if=/dev/nvme0n1p1 bs=4M status=progress | gzip -1 | ssh user@backup-server "cat > /mnt/storage/docker_host_raw.img.gz")
Hatua ya 2: Angalia ikiwa data yako bado iko katika sauti NYINGINE ambayo haijakatwa au overlay2 safu¶
Kabla ya kuchonga vizuizi vya diski ambavyo havijatengwa, thibitisha kwamba hifadhidata yako haikuhifadhiwa kwenye kipachiko au ujazo uliopewa jina tofauti ambao ulisalia:
# Search the entire /var/lib/docker tree read-only for any surviving database files:
sudo find /var/lib/docker -name "PG_VERSION" -o -name "ibdata1" -o -name "*.sqlite*" -o -name "*.db" -o -name "dump.rdb" -o -name "WiredTiger" 2>/dev/null
docker volume rm app_db_data, kugundua tu na find /var/lib/docker hiyo docker-compose.yml kweli aliumba projectname_app_db_data (ambayo bado ni asilimia 100 kwenye diski) wakati app_db_data ilikuwa juzuu ya zamani isiyotumika kutoka miezi sita iliyopita.
Hatua ya 3: Kurejesha saraka za kiasi cha Docker ambazo hazijaunganishwa zimewashwa ext4 kwa kutumia ext4 Jarida (ext4magic na debugfs)¶
Wakati docker volume rm hufuta /var/lib/docker/volumes/<vol_name>/_data kwenye ext4 mfumo wa faili, ext4 sifuri nje ya viashiria vya kuzuia moja kwa moja (i_block / kadiri mzizi wa mti) kwenye jedwali la ingizo hai. Hata hivyo, ext4 jarida (inode <8>, kwa kawaida 128 MB kwa 1024 MB bafa ya pete ya duara) bado ina nakala za kihistoria za jedwali halisi za ingizo na vizuizi vya saraka kutoka hapo awali docker compose down -v ilitekelezwa.
+-------------------------------------------------------------------------+
| HOW ext4magic RECOVERS A DELETED DOCKER VOLUME FROM THE EXT4 JOURNAL |
| |
| Live Inode Table on Disk (After docker volume rm): |
| Inode #918402 (users.ibd): [Size = 0, Extent Pointers = ZEROED] |
| |
| Ext4 Journal Ring Buffer (Inode <8> on Disk): |
| Transaction #41902 (10 mins ago): |
| Inode #918402 (users.ibd): [Size = 482MB, Extents = Blocks 9000..9999]|
| |
| -> ext4magic reads the old Inode Copy from Journal Transaction #41902 |
| and extracts Blocks 9000..9999 directly to your rescue drive. |
+-------------------------------------------------------------------------+
Kimbia ext4magic dhidi ya kizigeu chako cha kusoma pekee (au .img nakala ya picha kwenye seva ya pili), ikibainisha muhuri wa muda (-a) kutoka dakika 5 kabla ulikimbia docker compose down -v au docker system prune --volumes:
# Install ext4magic on your rescue machine (never on the affected partition)
sudo apt-get install -y ext4magic e2fsprogs
# Dump the ext4 journal from the frozen partition / image to a file in RAM (/dev/shm)
sudo debugfs -R "dump <8> /dev/shm/ext4_journal.copy" /dev/nvme0n1p1
# Recover all files deleted under var/lib/docker/volumes after (Current Time - 15 minutes)
sudo mkdir -p /mnt/external_rescue/docker_recovered
sudo ext4magic /dev/nvme0n1p1 \
-j /dev/shm/ext4_journal.copy \
-f var/lib/docker/volumes \
-a $(date -d "-15 minutes" +%s) \
-r -d /mnt/external_rescue/docker_recovered
-j /dev/shm/ext4_journal.copy: Husoma muhtasari wa jarida ulilohifadhi kwenye RAM mara tu baada ya kusimamisha Docker.
- -f var/lib/docker/volumes: Inalenga mti halisi wa saraka ya kiasi cha Docker (kumbuka: acha inayoongoza / katika ext4magic njia za jamaa).
- -a $(date -d "-15 minutes" +%s): Anasema ext4magic kuunda tena mti wa saraka kwa kutumia nakala za ingizo halali dakika 15 zilizopita (kabla ya kufuta kwa bahati mbaya).
- -r: Hurejesha saraka kamili ambapo hakuna vizuizi vilivyoandikwa; ikiwa -r inakosa faili zilizoandikwa upya kwa kiasi, endesha pasi ya pili ukibadilisha -r na -m (uchongaji wa uchawi + hali ya mseto ya jarida).
Hatua ya 4: Kuchonga faili mbichi za SQLite, PostgreSQL, au MySQL InnoDB wakati jarida limefungwa (XFS au ext4)¶
Warning
Kwa nini XFS hauungi mkono ext4magic na inahitaji ushushaji wa kusoma tu mara moja: Tofauti ext4, ambayo huandika nakala kamili za ingizo za 256-byte kwenye jarida lake, XFS kumbukumbu dhamira ya metadata deltas na kwa ukali kutumia tena ingizo B-miti iliyoachiliwa (agi) Kama /var/lib/docker anakaa kwenye XFS kizigeu (chaguo-msingi kwenye RHEL, Rocky Linux, AlmaLinux, na Amazon Linux), ikiteremka /var/lib/docker au kuweka upya / kusoma-tu ndani ya sekunde ni hatua moja muhimu zaidi kabla ya kuchonga.
Ikiwa mwenyeji anatumia XFS au ikiwa ext4 jarida ambalo tayari limefungwa juu ya viashiria vya ingizo, tumia saini na muundo wa kuchonga dhidi ya picha ya diski mbichi (docker_host_raw.img):
- Kwa Hifadhidata za SQLite3 (
.sqlite,.db- k.m., Vaultwarden, Nextcloud, Mratibu wa Nyumbani, Gitea, Grafana): Kila hifadhidata ya SQLite3 huanza na kichwa cha ASCII cha baiti 16 katika byte 0 ya ukurasa wake wa kwanza wa kilobaiti 4:53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00("SQLite format 3\0"), na huhifadhi saizi halisi ya ukurasa wa hifadhidata (Bytes 16..17, kwa kawaida4096) na jumla ya saizi ya hifadhidata katika kurasa (Bytes 28..31, big-endian 32-bit integer) ndani kabisa ya kichwa hicho hicho. - Kimbia
PhotoRecna[File Opt]->[x] sqlitekuwezeshwa, au changanua kizigeu moja kwa moja nagrep -ab "SQLite format 3"kupata urekebishaji kamili wa faili yako ya SQLite iliyofutwa na uitoe nayodd:Mara baada ya kuondolewa, kukimbia# Find the exact byte offsets of every "SQLite format 3" header on the partition: sudo grep -ab "SQLite format 3" /dev/nvme0n1p1sqlite3 carved.db ".recover" | sqlite3 repaired.dbkuunda upya kila ukurasa wa jani la mti wa B.
Tip
Jinsi ya kuhesabu kwa usahihi dd saizi ndogo ya faili ya SQLite3 ambayo haijaunganishwa kutoka kwa kichwa chake: Mara moja grep -ab "SQLite format 3" hukupa kuanzia baiti kukabiliana OFFSET ya hifadhidata yako ya SQLite iliyofutwa, soma baiti 16..17 (uint16 big-endian saizi ya Ukurasa, k.m., 0x1000 = 4096 ka) na ka 28..31 (Hesabu ya Ukurasa wa uint32 wenye umri mkubwa, k.m., 25000 kurasa) kwa kutumia hexdump -C -s OFFSET -n 32. Kuzidisha Page Size x Page Count hukupa urefu kamili wa baiti kupita dd (iflag=skip_bytes,count_bytes) wakati faili iko kwenye diski.
- ** Kwa MySQL / MariaDB InnoDB (
.ibdfaili za meza)**: Kila InnoDB.ibdjedwali lina mfuatano16 KB(16,384byte) kurasa zenyeFIL_PAGE_INDEX(0x45BF) kichwa na ya kipekee ya jedwalispace_id. Tumia Percona / TwinDBundrop-for-innodb(stream_parser+c_parser) zana ya kuchanganua/dev/nvme0n1p1kwa wote16 KBKurasa za faharasa za InnoDB na utupe kila safu mlalo moja kwa moja kwenye faili za TSV/SQL ili kuagiza tena. - Kwa Faili za Lundo za PostgreSQL (
$PGDATA/base/<db_oid>/<relfilenode>): PostgreSQL huhifadhi kila jedwali kama dhabiti8 KB(8,192byte) lundo la kurasa zenyePageHeaderData(pd_lower,pd_upper,pd_special) Tumiapg_filedumpaupglazarus/pdukuchanganua sehemu za diski ambazo hazijatengwa8 KBkurasa zinazolingana na mpangilio wa safu wima ya jedwali lako (HeapTupleHeaderData) na uunda upya safu.
Awamu ya 4: Kubernetes PVC, PV, na etcd Picha ya Urejeshaji wa Dharura¶
Katika Kubernetes (EKS, GKE, AKS, k3s, RKE2, kubeadm, OpenShift), kufuta kwa bahati mbaya PersistentVolumeClaim (kubectl delete pvc), StatefulSet, au Nafasi nzima ya Majina (kubectl delete ns prod) hufuata usanifu tofauti sana kuliko Docker iliyosimama.
Mfano A: Maonyesho ya PVC Terminating (The Finalizer Lifesaver)¶
Endesha:
IkiwaSTATUS safu inasema Terminating, pumua kwa utulivu: data yako BADO HAIJAFUTWA.
- Kwa nini? Kila Kubernetes PVC iliyoundwa Tangu Kubernetes 1.9 inajumuisha kiotomatiki finalizers: [kubernetes.io/pvc-protection].
- Alimradi tu Pod bado inapachika PVC hiyo, kidhibiti cha Kubernetes kinakataa kukamilisha ufutaji wa PVC na katu haipigi simu kiendeshi cha CSI. DeleteVolume RPC.
- Kitendo cha Hapo Hapo: Ufanye SI futa au uanze upya Pod, na ufanye SIYO kubandika kikamilishaji. Mara moja nakili data yote kutoka kwa Pod inayoendesha kwa mashine yako ya karibu au ndoo ya S3:
# Stream a compressed tar backup or pg_dump out of the still-running pod immediately:
kubectl exec -n <namespace> <pod-name> -- pg_dumpall -U postgres > ./rescued_k8s_db.sql
# Or tar an entire mounted volume directory out over stdout:
kubectl exec -n <namespace> <pod-name> -- tar czf - /var/lib/postgresql/data > ./rescued_pvc_files.tar.gz
Mfano B: PVC ilifutwa, na kubectl get pv inaonyesha PersistentVolume in Released jimbo (ReclaimPolicy: Retain)¶
Endesha:
Ikiwa Sauti yako ya Kudumu (pv-prod-postgres) bado imeorodheshwa na STATUS: Released (kwa sababu StorageClass yake inatumika reclaimPolicy: Retain), Asilimia 100 ya data yako bado haijaguswa kwenye diski ya msingi. Hata hivyo, Kubernetes anakataa kuruhusu PVC mpya kujifunga kwa a Released PV kwa sababu PV bado ina a spec.claimRef akiashiria PVC za zamani zilizofutwa UID.
Jinsi ya kutengeneza a Released PV Available tena katika sekunde 10 na kupoteza data sifuri:
1. Hariri PersistentVolume kitu na kufuta spec.claimRef kizuizi:
kubectl get pv tena: hali inabadilika mara moja kutoka Released kwa Available.
3. Unda upya yako PersistentVolumeClaim ( kubainisha volumeName: <your-pv-name> na uwezo unaolingana/hifadhiClassName). Itafunga kwa PV iliyopo mara moja na faili zote zikiwa sawa.
Mfano C: Kurejesha hali ya nguzo ya Kubernetes iliyofutwa kutoka kwa etcd picha (etcdctl snapshot restore)¶
Nini ikiwa mtu alikimbia kubectl delete namespace prod au helm uninstall na kufuta maelezo 200 ya Kubernetes, Siri, ConfigMaps na ufafanuzi wa PV kwenye programu inayojidhibiti. kubeadm, k3s, au RKE2 ndege ya kudhibiti?
- Tafuta yako ya hivi punde
etcdsnapshot (kwa chaguo-msingi in/var/lib/rancher/k3s/server/db/snapshots/,/var/lib/rancher/rke2/server/db/snapshots/, au ulioratibiwa/var/backups/etcd/snapshot.db) - Thibitisha uadilifu wa muhtasari kabla ya kugusa nguzo ya moja kwa moja:
- Acha
kube-apiservernaetcdkwenye nodi ya ndege ya kudhibiti: - Kwenye
kubeadm(maganda tuli): Sogeza/etc/kubernetes/manifests/kube-apiserver.yamlna/etc/kubernetes/manifests/etcd.yamlkwa muda kwa/root/manifests_hold/hivyokubelethusimamisha vyombo vyote viwili kwa usafi, kisha kuweka nakala rudufu/var/lib/etcdkwa/var/lib/etcd.bak. - Kwenye
k3s: kukimbiasudo systemctl stop k3snasudo k3s server --cluster-reset --cluster-reset-restore-path=/path/to/snapshot. - Rudisha
etcdsaraka ya data imewashwakubeadm: - Sogeza
etcd.yamlnakube-apiserver.yamlkurudi ndani/etc/kubernetes/manifests/. Ndani ya sekunde 30,kube-apiserverinaunganishwa tena na iliyorejeshwaetcdkuhifadhi na kila kitu kilichofutwa cha Namespace, Siri, ConfigMap, na PersistentVolume kinatokea tena.
Awamu ya 5: Ugumu wa viwango vya Docker na Kubernetes dhidi ya kufutwa kwa bahati mbaya¶
Mara tu hifadhidata yako ya uzalishaji inaporejeshwa, tekeleza kanuni hizi nne za usanifu ili chapa moja ya CLI isiweze kufuta tena sauti ya moja kwa moja:
- Badilisha kila toleo la Kubernetes
StorageClasskutokareclaimPolicy: DeletekwareclaimPolicy: Retain: Kwa chaguo-msingi, Darasa za Hifadhi za wingu zilizojengwa (gp2,gp3,standard-rwo) chaguo-msingi kwareclaimPolicy: Delete, ikimaanisha kufuta PVC huharibu diski ya wingu. Unda aStorageClassnareclaimPolicy: Retain(au bandika PV zilizopo nakubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}') kwa hivyo kufuta PVC au Namespace hakuwahi kufuta kiasi cha msingi cha kizuizi. - Washa Ratiba za AWS EBS Recycle Bin / GCP Snapshot Ratiba / Velero yenye Snapshots za CSI: Kuwasha AWS EBS Recycle Bin huhifadhi sauti yoyote ya EBS iliyofutwa kwa siku 7 hadi 30 hata kama kiendeshi cha CSI kinapiga simu.
DeleteVolume. - Kamwe usitumie
docker system prune --volumeskatika hati za kusafisha kiotomatiki au viendeshaji vya CI/CD: Ikiwa kontena la hifadhidata ya uzalishaji litaanguka kwa muda mfupi (Exited (1)) kwa wakati halisi kazi ya cron inaendeshwadocker system prune -a --volumes -f, Docker inazingatia juzuu zake zisizojulikana "hazijatumika" na kuzifuta kabisa. Ukanda--volumeskutoka kwa hati zote za kusafisha. - Tumia vipandikizi vya kuunganisha seva pangishi (
/srv/prod_data/postgres:/var/lib/postgresql/data) au hifadhidata zinazodhibitiwa na nje za upakiaji wa hali ya juu wa uzalishaji: Tofauti/var/lib/docker/volumes/, pandishi saraka za bind-mount nje/var/lib/docker/haijaguswa kamwe nadocker compose down -v,docker volume rm, audocker system prune --volumes.
Nambari za dharura za kikanda na itifaki za wakala¶
Wakati kontena au ufutaji wa hifadhi ya Kubernetes unaathiri shughuli za kliniki za hospitali, utumaji wa usalama wa umma, au data ya kibinafsi iliyodhibitiwa, huongezeka mara moja:
- Marekani na Kanada: Piga
911ikiwa hitilafu ya nguzo ya kontena itazima ufuatiliaji wa kimatibabu wa mgonjwa, mifumo ya EHR au utumaji wa dharura. Ripoti ufutaji wa miundombinu ya kontena au matukio ya mtandaoni kwa CISA (1-844-Say-CISA/cisa.gov/report) au Kituo cha Kanada cha Usalama wa Mtandao (1-833-CYBER-88). - Uingereza: Piga
999kwa vitisho kwa maisha au miundombinu muhimu ya NHS. Chini ya GDPR ya Uingereza, uharibifu wa kudumu au upotevu wa upatikanaji wa data ya kibinafsi bila hifadhi rudufu inayoweza kurejeshwa inahitaji kutathmini arifa ya ukiukaji wa saa 72 kwa ICO (0303 123 1113). - Umoja wa Ulaya: Piga
112katika nchi zote wanachama wa EU. Huluki chini ya Maelekezo ya NIS2 lazima ziwasilishe onyo la mapema kwa CSIRT yao ya kitaifa ndani ya saa 24 baada ya hitilafu kali ya huduma, na upotevu wa kudumu wa data ya kibinafsi husababisha Kifungu cha 33 cha GDPR kuripoti ndani ya saa 72. - Australia na New Zealand: Piga
000nchini Australia au111huko New Zealand; kuripoti matukio muhimu ya miundombinu kwa ACSC (1300 CYBER1). - India na Asia-Pacific: Piga
112nchini India kwa majibu ya dharura; ripoti matukio ya usalama wa wingu au kontena kwa CERT-In (incident@cert-in.org.in) ndani ya dirisha la lazima la saa 6.
Maswali yanayoulizwa mara kwa mara¶
Je. docker compose down -v futa vipandikizi vya kufunga mwenyeji (./data:/var/lib/mysql) au idadi ya Docker iliyotajwa tu na isiyojulikana?¶
`docker compose down -v` Ufutaji TU Kiasi kilichotajwa kilichotangazwa katika `volumes:` sehemu ya `docker-compose.yml` na juzuu zisizojulikana zilizoambatishwa kwenye makontena; hiyo kamwe hufuta faili ndani ya mfungaji wa mfungaji (kama vile `- /opt/mysql_data:/var/lib/mysql` au `- ./postgres_data:/var/lib/postgresql/data`) Ikiwa faili yako ya kutunga ilitumia njia ya mwenyeji kuanzia `/` au `./`, angalia folda hiyo kwenye seva pangishi sasa hivi: faili zako bado ziko sawa kwa asilimia 100.
Kwa nini docker system prune --volumes Futa kiasi cha hifadhidata yangu niliposimamisha kontena kwa dakika 2 tu kusasisha utofauti wa mazingira?¶
Subiri kwa uangalifu tofauti kati yao `docker stop` na `docker rm`: ikiwa chombo ni tu `Stopped / Exited` (inaonekana katika `docker ps -a`), `docker system prune --volumes` hufanya sivyo futa kiasi chake kwa sababu chombo kilichosimamishwa bado kinarejelea. Walakini, ikiwa ulikimbia `docker rm
Ninaweza kupata kiasi cha Docker kilichofutwa ndani ya Dawati la Docker kwenye Mac (Apple Silicon / Intel) au Windows (WSL2)?¶
Ndio, ukiacha Kompyuta ya Docker mara moja ili mashine pepe ikome kufanya kazi `fstrim` dhidi ya diski halisi. Kwenye macOS, Docker huhifadhi viwango vyote vya Linux ndani `-/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw`; kwenye Windows WSL2, ndani `%LocalAppData%\Docker\wsl\disk\docker_data.vhdx`. Nakili hiyo `.raw` au `.vhdx` faili kwa SSD ya nje mara moja, ambatisha kusoma tu kwenye Linux (kwa kutumia `losetup -Pr` kwa `.raw` au `qemu-nbd -r` kwa `.vhdx`), na kukimbia `ext4magic` au `PhotoRec` dhidi ya mtandaoni `ext4` kizigeu ndani.
Nini ikiwa ningefuta Kubernetes StatefulSet na kubectl delete statefulset postgres? Hiyo ilifuta PVC zangu pia?¶
Hapana. Kwa chaguo-msingi katika Kubernetes (isipokuwa `persistentVolumeClaimRetentionPolicy.whenDeleted: Delete` ilisanidiwa kwa uwazi kwenye Kubernetes 1.27+), inayoendeshwa `kubectl delete statefulset` inafuta kidhibiti cha StatefulSet na Pods zake, kuacha yote `PersistentVolumeClaims` (`data-postgres-0`, `data-postgres-1`) na data zao za msingi zikiwa shwari kwa asilimia 100. Tuma maombi yako tena `StatefulSet` faili ya maelezo ya YAML yenye jina sawa na `volumeClaimTemplates`, na Podi mpya zitaambatanishwa tena kiotomatiki na zilizopo `data-postgres-0` PVCs.
Ninawezaje kupata faili ndani ya Docker overlay2 saraka wakati kontena inakataa kuanza (CrashLoopBackOff / Exited (1))?¶
Usifute kontena iliyoanguka. Muda tu chombo kilichosimamishwa bado kipo ndani `docker ps -a`, safu yake inayoweza kuandikwa na vipandikizi vya kiasi ni sawa kabisa kwenye diski. Unaweza kunakili faili moja kwa moja kutoka kwa kontena iliyosimamishwa ukitumia `docker cp
Nini ikiwa mtu alifuta Kubernetes Namespace (kubectl delete ns prod) na PVC zote zilikuwa nazo reclaimPolicy: Delete kwenye AWS EBS au GCP?¶
Ikiwa kiendesha CSI cha wingu (`ebs.csi.aws.com` au `pd.csi.storage.gke.io`) tayari kutekelezwa `DeleteVolume` kwa sababu `reclaimPolicy` ilikuwa `Delete`, angalia nyavu tatu za usalama za kiwango cha wingu mara moja: (1) angalia **AWS Recycle Bin for EBS Volumes** katika console ya AWS EC2 (ikiwa sheria ya uhifadhi ilikuwa amilifu kwenye akaunti/tagi, kiasi cha EBS kilichofutwa kinakaa kwenye Recycle Bin na kinaweza kurejeshwa kwa kubofya 1); (2) angalia **Nakala za AWS / DLM / GCP Snapshot Ratiba** kwa muhtasari wa hivi majuzi wa sauti otomatiki; na (3) angalia ikiwa hifadhidata yako ilikuwa ikitiririsha WAL/binlogs (`WAL-G`, `pgBackRest`, `Litestream`) kwa ndoo ya S3/GCS.
Miongozo inayohusiana¶
- Disk ya seva 100% imejaa (baiti 0 bila malipo): hifadhidata ya logi ya WAL, mti wa B ulioharibika, na uokoaji wa nafasi sifuri
- Kwa bahati mbaya
rm -rfauShift+Deletekwenye Linux, macOS, au Windows: weka tena mara moja kwa kusoma tu na kuchonga ingizo. - Mashine pepe ya VMDK, VHDX, na ufisadi wa mnyororo wa qcow2 na uokoaji wa hypervisor
- Ahadi ya Git ya Ajali ya funguo za AWS, faili ya
.env, au kitufe cha kibinafsi cha SSH kwa repo ya umma ya GitHub - Shida ya upangishaji wa wavuti, uhamiaji, na urejeshaji wa chelezo
- Hifadhi rudufu za kompyuta, mkakati wa 3-2-1, na uokoaji wa maafa
- Nambari za dharura kwa nchi
Vyanzo na mwongozo rasmi¶
- Hati Rasmi ya Kubernetes (
kubernetes.io/ Cloud Native Computing Foundation): Kitu cha Hifadhi Kinachotumika Ulinzi (kubernetes.io/pvc-protectionWakamilishaji), Kurudisha Volumes zinazoendelea (Retaindhidi yaDelete), na UendeshajietcdNguzo za Kubernetes (etcdctl snapshot restore). - Docker Inc. (
docs.docker.com): Dhibiti Data kwenye Docker: Volumes, Bind Mounts,overlay2Usanifu wa Kiendeshaji cha Hifadhi, na Rejelea ya Punguza. - Shirika la Linux Kernel (
kernel.org): The/procMfumo wa faili (procfsFungua Urejeshaji wa Maelezo ya Faili kupitia/proc/<pid>/fd/) na Maelezo ya Jarida la Ext4. ext4magicNyaraka za Mradi (ext4magic.sourceforge.net): Inodi ya Uchunguzi na Urejeshaji wa Muamala wa Jarida kwenye Mifumo ya Faili ya Ext3/Ext4.- Taasisi ya Kitaifa ya Viwango na Teknolojia (
NIST) (Marekani): Chapisho Maalum 800-190: Mwongozo wa Usalama wa Kontena la Maombi na Urejeshaji wa Tukio.