On the previous figure, the Windows application is running of the 3 servers. Users are connected to a virtual IP address which is configured locally on each server. The input traffic for the virtual IP address is received by all the servers and split among them by a filter inside each server's kernel.
The network load balancing algorithm inside the filter is based on the identity of the client packets (client IP address, client TCP port). Depending on the identity of the client packet input, only one filter in a server accepts the packet; the other filters in other servers reject it.
Once a packet is accepted by the filter on a server, only the CPU and memory of this server are used by the Windows application that responds to the request of the client. The output messages are sent directly from the Windows server to the client.
If a server fails, the SafeKit membership protocol reconfigures the filters in the network load balancing cluster to re-balance the traffic on the remaining available servers.
Note that SafeKit works in VMware environments without the Microsoft NLB problems of unicast and muticast modes. And note also that SafeKit network load balancing is working not only on Windows (including Windows editions for PCs) but also on Linux.
With SafeKit, you can configure either a farm application module or a mirror application module according the high availability architecture suited for an application. For Windows load balancing and failover, the right module is the farm module.
Starting from the generic farm module, the Windows module can be customized with the SafeKit web console (Advanced configuration).
The configuration files for Windows load balancing and failover are given here.
1. the Windows application stop and start scripts,
2. the configuration file userconfig.xml which contains:
Once the module is configured and tested, you can publish it with the web console. Thus, deployment of Windows load balancing and failover requires no specific IT skills:
Then with the SafeKit web console (Quick configuration):
Here are two examples of Windows application modules:
<!DOCTYPE safe> <safe> <service mode="farm" maxloop="3" loop_interval="24"> <!-- Farm topology configuration for the membership protocol --> <!-- Names or IP addresses on the default network are set during initialization in the console --> <farm> <lan name="default" /> </farm> <!-- Virtual IP Configuration --> <!-- Replace * VIRTUAL_IP_ADDR_TO_BE_DEFINED by the IP address of your virtual server --> <vip> <interface_list> <interface check="on" arpreroute="on"> <virtual_interface type="vmac_directed"> <virtual_addr addr="VIRTUAL_IP_ADDR_TO_BE_DEFINED" where="alias"/> </virtual_interface> </interface> </interface_list> <loadbalancing_list> <group name="Windows_Appli"> <!-- Set load-balancing rule on the TCP port of the service to load balance --> <rule port="TCP_PORT_TO_BE_DEFINED" proto="tcp" filter="on_addr"/> </group> </loadbalancing_list> </vip> <!-- TCP Checker Configuration --> <!-- Replace * VIRTUAL_IP_ADDR_TO_BE_DEFINED by the IP address of your virtual server * TCP_PORT_TO_BE_DEFINED by the TCP port of the service to check --> <check> <tcp ident="Check_Appli" when="both"> <to addr="VIRTUAL_IP_ADDR_TO_BE_DEFINED" port="TCP_PORT_TO_BE_DEFINED" interval="10" timeout="5" /> </tcp> </check> <!-- User scripts activation --> <user nicestoptimeout="300" forcestoptimeout="300" logging="userlog" /> </service> </safe>
@echo off rem Script called on all servers for starting applications rem For logging into SafeKit log use: rem "%SAFE%\safekit" printi | printe "message" rem stdout goes into Application log echo "Running start_both %*" set res=0 rem Fill with your services start call set res=%errorlevel% if %res% == 0 goto end :stop set res=%errorlevel% "%SAFE%\safekit" printe "start_both failed" rem uncomment to stop SafeKit when critical rem "%SAFE%\safekit" stop -i "start_both" :end
@echo off rem Script called on all servers for stopping application rem For logging into SafeKit log use: rem "%SAFE%\safekit" printi | printe "message" rem ---------------------------------------------------------- rem rem 2 stop modes: rem rem - graceful stop rem call standard application stop with net stop rem rem - force stop (%1=force) rem kill application's processes rem rem ---------------------------------------------------------- rem stdout goes into Application log echo "Running stop_both %*" set res=0 rem default: no action on forcestop if "%1" == "force" goto end rem Fill with your services stop call rem If necessary, uncomment to wait for the real stop of services rem "%SAFEBIN%\sleep" 10 if %res% == 0 goto end "%SAFE%\safekit" printe "stop_both failed" :end
Examples of mirror application modules:
Examples of farm application modules: