Tek bir sunucunun yetersiz kaldığı durumlarda birden fazla sunucu kullanarak iş yükünü o sunucular arasında dağıtma işlemi düşünülebilir. Örnekler ile açıklamaya çalışacağım.
Web sunucular üzerinde bu şekilde bir kullanım gerekebilir. Gelen istekleri bir vekil sunucu alır. Bu vekil sunucu, istekleri arkasındaki web sunuculara gönderir. Web sunuculardan gelen cevapları da tekrar istek yapan istemcilere gönderir. Bu çalışma şeklindeki vekil sunucu, yük dengeleme de (load balancing) yapabilir ve reverse proxy olarak bilinir. Ben bu şekilde ihtiyacım olduğunda Nginx ve HAProxy’yi incelemiştim. Nginx’in ücretsiz kullanılabilen hali istediğim bazı temel özellikleri sağlamadığı için HAProxy’yi tercih etmiştim. Belki şu anda Nginx değişmiş bile olabilir ama HAProxy’den memnun olduğum için bir daha Nginx’i vekil sunucu olarak iş yükü dağıtmak amacıyla kullanmaya çalışmadım.
HAProxy, yük dengeleme yaparken farklı algoritmalar destekliyor. Ben genelde round robin algoritmasını tercih ediyorum. Gelen istekler sıralı bir şekilde sunuculara gönderiliyor. Sunucular ortak bilgilere erişim ihtiyacı duyuyorlarsa buna uygun çözüm düşünmek gerekiyor. Webmail yazımda bununla ilgili örnekler vermiştim.
E-posta sunucularında da iş yükünü dağıtmak zorunda kalmıştım. Bir sunucu yükü kaldırmayınca sunucu sayısını artırdım. İlk başlarda NFS ile ortak disk alanı kullandırıyordum. Bu çözümden memnun kalmayınca kullanıcı posta kutularını sunuculara dağıtacak bir çözüme yöneldim. Böylece yatay olarak genişleme şansım da olacaktı. Bu çözümde Dovecot’u vekil sunucu olarak kullanıp gelen istekleri arkadaki diğer Dovecot sunuculara yönlendirdim. Tabii burada round robin gibi bir yöntem mümkün değil. İstekler kullanıcı e-postalarının olduğu sunuculara gönderilmek zorunda. Dovecot yazımda bu işleyişten bahsetmiştim.
DNS, LDAP gibi bir çok servis için de hem iş yükünü dağıtmak hem de hizmet kesintilerini azaltmak için birden fazla sunucu kullanılır. Çoğu zaman bir asıl sunucu olur. Güncellemeler o sunucu üzerinde yapılır. Diğer sunucular asıl sunucudan verileri çekerler ve istemcilerden gelen sorgulara cevap verirler. DNS mantığında üstteki alan adı sunucusu bütün yetkili DNS sunucularının adresini diğer sunuculara gönderir. Diğer sunucular hangisinin asıl sunucu olduğunu bile bilmeden sorguları gönderirler. LDAP tarafında genellikle sunucu bilgileri istemci konfigürasyonu sırasında girilir. Sunucu isimlerinin yazılış sırası önemlidir.
Bazen ilk anda düşünülemeyen nedenlerle sorunlar çıkar ve ona göre çözüm geliştirmek gerekir. Mesela OpenLDAP sunucusu bazı sorguları bekleterek cevap veriyordu. Biraz konuyu inceleyince farklı programların aynı LDAP kullanıcı yetkisini kullanarak sorgu gönderdiğini ve bunun beklemelere yol açtığını fark etmiştim. LDAP üzerinde yeni kullanıcılar oluşturup iş yükünü farklı kullanıcılara bölüştürerek bu beklemelerin önüne geçmeye çalışmıştım.
Dışarıdan gelen e-postaları alan sunucularda da birden fazla sunucu kullanıyorum. Bazen yoğunluk arttığında tek sunucu yetersiz kalabiliyor. Burada MX kayıtlarını yaparken genelde farklı değerler giriyorum. Yani, bir sunucunun öncelikle tercih edilmesini, gerekirse diğerlerinin devreye girmesini istiyorum.
İş yükünü farklı sunuculara dağıtarak yapılan bir tasarım bizi büyük masraflardan da kurtarır. Çünkü bu sayede pahalı büyük bir sunucu yerine fiyat olarak çok daha hesaplı küçük sunucular ile hizmet verilebilir. Ayrıca yeni sunucu ekleyerek genişletmek de mümkündür.