Balancer, ağın performansını ve verimliliğini artırmak için kullanılır. Balancer, bir ağdaki sunucuların yüklerini eşitleyen ve istekleri bu sunuculara dağıtan bir araçtır. Bu sayede, sunucuların yükleri dengede tutulur ve sistem daha verimli çalışır. Balancer, genellikle web sunucuları veya veritabanı sunucuları gibi yüksek trafik alan sistemlerde kullanılır.
Bir balancer, genellikle bir ağın önüne yerleştirilir ve tüm istekleri alır. Daha sonra, bu istekleri hedef sunuculara yönlendirir. Hedef sunucular, balancer tarafından yönlendirilen istekleri işleyerek yanıt verir. Bu sayede, balancer, istekleri hedef sunucular arasında paylaştırarak sistem yükünü eşitler.
Balancer, genellikle birkaç yöntemle istekleri hedef sunuculara dağıtır. Bunlar arasında, round-robin, least connections ve weighted round-robin gibi yöntemler bulunur. Bu yöntemler arasında, en sık kullanılanı round-robin yöntemidir. Bu yöntemde, istekler gelen sıraya göre hedef sunucular arasında paylaştırılır. Örneğin, ilk isteği hedef sunucu 1’e, ikinci isteği hedef sunucu 2’ye yönlendirir ve bu şekilde devam eder.
Least connections yönteminde ise, hedef sunucular arasında en az bağlantı sayısına sahip olan sunucuya yönlendirilir. Bu sayede, sunucular arasındaki yükler dengede tutulur.
Weighted round-robin yönteminde ise, hedef sunuculara ağırlık verilerek istekler dağıtılır. Örneğin, hedef sunucu 1’e daha fazla ağırlık verilerek daha fazla istek bu sunucuya yönlendirilebilir. Bu sayede, hedef sunucular arasındaki yük dağılımı daha istikrarlı hale getirilebilir.
Delphi ve Indy kütüphaneleri ile bir balancer yapmak için aşağıdaki adımları takip edebilirsiniz:
- Delphi IDE’sini (Integrated Development Environment) kullanarak bir Indy TCP Server projesi oluşturun. Bu, Indy kütüphanesinin TCP/IP protokolünü kullanarak bir sunucu oluşturmanıza yardımcı olacak bir araçtır.
- Sunucunuzu oluşturduktan sonra, birkaç bağlantı noktası (port) açın. Bu bağlantı noktaları, sunucunuzun kullanıcı isteklerini dinleyecek ve yönlendirecek yerlerdir.
- Sunucunuzun OnExecute eventi içinde, istekleri dinleyen bir döngü oluşturun. Bu döngü, bir isteği aldığında, bu isteği bir hedef sunucuya yönlendirecektir.
- Hedef sunucuları belirlemek için, sunucunuzun önceden tanımlanmış bir listesi olabilir. Bu liste, hedef sunucuların IP adreslerini ve port numaralarını içerebilir.
- İstekleri hedef sunucuya yönlendirmeden önce, hedef sunucunun mevcut yük durumunu kontrol edin. Eğer hedef sunucu yüksek bir yük altında ise, isteği başka bir hedef sunucuya yönlendirin.
- İstekleri hedef sunucuya yönlendirirken, isteğin başlık ve verilerini koruyun. Ayrıca, hedef sunucudan dönen yanıtı da kullanıcıya iletin.
Bu örnekte, bir balancer oluşturulmuş ve iki hedef sunucu tanımlanmıştır. Balancer, her bir isteği gelen sıraya göre hedef sunucular arasında paylaştıracak şekilde tasarlandı.
Örnek kodu kullanmak için aşağıdaki nesneleri eklemeniz gerekmektedir:
- Indy TCP Server (IdTCPServer) nesnesi: Bu nesne, balancer işlevini yerine getirecektir.
- Indy TCP Client (IdTCPClient) nesnesi: Bu nesne, hedef sunuculara bağlanmak için kullanılacaktır.
- Indy Global (IdGlobal) nesnesi: Bu nesne, stringleri ayırmak için kullanılacaktır.
- Indy Context (IdContext) nesnesi: Bu nesne, bir TCP bağlantısı ile iletişim kurmak için kullanılacaktır.
Bu nesneler eklendikten sonra, örnek kodu kullanarak balanceri oluşturabilirsiniz. Örnek kodda verilen TMyBalancer sınıfını kullanarak bir balancer nesnesi oluşturun ve bu nesnenin Active özelliğini True yaparak sunucuyu etkinleştirin. Daha sonra, balancera göndereceğiniz istekleri yönlendirerek hedef sunuculara iletebilirsiniz.
uses
IdTCPServer, IdGlobal, IdContext, IdTCPClient;
type
TMyBalancer = class(TIdTCPServer)
private
FServerList: TStringList; // hedef sunucuların listesi
FServerIndex: Integer; // geçerli hedef sunucu indeksi
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Execute(AContext: TIdContext); override;
end;
constructor TMyBalancer.Create(AOwner: TComponent);
begin
inherited;
FServerList := TStringList.Create;
// hedef sunucuları listeye ekleyin
FServerList.Add('192.168.1.10:80');
FServerList.Add('192.168.1.11:80');
FServerIndex := 0;
end;
destructor TMyBalancer.Destroy;
begin
FServerList.Free;
inherited;
end;
procedure TMyBalancer.Execute(AContext: TIdContext);
var
LClient: TIdTCPClient;
LHost, LPort: string;
LRequest, LResponse: TIdBytes;
begin
// isteği alın
LRequest := AContext.Connection.IOHandler.ReadBytes;
// hedef sunucu adresini ve port numarasını ayırın
LHost := Fetch(FServerList[FServerIndex], ':');
LPort := FServerList[FServerIndex];
// hedef sunucuya bağlanın
LClient := TIdTCPClient.Create(nil);
try
LClient.Host := LHost;
LClient.Port := StrToInt(LPort);
LClient.Connect;
// isteği hedef sunucuya iletin
LClient.IOHandler.Write(LRequest);
// yanıtı alın
LResponse := LClient.IOHandler.ReadBytes;
// yanıtı kullanıcıya iletin
AContext.Connection.IOHandler.Write(LResponse);
finally
LClient.Free;
end;
// geçerli hedef sunucu indeksini artırın
Inc(FServerIndex);
// hedef sunucuların listesi sonuna gelindiğinde, sıfırlayın
if FServerIndex >= FServerList.Count then
FServerIndex := 0;
end;
var
LBalancer: TMyBalancer;
begin
LBalancer := TMyBalancer.Create(nil);
try
LBalancer.DefaultPort := 80; // bağlantı noktası (port)
LBalancer.Active := True; // sunucuyu etkinleştirin
WriteLn('Balancer çalışıyor. Önceden tanımlanmış hedef sunuculara istekler yönlendirilecektir.');
ReadLn; // sunucunun çalışmasını bekletin
finally
LBalancer.Active := False; // sunucuyu devre dışı bırakın
LBalancer.Free;
end;
end.
Bu örnek kod da, TMyBalancer sınıfı bir Indy TCP Server sınıfından türetilmiştir. Bu sınıf, bir constructor ve bir destructor ile yapılandırılmıştır. Constructor, hedef sunucuların listesini oluşturur ve bu listeye hedef sunucuları ekler. Destructor ise bu listeyi yok eder. Sınıfın Execute metodu ise, gelen istekleri dinler ve hedef sunucular arasında paylaştırır. Bu metod içinde, gelen istek okunur ve hedef sunucu adresi ve port numarası ayıklanır. Daha sonra, hedef sunucuya bir TIdTCPClient nesnesi ile bağlanılır ve istek iletilir. Hedef sunucudan dönen yanıt da okunur ve kullanıcıya iletilir. Son olarak, geçerli hedef sunucu indeksi artırılır ve hedef sunucuların listesi sonuna gelindiğinde, sıfırlanır. Bu örnek kod, Delphi ve Indy kütüphaneleri ile bir balancer oluşturmak için bir fikir verebilir. Daha detaylı bilgi ve örnek kodlar için, Indy kütüphanesinin dokümantasyonunu ve örneklerini inceleyebilirsiniz.