Merhaba,
Öncelikle şu detayı belirtmekte fayda görüyorum. İlgi alanım GNU/Linux olsada fazla bilgi göz çıkarmaz edasıyla bu tür şeyleri de araştırıp not ediyorum. Aşağıda anlattığım içeriğin Türkçe dokümanı bulunmuyor ve gerçekten 0’dan bir yapı nasıl kurulur bunu içeriyor. Bu yapıyı daha da abartıp, öne iki IIS proxy makinası oluşturup birden fazla IIS makinaya trafiği yönlendirebilirsiniz. Yazı uzun ama ASP.NET/Java/.netCore Developer veya Microsoft SysAdmin iseniz ve yolunuz IIS’e çıkıyorsa okumanızı öneririm.
Bu yazıda IIS üzerinde Blue-Green Deployment nasıl yapılandırılıp kullanılacağından bahsediyorum. Bunu yaparken de aynı zamanda Load Balancer ve Proxy olarak kullanımdan (ARR) da bahsetmiş olacağım. Elbette böyle bir yapı kurmak yerine Citrix Netscaler, F5, AWS Elastic LB veya HAProxy, LVS.. vs. kullanabilirsiniz. Ancak maliyet sizin için önemliyse böyle bir yol da bulunuyor.
Blue-Green Deployment nedir ve neden kullanılsın?
Senaryo 1: Örneğin e-ticaret sisteminiz var ve gün içinde publish çıkmanız gerekli. Standartı nedir? Publish çıkılır, aktif olması için de bazen web servis reload edilir. Sorun yoksa devam eder, sorun çıkarsa da publish geri alınır. Bu aralıkta da kesinti olur. Bu durumu ziyaretçilere en az seviyede yansıtmak için de yazılım ekibi genelde akşam saatlerinde deploy çıkar veya kesintiyi kabul ederler.
İşte bu yapıda load balancer kullanmıyorsanız, IIS üzerinde “Application Request Routing“dan faydalanabilirsiniz. ARR nedir?

Bir farm yaratarak URL Rewrite’ın da yardımıyla proxy ve load balancer ortamı yaratıyorsunuz. Böylelikle IIS üzerinde tek bir site kullanmak yerine Proxy görevi görecek site yaratıp, arkada onu iki web siteye yönlendirebiliyorsunuz. Böylelikle Servers yazan sitelerden birinde publish çıkarken (down edip) trafiği diğerinden sürdürebilirsiniz. Publish’de sorun yoksa da down ettiğinizi up eder ve diğerini down edip onda publish çıkarsınız. (Ne dediğimi en sonda anlayacaksınız.) Burada kilit noktaysa sessionları web sitelerde değil, SQL’de tutmanızdır. Böylelikle geçişlerde session düşmez. (IIS üzerinde Session State kısmından yapabilirsiniz.)
Senaryo 2:Load balancer cihazların kira bedelleri, sanal load balancer sunucuların (Citrix Netscaler VPX örn.) lisans maliyeti veya da HAProxy veya LVS konfigürasyonunu yapacak teknik yeterliliğin olmaması dolayısıyla, bir load balancer-proxy görecek yapıya ihtiyacınız olabilir. Kısaca yukarıdaki görselde gördüğünüz şekilde bu makinayı sadece istekleri karşılayan ve load balancer görevi gören bir sunucu olarak da kullanabilirsiniz.

