DATA migration from database to database

Who am I ?

Clément Bertillon

🏆 Certifié Symfony 2, 4

🎉 Certifié Twig

https://twitter.com/BERTILLONClment

https://github.com/skigun

🏆 Certifié AWS

Retour d'expérience

- La migration d'une base de données vers X base de données
- L'utilisation de RabbitMQ chez ProwebCe depuis 3 ans

- La mise en place d'un cluster RabbitMQ

 

L'occasion de capitaliser sur :

Scénario : Import

HM

BPM

Scénario : Import

HM

BPM

$ php -d -memory_limit=1 import_script.php

Contraintes

Volume important

Traitement long

Gestion d'erreurs

1.5 milliards de lignes

Plusieurs jours

Interruption et reprise du traitement et des données

Scénario : Import

HM

BPM

Scénario : Import

HM

Product

Stock

Client

GiftVoucher

Order

Accounting

Common

Invoice

Supplier

PaymentMethod

Search

Delivery

L'équipe de Dev :

1er Draft

bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console messenger:consume
bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console messenger:consume

HM

Product

Order

Client

bin/console app:legacy:import
bin/console rabbitmq:consume
bin/console rabbitmq:consume
bin/console messenger:consume

HM

{
    "id": 42,
    "source_entity": "Client",
    "operation": "IMPORT"
}

Product

Order

Client

Comment utiliser RabbitMQ

### .env

RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672

## OR

MESSENGER_DSN=amqp://guest:guest@rabbitmq:5672/bpm

Configurer le DSN

Configurer un(e) Vhost directement dans le DSN  

# config/packages/messenger.yaml
framework:
    messenger:
        transports:
            sync_legacy_db_import:
                dsn: '%env(MESSENGER_DSN)%'
                serializer: messenger.transport.symfony_serializer
                options:
                    exchange:
                        name: sync_legacy_db_import
                    queues:
                        sync_legacy_db_import: ~
            retry_strategy: ~

Configurer votre Queue

bin/console rabbitmq:setup-fabric
## OR
bin/console messenger:setup-transports

http://rabbitmq.docker:15672/#/queues

Dashboard

Présentation Bundle / Démo

Aller plus loin

Protéger vos consumers peu importe le context !

Bonne pratique

Sur le temps

old_sound_rabbit_mq:
    consumers:
        sync_legacy_db:
            idle_timeout: 1800
            idle_timeout_exit_code: 0
            graceful_max_execution:
                timeout: 3600

Sur la mémoire

bin/console rabbitmq:consumer --memory-limit=256

On le fait pas chez ProwebCE...

Sur le nombre de messages

bin/console rabbitmq:consumer --messages=100

Bonus : Protection pour supervisord

[program:import]
command = bin/console rabbitmq:consumer import_queue -m 100 || (sleep 10s && false)
user = www-data
redirect_stderr = true
numprocs=to_the_moon
process_name=%(program_name)s_%(process_num)02d

Performance

Publisher Consumer Mysql Redis
Mémoire alloué
Temps d'execution
Latence réseau

Trouver les bottleneck

Bonus : Nombre de message sur les queues RabbitMQ ?

Exemple de latence réseau

Exemple de latence réseau

Si le traitement d'un message nécessite 4 appels à la base de données.

Pour 150 millions x 4 appels multipliés par la latence et divisés par 20 consumers par exemple.


 

Sur un traitement estimé à 3 jours, ça peut réprésenter 33% du temps passé

Ramené en temps on passe :
4,15 heures sur le Server 1
20,5 heures sur le Server 2

Un consumer par coeur logique

[program:import]
command = bin/console messenger:consume import_queue -m 100
numprocs=10

Data Migration from database to database

By skigun

Data Migration from database to database

  • 158