Load Balancing
Contents
Overview and Architecture
The solution uses a common Linux HA framework from http://clusterlabs.org. There are two components involved in this solution:
- Cman uses corosync internally to provide a platform for membership, messaging, and quorum among the hosts.
- Pacemaker is a cluster resource manager that controls where resources (processes) are executed. Pacemaker works with the processes like Apache httpd using resource agents to provide controls of the process such as start/stop/status.
The following diagram shows a primary/backup design to associate a single virtual IP address with httpd. Whenever the primary host fails, the virtual IP address and the httpd process can be automatically fail over to the backup host.
As a simple two host primary/backup solution, the hosts must be deployed on the same subnet that allows UDP multicast. This solution provides the same reliability as a network that hosts the two machines handling the virtual IP address.
Deploying the Load Balancer
Prerequisites
- Red Hat Enterprise Linux 6 or CentOS 6 We don't officially support CentOS yet
Installing the OS
Install the required software using the following command:
yum -y install httpd pacemaker cman pcs ccs resource-agents
Setting up the HTTP Load Balancer
On both servers, create the following files:
- create /etc/httpd/conf.d/serverstatus.conf, and add the following text:
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 127.0.0.1 </Location>
- create /etc/httpd/conf.d/loadbalancer.conf, and add the following text:
The following lines starting with BalancerMember refers to the URL to the servers for Interaction Recording Web Services (or Web Services if you're using version 8.5.210.02 or earlier), Recording Processor, Recording Crypto Server, Interaction Receiver, and WebDAV server.
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
# Web Server
<Proxy balancer://htcc>
BalancerMember http://htcc1:8080 route=HTCC1
BalancerMember http://htcc2:8080 route=HTCC2
BalancerMember http://htcc3:8080 route=HTCC3
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /api balancer://htcc/api
ProxyPass /internal-api balancer://htcc/internal-api
ProxyPass /ui balancer://htcc/ui
# RP
<Proxy balancer://rp>
BalancerMember http://rp1:8889
BalancerMember http://rp2:8889
</Proxy>
ProxyPass /rp/api balancer://rp/api
# RCS
<Proxy balancer://rcs>
BalancerMember http://rcs1:8008 connectiontimeout=10000ms route=RCS
BalancerMember http://rcs2:8008 connectiontimeout=10000ms route=RCS_b
</Proxy>
ProxyPass /rcs balancer://rcs/rcs stickysession=JSESSIONID
# Interaction Receiver
<Proxy balancer://sm>
BalancerMember http://ir1
BalancerMember http://ir2 status=H
</Proxy>
ProxyPass /interactionreceiver balancer://sm/interactionreceiver
# WebDAV
<Proxy balancer://webdav>
BalancerMember http://webdav1
BalancerMember http://webdav2 status=H
</Proxy>
ProxyPass /webdav/recordings balancer://webdav/recordings
ProxyPass /webdav/dest2 balancer://webdav/dest2
Setting Up Pacemaker and Cman
Disable Autostart for Httpd
Pacemaker manages the startup of httpd. Disable httpd from chkconfig services using the following command:
chkconfig httpd off
Setting Up the Hosts File
Make sure there is a hostname for both servers and that the hostname is resolvable on both hosts, either using DNS or /etc/hosts file. ip1 and ip2 are used as the hostnames thereafter.
# /etc/hosts # ... keep the existing lines, and only append new lines below 192.168.33.18 ip1 192.168.33.19 ip2
Setting Up the Cluster
Run the following command on each host to create the cluster configuration:
ccs -f /etc/cluster/cluster.conf --createcluster webcluster ccs -f /etc/cluster/cluster.conf --addnode ip1 ccs -f /etc/cluster/cluster.conf --addnode ip2 ccs -f /etc/cluster/cluster.conf --addfencedev pcmk agent=fence_pcmk ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect ip1 ccs -f /etc/cluster/cluster.conf --addmethod pcmk-redirect ip2 ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk ip1 pcmk-redirect port=ip1 ccs -f /etc/cluster/cluster.conf --addfenceinst pcmk ip2 pcmk-redirect port=ip2 ccs -f /etc/cluster/cluster.conf --setcman two_node=1 expected_votes=1 echo "CMAN_QUORUM_TIMEOUT=0" >> /etc/sysconfig/cman
Start the Service
Start the cman and pacemaker services on each host using the following command:
service cman start service pacemaker start chkconfig --level 345 cman on chkconfig --level 345 pacemaker on
Setting Up UDP Unicast
This solution relies on UDP multicast to work, but can also work with UDP unicast. Edit the /etc/cluster/cluster.conf file and insert an attribute to the <cman> tag as follows:
... <cman transport="udpu" two_node="1" expected_votes="1/> ...
Restart both servers to take effect.
Setting Cluster Defaults
Run the following on one of the servers.
pcs property set stonith-enabled=false pcs property set no-quorum-policy=ignore pcs resource defaults migration-threshold=1
Configure the Virtual IP Address and Apache httpd
Run the following on one of the servers.
For the first command below, nic=eth0 refers to the network interface that brings up the virtual IP address. Change eth0 to the active network interface your environment uses.
Change <Virtual IP> in the first command below to your virtual IP assigned to this load balancer pair.
pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=<Virtual IP> nic=eth0 cidr_netmask=32 op monitor interval=30s pcs resource create webserver ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf statusurl="http://localhost/server-status" op monitor interval=30s pcs resource meta webserver migration-threshold=10 pcs constraint colocation add webserver virtual_ip INFINITY pcs constraint order virtual_ip then webserver
Maintaining Pacemaker
The following commands help you with the maintenance operations for pacemaker.
To check the status of the cluster:
- pcs status
To clear resource errors (for example, because of incorrect configuration):
- pcs resource cleanup <resourcename>. A resource name is either virtual_ip or web server (for example, pcs resource cleanup webserver).
To check the status of the resources in the cluster:
- crm_mon -o -1
