Ana içeriğe atla

IIS Binding ve PowerShell ile Blue-Green Güncelleme Stratejisi kullanarak Kesintisiz Güncellemeye Geçtik.

Blue-Green Deployment Nedir?

Blue-Green deployment, yazılım geliştirme süreçlerinde kullanılan bir stratejidir ve uygulamanın yeni bir sürümünü kullanıcılara sunma sürecini optimize etmeyi amaçlar. Temel prensip, esas uygulama (Mavi) ve yeni sürüm (Yeşil) olmak üzere iki ayrı ortam oluşturmak ve güncelleme esnasında trafiği mavi ortamdan yeşil ortama yönlendirerek yeni versiyona geçişi kesintisiz (zero downtime) uygulamaktır.

Mavi Ortam (Blue): Mevcut ve üretimde olan uygulamanın sürümüdür. Kullanıcı trafiği bu ortama yönlendirmiş vaziyettedir.

Yeşil Ortam (Green): Yeni bir güncelleme veya sürümünün bulunduğu, test edildiği ve hazırlandığı ortamdır. Son kullanıcı trafiği buraya yönlendirilmez, ancak uygulama burada aktif olarak çalışır.

Ana fikir, yeni bir sürümü kesintisiz ve sorunsuz bir şekilde kullanıcılara sunabilmek ve olası kesintileri (downtime) ve hataları minimize edebilmektir. Blue-Green deployment, uygulamanın sürekli erişilebilir olmasını sağlarken, güncellemelerin sağlıklı bir şekilde dağıtılmasını da kolaylaştırır.


Blue-Green Deployment bize ne yarar sağladı?

Normal şartlarda güncellemelerimizi Azure DevOps Server ile CI/CD pipeline'i kurarak yapmaktaydık. Güncelleme hiçbir sorun olmasa bile 10-20 dakika sürebiliyordu. Bu süre zarfında gelen isteklere "Güncelleniyoruz... x saatinde sistem tekrardan erişilebilir olacaktır" gibi bir yanıt dönülüyordu. Buraya kadar 20 dakika boyunca sistemin kapalı olması, özellikle de bankalar ve dijital satış kanallarına hizmet veren bir uygulama için büyük sorun oluşturuyor. Hele bir de güncellemede hata yaşandığında 1 saati bulan bir kesinti kabul edilemez bir durum ve ciddi müşteri memnuniyetsizliğine ve sorunlara yol açabiliyor.

Blue-Green Deployment stratejisiyle bu sorunu aşmayı ve hiçbir kesinti olmadan yeni sürüm güncellemesi yapmayı başardık. Bu yazımda, bu stratejiyi mevcut bir yapı üzerinde büyük değişiklikler yapmadan nasıl uyguladığımızı anlatacağım.

Blue-Green Deployment stratejisi için daha fazla bilgi almak için bu makaleye bakabilirsiniz.

1. Deneme: Url Rewrite Module

Bu strateji genellikle Load Balancer uygulamaları kullanılarak uygulanır. Client'ten gelen isteği bir Load Balancer uygulaması (veya router) karşılar ve yapılan ayarlara göre trafiği mavi veya yeşil ortama yönlendirir. 


Ancak bizim senaryomuzda yeni load balancer eklenmesi farklı sorunlara sebep olacağından, trafik yönlendirmesini IIS kullanarak nasıl uygulayabileceğimizi araştırdık. İlk denemelerde Azure DevOps'da Release Pipeline içerisinde yeşil ortamı güncelledikten sonraki adımda PowerShell kullanarak IIS'in Url Rewrite Module'uyla mavi ortama gelen istekleri yeşile yönlendirmesini sağlamak için bir kod yazmaya çalıştık. 
Url Rewrite komutlarını PowerShell ile başarılı bir şekilde web.config'e ekletmiş olsak da maalesef yönlendirme gerçekleşmedi. Zaten gerçekleşse bile daha sonra Url Rewrite'in bu iş için uygun olmadığını farkettik. Çünkü maviye gelen istekleri her ne kadar yeşile yönlendirse de aktif ve çalışır bir uygulama olmadan yönlendirme yapamıyor ki mavi ortam güncellenirken dll'ler güncellenirken aktif ve çalışır olmayacaktır, bu da şu demek: güncelleme esnasında güncelleme bitene kadar yönlendirme yapılamadığı için kesinti oluşacaktı. Böylece birinci denememiz başarısız oldu.

2. Deneme: Application Request Routing

ikinci denemde, IIS üzerinde Web Server Farm oluşturup ARR (Application Request Routing) kullanarak, gelen istekleri mavi ortamdan yeşil ortama yönlendirmeyi denedik. 
Aşağıdaki makaleyi adım adım takip ederek tüm işlemleri uyguladık. Ancak bizim sunucumuzda birden çok web uygulaması host edildiğinden bu yöntemde de başarısız olduk. Ayrıca büyük değişikliklere gidip yeni bir sunucu ekleyip bu sunucuyu load balancer olarak kullanarak iki ortam arasında trafiği yönlendirmekte işimize gelmedi.

