Serveur minecraft

Postgres gère plus que vous ne le pensez – Un bon serveur Minecraft

Le 29 octobre 2019 - 16 minutes de lecture

Points clés à retenir

  • Vous pensez ajouter un autre magasin de données comme Redis ou Elasticsearch? Prenez une minute et repensez-vous. Postgres offre des fonctionnalités puissantes qui ne sont pas évidentes à première vue.
  • Postgres possède un système de mise en cache en mémoire avec des pages, des comptes d'utilisation et des journaux de transactions.
  • Postgres a un type de données spécial, tsvecteur, pour rechercher rapidement dans le texte.
  • Postgres peut s’adapter à des charges lourdes en offrant des index spécialisés permettant de rechercher efficacement des données temporelles, des jeux de données texte volumineux et des données structurées.
  • Cependant, il est parfois nécessaire de recourir à un autre magasin de données, par exemple pour des types de données spéciaux, un traitement en temps réel intensif et une recherche instantanée en texte intégral.

Vous envisagez de passer au-delà de votre cluster Postgres et d'ajouter un autre magasin de données tel que Redis ou Elasticsearch? Avant d’adopter une infrastructure plus complexe, prenez une minute et repensez-vous. Il est tout à fait possible de tirer le meilleur parti d’une base de données Postgres existante. Il peut supporter des charges lourdes et offre des fonctionnalités puissantes qui ne sont pas évidentes à première vue. Par exemple, il est possible d'activer la mise en cache en mémoire, la recherche de texte, l'indexation spécialisée et le stockage clé-valeur.

Après avoir lu cet article, vous voudrez peut-être répertorier les fonctionnalités de votre magasin de données et vérifier si Postgres leur convient. C’est assez puissant pour la plupart des applications.

Pourquoi l'ajout d'un autre magasin de données n'est pas toujours une bonne idée

Comme Fred Brooks l'a mis dans Le mois mythique: "Le programmeur, comme le poète, travaille à peine éloigné de la pensée pure. [They] construire des châteaux dans les airs, à partir des airs, en créant un effort d'imagination. "

Ajouter plus de pièces à ces châteaux et se perdre dans le dessin est fascinant à l'infini. Cependant, dans le monde réel, la construction de davantage de châteaux dans les airs peut gêner votre chemin. Il en va de même pour le dernier battage publicitaire dans les magasins de données. Choisir une technologie ennuyeuse présente plusieurs avantages:

  • Si de nouveaux membres rejoignent votre équipe, peuvent-ils facilement comprendre vos différents magasins de données?
  • Lorsque vous ou un autre membre de l'équipe revenez un an plus tard, pourraient-ils comprendre rapidement le fonctionnement du système?
  • Si vous devez modifier votre système ou ajouter des fonctionnalités, combien d'éléments devez-vous déplacer?
  • Avez-vous pris en compte les coûts de maintenance, la sécurité et les mises à niveau?
  • Avez-vous pris en compte les inconnus et les modes de défaillance lorsque vous exécutez votre nouveau magasin de données en production à grande échelle?

Bien qu'il puisse être géré selon une conception réfléchie, l'ajout de plusieurs magasins de données augmente la complexité. Avant d'explorer l'ajout de magasins de données supplémentaires, il est utile de rechercher les fonctionnalités supplémentaires que vos magasins de données existants peuvent vous offrir.

Caractéristiques moins connues mais puissantes de Postgres

Beaucoup de gens ignorent que Postgres offre bien plus qu'une simple base de données SQL. Si vous avez déjà Postgres dans votre pile, pourquoi ajouter plus de morceaux quand Postgres peut faire le travail?

Les caches Postgres aussi

Il existe une idée fausse selon laquelle Postgres lit et écrit à partir du disque pour chaque requête, en particulier lorsque les utilisateurs le comparent à des magasins de données purement en mémoire, comme Redis.

En fait, Postgres dispose d’un système de mise en cache superbement conçu avec des pages, des compteurs d’utilisation et des journaux de transactions. La plupart de vos requêtes n’auront pas besoin d’accéder au disque, en particulier si elles font constamment référence aux mêmes données, comme le font souvent les requêtes.

