0

AWS RDS, Aurora et PostgreSQL

twitterlinkedinmail

Introduction

Cet article fait partie d’une suite d’articles venant à découvrir les services PaaS BDD PostgreSQL que fournissent les principaux acteurs acteurs du cloud.

Le scénario de test sera toujours le même, un bench de type TPC-C sera lancé à l’aide d’une version benchmarksql revue pour intégrer la connexion SSL et la capture de traces SGBD (sources disponibles ici : https://github.com/Capdata/benchmarksql), chaque bench :

  • Durera 20 minutes
  • Base de données avec 200 entrepôts (Cf norme TPC-C)
  • Sera lancé avec 50 clients à partir d’une VM créée dans la même zone que le PaaS

Le but est de mesurer pour des configurations particulières le nombre de transactions par minutes, les valeurs seront ensuite agrégées et extrait le 90e centile du nombre de transactions totales par minutes (tpm / min) et du nombre de commandes par minutes (nopm / min, c’est la valeur de référence pour les benchmark de type TPC-C).

 

AWS

 

Présentation

AWS fournit un accès à PostgreSQL en service managé au travers de 2 offres :

  • RDS PostgreSQL
  • RDS Aurora

RDS PostgreSQL est disponible en versions 9.5.2 à 12.4 ,quant à Aurora il offre une compatibilité de 9.6.8 à 11.8

Un peu d’historique

2009 : Mise en service de RDS
2013 : Support de PostgreSQL dans RDS
2014 : Mise en service de Aurora (support Mysql uniquement)
2017 : Support de PostgreSQL par aurora
2019 : Aurora PostgreSQL logical replication
2019 : Aurora Serverless disponible pour PostgreSQL (nombre de régions disponibles encore assez limité aujourd’hui)
2020 : Babelfish* en preview sur Aurora pour PostgreSQL

*Babelfish (annoncé en décembre 2020) est un projet sous licence apache v2 (ouverture des sources prévue pour le premier trimestre de 2021) qui ajoute un endpoint à PostreSQL rendant transparente pour les application la conversion SQL Server / PostgreSQL et ce sans à avoir à changer quoi que ce soit côté applicatif.

AWS RDS

RDS pour Relational Database Service est le service de Base de données Relationnelle géré par AWS, offre un large choix de moteurs SGBD propriétaire (SQLServer, Oracle, Mysql, Aurora) ou libres (MariaDB, PostgreSQL).

En plus de profiter de tous les services inhérents à tous les composants AWS, celui-ci comprend le stockage, la gestion des sauvegarde et des montées de versions mineures automatiques (si validé).

Pour une description détaillée de RDS je vous renvoie à l’excellent article de David Baffaleuf : https://blog.capdata.fr/index.php/comparatif-mysql-dans-le-paas-episode-3-amazon-rds-2-2/

RDS Aurora

Aurora est le moteur SGBD RDS développé par AWS, offrant une compatibilité avec soit PostgreSQL soit MySQL (choix défini lors de la création).
Aurora, en plus de promettre un gain en performances promet également une durabilité accrue des données ; en effet, les données sont regroupées par block de 10Gb et présentées par 6 storage nodes différents répartis de façon uniforme sur 3 Zones de disponibilités (AZ) différentes (on a donc 2 storages nodes par AZ ) le stockage s’agrandit de façon autonome par block de 10Gb jusqu’à atteindre la limite (contrainte par le système) de 64To (limite qui augmente régulièrement).

L’historique des modifications du service est disponible ici : https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/WhatsNew.html

Aurora un moteur SGBD-R à part

Aurora et le stockage

Aurora se distingue des PaaS RDS classique par son stockage et l’optimisation SGBD qui a été faite pour en tirer plein parti.

En effet, la façon dont est conçu le stockage sur Aurora est très particulier, comme expliqué ci-dessus, le stockage est alloué et protégé par block de 10Gb :

StorageAllocation

De plus, ce stockage est régulièrement backupé sur S3 :

FaultTolerance

(ci-dessus, chaque carré vert correspond à 1 storage node et chaque bloc de couleur à un “protection group” (ensemble de données) de 10Gb

Pour éviter les latences sur le stockage le moteur n’attend pas l’acquittement de tous les storage nodes mais considère la donnée comme écrite si au moins 4 des 6 storage nodes l’ont validée, ainsi même avec la perte d’une AZ (ou de 2 storage nodes d’AZ différentes) le service est toujours rendu.

De plus des modifications ont étés apportées au sein même des SGBD (Mysql et PostgreSQL) de façon à ce que les données échangées (entre les instances de BDD et les storage nodes) soient réduites au strict minimum (les logs de transaction).

Pour plus d’informations :

Performances

Comme expliqué en introduction, l’outil benchmarkSQL sera utilisé (légèrement modifié pour supporter le SSL et capturer des métriques complémentaires), seront en plus capturé en fin de chaque bench les métriques des PaaS.

Les sources sont disponibles à l’adresse : https://github.com/Capdata/benchmarksql

Les PaaS ont tous la version 11 de PostgreSQL, les options PostgreSQL sont laissées à leurs défauts et leur configuration est la suivante :

aws_aurora : Aurora en compatibilité PostgreSQL
aws_rds : Stockage de type gp2 et taille allouée 2To (IOPS liées à la taille du stockage : 3 IOPS/Go max 16k IOPS), IOPS :   6k IOPS
aws_rds_pio_10k : Stockage de type IO provisionnés, 10k IOPS max
aws_rds_pio_30k : Stockage de type IO provisionnés, 30k IOPS max

Partant de là, la seule variable à être ajustée a été la capacité / classe d’instance EC2 (CPU et mémoire) de l’instance :

(Il n’y a pas de valeurs pour aurora pour les classes db.m5.* car ces classes ne sont pas disponibles sur aurora).

Tarification des instances

CPU / MEM

Les tarif donnés ici sont sur la Zone Paris pour une seule instance en dollar US (données au 04/12/2020 et donnés ici à unique titre de comparaison).

Instance class CPU MEM RDS Aurora
Prix / heure  Prix / mois  Prix / heure  Prix / mois 
db.m5.8xlarge 32 128 $3,30 $2 373,12 NON DISPO NON DISPO
db.m5.4xlarge 16 64 $1,65 $1 186,56 NON DISPO NON DISPO
db.m5.2xlarge 8 32 $0,82 $593,28 NON DISPO NON DISPO
db.m5.xlarge 4 16 $0,41 $296,64 NON DISPO NON DISPO
db.m5.large 2 8 0,206 148,32 NON DISPO NON DISPO
db.r5.8xlarge 32 256 $4,70 $3 386,88 $5,36 $3 859,20
db.r5.4xlarge 16 128 $2,35 $1 693,44 $2,68 $1 929,60
db.r5.2xlarge 8 64 $1,18 $846,72 $1,34 $964,80
db.r5.xlarge 4 32 $0,59 $423,36 $0,67 $482,40
db.r5.large 2 16 $0,29 $211,68 $0,34 $241,20

La différence de tarif entre les 2 Types de PaaS (RDS Classique et Aurora) n’est pas énorme (du moins en ce qui concerne le coût de l’instance).

Stockage

Il y a donc de présenté 3 classes de stockage différentes :

GP2:
Stockage à usage général (SSD) 0,133 USD par Go/mois
Cependant, les opérations d’IO consommées ne vous sont pas facturées.

IO Provisionnées :
Tarif de stockage 0,145 USD par Go/mois
Tarif d’IOPS provisionnés 0,116 USD par IOPS/mois
Cependant, les opérations d’IO consommées ne vous sont pas facturées.

Aurora :
Taux de stockage 0,11 USD par Go et par mois
Taux d’E/S 0,22 USD par tranche d’un million de demandes
Le stockage utilisé par votre base de données Amazon Aurora est facturé par tranches de Go/mois. Les IO consommées sont, quant à elles, facturées par tranches de millions de requêtes

La grosse différence entre Aurora et les autres types de stockage est donc le fait que les IO sont facturées en plus du stockage, c’est donc un élément à prendre en charge lors du choix Aurora vs RDS Classique.

Explications :

Pour un stockage de 20Go et une moyenne de 1000 IO/s en lecture et 1000 IO/s en écriture (ce qui est assez faible).

Aurora :

– Cout du stockage seul 20 Go x 0.11 USD = 2.20 USD
– 1000 Reads/Second + 1000 Writes/Second = 2000 Number of I/Os per second
– 2000 IO/s x 730 h x 60 min x 60 s = 5 256 000 000  IO / mois
– 5 256 000000 x 0.00000022 USD = 1156,30 USD (coût des IOs)
– 2,20 USD + 1156,30 USD = 1 158,30 USD

Coût final mensuel : 1 158,30 USD

RDS Classique GP2 :

– Cout du stockage seul 20 Go x 0,133 USD = 2,66 USD

Coût final mensuel : 2,66 USD

Remarque : Les performances d’IO pour ce stockage sont de 3 IOPS pour chaque Go, avec un minimum de 100 IOPS.
Par exemple, les performances de base pour un volume de 100 Gio sont de 300 IOPS.

Pour le cas présenté ci-dessus, le stockage alloué (pour des raisons de performances) été de 2048Go (ce qui représente une grosse sur allocation mais nécessaire pour atteindre un niveau d’IOPS raisonnable).

RDS Classique Provision IOPS  :
Provision de 10 000 IOPS

– 20 Go  x 0,145 USD = 2,90 USD (Stockage seul)
– 10 000 IOPS x 0,116 USD = 1 160,00 USD (Coût des IO)
– 2,90 USD + 1 160,00 USD = 1 162,90 USD

Coût final mensuel : 1 162,90 USD 

RDS Classique Provision IOPS  :
Provision de 30 000 IOPS

– 20 Go  x 0,145 USD = 2,90 USD (Stockage seul)
– 30 000 IOPS x 0,116 USD = 3 480,00 USD (Coût des IO)
– 2,90 USD + 3 480,00 USD = 1 162,90 USD

Coût final mensuel : 3 482,90 USD 

Comparatif de coûts stockage

IOPS max Disponibles Stockage provisionné (en Go) Prix stockage Prix IO Provisionnés Prix des IO Total
RDS GP2 20 Go 100 20 2,66 $ 0,00 $ 0,00 $ 2,66 $
RDS GP2 2 To 6144 2048 272,38 $ 0,00 $ 0,00 $ 272,38 $
RDS IO Provisionnés 10k IOPS 10000 20 2,90 $ 1 160,00 $ 0,00 $ 1 162,90 $
RDS IO Provisionnés 30k IOPS 30000 20 2,90 $ 3 480,00 $ 0,00 $ 3 482,90 $
Aurora (base de 2000 IO/s en moyenne NON COMMUNIQUE 20 2,20 $ 0,00 $ 1 156,32 $ 1 158,52 $

 

Conclusion

Il est clair qu’Aurora est plus performant que RDS Classique et peut revenir moins cher que de l’IO provisionné, cependant, il faut bien toujours garder à l’esprit que sur Aurora chaque IO a un prix, de plus ce moteur, bien que pleinement compatible avec PostgreSQL (ou MySQL) reste un moteur propriétaire.

Une assez bonne surprise est également ressortie de ce benchmark, les trés bonnes performances de RDS avec un stockage GP2 (attention, ici il n’y a aucune garantie sur les IO).

Continuez votre lecture sur le blog :

twitterlinkedinmail

Nicolas MARTIN

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.