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. Déploiement d'une application web
    sans interruption de service
    Meetup Dev & Talk Valenciennes - Octobre 2016
    1 / 38

    View full-size slide

  2. Bob Maerten
    @bobmaerten
    2 / 38

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  9. Blue/Green
    9 / 38

    View full-size slide

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

    View full-size slide

  11. 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

    View full-size slide

  12. Structures plus modestes
    13 / 38

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  15. 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

    View full-size slide

  16. 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

    View full-size slide

  17. 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

    View full-size slide

  18. 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

    View full-size slide

  19. 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

    View full-size slide

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

    View full-size slide

  21. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  24. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  27. 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

    View full-size slide

  28. 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

    View full-size slide

  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
    supprimer la colonne de la DB
    30 / 38

    View full-size slide

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

    View full-size slide

  31. 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

    View full-size slide

  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
    migrer les données de l'ancienne colonne vers la nouvelle
    33 / 38

    View full-size slide

  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
    supprimer l'ancienne colonne comme au point précédent
    34 / 38

    View full-size slide

  34. 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

    View full-size slide

  35. Démo ?
    Questions ?
    36 / 38

    View full-size slide

  36. 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

    View full-size slide

  37. 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

    View full-size slide