How to Deploy Anything in IIS with Zero Downtime on a Single Server | Kevin Reed (kevinareed.com)

3. Deneme: IIS Binding Switch

Üçüncü denemede ise mavi ortama ait IIS domain binding'leri yeşil ortama taşıyarak trafiğin yeşil ortama akmasını sağlamayı hedefledik. Bu denemede başarılı olduk ve kesintisiz güncellemeyi yapmayı başardık. Bu yöntemi uyguladığımız adımları aşağıda adım adım ekledim:

1- Yeşil Ortam Hazırlanıp ve Çalışır vaziyette olmalı:
  • Öncelikle, yeşil ortam için IIS'de yeni bir site oluşturup, gerekli düzenlemeleri yapmalısınız. Yeşil ortam için farklı bir subdomain tanımlayıp dışarıdan güncelleme sonrası testlerin yapılabilmesi için erişilebilir olmalı. Örneğin, mavi ortamımızın domain'i test.mydomain.com ise yeşil ortamımızın da domain'ini testgreen.mydomain.com olarak tanımlamalıyız.
  • Yeşil ve mavi ortamlarını ayırt edebilmek için her birinin içine birer tane basit bir HTML dosyası yükleyerek yanıtın hangi sunucudan geldiğini belirlemelisiniz. "Up.html" dosyasını oluşturup, mavi ortamı için "Up - Blue", yeşil ortamı için ise "Up - Green" ibaresini yazıp kaydetmelisiniz.

 2- Mavi ortam için ek bir subdomain eklenmesi
Binding'ler switch edilirken, mavi ortamda en az bir binding kalmalı. Bir websitesinin hiç binding'i yoksa IIS uygulamayı durduruyor, o yüzden ek bir testblue.mydomain.com isimli bir subdomain eklenmeli.
Aynı zamanda mevcuttaki test.mydomain.com sitenin IIS'deki ismini testblue.mydomian.com olarak değişiyoruz, bu değişiklik zorunlu değil sadece ortamları kolay ayırt etmek için belirtiyoruz.
Şu aşamaya kadar ayarlarımız aşağıdaki görsellerdeki gibidir.




3- Azure Devops Pipeline'inin oluşturulması
Azure Release Pipeline'imiz aşağıdaki görselde görüldüğü adımlardan oluşacaktir. 


Şekilde görüldüğü gibi tek bir stage içinde 6 task mevcuttur, ancak isteyen aşağıdaki görseldeki gibi task'ları ayrı ayrı stage'lere bölebilir.




Gelelim stage içindeki task'lara:


  • IIS Green Deployment: bu adım normal IIS web deploy adımıdır, bu adımda amacımız yeşil ortamı öncelikle güncellemektir. bu adımda testgreen.mydomain.com virtual site name'ini belirterek güncellemenin yeşil ortama atılmasını sağlıyoruz.
  • Agentless Job - Manual Intervention: bu adımda manuel mudahele bekleniyor, yani yeşil ortamımız güncellendikten sonra gerekli testlerini yapıyoruz, ortamın güncel olduğundan ve doğru çalıştığından emin oluyoruz ve hazır olduğumuzda "Resume" butonuna tıklayarak güncellemeyi devam ettiriyoruz.
  • Switch Blue Traffic to Green Env: Yeşil ortamın sağlıklı çalıştığından emin olduktan sonra, sıra mavi ortamın binding'lerini IIS'de yeşil ortama atamaya geldi, böylece mavi ortama gelecek istekler aslında yeşil ortamdan karşılanacaktır. bu işlemi otomatik yaptırmak için Azure Devops pipeline'ında "Powershell On Target Machine" task'ını kullanarak aşağıdaki powershell scriptini inline veya dosya şeklinde ekleyebiliriz.
         SSL binding mevcutsa bu binding yeşil siteye taşımak veya yeşilden geri maviye taşımak için FingerPrint'ine ihtiyacımız olacaktır, bu FingerPrint'i aşağıdaki görselde görüldüğü gibi bulabilirsiniz.
         


  •  Agentless Job - Delay : Trafik switch edildikten sonra, mavi ortamı güncellemeden önce bir süre bekliyoruz. Bu süre içinde devam eden işlemlerin tamamlanmasını sağlıyoruz, böylece herhangi bir işlem kesilmeden sorunsuz bir şekilde devam edebilmesini sağlıyoruz.
  • IIS Blue Deployment: Bu aşamada artık mavi ortamı güncelleyebiliriz. 
  • Switch Traffic Back To Blue Env: Artık mavi ortam güncellendiğine göre IIS Binding'leri eski haline getirebiliriz, bunun için tekrardan "Powershell On Target Machine" task'ını ekleyerek, bir önceki script'in tersini yazacağız. bu scripti aşağıda bulabilirsiniz:

