7
votes

Meilleure approche NOSQL pour gérer 100+ millions d'enregistrements

Je travaille sur un projet Nous étions chargés par lots et stocker énormément de volumes de données dans la base de données Oracle qui se prétendent constamment via Hibernate contre ce tableau de 100 millions de dollars (les lectures sont beaucoup plus fréquentes que les écritures). Pour accélérer les choses, nous utilisons Lucene pour certaines des requêtes (en particulier des requêtes de boîte à borniries géographiques) et de l'hibernation du cache de deuxième niveau, mais cela ne suffit toujours pas. Nous avons toujours un goulot d'étranglement dans les requêtes hibernées contre Oracle (nous ne mettons pas en cache plus de 100 millions d'entités de table dans le cache de deuxième niveau hibernate en raison de l'absence de beaucoup de mémoire).

Quelles solutions NOSQL supplémentaires (en dehors de Lucene), je peux exploiter dans cette situation?

Certaines options que je pense sont:

  1. Utilisez EHCache Distributed (TerreAcotta) pour hibernate Second Niveau pour exploiter davantage de mémoire sur des machines et réduire les caches en double (chaque VM dispose actuellement de sa propre cache).

  2. Utilisez complètement dans la base de données de mémoire SQL comme H2, mais malheureusement, ces solutions nécessitent de charger 100 tables MLN dans une machine virtuelle unique.

  3. Utilisez Lucene pour interrogé et bigtable (ou hashmap distribué) pour la recherche d'entité par ID. Quelle mise en œuvre de bigtable conviendra à cela? J'avais envisagé HBASE.

  4. Utilisez MongoDB pour stocker des données et pour interroger et rechercher par ID.


2 commentaires

Si la recherche par ID est une option potentielle avec BigTable ou MongoDB, pourquoi n'est-ce pas une option potentielle avec SQL?


À quoi ressemble vos données ..?


6 Réponses :


0
votes

Vous pouvez collecter des demandes et diviser spécifiques à un ensemble de données et avoir un processus unique (ou un groupe de serveurs) qui, ici, vous pouvez ici disposer des données disponibles dans le cache pour améliorer les performances.

E.g.,

Dites, les données de l'employé et de la disponibilité sont traitées à l'aide de 10 tables, celles-ci peuvent être gérées B un petit groupe de serveurs lorsque vous configurez le cache Hibernate pour charger et gérer les demandes.

Pour que cela fonctionne, vous avez besoin d'un équilibreur de charge (qui équilibre le chargement par scénario d'entreprise).

Je ne sais pas à quel point cela peut être mis en œuvre ici.


0 commentaires

7
votes

