Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Du kan ikke levere kontinuerlig om du har nedetid

654 views

Published on

Når du driver med kontinuerlig leveranse er det et problem om du har nedetid hver gang du produksjonssetter når målet er å produksjonssette så ofte du kan. I denne lyntalen vil jeg vise hvordan du kan unngå nedetid når du deployer Java-web-applikasjoner. Jeg vil vise hvordan du kan deploye (og rulle tilbake) nye versjoner, og også hvordan du bør håndtere databaseendringer (og rollback) mellom deployments.

  • Be the first to comment

  • Be the first to like this

Du kan ikke levere kontinuerlig om du har nedetid

  1. 1. DU KAN IKKE LEVERE KONTINUERLIG OM DU HAR NEDETID Smidig 2012 Stein Inge Morisbak
  2. 2. Vår høyeste prioritet er å tilfredsstille kundengjennom tidlige og kontinuerlige leveranser av programvare som har verdi.
  3. 3. Lever fungerende programvare hyppig,med et par ukers til et par måneders mellomrom. Jo oftere, desto bedre.
  4. 4. Fungerende programvare er det primære målet på fremdrift.
  5. 5. Continuous delivery is about putting the release schedule in the hands of the business, not in the hands of IT. ... any build could potentially be released to users at the touch of abutton using a fully automated process in a matter of seconds or minutes. - Jez Humble (http://continuousdelivery.com/)
  6. 6. public class MySessionHandler extends SessionHandler { public MySessionHandler(final Server server, final DataSource dataSource) { super(); setSessionManager(new MyJDBCSessionManager(server, dataSource)); }}public class MyJDBCSessionIdManager extends JDBCSessionIdManager implements SessionIdManager { public MyJDBCSessionIdManager(final Server server, final DataSource ds) { super(server); setDatasource(ds); }}
  7. 7. BIG-IP LASTBALANSERERNODE 1 /online NODE 2 /online NODE 3 /online
  8. 8. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  9. 9. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  10. 10. BIG-IP LASTBALANSERER NODE 1 /offline /online NODE 2 /online NODE 3 /online> ./jetty-deploy.sh web-app 1.7
  11. 11. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  12. 12. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  13. 13. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /online NODE 3 /online
  14. 14. BIG-IP LASTBALANSERERNODE 1 /offline /online NODE 2 /offline /online NODE 3 /offline /online
  15. 15. #!/bin/bash# Usage: jetty-deploy.sh <artifact> <version>artifact=$1version=$2wget https://nexus.bekk.no/${artifact}/${version}/${artifact}-${version}.zipunzip ${artifact}.zip/etc/init.d/${artifact} stoprm ${artifact} # softlinkln -s ${artifact}-${version} ${artifact}/etc/init.d/${artifact} startwhile ( ! curl http://localhost:8080/status 2>/dev/null | grep online )do echo "Waiting for web-app to come online." sleep 10done
  16. 16. #!/bin/bash# Usage: rollback.sh <artifact> <version>artifact=$1version=$2/etc/init.d/${artifact} stoprm ${artifact} # softlinkln -s ${artifact}-${version} ${artifact}/etc/init.d/${artifact} startwhile ( ! curl http://localhost:8080/status 2>/dev/null | grep online )do echo "Waiting for web-app to come online." sleep 10done
  17. 17. upstream my_webapp_upstream { server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.1:8082; server 127.0.0.1:8083; keepalive 64;}...location @webapp {...proxy_next_upstream error timeout http_502;...proxy_pass http://my_webapp_upstream;}...
  18. 18. <VirtualHost *:80> ServerName example.com  ProxyRequests Off ProxyPreserveHost On  ProxyPass / http://localhost: / 8080  ProxyPassReverse / http://localhost: / 8080</VirtualHost>
  19. 19. <VirtualHost *:80> ServerName example.com  ProxyRequests Off ProxyPreserveHost On  ProxyPass / http://localhost: / 8080  ProxyPassReverse / http://localhost: / 8080</VirtualHost>$ jetty-deploy.sh -port=8081
  20. 20. <VirtualHost *:80> ServerName example.com  ProxyRequests Off ProxyPreserveHost On  ProxyPass / http://localhost: / 8081  ProxyPassReverse / http://localhost: / 8081</VirtualHost>$ jetty-deploy.sh -port=8081
  21. 21. <VirtualHost *:80> ServerName example.com  ProxyRequests Off ProxyPreserveHost On  ProxyPass / http://localhost: / 8081  ProxyPassReverse / http://localhost: / 8081</VirtualHost>$ /etc/init.d/apache reload
  22. 22. DATABASEMIGRERING (OG ROLLBACK)
  23. 23. DATABASEMIGRERING (OG ROLLBACK)
  24. 24. EXPAND/CONTRACT-PATTERN
  25. 25. EXPAND/CONTRACT-PATTERN EXPAND:
  26. 26. EXPAND/CONTRACT-PATTERN EXPAND: CONTRACT:
  27. 27. db v. 3 TID
  28. 28. app v. 14 kompatibel med db v. 3db v. 3 deploy TID
  29. 29. app v. 14 kompatibel med db v. 3db v. 3 db pre. 4 deploy migrer TID
  30. 30. app v. 14 app v. 15 kompatibel med kompatibel med db v. 3 pre 4 og 4db v. 3 db pre. 4 deploy deploy migrer TID
  31. 31. app v. 14 app v. 15 kompatibel med kompatibel med db v. 3 pre 4 og 4db v. 3 db pre. 4 db v. 4 deploy deploy migrer migrer TID
  32. 32. app v. 14 app v. 15 app v. 17 kompatibel med kompatibel med kompatibel med db v. 3 pre 4 og 4 db 4 og 5db v. 3 db pre. 4 db v. 4 deploy deploy deploy migrer migrer TID
  33. 33. app v. 14 app v. 15 app v. 17 kompatibel med kompatibel med kompatibel med db v. 3 pre 4 og 4 db 4 og 5db v. 3 db pre. 4 db v. 4 db v. 5 deploy deploy deploy migrer migrer migrer TID
  34. 34. app v. 14 app v. 15 app v. 17 app v. 18 kompatibel med kompatibel med kompatibel med kompatibel med db v. 3 pre 4 og 4 db 4 og 5 db v. 5db v. 3 db pre. 4 db v. 4 db v. 5 deploy deploy deploy deploy migrer migrer migrer TID
  35. 35. http://www.liquibase.org
  36. 36. <databaseChangeLog> <changeSet id="Legger til kolonne for kontostatus" author="Stein Inge Morisbak"> <addColumn tableName="KONTO"> <column type="VARCHAR(20)" name="STATUS" /> </addColumn> </changeSet> <changeSet id="Migrer kontostatus" author="Stein Inge Morisbak"> <sql> update KONTO set STATUS = AKTIV where AKTIV = 1; update KONTO set STATUS = DEAKTIVERT where AKTIV = 0; </sql> <rollback> update KONTO set AKTIV = 1 where STATUS = AKTIV; update KONTO set AKTIV = 0 where STATUS = DEAKTIVERT; update KONTO set AKTIV = 0 where STATUS = STENGT; </rollback> </changeSet> <changeSet id="Fjerner gammel kolonne for aktiv" author="Stein Inge Morisbak"> <dropColumn tableName="KONTO" columnName="AKTIV"/> <rollback> <addColumn tableName="KONTO"> <column type="NUMBER(1,0)" name="AKTIV"/> </addColumn> </rollback> </changeSet></databaseChangeLog>
  37. 37. OPPSUMMERING
  38. 38. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!
  39. 39. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!
  40. 40. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.
  41. 41. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.
  42. 42. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte:
  43. 43. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen.
  44. 44. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand).
  45. 45. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy.
  46. 46. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden.
  47. 47. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden. - Gjenta for resten av nodene.
  48. 48. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden. - Gjenta for resten av nodene. - Rydd opp i databasen (contract).
  49. 49. OPPSUMMERINGDu er ikke smidig om du ikke leverer kontinuerlig!Du kan ikke levere kontinuerlig om du har nedetid!Forretning bestemmer hva og når noe skal i produksjon.Prodsetting skal være like enkelt som å trykke på en knapp.Nedetidfri deploy kan løses på følgende måte: - Sesjonsreplikering i databasen. - Migrer bakover- og fremoverkompatible databaseendringer (expand). - Meld ut en node av lastbalansering/reverse proxy. - Deploy til noden. - Gjenta for resten av nodene. - Rydd opp i databasen (contract).
  50. 50. y DevO ps Norwa Dan North 14. november klokken 18:00:How to build your own Heroku - an experience report. http://www.meetup.com/DevOps-Norway/
  51. 51. TAKK FOR MEG! Stein Inge MorisbakFagleder Kontinuerlige Leveranser/DevOps stein.inge.morisbak@BEKK.no @steinim http://open.bekk.no/

×