Böylelikle kesintiz bir şekilde, Blue-Green Deployment stratejisini load balancer kullanmak yerine doğrudan IIS Binding Switch ile gerçekleştirmiş olduk.




Yorumlar

Bu blogdaki popüler yayınlar

C# ve Asp.net MVC'de Çok katmanlı Soğan mimarisi (Onion Architecture)

Çok katmanlı mimari, güçlü ve kolay geliştirelebilen ve katmanlarının kolaylıkla değiştirilebilen büyük uygulamalarda çok önemli bir rol oynar. Eski ve en ünlü çok katmanlı mimari, 3 katmandan oluşmakta Data Access Layer - Veri Katmanı Business Process Layer - İş Modeli Katmanı Presentation Layer - Kullanıcı Arayüzü Katmanı  Bu mimaride, Kullanıcı Arayüzü Katmanı sadece ve sadece İş Modeli Katmanıyla iletişimdedir, ve Veri Katmanıyla direk iletişime geçmesine izin verilmiyor, böylece hem güvenlik sağlanıyor, hem de bir katman değiştirilmek istendiğinde diğer katmanlarda minimum değişiklikle bu işlem yapılabiliyor. bu mimari her ne kadar küçük ölçekli uygulamalarda başarılı olsa da, daha büyük ve karmaşık uygulamalarda yetersiz kalmaktadır. Geleneksel Katmanlı Mimari Onion Architecture veya Soğan mimarisi Jeffrey Palermo tarafından onerilmiştir. bu mimaride her katman soğan halkaları gibi düşünülmüş olup kolaylıkla değiştirilebilmesi veya düzenlenmesi amaçlanmıştır. bu mim

C# ve Asp.net MVC'de Çok katmanlı Soğan mimarisinde (Onion Architecture) Asp.Net Identity Kullanımı

Bir önceki makelemde (Buraya Tıklayınız)   Soğan mimarisini oluşturduk ve Ninject kullarak Katmanlar arasında bağımsızlığı sağladık. Bu makalede ise ASP.NET Identity 2.x kullanarak Güvenlik ve Üye yönetimini katmanlı mimaride nasıl sağlayabileceğimizi göstereceğim. bu makalede amaç ASP.NET Identity hakkında bilgi vermek veya nasıl kullanıldığını anlatmaktan ziyade, bir katmanlı mimaride katmanlar arası ilişkiyi bozmadan ASP.NET Identity'yi kullanıma sunulmasıdır. Sorun Nedir? Yeni bir web uygulaması oluşturulduğunda ve üye yönetimi olarak ASP.NET Identity kullanıldığında varsayılan olarak veri tabanı erişimini doğrudan PL katmanından ayarlamaktadır, ancak katmanlı mimaride PL katmanın veri tabanına veyahut DAL katmanına doğrudan erişmesi yasaklanmıştır. ASP.NET Identity'nin çalışabilmesi için IdentityDbContext 'i geliştirmiş bir Context (Entity Framework) sınıfına ihtiyaç duyar. Önemli Not: ASP.NET Identity varsayılan olarak EF kullanarak veri tabanına erişim

Güncel İl, İlçe ve Okullar Listesi (excel ve sql)

Bu Yazımda, en son ve güncel iller, ilçeler ve okullar listesini yayınlıyorum. bu yayında hem excel ve hemde sql sorgularını yayınlanmıştır. NOT1: il ve ilçeler listesi iç işleri bakanlığının sitesinden alınmıştır. eğer değişiklik olursa bu linkten kendiniz de alabilirsiniz, ancak veritabanına kendiniz yazmanız gerekecektir. İÇ İŞLERİ BAKANLIĞI - İL ve İLÇELER LİSTESİ NOT2: Okullar listesi Milli Eğitim Bakalığı sitesinden alınarak Excele aktarılmıştır, daha sonra Excelden Veritabanında eşleşen il ve ilçeri bulunarak doğru bir şekilde kaydedilmiştir. Toplam 3250 Adet okul. Milli Eğitim Bakanlığı - Okullar Ful Listesi Tablo düzeni şu şekildedir. İl, İlçe ve Okul için SQL İlişki diagramı Yukarıdaki Resimde görüldüğü üzere; Her İl'in (City Tablosu) 0 veya birden fazla İlçesi var, ve her İlçenin 0 veya daha Çok Okulu vardır. Gördüğünüz üzere Okul ve İl arasında bağlantı eklenmemiştir, okul olduğu il zaten ilçe tablosu vasitasiyla belirlenebiliniyor, böylece veri taba