Recommander Cassandra avec Elasticsearch pour un système évolutif (100 millions n'est rien pour eux). Utilisez Cassandra pour toutes vos données et ES pour les requêtes ad hoc et Geo. Ensuite, vous pouvez tuer toute votre pile héritée. Vous aurez peut-être besoin d'un système MQ comme la Rabbitmq pour la synchronisation de données entre Cass. et es.


0 commentaires

0
votes

à 100 m enregistre votre goulot d'étranglement est probablement hiberné, pas oracle. Nos clients ont régulièrement des milliards de documents dans les tableaux individuels de notre entrepôt de données à base d'Oracle et ils les gère bien.

Quel genre de requêtes exécutez-vous sur votre table?


2 commentaires

Voici un exemple d'exécution de la même méthode modifiée pour utiliser dans la base de données de mémoire VS qui allait jusqu'au oracle: 116,201ms vs 20ms (le 116201ms est dépensé sur oracle.jdbc.driver.oraclepreparaStatement.executequery () selon votrekit). Mon objectif est de venir autant possible près de 20 ms.


@Tsolak Petrosian: Si votre objectif de performance est des dizaines de millisecondes pour des recherches sur une table de disques de 100 m de 100 m, vous devriez probablement envisager des bases de données ou des caches en mémoire plutôt que de NOSQL.



1
votes

Comme vous le suggérez MongoDB (ou toute solution de persistance similaire de NOSQL) est un ajustement approprié pour vous. Nous avons exécuté des tests avec des ensembles de données significativement plus importants que celui que vous suggérez sur MongoDB et cela fonctionne bien. Surtout si vous êtes lu que les lectures et / ou la distribution de lectures de MongoDB lourdes à travers les membres de la réplication, vous permettra de accélérer de manière significative vos requêtes. Si votre usecase permet de garder vos indices correctement équilibrés, votre objectif est de vous rapprocher de 20 ms. Les requêtes devraient devenir prises sans autre mise en cache.


0 commentaires

1
votes

Vous devriez également consulter le projet Lily (LilyProject.org). Ils ont intégré HBASE avec SOLR. En interne, ils utilisent des files d'attente de messages pour garder Solr en synchronisation avec HBASE. Cela leur permet d'avoir la vitesse de l'indexation de solr (Sharding and Replication), soutenue par un système de stockage de données hautement fiable.


0 commentaires

3
votes

Cela dépend vraiment de vos ensembles de données. La règle numéro un à la conception NOSQL est de définir d'abord vos scénarios de requête. Une fois que vous comprenez vraiment comment vous souhaitez interroger les données, vous pouvez consulter les différentes solutions NOSQL. L'unité de distribution par défaut est la clé. Par conséquent, vous devez vous rappeler que vous devez être capable de diviser efficacement vos données entre vos machines de nœuds, sinon vous finirez avec un système évolutif horizontalement avec tout le travail étant toujours effectué sur un nœud (bien que de meilleures requêtes en fonction du cas).

Vous devez également repenser le théorème de la CAP, la plupart des bases de données NOSQL sont finalement cohérentes (CP ou AP) alors que les SGBD relationnels traditionnels sont ca. Cela aura une incidence sur la façon dont vous gérez les données et la création de certaines choses, par exemple une génération de clé peut être de la tromperie.

N'oubliez pas non plus que dans certains systèmes tels que HBASE, il n'y a pas de concept d'indexation. Tous vos index devront être construits par votre logique d'application et toutes les mises à jour et les suppressions devront être gérées comme telles. Avec Mongo, vous pouvez créer des index sur des champs et les interroger relativement rapidement, il est également possible d'intégrer Solr avec Mongo. Vous n'avez que besoin d'interroger par ID à Mongo, comme vous le faites dans HBASE, une famille de colonnes (une base de données de style Bigtable AKA Google) où vous avez essentiellement une paire de la valeur de clé imbriquée.

Donc, une fois encore, il s'agit de vos données, ce que vous voulez stocker, comment vous envisagez de la stocker, et surtout comment vous voulez y accéder. Le projet Lily a l'air très prometteur. Le travail que je suis impliqué avec nous prenons une grande quantité de données sur le Web et que nous le stockons, l'analysez, de la bande, d'analyser, d'analyser, de le diffuser, de le diffuser, de la mise à jour, etc., etc. Nous n'utilisons pas simplement un système mais beaucoup qui conviennent mieux au travail à portée de main. Pour ce processus, nous utilisons différents systèmes à différentes étapes, car il nous donne un accès rapide dans lequel nous en avons besoin, permet de diffuser et d'analyser des données en temps réel et de manière significative, de garder une trace de tout comme nous allons (comme perte de données dans un prod système est une grosse affaire). J'utilise Hadoop, HBASE, HIVE, MONGODB, SOLR, MYSQL et même de bons fichiers texte anciens. N'oubliez pas que pour la fabrication d'un système utilisant ces technologies est un peu plus difficile que d'installer Oracle sur un serveur, certaines sorties ne sont pas aussi stables et que vous avez vraiment besoin de faire vos tests en premier. À la fin de la journée, cela dépend vraiment du niveau de résistance aux entreprises et de la nature critique de votre système.

Un autre chemin que personne à ce sujet est mentionné, c'est de newsql - c'est-à-dire des RDBMS horizontalement évolutifs ... Il y en a quelques-uns, comme un groupe MySQL (je pense) et Voltdb qui pourraient convenir à votre cause.

Encore une fois, il s'agit de comprendre vos données et les modèles d'accès, les systèmes NOSQL sont également non relativement non relationnels et sont là pour une meilleure combinaison avec des ensembles de données non relationnels. Si vos données sont intrinsèquement relationnelles et que vous avez besoin de certaines fonctionnalités de requête SQL, qui ont vraiment besoin de faire des choses comme des produits cartésiens (AKA jointes), vous pouvez bien vouloir mieux coller avec Oracle et investir quelque temps dans l'indexation, le frisson et le réglage de la performance.

Mon conseil serait de jouer avec quelques systèmes différents. Regarde;

MongoDB - Document - CP

Couchdb - Document - AP

ReDIS - en mémoire de clé-valeur (non de la colonne famille) - CP

Cassandra - Famille de colonne - Tolérant disponible et partitionnement (AP)

HBASE - Famille de colonne - Tolérant cohérente et cohérente (CP)

hadoop / ruche

Voltdb - un produit vraiment beau, une base de données relativement distribuée et pourrait fonctionner pour votre cas (peut être un geste plus facile). Ils semblent également fournir un soutien d'entreprise qui peut être plus adapté à un prod env (c'est-à-dire des utilisateurs d'entreprise un sens de la sécurité).

Toute façon c'est mon 2C. Jouer avec les systèmes est vraiment la seule façon de savoir que vous allez découvrir ce qui fonctionne vraiment pour votre cas.


0 commentaires