49
Deployment Strategies

deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deployment Strategies

Page 2: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Ben Kimim

• Aybars Badur

• Evli, 2 cocuk babasi

• Backend Lead @adphorus

[email protected]

• twitter: @aybarsbadur

Page 3: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

deployment nedir ?

Kullanıcılarınıza/müşterilerinize iyi kalitede yazılımları ulaştırmak için yaptığınız süreçlerin tümü

Page 4: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Strateji nedir ?önceden belirlenen bir amaca ulaşmak için tutulan yolların ve uygulanan

yöntemlerin tümü. synonyms: master plan, game plan...

Page 5: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deployment vs. Integration• integration, deployment, delivery… aşağı yukarı

aynı şeyler

• ürettiğiniz bir yazılımı, var olan bir codebase e entegre ediyorsanız, Integration

• son kullanıcıya müşteriye ulaştırıyorsanız, Delivery / deployment

• bunları otomatize ediyorsanız, continous delivery, continous integration, continous deployment…

Page 6: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Delivery PipelineToyota production line

Page 7: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Delivery Pipelinecheckout code > test > deploy to staging > test ….

Page 8: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Reliability

• Güvenilirlik

• “Paranoyaklar uzun yaşar” şeklinde özetleyebileceğimiz çalışmaların tümü

• single point of failures lardan kaçınmak

• Riski dağıtmak

Page 9: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Reliability

• Tek sunucu kabustur

• diskler patlayabilir - daha fazla disk ekle

• işlemci yanabilir - ek işlemci ekle

• anakart patlayabilir ?

• daha fazla sunucu ekle

Page 10: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Reliability• tek datacenter problemlidir

• fırtınalar, depremler…

• tek servis sağlayıcı sorunludur

• dyn dns servisi ddos a uğradı, twitter a ulaşılamadı

• dünyanın en büyük dns sağlayıcısı

Page 11: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Reliability• failover, sharding, partitioning, clustering

• failover: eğer biri patlarsa diğerine geç.

• sharding/partitioning: bazı veriler bir sunucuda, bazıları diğerinde. uygulamanız hangisinde olduğunu bilir.

• clustering: partitioning le aynı şey ama her node diğerinden haberdardır.

• replication: bir sunucudaki verinin kopyası diğer sunucudadır.

Page 12: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Failover

• Failover on loadbalancer

• Failover over ip (using virtual ip)

• DNS failover

• Failover with task queue/workers

Page 13: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Failover

• Failover on loadbalancer

• Hosted load balancer (ELB) failover

• hardware load balancer (F5)

Page 14: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Failover

• Failover over ip (using virtual ip)

• keepalived, corosync …

• bazı servis sağlayıcıları bunu direk sunuyor (örn. Hetzner virtual ip )

Page 15: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Failover

• DNS Failover

• active/passive, active/active

• active/passive: bazı ipler sadece standby durumunda

• AWS Route53 çok ucuza sağlıyor

Page 16: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Failover• Task Queue / Pub-Sub / Message Bus

• app sunucu uygulamasi dummy olur, geleni kuyruga (kafka, rabbitmq etc.) atar

• kuyruk isi yapar cevabini datastore a yazar (redis, memcache)

• app sunucu cevabi kullaniciya gonderir

• celery, kuyruk, activemq …

Page 17: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Routing• bazı istekleri bir sunucuya, diğerlerini öteki sunucuya

yönlendir

• Routing algorithms

• Roundrobin

• Weighted round robin

• least connected

• sticky (on session cookie, ip_hash)

Page 18: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deploy

• this page intentionally left blank

Page 19: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deploy

• Deploy to PAAS

• bir platform as a service kullanın

• Heroku

• git push heroku master

Page 20: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deploy

• Going serverless

• sunucu kullanmazsanız, sunucu problemi yaşamazsınız.

• eg: use S3 for static files

• look for Heroku, AWS Lambda etc.

Page 21: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deploy• Tek sunucuya deploy

• git pull origin master

• sudo service myapplication restart

• (yada sudo supervisorctl restart all)

• derin bir nefes alır ve şanslı gününde olduğunu umarsın

