One of the advantages of using an LVS cluster is its ability to perform
flexible, IP-level load balancing on the real server pool. This
flexibility is due to the variety of scheduling algorithms an
administrator can choose from when configuring a cluster. LVS load
balancing is superior to less flexible methods, such as
Round-Robin DNS where the hierarchical nature of
DNS and the caching by client machines can lead to load
imbalances. Additionally, the low-level filtering employed by the LVS
router has advantages over application-level request forwarding because
balancing loads at the network packet level causes minimal computational
overhead and allows for greater scalability.
Using scheduling, the active router can take into account the real
servers' activity and, optionally, an administrator-assigned
weight factor when routing service
requests. Using assigned weights gives arbitrary priorities to
individual machines. Using this form of scheduling, it is possible to
create a group of real servers using a variety of hardware and software
combinations and the active router can evenly load each real server.
The scheduling mechanism for an LVS cluster is provided by a collection
of kernel patches called IP Virtual Server or
IPVS modules. These modules enable
layer 4 (L4) transport
layer switching, which is designed to work well with multiple servers on
a single IP address.
To track and route packets to the real servers efficiently, IPVS builds
an IPVS table in the kernel. This table is used
by the active LVS router to redirect requests from a virtual server
address to and returning from real servers in the pool. The IPVS table
is constantly updated by a utility called ipvsadm
— adding and removing cluster members depending on their
availability.
The structure that the IPVS table takes depends on the scheduling
algorithm that the administrator chooses for any given virtual
server. To allow for maximum flexibility in the types of services you
can cluster and how these services are scheduled, Red Hat Enterprise Linux provides the
following scheduling algorithms listed below. For instructions on how
to assign scheduling algorithms refer to Section 10.6.1 The VIRTUAL SERVER Subsection.
- Round-Robin Scheduling
Distributes each request sequentially around the pool of
real servers. Using this algorithm, all the real servers are
treated as equals without regard to capacity or load. This
scheduling model resembles round-robin DNS but is more granular
due to the fact that it is network-connection based and not
host-based. LVS round-robin scheduling also does not suffer the
imbalances caused by cached DNS queries.
- Weighted Round-Robin Scheduling
Distributes each request sequentially around the pool of
real servers but gives more jobs to servers with greater
capacity. Capacity is indicated by a user-assigned weight
factor, which is then adjusted upward or downward by dynamic
load information. Refer to Section 7.3.2 Server Weight and Scheduling
for more on weighting real servers.
Weighted round-robin scheduling is a preferred choice if
there are significant differences in the capacity of real
servers in the pool. However, if the request load varies
dramatically, the more heavily weighted server may answer more
than its share of requests.
- Least-Connection
Distributes more requests to real servers with fewer active
connections. Because it keeps track of live connections to the
real servers through the IPVS table, least-connection is a type
of dynamic scheduling algorithm, making it a better choice if
there is a high degree of variation in the request load. It is
best suited for a real server pool where each member node has
roughly the same capacity. If a group of servers have different
capabilities, weighted least-connection scheduling is a better
choice.
- Weighted Least-Connections
(default)
Distributes more requests to servers with fewer active
connections relative to their capacities. Capacity is indicated
by a user-assigned weight, which is then adjusted upward or
downward by dynamic load information. The addition of weighting
makes this algorithm ideal when the real server pool contains
hardware of varying capacity. Refer to Section 7.3.2 Server Weight and Scheduling for more on weighting real
servers.
- Locality-Based Least-Connection Scheduling
Distributes more requests to servers with fewer active
connections relative to their destination IPs. This algorithm is
designed for use in a proxy-cache server cluster. It routes the
packets for an IP address to the server for that address unless
that server is above its capacity and has a server in its half
load, in which case it assigns the IP address to the least
loaded real server.
- Locality-Based Least-Connection Scheduling with
Replication Scheduling
Distributes more requests to servers with fewer active
connections relative to their destination IPs. This algorithm is
also designed for use in a proxy-cache server cluster. It
differs from Locality-Based Least-Connection Scheduling by
mapping the target IP address to a subset of real server
nodes. Requests are then routed to the server in this subset
with the lowest number of connections. If all the nodes for the
destination IP are above capacity, it replicates a new server
for that destination IP address by adding the real server with
the least connections from the overall pool of real servers to
the subset of real servers for that destination IP. The most
loaded node is then dropped from the real server subset to
prevent over-replication.
- Destination Hash Scheduling
Distributes requests to the pool of real servers by looking
up the destination IP in a static hash table. This algorithm is
designed for use in a proxy-cache server cluster.
- Source Hash Scheduling
Distributes requests to the pool of real servers by
looking up the source IP in a static hash table. This algorithm is
designed for LVS routers with multiple firewalls.
The administrator of an LVS cluster can assign a
weight to each node in the real server
pool. This weight is an integer value which is factored into any
weight-aware scheduling algorithms (such as
weighted least-connections) and helps the LVS router more evenly load
hardware with different capabilities.
Weights work as a ratio relative to one another. For instance, if one
real server has a weight of 1 and the other server has a weight of 5,
then the server with a weight of 5 gets 5 connections for every 1
connection the other server gets. The default value for a real server
weight is 1.
Although adding weight to varying hardware configurations in a real
server pool can help load-balance the cluster more efficiently, it can
cause temporary imbalances when a real server is introduced to the
real server pool and the virtual server is scheduled using weighted
least-connections. For example, suppose there are three servers in the
real server pool. Servers A and B are weighted at 1 and the third,
server C, is weighted at 2. If server C goes down for any reason,
servers A and B evenly distributes the abandoned load. However, once
server C comes back online, the LVS router sees it has zero
connections and floods the server with all incoming requests until it
is on par with servers A and B.
To prevent this phenomenon, administrators can make the virtual server
a quiesce server — anytime a new real
server node comes online, the least-connections table is reset to zero
and the LVS router routes requests as if all the real servers were
newly added to the cluster.