sql >> Database >  >> RDS >> PostgreSQL

Functies van PostgreSQL-back-upmethode in AWS S3

Amazon bracht begin 2006 S3 uit en de eerste tool waarmee PostgreSQL-back-upscripts gegevens in de cloud konden uploaden - s3cmd - werd amper een jaar later geboren. Tegen 2010 (volgens mijn Google-zoekvaardigheden) blogt Open BI erover. Het is dan veilig om te zeggen dat sommige van de PostgreSQL DBA's al 9 jaar back-ups maken van gegevens naar AWS S3. Maar hoe? En wat is er in die tijd veranderd? Hoewel sommigen nog steeds verwijzen naar s3cmd in de context van bekende PostgreSQL-back-uptools, hebben de methoden veranderingen ondergaan die een betere integratie met het bestandssysteem of de native PostgreSQL-back-upopties mogelijk maken om de gewenste hersteldoelstellingen RTO en RPO te bereiken.

Waarom Amazon S3

Zoals aangegeven in de Amazon S3-documentatie (S3 FAQ's zijn een zeer goed uitgangspunt), zijn de voordelen van het gebruik van de S3-service:

  • 99.999999999 (elf negens) duurzaamheid
  • onbeperkte gegevensopslag
  • lage kosten (nog lager in combinatie met BitTorrent)
  • gratis inkomend netwerkverkeer
  • alleen uitgaand netwerkverkeer is factureerbaar

AWS S3 CLI Gotchas

De AWS S3 CLI-toolkit biedt alle tools die nodig zijn voor het overbrengen van gegevens van en naar de S3-opslag, dus waarom zou u die tools niet gebruiken? Het antwoord ligt in de Amazon S3-implementatiedetails, die maatregelen bevatten voor het omgaan met de beperkingen en beperkingen met betrekking tot objectopslag:

  • Maximale grootte van 5 TB per opgeslagen object
  • Maximale grootte van 5 GB van een PUT-object
  • upload in meerdere delen aanbevolen voor objecten groter dan 100 MB
  • kies een geschikte opslagklasse in overeenstemming met de S3-prestatiegrafiek
  • profiteer van de S3-levenscyclus
  • S3-model voor gegevensconsistentie

Raadpleeg als voorbeeld de aws s3 cp-helppagina:

--expected-size (string) Dit argument specificeert de verwachte grootte van een stream in termen van bytes. Merk op dat dit argument alleen nodig is wanneer een stream wordt geüpload naar s3 en de grootte groter is dan 5 GB. Als u dit argument onder deze voorwaarden niet opneemt, kan dit leiden tot een mislukte upload vanwege te veel delen in de upload.

Het vermijden van die valkuilen vereist een grondige kennis van het S3-ecosysteem, wat de speciaal gebouwde PostgreSQL- en S3-back-uptools proberen te bereiken.

PostgreSQL native back-uptools met ondersteuning voor Amazon S3

S3-integratie wordt geleverd door enkele van de bekende back-uptools, die de ingebouwde PostgreSQL-back-upfuncties implementeren.

BarmanS3

BarmanS3 is geïmplementeerd als Barman Hook-scripts. Het vertrouwt op AWS CLI, zonder de hierboven genoemde aanbevelingen en beperkingen aan te pakken. De eenvoudige installatie maakt het een goede kandidaat voor kleine installaties. De ontwikkeling is enigszins tot stilstand gekomen, de laatste update ongeveer een jaar geleden, waardoor dit product een keuze is voor degenen die Barman al in hun omgeving gebruiken.

S3-dumps

S3dumps is een actief project, geïmplementeerd met behulp van Amazon's Python-bibliotheek Boto3. Installatie is eenvoudig uit te voeren via pip. Hoewel u vertrouwt op de Amazon S3 Python SDK, onthult een zoekopdracht in de broncode voor regex-trefwoorden zoals multi.*part of storage.*class geen van de geavanceerde S3-functies, zoals multipart-overdrachten.

pgBackRest

pgBackRest implementeert S3 als een repository-optie. Dit is een van de bekende PostgreSQL-back-uptools, die een uitgebreide set back-upopties biedt, zoals parallelle back-up en herstel, codering en ondersteuning voor tabelruimten. Het is meestal C-code, die de snelheid en doorvoer biedt waarnaar we op zoek zijn, maar als het gaat om interactie met de AWS S3 API, gaat dit ten koste van het extra werk dat nodig is voor het implementeren van de S3-opslagfuncties. Recente versie implementeert S3 meerdelige upload.

WAL-G

WAL-G die 2 jaar geleden werd aangekondigd, wordt actief onderhouden. Deze ijzersterke PostgreSQL-back-uptool implementeert opslagklassen, maar geen multipart-upload (zoeken in de code voor CreateMultipartUpload vond niets).

PGHoard

pghoard is ongeveer 3 jaar geleden uitgebracht. Het is een krachtige en veelzijdige PostgreSQL-back-uptool met ondersteuning voor S3-overdrachten in meerdere delen. Het biedt geen van de andere S3-functies, zoals opslagklasse en objectlevenscyclusbeheer.

S3 als een lokaal bestandssysteem

Toegang hebben tot S3-opslag als een lokaal bestandssysteem, is een zeer gewenste functie, omdat het de mogelijkheid opent om de oorspronkelijke PostgreSQL-back-uptools te gebruiken.

Voor Linux-omgevingen biedt Amazon twee opties:NFS en iSCSI. Ze maken gebruik van de AWS Storage Gateway.

NFS

Een lokaal gekoppelde NFS-share wordt geleverd door de AWS Storage Gateway File-service. Volgens de link moeten we een bestandsgateway maken.

Selecteer in het scherm Hostplatform selecteren Amazon EC2 en klik op de knop Instantie starten om de EC2-wizard te starten voor het maken van de instantie.

Laten we nu, gewoon uit nieuwsgierigheid van deze Sysadmin, de AMI inspecteren die door de wizard wordt gebruikt, omdat het ons een interessant perspectief geeft op enkele van de interne onderdelen van AWS. Met de bekende afbeeldings-ID ami-0bab9d6dffb52fef5 laten we eens kijken naar de details:

Zoals hierboven weergegeven, is de AMI-naam aws-thinstaller — dus wat is een "thinstaller"? Uit zoekopdrachten op internet blijkt dat Thinstaller een IBM Lenovo-softwareconfiguratiebeheertool voor Microsoft-producten is, waarnaar eerst wordt verwezen in deze blog van 2008 en later in deze Lenovo-forumpost en dit verzoek om service van het schooldistrict. Ik had geen manier om dat te weten, omdat mijn Windows-systeembeheerdersbaan 3 jaar eerder eindigde. Dus werd deze AMI gebouwd met het Thinstaller-product. Om de zaken nog verwarrender te maken, wordt het AMI-besturingssysteem vermeld als "Andere Linux", wat kan worden bevestigd door SSH-ing in het systeem als beheerder.

Een trucje van de wizard:ondanks de installatie-instructies van de EC2 firewall had mijn browser een time-out bij het verbinden met de opslaggateway. Het toestaan ​​van poort 80 is gedocumenteerd bij Poortvereisten - we zouden kunnen stellen dat de wizard ofwel alle vereiste poorten moet vermelden, of moet linken naar documentatie, maar in de geest van de cloud is het antwoord "automatiseren" met tools zoals CloudFormation.

De wizard stelt ook voor om te beginnen met een instantie van xlarge.

Zodra de opslaggateway gereed is, configureert u de NFS-share door op Maken te klikken knop voor het delen van bestanden in het Gateway-menu:

Zodra de NFS-share gereed is, volgt u de instructies om het bestandssysteem te koppelen:

In de bovenstaande schermafbeelding moet u er rekening mee houden dat de opdracht mount verwijst naar het privé-IP van de instantie adres. Om te mounten vanaf een openbare host, gebruikt u gewoon het openbare adres van de instantie zoals weergegeven in de details van de EC2-instantie hierboven.

De wizard blokkeert niet als de S3-bucket niet bestaat op het moment dat de bestandsshare wordt gemaakt, maar zodra de S3-bucket is gemaakt, moeten we de instantie opnieuw starten, anders de opdracht mount mislukt met:

[[email protected] ~]# mount -t nfs -o nolock,hard 34.207.216.29:/s9s-postgresql-backup /mnt

mount.nfs: mounting 34.207.216.29:/s9s-postgresql-backup failed, reason given by server: No such file or directory

Controleer of de share beschikbaar is gesteld:

[[email protected] ~]# df -h /mnt

Filesystem                            Size Used Avail Use% Mounted on

34.207.216.29:/s9s-postgresql-backup  8.0E 0 8.0E 0% /mnt

Laten we nu een snelle test uitvoeren:

[email protected][local]:54311 postgres# \l+ test

                                                List of databases

Name |  Owner | Encoding |   Collate | Ctype | Access privileges |  Size | Tablespace | Description

------+----------+----------+-------------+-------------+-------------------+---------+------------+-------------

test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | 2763 MB | pg_default |

(1 row)

[[email protected] ~]# date ; time pg_dump -d test | gzip -c >/mnt/test.pg_dump.gz ; date

Sun 27 Oct 2019 06:06:24 PM PDT



real    0m29.807s

user    0m15.909s

sys     0m2.040s

Sun 27 Oct 2019 06:06:54 PM PDT

Merk op dat de Laatst gewijzigde tijdstempel op de S3-bucket ongeveer een minuut later is, wat, zoals eerder vermeld, te maken heeft met het Amazon S3-gegevensconsistentiemodel.

Hier is een uitgebreidere test:

~ $ for q in {0..20} ; do touch /mnt/touched-at-$(date +%Y%m%d%H%M%S) ;

sleep 1 ; done



~ $ aws s3 ls s3://s9s-postgresql-backup | nl

    1      2019-10-27 19:50:40          0 touched-at-20191027194957

    2      2019-10-27 19:50:40          0 touched-at-20191027194958

    3      2019-10-27 19:50:40          0 touched-at-20191027195000

    4      2019-10-27 19:50:40          0 touched-at-20191027195001

    5      2019-10-27 19:50:40          0 touched-at-20191027195002

    6      2019-10-27 19:50:40          0 touched-at-20191027195004

    7      2019-10-27 19:50:40          0 touched-at-20191027195005

    8      2019-10-27 19:50:40          0 touched-at-20191027195007

    9      2019-10-27 19:50:40          0 touched-at-20191027195008

   10      2019-10-27 19:51:10          0 touched-at-20191027195009

   11      2019-10-27 19:51:10          0 touched-at-20191027195011

   12      2019-10-27 19:51:10          0 touched-at-20191027195012

   13      2019-10-27 19:51:10          0 touched-at-20191027195013

   14      2019-10-27 19:51:10          0 touched-at-20191027195014

   15      2019-10-27 19:51:10          0 touched-at-20191027195016

   16      2019-10-27 19:51:10          0 touched-at-20191027195017

   17      2019-10-27 19:51:10          0 touched-at-20191027195018

   18      2019-10-27 19:51:10          0 touched-at-20191027195020

   19      2019-10-27 19:51:10          0 touched-at-20191027195021

   20      2019-10-27 19:51:10          0 touched-at-20191027195022

   21      2019-10-27 19:51:10          0 touched-at-20191027195024

Nog een vermeldenswaardig probleem:na het spelen met verschillende configuraties, het maken en vernietigen van gateways en shares, kreeg ik op een bepaald moment bij een poging om een ​​bestandsgateway te activeren een interne fout:

De opdrachtregel geeft wat meer details, maar wijst niet op een probleem:

~$ curl -sv "http://107.22.30.30/?gatewayType=FILE_S3&activationRegion=us-east-1"

*   Trying 107.22.30.30:80...

* TCP_NODELAY set

* Connected to 107.22.30.30 (107.22.30.30) port 80 (#0)

> GET /?gatewayType=FILE_S3&activationRegion=us-east-1 HTTP/1.1

> Host: 107.22.30.30

> User-Agent: curl/7.65.3

> Accept: */*

>

* Mark bundle as not supporting multiuse

< HTTP/1.1 500 Internal Server Error

< Date: Mon, 28 Oct 2019 06:33:30 GMT

< Content-type: text/html

< Content-length: 14

<

* Connection #0 to host 107.22.30.30 left intact

Internal Error~ $

Dit forumbericht wees erop dat mijn probleem mogelijk iets te maken heeft met het VPC-eindpunt dat ik had gemaakt. Mijn oplossing was het verwijderen van het VPC-eindpunt dat ik had ingesteld tijdens verschillende iSCSI-trials en error-runs.

Terwijl S3 gegevens in rust versleutelt, is het NFS-draadverkeer platte tekst. Hier is namelijk een tcpdump-pakketdump:

23:47:12.225273 IP 192.168.0.11.936 > 107.22.30.30.2049: Flags [P.], seq 2665:3377, ack 2929, win 501, options [nop,nop,TS val 1899459538 ecr 38013066], length 712: NFS request xid 3511704119 708 getattr fh 0,2/53

[email protected]@.......k.......        ...c..............

q7s..D.......PZ7...........................4........omiday.can.local...................................................5.......]...........!....................C...

..............&...........]....................# inittab is no longer used.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses 'targets' instead of runlevels. By default, there are two main targets:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

.....   .........0..

23:47:12.331592 IP 107.22.30.30.2049 > 192.168.0.11.936: Flags [P.], seq 2929:3109, ack 3377, win 514, options [nop,nop,TS val 38013174 ecr 1899459538], length 180: NFS reply xid 3511704119 reply ok 176 getattr NON 4 ids 0/33554432 sz -2138196387

Totdat dit IEE-concept is goedgekeurd, is de enige veilige optie voor verbinding van buiten AWS het gebruik van een VPN-tunnel. Dit bemoeilijkt de installatie, waardoor de lokale NFS-optie minder aantrekkelijk is dan de op FUSE gebaseerde tools die ik later ga bespreken.

iSCSI

Deze optie wordt geleverd door de AWS Storage Gateway Volume-service. Zodra de service is geconfigureerd, gaat u naar de sectie Linux iSCSI-clientconfiguratie.

Het voordeel van het gebruik van iSCSI boven NFS bestaat uit de mogelijkheid om te profiteren van de cloud-native back-up-, klonen- en snapshotservices van Amazon. Voor details en stapsgewijze instructies, volg de links naar AWS Backup, Volume Cloning en EBS Snapshots

Hoewel er tal van voordelen zijn, is er een belangrijke beperking die waarschijnlijk veel gebruikers zal afschrikken:het is niet mogelijk om toegang te krijgen tot de gateway via het openbare IP-adres. Dus, net als de NFS-optie, voegt deze vereiste complexiteit toe aan de installatie.

Ondanks de duidelijke beperking en ervan overtuigd dat ik deze setup niet zal kunnen voltooien, wilde ik toch een idee krijgen van hoe het werkt. De wizard leidt door naar een AWS Marketplace-configuratiescherm.

Merk op dat de Marketplace-wizard een secundaire schijf maakt, maar niet groot genoeg in grootte, en daarom moeten we nog steeds de twee vereiste volumes toevoegen, zoals aangegeven in de instructies voor het instellen van de host. Als niet aan de opslagvereisten wordt voldaan, blokkeert de wizard op het configuratiescherm voor lokale schijven:

Hier is een glimp van het configuratiescherm van Amazon Marketplace:

Er is een tekstinterface toegankelijk via SSH (log in als gebruiker sguser) die basistools voor netwerkprobleemoplossing en andere configuratie-opties biedt die niet kunnen worden uitgevoerd via de web-GUI:

~ $ ssh [email protected]

Warning: Permanently added 'ec2-3-231-96-109.compute-1.amazonaws.com,3.231.96.109' (ECDSA) to the list of known hosts.

'screen.xterm-256color': unknown terminal type.




      AWS Storage Gateway Configuration



      #######################################################################

      ##  Currently connected network adapters:

      ##

      ##  eth0: 172.31.1.185

      #######################################################################



      1: SOCKS Proxy Configuration

      2: Test Network Connectivity

      3: Gateway Console

      4: View System Resource Check (0 Errors)



      0: Stop AWS Storage Gateway



      Press "x" to exit session



      Enter command:

En nog een paar andere belangrijke punten:

  • In tegenstelling tot de NFS-configuratie is er geen directe toegang tot de S3-opslag, zoals vermeld in de sectie Veelgestelde vragen over Volume Gateway.
  • AWS-documentatie dringt aan op het aanpassen van de iSCSI-instellingen om de prestaties en beveiliging van de verbinding te verbeteren.

ZEKERING

In deze categorie heb ik de op FUSE gebaseerde tools opgesomd die een completere S3-compatibiliteit bieden in vergelijking met de PostgreSQL-back-uptools, en in tegenstelling tot Amazon Storage Gateway, gegevensoverdracht van een on-premise host toestaan naar Amazon S3 zonder extra configuratie. Zo'n setup zou S3-opslag kunnen bieden als een lokaal bestandssysteem dat PostgreSQL-back-uptools kunnen gebruiken om te profiteren van functies zoals parallelle pg_dump.

s3fs-fuse

s3fs-fuse is geschreven in C++, een taal die wordt ondersteund door de Amazon S3 SDK-toolkit, en is als zodanig zeer geschikt voor het implementeren van geavanceerde S3-functies zoals meerdelige uploads, caching, S3-opslagklasse, server- side-encryptie en regioselectie. Het is ook zeer POSIX-compatibel.

De applicatie wordt meegeleverd met mijn Fedora 30 waardoor de installatie eenvoudig is.

Te testen:

~/mnt/s9s $ time pg_dump -d test | gzip -c >test.pg_dump-$(date +%Y%m%d-%H%M%S).gz

real    0m35.761s

user    0m16.122s

sys     0m2.228s

~/mnt/s9s $ aws s3 ls s3://s9s-postgresql-backup

2019-10-28 03:16:03   79110010 test.pg_dump-20191028-031535.gz

Merk op dat de snelheid iets lager is dan bij gebruik van de Amazon Storage Gateway met de NFS-optie. Het compenseert de lagere prestaties door een zeer POSIX-compatibel bestandssysteem te bieden.

S3QL

S3QL biedt S3-functies zoals opslagklasse en versleuteling aan de serverzijde. De vele functies worden beschreven in de uitgebreide S3QL-documentatie, maar als u op zoek bent naar meerdelige upload, wordt dit nergens vermeld. Dit komt omdat S3QL zijn eigen algoritme voor het splitsen van bestanden implementeert om de deduplicatiefunctie te bieden. Alle bestanden zijn opgedeeld in blokken van 10 MB.

De installatie op een Red Hat-gebaseerd systeem is eenvoudig:installeer de vereiste RPM-afhankelijkheden via yum:

sqlite-devel-3.7.17-8.14.amzn1.x86_64

fuse-devel-2.9.4-1.18.amzn1.x86_64

fuse-2.9.4-1.18.amzn1.x86_64

system-rpm-config-9.0.3-42.28.amzn1.noarch

python36-devel-3.6.8-1.14.amzn1.x86_64

kernel-headers-4.14.146-93.123.amzn1.x86_64

glibc-headers-2.17-260.175.amzn1.x86_64

glibc-devel-2.17-260.175.amzn1.x86_64

gcc-4.8.5-1.22.amzn1.noarch

gcc48-4.8.5-28.142.amzn1.x86_64

mpfr-3.1.1-4.14.amzn1.x86_64

libmpc-1.0.1-3.3.amzn1.x86_64

libgomp-6.4.1-1.45.amzn1.x86_64

libgcc48-4.8.5-28.142.amzn1.x86_64

cpp48-4.8.5-28.142.amzn1.x86_64

python36-pip-9.0.3-1.26.amzn1.noarch

python36-libs-3.6.8-1.14.amzn1.x86_64

python36-3.6.8-1.14.amzn1.x86_64

python36-setuptools-36.2.7-1.33.amzn1.noarch

Installeer vervolgens de Python-afhankelijkheden met pip3:

pip-3.6 install setuptools cryptography defusedxml apsw dugong pytest requests llfuse==1.3.6

Een opmerkelijk kenmerk van deze tool is het S3QL-bestandssysteem dat bovenop de S3-bucket is gemaakt.

Goofy's

goofys is een optie wanneer prestaties de POSIX-compliance overtreffen. Zijn doelen zijn het tegenovergestelde van s3fs-fuse. Focus op snelheid komt ook tot uiting in het distributiemodel. Voor Linux zijn er vooraf gebouwde binaries. Eenmaal gedownload, voer het volgende uit:

~/temp/goofys $ ./goofys s9s-postgresql-backup ~/mnt/s9s/

En back-up:

~/mnt/s9s $ time pg_dump -d test | gzip -c >test.pg_dump-$(date +%Y%m%d-%H%M%S).gz



real    0m27.427s

user    0m15.962s

sys     0m2.169s



~/mnt/s9s $ aws s3 ls s3://s9s-postgresql-backup

2019-10-28 04:29:05   79110010 test.pg_dump-20191028-042902.gz

Houd er rekening mee dat de aanmaaktijd van het object op S3 slechts 3 seconden verwijderd is van de tijdstempel van het bestand.

ObjectFS

ObjectFS lijkt tot ongeveer 6 maanden geleden te zijn onderhouden. Een controle voor meerdelige upload onthult dat het niet is geïmplementeerd. Uit het onderzoeksartikel van de auteur leren we dat het systeem nog in ontwikkeling is, en sinds het papier in 2019 werd uitgebracht, dacht ik dat het de moeite waard was om het te vermelden.

S3-clients

Zoals eerder vermeld, moeten we, om de AWS S3 CLI te gebruiken, rekening houden met verschillende aspecten die specifiek zijn voor objectopslag in het algemeen en Amazon S3 in het bijzonder. Als de enige vereiste de mogelijkheid is om gegevens van en naar de S3-opslag over te dragen, dan kan een tool die de Amazon S3-aanbevelingen nauwgezet volgt, de klus klaren.

s3cmd is een van de tools die de tand des tijds heeft doorstaan. Deze Open BI-blog uit 2010 vertelt erover, in een tijd dat S3 de nieuweling was.

Opmerkelijke kenmerken:

  • versleuteling aan de serverzijde
  • automatische meerdelige uploads
  • bandbreedtebeperking

Ga naar de S3cmd:FAQ en Knowledge Base voor meer informatie.

Conclusie

De beschikbare opties voor het maken van back-ups van een PostgreSQL-cluster naar Amazon S3 verschillen in de methoden voor gegevensoverdracht en hoe ze aansluiten bij de Amazon S3-strategieën.

AWS Storage Gateway is een aanvulling op de S3-objectopslag van Amazon, maar dit gaat ten koste van de toegenomen complexiteit en de extra kennis die nodig is om het meeste uit deze service te halen. Het selecteren van het juiste aantal schijven vereist bijvoorbeeld een zorgvuldige planning en een goed begrip van de S3-gerelateerde kosten van Amazon is een must om de operationele kosten te minimaliseren.

Hoewel van toepassing op elke cloudopslag, niet alleen Amazon S3, heeft de beslissing om de gegevens op te slaan in een openbare cloud beveiligingsimplicaties. Amazon S3 biedt encryptie voor data in rust en data in transit, zonder garantie van nul kennis of geen kennisbewijzen. Organisaties die volledige controle over hun gegevens willen hebben, moeten versleuteling aan de clientzijde implementeren en de versleutelingssleutels buiten hun AWS-infrastructuur opslaan.

Voor commerciële alternatieven voor het toewijzen van S3 aan een lokaal bestandssysteem is het de moeite waard om de producten van ObjectiveFS of NetApp te bekijken.

Ten slotte zouden organisaties die hun eigen back-uptools willen ontwikkelen, ofwel door voort te bouwen op de basis van de vele open source-applicaties, ofwel vanaf nul te beginnen, moeten overwegen om de S3-compatibiliteitstest te gebruiken, beschikbaar gesteld door het Ceph-project.


  1. Herstel de mysql-database vanuit .frm-bestanden

  2. Een uitvoeringsplan genereren in SQL Server

  3. Een tijdzone-offset toevoegen aan een datetime2-waarde in SQL Server (T-SQL)

  4. mySQL - Een nieuwe tabel maken met gegevens en kolommen uit drie tabellen