Page 22: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Tek sunucuya deploy• graceful restart

• yeni child processes ateşle

• smoke test yap - eg: did they spawn, are they alive, crash early

• ping redis, ping database in bootstrap

• yeni connectionları yeni child processlere gönder (master has the socket)

• üzerlerinde bağlantı kalmadığında eski child processleri öldür

Page 23: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deploy to a single server• graceful restart

• spawn new set of processes

• smoke test yap - eg: düzgün başladılar mı, cevap verebiliyorlar mı vs..

• ping redis, ping database…

• python app.py —port=8081 & && APP_PID=$! && ! curl localhost:8081 && kill $APP_PID

• loadbalancer (nginx/haproxy vs.) routingi değiştir

• loadbalancerın configi değiştir, sonra reload, kill -HUP

• üzerlerinde bağlantı kalmadığında eski processleri öldür.

• https://github.com/kelseyhightower/confd

Page 24: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deploy to a single server• Graceful restart, diğer alternatif - mesela bir uygulama sunucunuz

yoksa (uwsgi, gevent gibi)

• child process socketi tekrar kullanılabilir olarak açar. yeni child processler forklarsınız, yeni child process ayağa kalkınca, parentına bir sinyal gönderir, parent eski çocuklarını öldürür.

• anahtar kelime: SO_REUSEPORT

• https://github.com/facebookgo/grace

• https://github.com/zimbatm/socketmaster

• https://github.com/pusher/crank

• http://grisha.org/blog/2014/06/03/graceful-restart-in-golang/

Page 25: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Deploy to a single server• graceful restart

• bazı uygulama sunucularında bu yeni kodu çalıştır, sonra eskisini öldür dansı hazır geliyor. dökümantasyonuna bakmalısınız.

• örn: uwsgi touch reload

• fork new processes

• accept new requests to new processes

• wait until there is no connection on old processes

• kill old child processes

• more details. http://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html

• touch /tmp/uwsgi-somefile to reload

Page 26: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Birden çok sunucuya deploy

Page 27: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Rolling deploy

Page 28: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

Rolling deploy• ilk sunucuyu loadbalancerdan çıkart (app1)

• üzerinde bağlantı kalmayana kadar bekle

• app1 üzerindeki kodu güncelle

• smoke test yap

• app1 i tekrar loadbalancera ekle

• bekle

• ikinci sunucuyu loadbalancerdan çıkart (app2)

• üzerine bağlantı kalmayana kadar bekle

• app2 üzerinde kodu güncelle

• smoke test

• ikinci sunucuyu loadbalancera ekle.

Page 29: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

blue/green deployment

• bir grup halindeki sunuculara sırayla deploy et. (örneğin birden çok environment yaratıp, eg: production_1, production_2 yada production_dublin, production_frankfurt)

• smoke test, monkey testing vs. yap

• herşey düzgünse, ikinci environmentı çıkart, ona deploy et, sonra aynı adımlar üçüncü için yap….

Page 30: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

canary deployment• bir yada birden çok sunucuda kodu güncelle

• smoke test

• bazı kullanıcıları yeni env. a gönder.

• monitor et

• daha fazla kullanıcı gönder

• monitor et

• eğer herşey düzgünse bütün sunuculara deploy et.

• yeni özellikleri test etmek, bazı şeyleri denemek için kullanışlı

Page 31: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

immutable deploys• kod deploy etme, sunucu deploy et.

• bir makine imajı yarat, (aws deki ami) ve bundan yeni makineler yarat.

• yeni bir set halinde yeni instancelar yarat.

• bunlara yönlendir kullanıcıları

• eski sunucuları sil

Page 32: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

immutable deploys

• kodu deploy etme, containerları deploy et. (eg: Docker)

• bir docker imajı build edip onu deploy et.

• yeni kontainerlara yönlendir.

• yeni sunucu yaratmaktan çok daha hızlı.

Page 33: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

container orchestration

• Docker Swarm

• AWS EC2 Container Service

• kubernetes

• …

Page 34: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

immutable infrastructure• sunucu deploy etme, infrastructure ı deploy et.

