J'ai un produit de transformation de données, qui permet de sélectionner des tables dans une base de données et de transformer les données de ligne de la base de données source en base de données de destination.Comment gérer d'énormes transactions sur n'importe quelle base de données?
Ceci est géré dans le produit actuel (table de travail et moteur Java) en traitant 1000 lignes à la fois et en effectuant 10 lignes en parallèle. Cette approche fonctionne correctement sur les ensembles de données plus petits. Mais, quand je dois transformer d'énormes ensembles de données (dire au sujet de X millions de disques) à un moment - cette approche fonctionne toujours, mais
- La CPU de la machine hôte sur laquelle mon produit fonctionne, est sous forte charge.
- La base de données source et la base de données cible sont perforées avec un trop grand nombre de transactions qu'elles commencent à ralentir. (Maintenant, cela peut être dû au fait que le serveur de base de données tourne probablement sur un matériel plus lent.)
J'ai commencé à chercher des solutions et j'ai rapidement répondu à cette question en demandant un matériel "sur les machines du serveur de base de données source/destination. Cela impliquait, par exemple, d'acheter un nouveau CPU multi-core et de la RAM supplémentaire. Il s'avère que la mise à niveau du matériel n'était pas la seule préoccupation: il fallait acheter plusieurs licences logicielles pour la base de données - grâce à des processeurs multicœurs (licence par cœur).
Donc, la balle est dans mon camp maintenant, je vais devoir trouver des moyens de résoudre ce problème, en apportant des modifications à mon produit. Et, voici où j'ai besoin de votre aide. En ce moment, je ne pouvais penser à une approche possible pour la manutention des charges énormes:
Approach1
- Lecture des données de base de données source, il persiste à un support temporaire (fichier).
- Transformez des données dans un fichier persistant, en l'exécutant dans un environnement distribué (machines monotouches moins chères), en gérant le "compromis" de basculement vers la persistance de fichier. (Utilisation de quelque chose comme Apache Hadoop pour gérer la partie de calcul répartie)
- Ecriture de données dans une base de données de destination.
C'est tout ce que j'ai pu trouver pour l'instant, d'un point de vue architectural. Avez-vous déjà géré cette situation? Si oui, comment l'avez-vous géré? Appréciez vos suggestions et votre aide.
Quel est le goulot d'étranglement? Vous avez mentionné deux candidats: la charge de l'application et la charge de la base de données. Pouvez-vous l'affiner davantage? – oksayt
@oksayt En ce moment, ma principale préoccupation est le chargement de la base de données. Je n'ai pas de repères à ce sujet, mais l'idée est de construire un meilleur produit, en tenant compte des goulots d'étranglement possibles. – Jay