欢迎来到福编程网,本站提供各种互联网专业知识!

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

发布时间:1970-01-01 作者:佚名 来源:互联网
本文介绍haproxy+keepalived双机热备负载均衡,在centos5.4上调试通过
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 = '' + 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官方文档。

相关推荐