haproxy+keepalived负载均衡之主备切换(centos)

时间:2022-01-22 10:24:15

VIP: 192.168.1.100 
Master: 192.168.1.238 
Slave: 192.168.1.239 
真实IP: 
RIP1: 192.168.1.235 
RIP2: 192.168.1.236 

以下为安装步骤 
第一步:安装haproxy 
下载http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.18.tar.gz 
#tar zxvf haproxy-1.4.18.tar.gz 
#make TARGET=linux26 
#make install 
第二步:安装ipvs 
根据ipvs官网介绍,不同版本内核适用的ipvs版本不一样。http://www.linuxvirtualserver.org/software/ipvs.html 
2.6.18 适用于1.24的各个版本 
ipvsadm-1.24-6.src.rpm (for kernel between 2.6.10 and 2.6.27.4) - December 10, 2005 
ipvsadm-1.24-5.src.rpm (for 1.2.0 or later) - October 27, 2004 
ipvsadm-1.24-4.src.rpm (for 1.1.8 or later) - January 10, 2004 
ipvsadm-1.24-3.src.rpm (for 1.1.8 or later) - December 20, 2003 
ipvsadm-1.24.tar.gz - December 10, 2005 
安装之前,软连接系统内核目录 
ln -s /usr/src/kernels/2.6.18-194.11.3.el5-i686/ /usr/src/linux 
查看系统当前的内核版本: 
uname -r 
2.6.18-164.el5 

有时你找不到这个内核的路径,系统安装后并没有kernerls的目录 
解决方法:yum install kernel-devel 
接下来在进行连接 编译 就ok了! 

我们使用最新的 ipvsadm-1.24.tar.gz,下载安装。 
tar zxvf ipvsadm-1.24.tar.gz 
cd ipvsadm-1.24 
make 
make install 

第三步,安装keepalived 
从http://www.keepalived.org上下载最新的keepalived-1.2.2.tar.gz。 
tar zxvf keepalived-1.2.2.tar.gz 
cd keepalived-1.2.2 
./configure 
make 
make install 
安装完毕。配置 
(1): 
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ 
mkdir /etc/keepalived 
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ 
ln -s /usr/local/sbin/keepalived /usr/sbin/ 
service keepalived start 
如果安装时的编译参数为: ./configure --prefix=/usr/local/keepalived 
则操作步骤如下: 
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ 
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 
mkdir /etc/keepalived 
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ 
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/ 
service keepalived start 

以下为详细的配置文件 

二、haproxy 
(1)、haproxy配置文件 haproxy.cfg 
global 
daemon 
chroot /usr/local/haproxy 
maxconn 256 
user haproxy 
group haproxy 
log-send-hostname xiaokk.com 
log-tag my_xiaokk 
nbproc 1 
pidfile /var/run/haproxy.pid 
log 127.0.0.1 local0 info 
defaults 
maxconn 256 
mode http 
timeout connect 5000ms 
timeout client 50000ms 
timeout server 50000ms 
timeout check 2000 
retries 3 
option httpclose 
option httplog 
option dontlognull 
option forwardfor 
option redispatch 
option abortonclose 
frontend http-www 
bind 192.168.1.100:80 
acl ha_policy hdr_reg(host) -i ^(www.test-haproxy.com|test-haproxy.com|demo.test-haproxy.com|www.hellobaby.com) 
acl ha_baby hdr_dom(host) -i hellobaby.com 
use_backend ha_www if ha_policy 
use_backend ha_www if ha_baby 
log 127.0.0.1 local0 info 
listen admin_status 
bind 192.168.1.100:1080 
mode http 
log 127.0.0.1 local0 info 
stats uri /admin?status 
stats refresh 30s 
stats realm Haproxy\ Admin\ Center 
stats auth admin:admin 
stats hide-version 
backend ha_www 
mode http 
balance source 
cookie SERVERID 
option httpchk HEAD /index.html 
server w1 192.168.1.235:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1 
server w2 192.168.1.236:85 cookie 1 check inter 1500 rise 3 fall 3 weight 2 
(2)、haproxy启却脚本 haproxy.sh 

#!/bin/sh 

# chkconfig: - 85 15 
# description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly \ 
# suited for high availability environments. 

# processname: haproxy 
# config: /usr/local/haproxy/conf/haproxy.cfg 
# pidfile: /var/run/haproyx.pid 


# Source function library. 
if [ -f /etc/init.d/functions ]; then 
. /etc/init.d/functions 
elif [ -f /etc/rc.d/init.d/functions ]; then 
. /etc/rc.d/init.d/functions 
else 
exit 0 
fi 

# Source networking configuration. 
. /etc/sysconfig/network 

# Check that networking is up 
[ ${NETWORKING} = "no" ] && exit 0 

[ -f /usr/local/haproxy/conf/haproxy.cfg ] || exit 1 

RETVAL=0 