• bütün ortamı kod yazarak yarat.

• hemen hemen herşeyi, sadece sunucuları değil (ELB, VPC etc.)

• tools: terraform, aws cloud formation

• sunuculara sshla vs. girmeye gerek olmamalı.

Page 35: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

continuous deployment• herşeyi otomatize edin

• git push deploy yapsın

• birden çok pushlayın, küçük parçalar halinde deploy yapın.

• daha fazla deploy yapın

• arada sürtünme olmasın.

Page 36: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

continuous deployment• ortaya çıkan sonuç şu, daha fazla deploy yapmak

daha az bug anlamına geliyor.

• eg: amazon her 11 saniyede bir yeni deploy yapıyor (2013)

• daha hızlı deploy yapmak için monolitik uygulamalardan mikroservislere geçin

• eg: netflix’in yüzlerce servisi var

• böylece bağımsız ekipler halinde deploy yapabilirsiniz.

Page 37: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

continuous deployment

• daha fazlası için…

• Continuous Delivery - Jez Humble, David Farley (ayrıca konuşmaları da güzeldir)

• Adrian Cockcroft un konuşmaları (eskiden netflixte cloud architect) fast delivery

• Fred George un konuşmaları

Page 38: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

continuous deployment

• CI/CD Sunucuları

• Jenkins

• Travis CI

• Ve diğerleri… onlarca düzgün seçenek var

Page 39: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

relational database deployment

• şema değişikleri - tablo ekleme, kolon silme vs.

• pek kolay yolu yok

Page 40: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

relational database deployment

• veritabanı kurulumu

• 1 master - X slaves

• failover, master ölürse, slavelerden birini promote et.

• veritabanı kurulumu

• multi master (biri standby)

• ip failover, address failover

• veritabanı kurulumu

• proxy arkasında multi master (eg: pgbouncer)

• aynı ip,failover uygulamaya transparan

Page 41: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

relational database deployment

• veritabanı kurulumu

• AWS RDS servisi

• failoverı kendi yapıyor

• snapshotlara hızla dönebilirsiniz

• herhangi bir zamana dönebilirsiniz

Page 42: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

şema değişiklikleri

• mümkünse yapmayın

• alter table users add column bar

• tablonuzu locklayabilir yada belki locklamaz.

• update x set foo='bar';

• tablonuzu locklayabilir.

Page 43: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

şema değişikliklerini uygulamak

• mümkünse yapmayın.

• users tablosuna phone_number eklemek

• örneğin:

• create table user_details(user_id int, phone_number varchar(30))

Page 44: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

şema değişiklikleri• değişiklikten kaçınma yolları - şemasız tasarımlara gidin

• users:

• id:

• name:

• password:

• email:

• data: JSON {“phone_number”: …}

Page 45: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

şema değişiklikleri• değişiklikten kaçınmak.

• users:

• id:

• name:

• user_data:

• user_id:

• key: varchar(…)

• value: text

Page 46: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

şema değişiklikleri• değişiklikten kaçınmak.

• users:

1 | ybrs

2 | asdasd

• user_data:

1 | phone_number | 123245

1 | city | Istanbul

2 | phone_number | 123245

Page 47: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

applying schema changes• hala şema değişikliği yapmak istiyorsanız.

• slavei offline a alın

• alter table…. çalıştırın

• slave i online yapın, senkronize olsun, replicate, bekleyin.

• masteri offline a alın, slavei mastera promote edin

• alter table ... on master (eski master)

• eski masterı slave olarak bağlayın, bekleyin replikasyon tamamlansın

• eski masterı tekrar master haline promote edin.

Page 48: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

applying schema changes

• hala şema değişikliği yapmak istiyorsanız.

• şu araçlara bakabilirsiniz, tek sunucu üzerinde canlı şema değişikliği için

• percona, pt-online-schema-change

• github: https://github.com/github/gh-ost

Page 49: deployment strategies · 2017-03-17 · Deployment vs. Integration • integration, deployment, delivery… aşağı yukarı aynı şeyler • ürettiğiniz bir yazılımı, var olan

DON’T PANICjust deploy