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

5e47e75af9d584936f6b4be3520c75d7?s=128

Bob Maerten

October 11, 2016
Tweet

Transcript

  1. Déploiement d'une application web sans interruption de service Meetup Dev

    & Talk Valenciennes - Octobre 2016 1 / 38
  2. Bob Maerten @bobmaerten 2 / 38

  3. https://levups.com 3 / 38

  4. Pourquoi le ZDD ? (Zero Downtime Deployment) 4 / 38

  5. Parce que c'est pratique quand il y a des users

    ! 5 / 38
  6. Parce que les devs n'aiment pas deploy aux aurores !

    6 / 38
  7. Parce qu'il n'y a que les petites natures qui ne

    deploy pas plusieurs fois par jour ! 7 / 38
  8. Plusieurs façons d'appréhender le ZDD 8 / 38

  9. Blue/Green 9 / 38

  10. 10 / 38

  11. Blue/Green Avantages test avant bascule usage en pseudo A/B rollback

    "facile" architectures multi-éléments 11 / 38
  12. 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
  13. Structures plus modestes 13 / 38

  14. Rolling restart a.k.a The web server killer feature! 14 /

    38
  15. Unicorn http://unicorn.bogomips.org/ 15 / 38

  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. Unicorn Avantages multi-process = utilisation de tous les coeurs (ruby)

    protection du code non-threadsafe isolation des crashs de workers 21 / 38
  22. 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
  23. Et pour les données en base de données ? 23

    / 38
  24. Cas simples Creation de tables l'ancien code ne connait pas

    la nouvelle table 24 / 38
  25. 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
  26. Cas nécessitant un peu d'at tention Suppression de colonne 26

    / 38
  27. Cas nécessitant un peu d'at tention Suppression de colonne migrer

    en 2 étapes 27 / 38
  28. 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
  29. 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
  30. 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
  31. Renommage de colonne ajouter une nouvelle colonne à la table

    31 / 38
  32. 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
  33. 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
  34. 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
  35. 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
  36. Démo ? Questions ? 36 / 38

  37. Images campagne "préjugés" de Cofidis http://techblog.betgenius.com/content/images/2014/Nov/Simple-Blue-Green-2.jpg https://levups.com https://github.com/images/error/angry_unicorn.png 37 /

    38
  38. Google-est-mon-ami-graphie https://www.numergy.com/developpeurs-blog/bluegreen-deployment-le-deploiement-continu-facile/ http://blog.octo.com/zero-downtime-deployment/ http://blog.appsignal.com/blog/2016/03/17/ruby-magic-mastering-concurrency.html https://unicorn.bogomips.org/SIGNALS.html https://blog.codeship.com/rails-migrations-zero-downtime/ http://jakeyesbeck.com/2016/02/07/how-to-remove-a-column-with-zero-downtime-in-ruby-on-rails/ https://www.rainforestqa.com/blog/2014-06-27-zero-downtime-database-migrations/ 38 /

    38