Red / Green Deployment

Er ya da geç, bir yazılım ürünü canlıya (production) alındıysa ya da hatalar bulunduysa ya da yeni sürümler planlanıyorsa, bu yazımda bahsetmek istediğim red/green deployment hakkında bir çalışma yapılması gerekmektedir. Bunun ne olduğunu ve bunu bizim nasıl yönettiğimizi bu yazımda sizlerle paylaşmak istiyorum.
Yazdıklarımın net anlaşılabilmesi için somut bir örnek üzerinden ilerlemek istiyorum. Bizim Vellkam olarak bu yazı yazılırken canlıda çalışan backend versiyon numaramız 1.7.19. Bu sürümde bir hata bulduk. Bu sebeple bir bugfix release sürüm oluşturmamız gerekiyor. Bu amaçla 1.7.19 ismini taşıyan git release branch üzerinden gerekli değişikliği yaptık ve testlerin ardından yeni bir bugfix release oluşturduk. Bu yeni sürüm 1.7.19.1 versiyon numarasını taşıyor. Bu versiyonun sistemi durdurmadan yani kullanıcılar bizim bir deployment yaptığımızı anlamadan canlıda çalışır hale getirilmesi gerekiyor. Bu amaçla red/black ya da blue/green deployment gibi kavramlar kullanılıyor. Biz kendi sürecimize red/green deployment ismini verdik. Nedenini açıklayayım.
Bir Java/Spring boot uygulaması olan Vellkam backend aşağıdaki resimde yer alan bir web cluster içinde çalışıyor:

Alt yapımız geriye sadece bir app server kalmış olsa bile, kullanıcılardan gelen istekleri cevaplayacak yapıya sahip. Bunun için ön tarafta yükü dağıtan loadbalancer sunucularımız faal durumda. Red/green deployment ile amacımız cluster içinde yer alan sunucuların bir yarısını yeni sürüm ile güncellemek. Biz bu işlemi yaparken app server 1 ve app server 2 isimli sunucuları durdurmak zorundayız. Bu sebepten dolayı bu iki sunucu artık gelen istekleri cevaplayamıyorlar yani kırmızı (red) durumunu düşünüyorlar. Geriye kalan iki sunucu app server 3 ve app server 4 kullanıcılardan gelen istekklere cevap verdikleri için yeşil yani green durumdalar.
Deployment işlemi başladığı andan itibaren web cluster iki parçaya ayrılıyor, bunlar red (erişilemez) ve green (erişilebilir) isimlerini taşıyor. Biz red olan kısımda yeni sürümü kurarken, green olan taraf eski versiyon ile kullanıcılara hizmet vermeye devam ediyor. Bu esnada monitoring sistemimiz bize gerekli uyarıyı bu şekilde yapıyor:

Görüldüğü gibi cluster içinde çalışmayan taraf kırmızı iken, çalışan taraf yeşil durumda. Biz bu resimden esinlenerek sürecin kendisine red/green deployment ismini verdik. Dışarda bu red/black ya da blue/green isimlerini taşıyan varyasyonlarla da kullanılan bir yöntem. Red/black deployment bünyesinde red calışan sunuculara işaret ederken, black ıle yeni sürüm güncellemesi kastedilmektedir. Blue/green türünde ise birbirinden bağımsız iki paralel sistem ayakta tutulmaktadır. Green bölümü trafiği alırken, blue tarafından sürüm güncellemeleri yapılabilmektedir. Güncelleme işlemi tamamlandıktan sonra trafik blue olan kanada aktarılarak yeni green olması sağlanır. Artık trafik almayan eski green kanat ise blue ya dönüşmüştür ve yeni sürüm güncellemeleri için kullanılabilir haldedir.
Biz deployment işlemini otomatize ettik. Deployment scriptler aracılığı ile sunucuların yarısını durdurup, gerekli güncellemeyi yaptıktan sonra, onları tekrar ayağa kaldırmak ve bu işlemi sunucuların diğer yarısı için yapmak mümkün hale gelmektedir.