le tampon_partagé Le paramètre de configuration du fichier de configuration Postgres détermine la quantité de mémoire à utiliser pour la mise en cache des données. En règle générale, cette valeur doit être comprise entre 25% et 40% de la mémoire totale. C’est parce que Postgres utilise également le cache du système d’exploitation pour son fonctionnement. Avec plus de mémoire, la plupart des requêtes récurrentes faisant référence au même ensemble de données n'auront pas besoin d'accéder au disque. Voici comment vous pouvez définir ce paramètre dans la CLI de Postgres:

ALTER SYSTEM SET shared_buffer TO = 

Les services de base de données gérés tels que Heroku proposent plusieurs plans dans lesquels la RAM (et donc le cache) est un facteur de différenciation majeur. La version hobby gratuite ne propose pas de ressources dédiées comme la RAM. Effectuez la mise à niveau lorsque vous êtes prêt pour les charges de production afin de mieux utiliser la mise en cache.

Vous pouvez également utiliser certains des outils de mise en cache les plus avancés. Par exemple, vérifiez la pg_buffercache afficher ce qui occupe le cache de tampon partagé de votre instance. Un autre outil à utiliser est le pg_prewarm fonction qui fait partie de l'installation de base. Cette fonction permet aux administrateurs de bases de données de charger des données de table dans le cache du système d’exploitation ou dans le cache de la mémoire tampon Postgres. Le processus peut être manuel ou automatisé. Si vous connaissez la nature de vos requêtes de base de données, cela peut considérablement améliorer les performances des applications.

Pour les plus courageux, reportez-vous à cet article pour une description détaillée de la mise en cache de Postgres.

Recherche de texte

Elasticsearch est excellent, mais de nombreux cas d'utilisation peuvent parfaitement convenir à Postgres pour la recherche de texte. Postgres a un type de données spécial, tsvecteur, et un ensemble de fonctions, comme to_tsvector et to_tsquery, pour rechercher rapidement dans le texte. tsvector représente un document optimisé pour la recherche de texte en triant les termes et en normalisant les variantes. Voici un exemple de to_tsquery une fonction:

SELECT to_tsquery ('anglais', 'The & Boys & Girls');

  to_tsquery
---------------
 'Garçon fille'

Vous pouvez trier vos résultats par pertinence en fonction de la fréquence et des champs de votre requête apparaissant dans les résultats. Par exemple, vous pouvez rendre le titre plus pertinent que le corps. Consultez la documentation de Postgres pour plus de détails.

Fonctions dans Postgres

Postgres fournit un puissant environnement de fonctions côté serveur dans plusieurs langages de programmation.

Essayez de pré-traiter autant de données que possible sur le serveur Postgres avec des fonctions côté serveur. De cette façon, vous pouvez réduire le temps de latence résultant du transfert d’un excès de données entre vos serveurs d’application et votre base de données. Cette approche est particulièrement utile pour les grandes agrégations et les jointures.

Ce qui est encore mieux, c’est que votre équipe de développement puisse utiliser ses compétences existantes pour écrire du code Postgres. Hormis le langage procédural natif de Postgres, PL / pgSQL, les fonctions et déclencheurs de Postgres peuvent être écrits en PL / Python, PL / Perl, PL / V8 (extension JavaScript pour Postgres) et PL / R.

Voici un exemple de création d'une fonction PL / Python pour vérifier la longueur des chaînes:

CREATE FUNCTION longer_string_length (chaîne1 chaîne, chaîne2 chaîne)
  RETOURS entier
AS $$
  a = len (chaine1)
  b-len (string2)
  si a> b:
    retourner un
  retour b
$$ LANGUAGE plpythonu;

Postgres propose des extensions puissantes

Les extensions à Postgres sont ce que les plug-ins veulent dire dans de nombreuses applications. L'utilisation appropriée des extensions Postgres peut également signifier que vous n'avez pas à travailler avec d'autres magasins de données pour bénéficier de fonctionnalités supplémentaires. De nombreuses extensions sont disponibles et répertoriées sur le site Web principal de Postgres.

Données géospatiales

PostGIS est une extension spécialisée pour Postgres utilisée pour la manipulation de données géospatiales et l'exécution de requêtes d'emplacement en SQL. Il est très populaire parmi les développeurs d’applications SIG qui utilisent Postgres. Un excellent guide pour débutants sur l’utilisation de PostGIS est disponible ici.

