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).
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.
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.
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:
À 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.
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:
- 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).
- Ê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.
- Ne nécessite pas que mon application sache à quels nœuds parler et quand.