Elbette tek bir sunucuda tüm sistemi çalıştırmanızı önermiyorum ama Türkiye’de çoğu firma tek bir makinaya tüm kaynakları verip sistemi çalıştırıyor. Eğer maliyet dolayısıyla genişleyebilir yapı kullanamıyorsanız örneğin kampanya dönemlerinde çift site olarak sistemi çalıştırabilirsiniz. Bu cpunun tavan yapmasına neden olacak olsa da, requestleri kaldırabilecektir. (En iyi performansı almak için IIS iyi yapılandırmalısınız. Bu kısımda desteğe ihtiyacınız olursa sosyal medya aracılığıyla ulaşabilirsiniz.)
Blue-Green Deployment Nasıl Kurulur ve Yapılandırılır?
İşin faydalarını anlatmayı bitirdiğimiz ve teknik boyutuna geldiğimiz kısımdayız. Üstte senaryoları yazmamın nedeni, müşterinize veya üstünüze bu yapıyı önerdiğinizde “Neden buna geçelim?” sorusunun cevabı olması içindi.
Bu yapıyı kurabilmek için IIS üzerinde iki temel şeye ihtiyaç var:
a. URL Rewrite 2.1
b. Application Request Routing 3.0
(Server 2016’ya göre söyledim. 2012’de -IIS 8.x’de- 2.5 olabilir, fark etmez.)
IIS üzerindeki “Web Platform Installer” aracılığıyla yükleyebilirsiniz.

Yüklediğinizi farz ederek sonraki adıma geçiyorum. Yukarıdaki görselde olduğu gibi Sites altında Proxy görevini görecek web sitenizi oluşturun (vahap.net) ve site dosyalarınızın olacağı ana siteleri oluşturun. (web1 ve web2.)
Sonrasında IIS’i kapatın ve yeniden açın. Server Farms kısmını göreceksiniz. “Create Server Farm..” diyerek, website adını yazın. (Bu sadece isim. İsterseniz kendi adınızı yazabilirsiniz.)

Alttaki kısım önemli.

Yukarıda Server Address kısmına eklediğiniz kayıtlar aktif olmalıdır. Yani dns kaydı olmalı. İlla ki bu subdomainlere public IP vermenize ve webten erişilmelerine gerek yok. Sunucu bu kayıtların IP’sine ulaşabilsin yeter. Bu nedenle sunucuya additional IP ekleyin ve rastgele bir local IP ve subnet tanımlayın. Sonra /Windows/system32/drivers/etc/hosts dosyasına girip, bu tanımlar için IP’yi ekleyin. Tek görselde anlatmaya çalıştım. Eğer bunu yapmazsanız 502.4 – Bad Gateway alabilirsiniz.

Bu işlemi yaptıktan sonra “Create Server Farm” adımına geri dönebiliriz. Orada bir diğer önemli nokta portlar. Hangi portlar üzerinden siteleri çalıştıracaksınız? Ben WEB1 için 8001 portunu ve WEB2 için de 8002 portunu kullandım. Portları yazdıktan sonra Enter tuşuna basın ve sonra Add diyin. Karşınıza Url Rewrite ile ilgili bir bildirim çıkacaktır. NO diyerek ilerleyin. Kuralları sonra manuel ekleyeceğiz.

İşlem sonunda hem yukarıdaki gibi veya localhost:8001 ve localhost:8002 diyerek sitelere ulaşabilmeniz lazım. Elbette bir index dosyası atmayı unutmayın. Ek olarak, alt sitelerin binding kısmına dikkat edin. Yukarıdaki görselde gösterdiğim gibi binding eklemeniz lazım. 8001 ve 8002 portunu * dinlemeli.
Bu işlem bittikten sonra gelelim ana domaine. Bu domaini sadece proxy ve dns çözümleyici olarak kullanacağız. Bu nedenle “No Managed Code” olarak Application Pool’u düzenlemelisiniz. Herhangi bir ASP veya ASP.NET çalışmayacak. Sadece proxy görevi görecek ve gerekirse datastore olacak.