L'extrait de code ci-dessous montre comment nous ajoutons l'extension PostGIS à la base de données actuelle. Depuis le système d'exploitation, nous exécutons ces commandes pour installer le paquet (en supposant que vous utilisiez Ubuntu):

$ sudo add-apt-repository ppa: ubuntugis / ppa
$ sudo apt-get update
$ sudo apt-get install postgis

Ensuite, connectez-vous à votre instance Postgres et installez l’extension:

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;

Si vous voulez vérifier quelles extensions vous avez dans la base de données actuelle, exécutez cette commande:

SELECT * FROM pg_available_extensions;

Type de données de valeur clé

L'extension Postgres hstore permet de stocker et de rechercher des paires clé-valeur simples. Ce tutoriel fournit un excellent aperçu de la manière de travailler avec le type de données hstore.

Types de données semi-structurés

Il existe deux types de données natifs pour le stockage de données semi-structurées dans Postgres: JSON et XML. Le type de données JSON peut héberger à la fois le JSON natif et sa forme binaire (JSONB). Ce dernier peut améliorer considérablement les performances des requêtes lors de la recherche. Comme vous pouvez le voir ci-dessous, il peut convertir des chaînes JSON en objets JSON natifs:

SELECT '"product1": ["blue", "green"], "tags": "price": 10, "discounted": false ':: json;
                      JSON
-------------------------------------------------- -------------------
 "produit1": ["blue", "green"], "tags": "prix": 10, "à prix réduit": false

Conseils pour la mise à l'échelle de Postgres

Si vous envisagez de désactiver Postgres pour des raisons de performances, commencez par regarder dans quelle mesure les optimisations qu’il offre peuvent vous permettre d’atteindre. Ici, nous supposerons que vous avez maîtrisé les bases, comme la création d’index appropriés. Postgres offre de nombreuses fonctionnalités avancées. Même si les modifications sont minimes, elles peuvent faire toute la différence, en particulier si elles vous empêchent de compliquer votre infrastructure.

Ne sur-indexez pas

Évitez les index inutiles. Utilisez des index multi-colonnes avec parcimonie. Trop d'index utilisent de la mémoire supplémentaire pour empêcher l'utilisation optimale du cache Postgres, ce qui est essentiel pour les performances.

En utilisant un outil comme EXPLIQUER L'ANALYSE Cela pourrait vous surprendre par la fréquence à laquelle le planificateur de requêtes choisit en réalité des analyses de table séquentielles. Une grande partie des données de la ligne de votre table étant déjà mise en cache, ces index élaborés ne sont souvent même pas utilisés.

Cela dit, si vous trouvez des requêtes lentes, la première solution, et la plus évidente, est de voir si la table manque d'un index. Les index sont essentiels, mais vous devez les utiliser correctement.

Les index partiels économisent de l'espace

Un index partiel peut économiser de l'espace en spécifiant les valeurs à indexer. Par exemple, vous souhaitez passer commande avant la date d’inscription d’un utilisateur, mais ne vous souciez que des utilisateurs qui se sont inscrits:

CREATE INDEX user_signup_date ON utilisateurs (signup_date) WHERE is_signed_up;

Comprendre les types d’index Postgres

Choisir le bon index pour vos données peut améliorer les performances. Voici quelques types d’index courants et la date à laquelle vous devriez les utiliser.

Les index B-tree sont des arbres binaires utilisés pour trier efficacement les données. Ils sont la valeur par défaut si vous utilisez le INDICE commander. La plupart du temps, un index B-tree suffit. Au fur et à mesure que vous modifiez, les incohérences peuvent constituer un problème plus important. Par conséquent, utilisez l'extension amcheck régulièrement.

Un INDIx de plage de bloc (BRIN) peut être utilisé lorsque votre table est naturellement déjà triée par une colonne et que vous devez effectuer un tri en fonction de cette colonne. Par exemple, pour une table de journal écrite séquentiellement, la définition d'un index BRIN dans la colonne timestamp indique au serveur que les données sont déjà triées.

Un index bloom est idéal pour les requêtes multi-colonnes sur de grandes tables où il vous suffit de tester l'égalité. Il utilise une structure mathématique spéciale appelée filtre de bloom basé sur la probabilité et utilise beaucoup moins d’espace.

