Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Déploiement d'une application web sans interruption de service

Déploiement d'une application web sans interruption de service

Présentation faite lors du 1er meetup Dev&Talk Valenciennes

Bob Maerten

October 11, 2016
Tweet

More Decks by Bob Maerten

Other Decks in Programming

Transcript

  1. Parce qu'il n'y a que les petites natures qui ne

    deploy pas plusieurs fois par jour ! 7 / 38
  2. Blue/Green Avantages test avant bascule usage en pseudo A/B rollback

    "facile" architectures multi-éléments 11 / 38
  3. Blue/Green Avantages test avant bascule usage en pseudo A/B rollback

    "facile" architectures multi-éléments Inconvénients doubles ressources gestion des sessions lors de la bascule delta DB pendant la bascule. 12 / 38
  4. Unicorn rolling restart État initial u n i c o

    r n m a s t e r | - w o r k e r [ 0 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - . . . | - w o r k e r [ n ] . 16 / 38
  5. Unicorn rolling restart Démarrage du rolling restart – duplication de

    licorne ! ( o l d ) u n i c o r n m a s t e r < - - - s i g n a l U S R 2 | - w o r k e r [ 0 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] * < - - - r e q u ê t e e n c o u r s d e t r a i t e m e n t | - . . . | - w o r k e r [ n ] u n i c o r n m a s t e r | - w o r k e r [ 0 ] | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 17 / 38
  6. Unicorn rolling restart Les workers s'autoterminent à la fin des

    requêtes en cours ( o l d ) u n i c o r n m a s t e r | - w o r k e r [ 0 ] * < - - - f i n d e r e q u ê t e s u r l ' a n c i e n c o d e | - ( t e r m i n é ) | - ( t e r m i n é ) | - ( t e r m i n é ) < - - - l e w o r k e r s ' e s t t e r m i n é à l a f i n d e l a r e q u ê t e | - . . . | - ( t e r m i n é ) u n i c o r n m a s t e r | - w o r k e r [ 0 ] * < - - - n o u v e l l e r e q u ê t e e n t r a n t e s u r l e n o u v e a u c o d e | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 18 / 38
  7. Unicorn rolling restart L 'ancien master se termine et laisse

    la place au nouveau ( o l d ) u n i c o r n m a s t e r < - - - s i g n a l Q U I T u n i c o r n m a s t e r | - w o r k e r [ 0 ] * < - - - t r a i t e m e n t d e l a r e q u ê t e s u r l e n o u v e a u c o d e | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 19 / 38
  8. Unicorn rolling restart Retour à l'état initial avec la nouvelle

    version du code u n i c o r n m a s t e r | - w o r k e r [ 0 ] | - w o r k e r [ 1 ] | - w o r k e r [ 2 ] * < - - - n o u v e l l e r e q u ê t e | - w o r k e r [ 3 ] | - . . . | - w o r k e r [ n ] 20 / 38
  9. Unicorn Avantages multi-process = utilisation de tous les coeurs (ruby)

    protection du code non-threadsafe isolation des crashs de workers 21 / 38
  10. Unicorn Avantages multi-process = utilisation de tous les coeurs (ruby)

    protection du code non-threadsafe isolation des crashs de workers Inconvénients frontal web supplémentaire obligatoire (apache/nginx) consommation mémoire 22 / 38
  11. Cas simples Creation de tables l'ancien code ne connait pas

    la nouvelle table Ajout de colonne l'ancien code ne connait pas la colonne sauf si containte/validation SQL sur la colonne 25 / 38
  12. Cas nécessitant un peu d'at tention Suppression de colonne migrer

    en 2 étapes préciser à l'ORM d'ignorer la colonne 28 / 38
  13. Cas nécessitant un peu d'at tention Suppression de colonne migrer

    en 2 étapes préciser à l'ORM d'ignorer la colonne ex. ActiveRecord c l a s s U s e r d e f s e l f . c o l u m n s s u p e r . r e j e c t { | c o l u m n | c o l u m n . n a m e = = " n o t e s " } e n d e n d déployer cette version du code 29 / 38
  14. Cas nécessitant un peu d'at tention Suppression de colonne migrer

    en 2 étapes préciser à l'ORM d'ignorer la colonne ex. ActiveRecord c l a s s U s e r d e f s e l f . c o l u m n s s u p e r . r e j e c t { | c o l u m n | c o l u m n . n a m e = = " n o t e s " } e n d e n d déployer cette version du code supprimer la colonne de la DB 30 / 38
  15. Renommage de colonne ajouter une nouvelle colonne à la table

    déployer une version qui lit et écrit les données sur les 2 colonnes à la fois ex. ActiveRecord c l a s s O r d e r d e f a m o u n t = ( v a l u e ) s u p e r s e l f . n e w _ a m o u n t = v a l u e e n d d e f a m o u n t n e w _ a m o u n t e n d e n d 32 / 38
  16. Renommage de colonne ajouter une nouvelle colonne à la table

    déployer une version qui lit et écrit les données sur les 2 colonnes à la fois ex. ActiveRecord c l a s s O r d e r d e f a m o u n t = ( v a l u e ) s u p e r s e l f . n e w _ a m o u n t = v a l u e e n d d e f a m o u n t n e w _ a m o u n t e n d e n d migrer les données de l'ancienne colonne vers la nouvelle 33 / 38
  17. Renommage de colonne ajouter une nouvelle colonne à la table

    déployer une version qui lit et écrit les données sur les 2 colonnes à la fois ex. ActiveRecord c l a s s O r d e r d e f a m o u n t = ( v a l u e ) s u p e r s e l f . n e w _ a m o u n t = v a l u e e n d d e f a m o u n t n e w _ a m o u n t e n d e n d migrer les données de l'ancienne colonne vers la nouvelle supprimer l'ancienne colonne comme au point précédent 34 / 38
  18. Dans tous les cas ! testez vos migrations de base

    de données en local sur une version à jour de votre db de production 35 / 38