1. What is the DSR(Direct Server Return) Load Balancing?
The type of Load Balancing is typically SLB and DSR, the DSR is when client request, which is balanced through L4 switch, is returning, it doens’t pass through L4 switch again that means returning directly.
Using SLB is as below,
Internet → A → L3 Switch → B → L4 Switch → C → Web Server → C → L4 Switch → B → L3 Switch → A → Internet
The point is the Client Request and Server Response pass through L4 switch.
Using DSR is returning directly from the server as below,
Internet → A → L3 Switch → B → L4 Switch → C → L2 Switch → D → Web Server 1 → D → L2 Switch → C → L3 Switch → Internet
2. How to configure the DSR(Direct Server Return) on Linux?
You need to add and configure the Loopback device with L4 for DSR.
/sbin/ifconfig lo:0 xxx.xxx.xxx.xxx netmask 255.255.255.255
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:56:92:5E:B9
inet addr:10.0.0.151 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1216814699 errors:0 dropped:0 overruns:0 frame:0
TX packets:1098502538 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:286063316490 (266.4 GiB) TX bytes:580239909610 (540.3 GiB)
Base address:0x2000 Memory:d8920000-d8940000lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:420991723 errors:0 dropped:0 overruns:0 frame:0
TX packets:420991723 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720576542847 (671.0 GiB) TX bytes:720576542847 (671.0 GiB)lo:0 Link encap:Local Loopback
inet addr:xxx.xxx.xxx.xxx Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
If you want to add a device for DSR and work permernatly, create the loopback device “ifcfg-lo:0”
if not then you will be creating one.
Excute the following command:
# cd /etc/sysconfig/network-scripts
# vi ifcfg-lo:0
DEVICE=lo:0
IPADDR=xxx.xxx.xxx.xxx
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
Additionally it is necessary to disable invalid ARP replies(misbehaving)
“Linux ARP flux” problem. Linux answers ARP requests on wrong and unassociated interfaces per default. This leads to the following two problems:
- ARP requests for the loopback alias address are answered on the HW interfaces (even if NOARP on lo0:1 is set).
- If the machine is connected twice to the same switch (e.g. with eth0 and eth1) eth2 may answer ARP requests for the address on eth1 and vice versa in a race condition manner (confusing almost everthing).
This can be prevented by specific arp kernel settings. Take a look here for additional information about the nature of the problem (and other solutions): http://linux-ip.net/html/ether-arp.html#ether-arp-flux.
To fix that generally (and reboot safe) we recommend to include the following lines into /etc/sysctl.conf (2.6 kernel only):
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
The following commands may be used to change the settings interactively during runtime:
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
Unfortunately there seems to be no general and simple solution for for kernel 2.4. We recommend currently upgrading to 2.6 kernel in that case, this is probably the easiest way.