Pewnie spotkałeś/łaś się do tej pory z problemem wykonania operacji Undelete na Azure Storage Account w przypadku kiedy na kontenerze znajdują się miliony plików, i istotna część z nich została usunięta. Jeśli masz na odzyskanie tylko 7dni to może być to nie lada wyzwanie.
Microsoft sugeruje użycie Azure Portal lub Azure Storage Explorer jest jednak w tym podejściu dość istotny problem, mianowicie przy dość intensywnie używanym kontenerze , samo wylistowanie plików do operacji undelete (nie mówiąc o jej zastosowaniu) jest czasochłonne, listowanie może odbywać się z prędkością nawet 2tyś/5-6s do około 20tyś/5s. Używając wspomnianych narzędzi nie ma jednak możliwości wybrania od razu wszystkich wylistowanych plików do operacji undelete. Przy skasowaniu np. 20mln plików jedyną możliwością jest wykonanie tej operacji w inny sposób, sposób który opiszemy poniżej:
Jak uniknąć listowania plików
Microsoft umożliwia nam dwie opcje pominięcia operacji listowania plików czy to w narzędziach powyżej , czy przy użyciu Pythona, Basha, czy innych sposobów
- $logs
Struktura katalogu to typ usługi->rok->miesiąc->dzień->godzina+minuta->*.log
- $blobchangefeed (jeśli funkcjonalność uruchomiona jest na poziomie Azure Storage Account)
log/idx/meta (w naszym przypadku log)->00->rok->miesiąc->dzień->godzina+minuta->*.avro
Podgląd na ten kontener jest tylko z poziomu Azure Portal, nie widać go w Azure Storage Explorer.
W obydwu lokalizacjach znajdują się podobne informacje. Istotne z jest znalezienie w nich typu operacji BlobDeleted w zakresie godzin jaki została wykonana operacja. Pamiętajcie jednak że operacja usuwania może odbywać się asynchronicznie. Więc od momentu wykonania operacji kasowania do faktycznego usunięcia blob-a może upłynąć trochę czasu.
Jeśli już wiemy jakie pliki chcemy odzyskać
Jeśli mamy już listę faktycznie usuniętych plików, jak zrobić aby wykonać operację szybko i sprawnie nie pisząc do tego „tony” kodu. Aby tego dokonać trzeba skupić się na sposobie samego odzyskania pojedynczego pliku. Można to zrobić low-level używając API do Azure Storage Account. To zapewni nam uruchomienie odzyskania pliku bez konieczności wykorzystania narzędzi powyżej. Jednak Microsoft przygotował „nakładki” do API Storage Account – my skupimy się na tej przygotowanej w Pythonie https://docs.microsoft.com/en-us/python/api/overview/azure/storage-blob-readme?view=azure-python . Ponieżej znajduje się prosty kod przy użyciu Python , dzięki któremu możemy odzyskać pojedyńczy plik. Jeśli dostarczymy dane w odpowiednim formacie.
import os
from datetime import datetime, timedelta
from azure.core.exceptions import HttpResponseError, ResourceExistsError
from azure.storage.blob import BlobServiceClient
connection_string = "DefaultEndpointsProtocol=https;AccountName=<nazwa storage account>;AccountKey=<klucz do storage account>;EndpointSuffix=core.windows.net"
service = BlobServiceClient.from_connection_string(conn_str=connection_string)
def executeUndelete(path):
blob_client = service.get_blob_client(container=<nazwa kontenera>, blob=path)
try:
blob_client.undelete_blob()
except:
return 0
return 1
Format nazwy pliku to jego ścieżka na kontenerze np. incoming/newprocess1/file.log
Jak odzyskać miliony plików – Undelete
Do odzyskania wielu plików musimy zastosować efekt skali. Jednym z przyjemniejszych sposobów jest wykorzystanie Azure Databricks. Gdzie w ramach usługi utworzymy klaster np. z 16 nodami (maszyny DS13v2) które pozwoli uruchomić odzyskiwanie plików wielowątkowo.
Sam Azure Databricks możemy również wykorzystać do przygotowania danych z plików *.log, czy *.avro opisanych powyżej (tego nie będę opisywał w szczegółach w tym artykule). Dane przygotowane w postaci tabelki można w bardzo prosty i przejrzysty sposób szybko wyświetlić i uruchomić proces odzyskiwania. Aby tego dokonać należy dodać do powyższego kodu poniższe linie i uruchomić poniższego SQLa
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
spark.udf.register("executeUndelete", executeUndelete, StringType())
select *,executeUndelete(sciezka_pliku) status_odzyskania from lista_plikow_do_odzyskania
Comments are closed.