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

Déploiement d'une application web sans interrup...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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

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

Avatar for Bob Maerten

Bob Maerten

October 11, 2016

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