Şu anda yük dengeleme için DNS round robin kullanıyorum, bu harika çalışıyor. Kayıtlar şöyle görünür (120 saniyelik bir TTL'ye sahibim)
;; ANSWER SECTION:
orion.2x.to. 116 IN A 80.237.201.41
orion.2x.to. 116 IN A 87.230.54.12
orion.2x.to. 116 IN A 87.230.100.10
orion.2x.to. 116 IN A 87.230.51.65
Her ISS / cihazın böyle bir yanıta aynı şekilde davranmadığını öğrendim. Örneğin, bazı DNS sunucuları adresleri rasgele döndürür veya her zaman geçiş yapar. Bazıları sadece ilk girdiyi yayar, diğerleri IP adresine bakarak hangisinin en iyi olduğunu (bölgesel olarak yakın) belirlemeye çalışır.
Ancak, kullanıcı tabanı yeterince büyükse (birden fazla ISS'ye yayılır, vb.) Oldukça iyi dengelenir. En yüksek ve en düşük yüklü sunucu arasındaki tutarsızlıklar neredeyse% 15'i geçmez.
Ancak şimdi sistemlere daha fazla sunucu tanıtmak ve hepsi aynı kapasitelere sahip değil sorun var.
Şu anda yalnızca 1 Gbps sunucum var, ancak 100 Mbps ve 10 Gbps sunucularla da çalışmak istiyorum.
Yani istediğim şey, 100 ağırlığında 10 Gbps, 10 ağırlığında 1 Gbps sunucu ve 1 ağırlığında 100 Mbps sunucuya sahip bir sunucu tanıtmak istiyorum.
Daha önce onlara daha fazla trafik getirmek için sunucuları iki kez ekledim (ki bu iyi çalıştı - bant genişliği neredeyse iki katına çıktı). Ancak 10 Gbps sunucuyu DNS'ye 100 kez eklemek biraz saçma.
Bu yüzden TTL kullanmayı düşündüm.
Sunucuya 240 saniye TTL ve sunucu B'ye yalnızca 120 saniye verirsem (daha düşük bir TTL belirtilirse çok sayıda DNS sunucusu 120'ye ayarlanmış olarak (bu yüzden duydum) yuvarlak robin için kullanılacak minimum değerdir). Bunun gibi bir şeyin ideal bir senaryoda olması gerektiğini düşünüyorum:
First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds
Second 120 seconds
50% of requests still have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds
Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B (from the 50% of Server A that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec
Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...
Gördüğünüz gibi bu tahmin etmek oldukça karmaşık bir hal alıyor ve pratikte böyle bir şey yapmayacağı kesin. Ama kesinlikle dağıtım üzerinde bir etkisi olmalı!
Ağırlıklı yuvarlak robin var olduğunu ve sadece kök sunucu tarafından kontrol edildiğini biliyorum. Yanıt verirken sadece DNS kayıtları arasında geçiş yapar ve DNS kayıtlarını, ağırlığa karşılık gelen ayarlanmış bir olasılıkla döndürür. DNS sunucum bunu desteklemiyor ve gereksinimlerim tam olarak doğru değil. Mükemmel bir şekilde ağırlık vermezse, ama doğru yöne gitmelidir.
Bence TTL alanını kullanmak daha zarif ve daha kolay bir çözüm olabilir - ve bunu dinamik olarak kontrol eden, kaynakları koruyan bir DNS sunucusu gerektirmez - bence DNS yük dengelemenin donanım yük dengeleyicilerine karşı tüm noktası budur.
Şimdi sorum şu: DNS kayıtlarının TTL özniteliğini kullanarak en iyi uygulamalar / yöntemler / başparmak-ağırlık robin dağılımı kuralları var mı?
Düzenle:
Sistem bir ileri proxy sunucu sistemidir. Bant Genişliği (istek değil) miktarı, Ethernet'e sahip tek bir sunucunun işleyebileceğinden fazladır. Bu yüzden bant genişliğini birkaç sunucuya dağıtan bir dengeleme çözümüne ihtiyacım var. DNS kullanmaktan başka alternatif yöntemler var mı? Tabii ki fiber kanallı bir yük dengeleyici kullanabilirim, ancak maliyetler saçma ve aynı zamanda sadece darboğazın genişliğini arttırıyor ve ortadan kaldırmıyor. Aklıma gelen tek şey anycast (anycast veya multicast mı?) IP adresleridir, ancak böyle bir sistem kurmak için imkanım yok.