Slide 1

Slide 1 text

Déploiement d'une application web sans interruption de service Meetup Dev & Talk Valenciennes - Octobre 2016 1 / 38

Slide 2

Slide 2 text

Bob Maerten @bobmaerten 2 / 38

Slide 3

Slide 3 text

https://levups.com 3 / 38

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Parce que c'est pratique quand il y a des users ! 5 / 38

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Parce qu'il n'y a que les petites natures qui ne deploy pas plusieurs fois par jour ! 7 / 38

Slide 8

Slide 8 text

Plusieurs façons d'appréhender le ZDD 8 / 38

Slide 9

Slide 9 text

Blue/Green 9 / 38

Slide 10

Slide 10 text

10 / 38

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Structures plus modestes 13 / 38

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Et pour les données en base de données ? 23 / 38

Slide 24

Slide 24 text

Cas simples Creation de tables l'ancien code ne connait pas la nouvelle table 24 / 38

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Cas nécessitant un peu d'at tention Suppression de colonne 26 / 38

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Renommage de colonne ajouter une nouvelle colonne à la table 31 / 38

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Démo ? Questions ? 36 / 38

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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