# start Haproxy 
start() { 
/usr/local/haproxy/sbin/haproxy -c -q -f /usr/local/haproxy/conf/haproxy.cfg 
if [ $? -ne 0 ]; then 
echo "Errors found in configuration file." 
return 1 
fi 

echo -n "Starting Haproxy: " 
daemon /usr/local/haproxy/sbin/haproxy -D -f /usr/local/haproxy/conf/haproxy.cfg -p /var/run/haproxy.pid 
RETVAL=$? 
echo 
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/haproxy 
return $RETVAL 


# stop Haproxy 
stop() { 
echo -n "Shutting down Haproxy: " 
killproc haproxy -USR1 
RETVAL=$? 
echo 
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/haproxy 
[ $RETVAL -eq 0 ] && rm -f /var/run/haproxy.pid 
return $RETVAL 


# restart Haproxy 
restart() { 
/usr/local/haproxy/sbin/haproxy -c -q -f /usr/local/haproxy/conf/haproxy.cfg 
if [ $? -ne 0 ]; then 
echo "ERR found in configuration file, check it with 'haproxy check'." 
return 1 
fi 
stop 
start 


# check haproxy 
check() { 
/usr/local/haproxy/sbin/haproxy -c -q -V -f /usr/local/haproxy/conf/haproxy.cfg 


# rsstatus 
rhstatus() { 
status haproxy 


# condrestart 
condrestart() { 
[ -e /var/lock/subsys/haproxy ] && restart || : 


# See how we were called. 
case "$1" in 
start) 
start 
;; 
stop) 
stop 
;; 
restart) 
restart 
;; 
reload) 
restart 
;; 
condrestart) 
condrestart 
;; 
status) 
rhstatus 
;; 
check) 
check 
;; 
*) 
echo $"Usage: haproxy {start|stop|restart|reload|condrestart|status|check}" 
RETVAL 
esac 

exit $RETVAL 

三、keepalived配置文件 
Master的配置文件: 
! Configuration File for keepalived 
global_defs { 
router_id LVS_1 

vrrp_script chk_haproxy { 
script "/etc/keepalived/check_haproxy.sh" 
interval 2 
weight 2 

vrrp_instance VI_1 { 
state MASTER 
priority 99 
advert_int 1 
virtual_router_id 50 
garp_master_delay 1 
interface eth0 
authentication { 
auth_type PASS 
auth_pass Kxiaokk345Pix 

track_interface { 
eth0 

virtual_ipaddress { 
192.168.1.100 

track_script { 
chk_haproxy 

notify_master "/etc/keepalived/mailnotify.py master" 
notify_backup "/etc/keepalived/mailnotify.py backup" 
notify_fault "/etc/keepalived/mailnotify.py fault" 


Slave的配置文件 
! Configuration File for keepalived 
global_defs { 
router_id LVS_2 

vrrp_script chk_haproxy { 
script "/etc/keepalived/check_haproxy.sh" 
interval 5 
weight 2 

vrrp_instance VI_1 { 
state BACKUP 
priority 96 
advert_int 1 
virtual_router_id 50 
garp_master_delay 1 
interface eth0 
authentication { 
auth_type PASS 
auth_pass Kxiaokk345Pix 

track_interface { 
eth0 

virtual_ipaddress { 
192.168.1.100 


track_script { 
chk_haproxy 

notify_master "/etc/keepalived/mailnotify.py master" 
notify_backup "/etc/keepalived/mailnotify.py backup" 
notify_fault "/etc/keepalived/mailnotify.py fault" 

###### --- haproxy存活状态检测脚本 
#!/bin/bash 

# desc: check haproxy service 

A=`ip address show eth0 | grep 192.168.1.100 | wc -l` 
B=`ps -C haproxy --no-heading | wc -l` 

if [ $A -eq 1 ]; then 
if [ $B -eq 0 ]; then 
/usr/local/haproxy/haproxy.sh start 
sleep 3 
fi 
fi 
######---- 

主备切换时邮件提醒程序(此程序源自litus,有小改动,调试通过) 
#!/usr/bin/python 
#coding: utf-8 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEText import MIMEText 
from email.MIMEImage import MIMEImage 
from email.Header import Header 
import sys 
import smtplib 

#------------------------------- 
# file: mailnotify.py 
# desc: send notify email 

#------------------------------- 
strFrom = 'toplover@sina.com' 
strTo = 'toplover@126.com' 
smtp_server = 'smtp.sina.com' 
smtp_user = 'toplover' 
smtp_pass = 'xxx***xxx' 

if sys.argv[1] != "master" and sys.argv[1] != "backup" and sys.argv[1] != "fault": 
sys.exit() 
else: 
notify_type = sys.argv[1] 

mail_title = "[crt] Haproxy-notify-info" 
mail_body_plain = notify_type + 'alive,please check it now' 
mail_body_html = '<b><font color=red>' + notify_type + 'alive,please check it now' 

msgRoot = MIMEMultipart('related') 
msgRoot['Subject'] = Header(mail_title,'utf-8') 
msgRoot['From'] = strFrom 
msgRoot['To'] = strTo 

msgAlternative = MIMEMultipart('alternative') 
msgRoot.attach(msgAlternative) 

msgText = MIMEText(mail_body_plain, 'plain', 'utf-8') 
msgAlternative.attach(msgText) 

msgText = MIMEText(mail_body_html, 'html', 'utf-8') 
msgAlternative.attach(msgText) 

smtp = smtplib.SMTP() 
smtp.connect(smtp_server) 
smtp.login(smtp_user,smtp_pass) 
smtp.sendmail(strFrom, strTo, msgRoot.as_string()) 
smtp.quit() 
到此完成了简单的haproxy+keepalived负载均衡主从热备功能。 
不明之处请参阅haproxy官方cofiguration.txt文件及keepalived官方文档。