Quelle est la manière moderne de partitionner PostgreSQL sur plusieurs machines, lorsque les données sont «naturellement partitionnables»


22

Après plusieurs années passées dans l'espace "NoSQL", j'ai maintenant un problème assez "relationnel" dans sa nature. Aujourd'hui, je vois des magasins de données avec des yeux très différents qu'auparavant. Des choses comme Riak m'ont gâté d'une manière que je ne peux plus tolérer des points de défaillance uniques, "en panne pour maintenance", etc. Bien sûr, (ou j'espère), je n'ai pas complètement perdu ma raison. Il s'agit d'un projet personnel qui n'a pas (ou pas encore) d'exigences extrêmement élevées.

La plupart des solutions de sharding ne me donnent pas ce que je veux (au moins un aperçu), probablement parce que mon problème est assez "facile" à résoudre. Au moins au niveau conceptuel (en ignorant les contraintes que les RDBM eux-mêmes apportent à la table).

  1. J'ai une petite quantité de données "partagées", qui peuvent être dupliquées librement. Il n'a pas d'exigences de cohérence stricte. Cela peut être stocké dans une base de données de type dynamo et évoluera à l'infini. Mais j'aimerais quand même aller avec une seule base de données si possible.

  2. J'ai beaucoup de données "par utilisateur". C'est-à-dire que de nombreux utilisateurs, chaque utilisateur ayant des données de taille absolument raisonnable, sont vraiment aptes à être stockés sur un seul nœud PostgreSQL. Nous parlons de 10s de milliers d'enregistrements au maximum.

  3. Je n'ai jamais besoin d'interroger les utilisateurs croisés et je n'ai pas besoin d'atomicité entre utilisateurs.

Cela semble extrêmement facile à réaliser. Au moins quand je le regarde avec mes "yeux NoSQL".

Voici mes idées de démarrage naïves:

  1. À l'extrême, je pouvais simplement sérialiser l'utilisateur entier en une seule clé / valeur dans Riak. Bien sûr, la dé / sérialisation constante de plusieurs mégaoctets de données sera lente et c'est pourquoi j'envisage d'utiliser PostgreSQL. Beaucoup de Riak K / Vs est un no-go, car j'ai besoin d'atomicité / de transactions dans les données de chaque utilisateur.

  2. Je pourrais utiliser une base de données SQLite par utilisateur et utiliser quelque chose comme GlusterFS pour la redondance / disponibilité. C'est probablement la solution que je vais choisir si je ne trouve pas quelque chose d'aussi bon en utilisant PostgreSQL. Avantages: Peut très bien réduire / augmenter l'échelle; Inconvénients: je préférerais avoir les types et la rigueur de PostgreSQL plutôt que SQLite

Donc, ce que je souhaiterais idéalement d'une solution de partitionnement PostgreSQL:

  1. Conservez automatiquement plusieurs copies des données de chaque utilisateur (sur différentes machines). Être capable de changer dynamiquement le nœud maître par utilisateur / partition (si le maître précédent tombe en panne).
  2. Être capable de monter / descendre de manière dynamique, en ajoutant / supprimant des nœuds de serveur. Surtout comme Riak est capable de le faire.
  3. Ne nécessite pas que mon application sache à quels nœuds parler et quand.

Salut les lox, comment avez-vous finalement résolu ce problème?
Dikla

Partitionnement au niveau de l'application avec plusieurs magasins de données. Un vrai gâchis en fait :(. Vraiment triste que quelque chose comme ça n'existe pas ...
loxs

Réponses:



4

Je pense que la meilleure option est pgpool-II . Vous pouvez avoir jusqu'à 128 nœuds et

  1. Il est possible de configurer des règles de partitionnement et de distribution de données complexes
  2. Prise en charge du "Provisioning en ligne". Ne met pas à l'échelle les écritures mais il est lu évolutif
  3. Pas sûr, si possible hors de la boîte. Vous devez peut-être utiliser LVS

Une autre option pourrait être Stado

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.