2012-09-15 5 views
3

Je travaille sur un système de clé-valeur distribuée (ou magasin de données), qui utilise levelDB comme bibliothèque de base de données intégrée dans le back-end.comment créer plusieurs tables logiques dans une instance DB unique?

Je souhaite qu'un noeud/machine héberge plusieurs tables (à des fins de réplication et d'équilibrage de charge). Je comprends que levelDB n'a aucune notion de tables, donc je ne peux pas partitionner logiquement mes données sous forme de tables (donc je ne peux pas utiliser ces tables comme unité de base de distribution).

Ma question est: Y a-t-il une possibilité d'avoir plusieurs 'tables logiques' en instance unique de niveauDB? D'après ce que je sais, je peux avoir plusieurs instances de levelDB en cours d'exécution sur mon nœud gérant chacune une table. Mais je ne veux pas faire cela, car dans ce cas il y aura une contention sérieuse (au disque je crois) lorsque ces multiples instances de DB sont accédées simultanément. Le fait d'avoir plusieurs tables logiques dans une seule instance de DB peut me donner des avantages sur les optimisations levelDB pour minimiser les accès disque.

Répondre

6

Si vous souhaitez avoir plusieurs "tables logiques" dans LevelDB, vous devez partitionner votre espace clé ou ajouter un préfixe aux clés. Pour chaque table créer un préfixe différent, par exemple:

0x0001 is for table 1 
0x0002 is for table 2 
0x0003 is for table 3 
and so on... 

donc une clé consisterait du préfixe de table et la clé elle-même: [0x0001,0xFF11] traiterait 0xFF11 clé dans le tableau 1. Vous pouvez alors utiliser un seul LevelDB instance et ont plusieurs "espaces clés" qui correspondraient à "tables".

+0

Oui .. ressemble à ceci est la seule façon. Je pensais d'utiliser un répertoire de système de fichiers pour chaque tablette, mais apparemment, si vous ouvrez plusieurs répertoires (en utilisant Open (options, , et db)) seul répertoire dernier est utilisé pour le stockage de données. Et –

+0

méthode ouverte de toute façon ne donne pas gestionnaire DB unique pour chaque répertoire (ou opération d'ouverture). –

+0

Je ne sais pas comment vous avez réussi à ouvrir plusieurs répertoires avec une seule instance de LevelDB ... donc je ne sais pas ce que vous voulez dire que « seul le dernier répertoire est utilisé pour les données de stockage. » Si vous avez besoin de plusieurs répertoires, vous devez utiliser plusieurs instances LevelDB. – Kiril

2

Votre meilleure option est de partitionner l'espace clé en utilisant un préfixe de clé comme suggéré par Lirik. Bien que l'ouverture de plusieurs bases de données soit possible, je ne le recommanderais pas pour votre cas d'utilisation, car les bases de données ne partageront pas de tampons et de caches. Travailler avec plusieurs bases de données ouvertes peut avoir un impact négatif sur les performances, et cela rendra l'optimisation de l'utilisation des ressources (principalement la mémoire) beaucoup plus difficile.

+0

@Wouter .. Oui, je suis entièrement d'accord avec votre point de vue. Non seulement le tampon et les caches ne seraient pas aussi efficaces, mais le disque peut aussi devenir fou en manipulant plusieurs instances de DB. J'utilise plusieurs instances pour mon système pour le moment, mais j'utiliserai la méthode key-prefix avant de la mettre en production. Merci. –

+0

Fwiw, mon projet Plyvel a une très belle API pour ça. Voir https://plyvel.readthedocs.org/en/latest/user.html#prefixed-databases pour plus d'informations. Dans le cas où vous n'utilisez pas Python, vous pouvez toujours être intéressé par son fonctionnement (et vous pouvez probablement copier son implémentation). –

Questions connexes