Eğer veri boyutu yüksek bir siteniz varsa (e-ticaret gibi) vahap.net olarak oluşturduğum alanda -tabii sizin domaininize göre isim farklıdır- web site dosyalarınızı burada tutabilirsiniz. Her iki node’a (web1 ve web2) kopyalamanıza gerek kalmaz. Örnek olması için big_data diye klasör oluşturdum ve diyelim ki boyutu 500 GB. “Add Virtual Directory” olarak ekleyerek aynı dosyayı kopyalamadan, tek bir ana dizinde gösterebildim. Bu hem disk alanından hem de iki farklı dizin kullanmaktan kurtardı. Aynı işlemi web2 üzerinde de uygulayıp, aynı dizinleri gösterdim. Eğer kullanıcı etkileşimli bir sisteminiz var ise kullanıcıların değişiklik yaptığı dizinleri virtual directory olarak eklemenizi öneririm. (Lock file olmuyor.)

Bu kısmı da yaptıktan sonra geldik URL Rewrite kuralına. Benim vahap.net olarak oluşturduğum domainin web.config dosyası şöyle:

Sizi bir zahmetten kurtararak aşağıya ekliyorum. Domain kısmını düzenlersiniz.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Alwaysup" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^www.vahap.net$" />
<add input="{HTTP_HOST}" pattern="^vahap.net$" />
</conditions>
<action type="Rewrite" url="http://vahap.net/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Son olarak web sitenizin root folderına gelin ve o klasörden itibaren Users grubu ekli değilse ekleyin ve Modify permission tanımlayın. Bu web1, web2 ve ana domainin klasörlerini kapsamalı. Aksi halde hata alabilirsiniz. Şimdi gelelim siteleri nasıl up ve down hale getireceğinize..
Bunun için up.html isminde dosya oluşturun. Bunun içine sadece up kelimesini yazın ve web1-web2’nin folderına atın. Ana domaine atmanıza gerek yok, o sadece proxy (üstteki URL Rewrite kuralıyla beraber) ve büyük dosyaları tuttuğunuz ana folder. Sonra IIS üzerinde Server Farms altında oluşturduğunuz alana tıklayın ve sağ framede “Health Test“e tıklayın.

Yukarıdaki görselin özeti şu: Oluşturduğunuz sitelerden hangisinin up hangisinin down olduğunu burada belirtiyorsunuz. IIS doğrudan vahap.net/up.html dosyasına arkadaki nodeler (web1 ve web2) üzerinden ulaşmayı deniyor. Eğer bu dosyalara ulaşıp, içindeki up kelimesiyle match eden bir sonuç olduğunda node ayakta diyerek trafiği yönlendiriyor. Örneğin siz web1’e trafik gelmesin isterseniz çözüm basit: up.html içindeki kelimeyi down yapın. Node Unhealthy duruma düşecek ve trafik gelmeyecek. Siz de (sunucu içinden) tarayıcıya web2.vahap.net:8002 yazarak publishi çıkıp test edebileceksiniz. Sonra aynı işlemi diğerinde yapacaksınız. Böylelikle IIS ile işiniz kalmıyor. Dilerseniz de publish çıktığınız siteyi gün içinde rahatlıkla restartlayabilirsiniz.

Yukarıda gördüğünüz gibi web1.vahap.net içindeki up.html ya bulamıyor veya içindeki kelime up değil. (Down yazmıştım.) Bu nedenle onu down sayıyor. Ancak web2.vahap.net node Health Test değerleriyle uyuşuyor. Bu da trafiğin web2.vahap.net üzerinden geçeceğini gösterir. Buradaki ayarları kendinize göre uyarlayın ve Apply diyin.
Bunu yaptıktan sonra yine Server Farms altında farm adına tıklayın ve sağ framede açılan “Monitoring and Management” tıklayın. Burada hangi node aktif, response süresi ne, ne kadar request geçiyor, kaç request fail gibi detayları görebilirsiniz.

Bu yazıda nedir ve nasıl kurulurdan bahsettim. Elbette sitenizi direkt buna geçirdiğinizde absürt sorunlarla karşılaşacaksınız. Sorunlarla karşılaştıkça bana ulaşmanız halinde eğer sistem taraflıysa yardımcı olurum.
Umarım zamandan kazanmanızı sağlar.