Ziel ist die Installation einer redundanten Lastverteilung auf zwei Servern. Hierzu verwenden wir Apache Server und Keepalived.
Installation Apache
sudo apt-get install apache2
Apache Module aktivieren
Für die Verwendung von Apache Server als Load Balancer sind folgende Module notwendig.
Rewrite => Url Rewrite
Deflate => HTTP Kompression
Headers => Managing HTTP headers
Status => Status Informationen
Proxy => Proxy Module
Proxy_http => Proxy Module für HTTP and HTTPS Protokoll
Proxy_balancer => Clustering und load-balancing
sudo a2enmod rewrite deflate headers status
sudo a2enmod proxy proxy_http proxy_balancer
sudo service apache2 restart
sudo vim /etc/apache2/sites-available/proxy_balancer.conf
<VirtualHost *:80>
ProxyRequests Off
ProxyPreserveHost On
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://cluster>
# Define back-end servers:
BalancerMember http://10.20.20.11:8001/ route=node1 retry=5 timeout=10
BalancerMember http://10.20.20.12:8001/ route=node2 retry=5 timeout=10
ProxySet stickysession=ROUTEID
ProxySet lbmethod=byrequests
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow
Deny from all
Allow from 10.20.20.0/24
</Location>
ProxyPass /balancer-manager !
ProxyPass / balancer://cluster
ProxyPassReverse / balancer://cluster
</VirtualHost> |
<VirtualHost *:80>
ProxyRequests Off
ProxyPreserveHost On
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://cluster>
# Define back-end servers:
BalancerMember http://10.20.20.11:8001/ route=node1 retry=5 timeout=10
BalancerMember http://10.20.20.12:8001/ route=node2 retry=5 timeout=10
ProxySet stickysession=ROUTEID
ProxySet lbmethod=byrequests
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow
Deny from all
Allow from 10.20.20.0/24
</Location>
ProxyPass /balancer-manager !
ProxyPass / balancer://cluster
ProxyPassReverse / balancer://cluster
</VirtualHost>
sudo a2ensite proxy_balancer
sudo service apache2 restart
Keepalived
Mit Hilfe von Keepalived wird ein Virtueller Linux Server erstellt, der aus einem Master- und Backup- Server besteht. Hierfür wird eine Virtuelle IP Adresse erstellt, die zwischen beiden Systemen hin und her wechseln kann. Primär liegt die Virtuelle IP Adresse auf dem Master-Server. Ist der Master nicht verfügbar, so wechselt die IP zum Backup. Ein Heartbeat geprüft die Verfügbarkeit der Server und führt bei einem Ausfall den Wechsel der IP zwischen den Servern durch.
Installation Keepalived
sudo apt-get install keepalived
sudo vim /etc/keepalived/keepalived.conf
vrrp_script chk_apache {
script "/usr/bin/killall -0 httpd" # check the apache2 process
interval 3 # every 3 seconds
}
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80" # connects and exits
interval 5 # every 5 seconds
}
vrrp_instance VI_1 {
state MASTER interface eth0
virtual_router_id 51
priority 150 advert_int 1
authentication {
auth_type PASS
auth_pass pw123! # place secure password here
}
virtual_ipaddress {
10.20.20.25
}
track_script {
chk_apache
chk_http_port
}
} |
vrrp_script chk_apache {
script "/usr/bin/killall -0 httpd" # check the apache2 process
interval 3 # every 3 seconds
}
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80" # connects and exits
interval 5 # every 5 seconds
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass pw123! # place secure password here
}
virtual_ipaddress {
10.20.20.25
}
track_script {
chk_apache
chk_http_port
}
}
sudo service keepalived restart
Keepalived Backup (Server #2)
Die Einstellungen auf dem Backup-Server sind analog zum Master-Server vor zu nehmen. Abweichungen in der Konfiguration sind „state BACKUP“ und „priority 100“.
sudo vim /etc/keepalived/keepalived.conf
vrrp_script chk_apache {
script "killall -0 httpd" # check the apache2 process
interval 3 # every 3 seconds
}
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80" # connects and exits
interval 5 # every 5 seconds
}
vrrp_instance VI_1 {
state BACKUP interface eth0
virtual_router_id 51
priority 100 advert_int 1
authentication {
auth_type PASS
auth_pass pw123! # place secure password here
}
virtual_ipaddress {
10.20.20.25
}
track_script {
chk_apache
chk_http_port
}
} |
vrrp_script chk_apache {
script "killall -0 httpd" # check the apache2 process
interval 3 # every 3 seconds
}
vrrp_script chk_http_port {
script "</dev/tcp/127.0.0.1/80" # connects and exits
interval 5 # every 5 seconds
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass pw123! # place secure password here
}
virtual_ipaddress {
10.20.20.25
}
track_script {
chk_apache
chk_http_port
}
}
Kernel Einstellungen (Sysctl)
Damit die Virtuelle IP im Server verwendet werden kann, muß eine Einstellung für den Kernel geändert werden
sudo vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1 |
net.ipv4.ip_nonlocal_bind = 1
Nach dem Speichern muß ein Neustart von dem Server durchgeführt werden.
Ob die Einstellung richtig vorgenommen wurde kann man prüfen mit.
sudo sysctl net.ipv4.ip_nonlocal_bind
Funktionstest
Durch An- und Ab-schalten von Keepalived und/oder Apache auf Master und Backup kann man nun die Funktion testen.
sudo service apache stop
sudo service keepalived stop
Die Virtuelle IP kann man sich anzeigen mit dem Kommando ip.
sudo ip addr
Links:
Apache Server Status
Apache Load Balancer Manager