CRÉER UN INDEX i à l’aide de bloom (col1, col2, col3);
SELECT * parmi t WHERE col1 = 5 AND col2 = 9 AND col3 = ‘x’;

Utilisez un index GIN ou GiST pour des index efficaces basés sur des valeurs composites telles que du texte, des tableaux et JSON.

Quand avez-vous besoin d'un autre magasin de données?

Il existe des cas légitimes d’ajout d’un magasin de données autre que Postgres.

Types de données spéciaux

Certains magasins de données vous fournissent des types de données que vous ne pouvez tout simplement pas obtenir sur Postgres. Par exemple, la liste liée, les bitmaps et les fonctions HyperLogLog dans Redis ne sont pas disponibles sur Postgres.

Lors d'un démarrage précédent, nous devions implémenter une limitation du nombre de fréquences, qui est un compteur d'utilisateurs uniques sur un site Web, basé sur des données de session (telles que les cookies). Des millions voire des dizaines de millions d'utilisateurs visitent un site Web. La limitation du nombre d'expositions signifie que vous ne montrez votre annonce à chaque utilisateur qu'une fois par jour.

Redis a un type de données HyperLogLog qui est parfait pour une limitation de la fréquence. Il se rapproche de l'appartenance définie avec un très faible taux d'erreur, en échange du temps O (1) et d'une très petite empreinte mémoire. PFADD ajoute un élément à un ensemble HyperLogLog. Il retourne 1 si votre élément n'est pas déjà dans l'ensemble, et 0 s'il est dans l'ensemble.

PFADD user_ids uid1
(entier) 1
PFADD user_ids uid2
(entier) 1
PFADD user_ids uid1
(entier) 0

Traitement en temps réel lourd

Si vous devez coordonner de nombreux événements pub-sub, emplois et des dizaines d’employés, vous aurez peut-être besoin d’une solution plus spécialisée telle que Apache Kafka. Les ingénieurs de LinkedIn ont initialement développé Kafka pour gérer les nouveaux événements utilisateur, tels que les clics, les invitations et les messages, et permettre à différents travailleurs de gérer le transfert de messages et les travaux de traitement des données.

Recherche instantanée en texte intégral

Si vous avez une application en temps réel très chargée avec plus de dix recherches à la fois et que vous avez besoin de fonctionnalités telles que la saisie semi-automatique, vous pouvez bénéficier davantage d'une solution de texte spécialisée telle qu'Elasticsearch.

Conclusion

Redis, Elasticsearch et Kafka sont puissants, mais leur ajout fait parfois plus de mal que de bien. Vous pourrez peut-être obtenir les fonctionnalités dont vous avez besoin avec Postgres en tirant parti des fonctionnalités moins connues que nous avons décrites ici. Le fait de tirer le meilleur parti de Postgres peut vous faire gagner du temps et vous éviter une complexité et des risques supplémentaires.

Pour gagner encore plus de temps et de maux de tête, envisagez d’utiliser un service géré tel que Heroku Postgres. La mise à l'échelle consiste simplement à ajouter des répliques suiveurs. La haute disponibilité peut être activée en un seul clic et Heroku l'exploite à votre place. Si vous avez vraiment besoin de développer au-delà de Postgres, les autres magasins de données mentionnés plus haut, tels que Redis, Apache Kafka et Elasticsearch, peuvent tous être facilement configurés sur Heroku. Allez de l'avant et construisez vos châteaux dans les airs ―, mais associez-les à une fondation fiable pour pouvoir rêver d'un meilleur produit et d'une meilleure expérience client.

Pour plus d'informations sur Postgres, écoutez les workloads de base de données Cloud avec Jon Daniel dans Software Engineering Daily.

A propos de l'auteur

Jason Skowronski est consultant technique et propriétaire de Dev Spotlight. Il se concentre sur la rédaction de contenu de qualité pour les développeurs et les ingénieurs de DevOps. Il a débuté sa carrière en tant que développeur de logiciels chez Amazon, puis a rejoint Loggly jusqu'à leur acquisition par SolarWinds. Il travaille maintenant en tant que consultant auprès de grandes entreprises comme Heroku et Rollbar pour aider leurs clients à rester informés des meilleures pratiques et des dernières innovations.

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.