lvs+heartbeat
LVS+Heartbeat实现apache负载均衡高可用
# 部署准备
VIP 192.168.1.10
主ha服务器 eth0:192.168.1.11
eth1:192.168.200.101 (心跳线)
主机名lvs1: heartbeat+lvs+ldirectord
从ha服务器 eth0:192.168.1.12
eth1:192.168.200.102 (心跳线)
主机名lvs2: heartbeat+lvs+ldirectord
web1服务器 eth0:192.168.1.13
lo:0 :192.168.1.10
web2服务器 eth0:192.168.1.14
lo:0 :192.168.1.10
在四台主机上分别关闭防火墙和selinux安全机制
service iptables stop
setenforce 0
2
在主ha和从ha上修改主机名及hosts文件
主ha:
hostname lvs1
bash
vim /etc/hosts
127.0.0.1 primary.fantong.com localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.1.11 lvs1
192.168.200.101 lvs1
192.168.1.12 lvs2
192.168.200.102 lvs2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
从ha:
hostname lvs2
bash
vim /etc/hosts
127.0.0.1 primary.fantong.com localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.1.11 lvs1
192.168.200.101 lvs1
192.168.1.12 lvs2
192.168.200.102 lvs2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 配置主ha服务器
# 安装ipvsadm、heartbeat
安装ipvsadm
yum –y install ipvsadm
modprobe ip_vs //加载ip_vs模块
2
3
安装heartbeat
上传heartbeat的rpm包
Setup脚本内容:
#!/bin/bash
cd `dirname $0`
echo `pwd`
echo install lib64ltdl7
rpm -ivf lib64ltdl7-2.2.6-6.1mdv2009.1.x86_64.rpm
echo install perl-TimeDate
rpm -ivf perl-TimeDate-1.16-13.el6.noarch.rpm
echo install PyXML
rpm -ivf PyXML-0.8.4-19.el6.x86_64.rpm
echo install cluster-glue-libs
rpm -ivf cluster-glue-libs-1.0.5-6.el6.x86_64.rpm
echo install cluster-glue
rpm -ivf cluster-glue-1.0.5-6.el6.x86_64.rpm
echo install resource-agents
rpm -ivf resource-agents-3.9.5-24.el6_7.1.x86_64.rpm
echo install heartbeat
rpm -ivf heartbeat-3.0.4-2.el6.x86_64.rpm heartbeat-libs-3.0.4-2.el6.x86_64.rpm
echo install ldirectord
rpm -ivf heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm --nodeps
echo Done
exit 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
执行setup.sh脚本进行安装
sh setup.sh
# 配置主ha
软件安装完成以后会生成目录/etc/ha.d,该目录下存放heartbeat 的配置文件ha.cf,验证文件authkeys,资源文件haresources(注意:在heartbeat中,脚本都被称为资源)等,这三个文件是必不可少的,在rpm安装时默认这三个文件不在/etc/ha.d/目录下,需手动复制。软件包heartbeat-ldirectord 的作用是管理后端的realserver。比如后端某个realserver死掉了,会自动从列表当中删除该资源,当该资源恢复后再自动添加进去。配置文件是:/etc/ha.d/ldirectord.cf,默认也是没有的,需手动复制
cp /usr/share/doc/ heartbeat-3.0.4/ha.cf /etc/ha.d/
cp /usr/share/doc/ heartbeat-3.0.4/authkeys /etc/ha.d/
cp /usr/share/doc/ heartbeat-3.0.4/haresources /etc/ha.d/
cp /usr/share/doc/ heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
2
3
4
5
6
7
配置/etc/ha.d/ha.cf:
vim /etc/ha.d/ha.cf
24 debugfile /var/log/ha-debug
29 logfile /var/log/ha-log //日志目录
34 logfacility local0
48 keepalive 2 //主从切换的保持时间
56 deadtime 30 //宣布对方死亡时间
61 warntime 10 //警告时间
76 udpport 694 //主从之间的通信端口
121 ucast eth1 192.168.200.102 //采用单播方式探测心跳,bcast是广播方式,mcast是组播方式;后面的地址是对端从ha的心跳地址
157 auto_failback on //自动恢复,就是说如果主从故障中恢复会抢回主的位置
211 node lvs1 //主节点主机名
212 node lvs2 //从节点主机名
220 ping 192.168.1.250 //最好是网关地址
227 ping_group group1 192.168.1.11 192.168.1.12
228 ping_group group1 192.168.200.101 192.168.200.102
254 respawn hacluster /usr/lib64/heartbeat/ipfail
260 apiauth ipfail gid=haclient uid=hacluster //用户已经自动建立
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
配置/etc/ha.d/authkeys 验证文件
vim /etc/ha.d/authkeys
只看最后四行
23 auth 2 //去掉下面哪行的注释 就填上哪行的行号,此文件主从必须一样。
24 #1 crc // crc算法是求和
25 2 sha1 HI! // sha1是hash加密 HI!是被加密的值
26 #3 md5 Hello! // md5 加密 hello 加密值,在这里使用sha1加密
2
3
4
5
6
7
8
9
10
设置authkeys文件 的权限(注意:此文件主从必须都是600的权限)
chmod 600 /etc/ha.d/authkeys
配置/etc/ha.d/ ldirectord.cf
vim /etc/ha.d/ldirectord.cf
12 checktimeout=3 //隔3秒没有收到realserver的返回页面,ha认定宕机,服务将不使用该realserver提供服务
13 checkinterval=1 //间隔1秒访问一次realserver根目录的index.html文件
15 autoreload=yes //当realserver 恢复正常后自动加入队列提供服务
16 logfile="/var/log/ldirectord.log" // log日志的路径
17 logfile="local0"
21 quiescent=no //如果realserver出问题,立即从资源列表删除
24 virtual=192.168.1.10:80 // VIP 对外IP
25 real=192.168.1.13:80 gate //真实服务器前面必须空4格, gate表示采用的是lvs中DR模式,也可添加权重
26 real=192.168.1.14:80 gate
27 fallback=127.0.0.1:80 gate // real机器全部宕机由谁来承担,此为局部设置
28 service=http
29 request="test.html" //验证文件必须位于rs机器的网页根目录
30 receive="Test Page" //验证文件的内容必须相同
31 scheduler=rr // realserver的调动方法:轮询
34 protocol=tcp // tcp协议 也支持UDP协议
35 checktype=negotiate //有很多种,选择默认是negotiate通过页面来检测rs
36 checkport=80 //检测的端口
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
配置/etc/ha.d/haresources
在最后一行处添加:
150 lvs1 IPaddr::192.168.1.10/24/eth0 lvs ldirectord
//主ha的主机名 + VIP(对外提供的IP)+ 需要启动的服务(lvs是下面脚本的名称)
添加资源脚本lvs文件(注意需要根据自身情况修改网卡名)
vim /etc/init.d/lvs
\#!/bin/bash
\# description: start LVS of DirectorServer
\# website director vip.
GW=192.168.1.250 //网关地址千万不要填错了,否则你的辅助(浮动)ip是无法访问的
WEB_VIP=192.168.1.10
WEB_RIP1=192.168.1.13
WEB_RIP2=192.168.1.14
. /etc/rc.d/init.d/functions
logger $0 called with $1
case "$1" in
start)
/sbin/ipvsadm -C
/sbin/ipvsadm --set 30 5 60
/sbin/ifconfig eth0:0 $WEB_VIP broadcast $WEB_VIP netmask 255.255.255.255 up
/sbin/route add -host $WEB_VIP dev eth0:0
/sbin/ipvsadm -A -t $WEB_VIP:80 -s rr
/sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP1:80 -g -w 1
/sbin/ipvsadm -a -t $WEB_VIP:80 -r $WEB_RIP2:80 -g -w 1
touch /var/lock/subsys/ipvsadm >/dev/null 2>&1
/sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW >/dev/null 2>&1
;;
stop)
/sbin/ipvsadm -C
/sbin/ipvsadm -Z
ifconfig eth0:0 down
route del $WEB_VIP >/dev/null 2>&1
rm -rf /var/lock/subsys/ipvsadm>/dev/null 2>&1
/sbin/arping -I eth0 -c 5 -s $WEB_VIP $GW
echo "ipvsadmstoped"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm is stoped"
exit 1
else
ipvsadm -ln
echo "..........ipvsadm is OK."
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
ldirectord 启动的时候会从/etc/init.d 和 /etc/ha.d/resource.d 下搜索资源(这里说的资源就是指脚本)
chmod 755 /etc/init.d/lvs
ln –s /etc/init.d/lvs /etc/ha.d/resource.d/lvs
2
3
设置heartbeat ipvsadm 的开机自启动
chkconfig heartbeat on chkconfig ipvsadm on
1
2
# 配置从ha服务器
安装ipvsadm、heartbeat过程与主ha服务器一致
其他配置文件通过主ha服务器scp到从ha服务器上修改即可
scp root@192.168.1.11:/etc/ha.d/* /etc/ha.d/
scp root@192.168.1.11:/etc/init.d/lvs /etc/init.d/lvs
2
scp复制到从ha服务器后,做以下修改
修改ha.cf
121 ucast eth1 192.168.200.101
注意看看authkeys的权限,最好重新加一下权限
chmod 600 /etc/ha.d/authkeys
资源脚本的链接
chmod 755 /etc/init.d/lvs
ln –s /etc/init.d/lvs /etc/ha.d/resource.d/lvs
2
注意:
可以分别在主ha和从ha启动一下ldirectord,如果出现以下报错:
[root@localhost ~]# /etc/init.d/ldirectord start
Starting ldirectord... Can't locate LWP/UserAgent.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/ldirectord line 2401.
BEGIN failed--compilation aborted at /usr/sbin/ldirectord line 2401.
Failure
Ldirectord缺少依赖包
解决方法:
yum –y install perl-libwww-perl libwww-perl perl-MailTools
# 配置web
# 配置web1
创建脚本(用来设置VIP和屏蔽arp,否则会和其他机器产生冲突):
vim /opt/real.sh
\#!/bin/sh
VIP=192.168.1.10
source /etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of RealServer"
/sbin/ifconfig lo:0 ${VIP} broadcast ${VIP} netmask 255.255.255.255 up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "Close LVS of RealServer"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "wrong,please use start|stop"
exit 1
esac
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
修改权限:
chmod 755 /usr/local/real.sh
加入开机启动:
Vim /etc/rc.local
/usr/local/real.sh start
2
3
可以先手动启动一下
/usr/local/real.sh start
创建验证页(web1和web2必须相同,否则无法通过ldirectord验证):
vim /var/www/html/test.html
Test Page
2
创建index.html测试页:
vim /var/www/html/index.html
test 1
2
# 配置web2
过程与配置web1一致,但创建测试页不同
创建index.html测试页:
vim /var/www/html/index.html
test 2
2
# 验证
启动主ha服务器
service heartbeat start
tail –f /var/log/ha-log //出现以下日志消息
tail –f /var/log/message //出现以下日志消息
ip a //查看是否获取到VIP
ipvsadm –ln //查看节点服务器
启动从ha服务器
service heartbeat start
tail –f /var/log/ha-log //出现以下日志消息
tail –f /var/log/message //出现以下日志消息
在主ha服务器没有挂掉之前,从ha服务器是不提供服务的,也就是说现在从ha服务器是没有VIP和节点服务器的
ip a
ipvsadm –ln
此时访问http://192.168.1.10/,刷新后以下两个画面轮流出现
还可以做以下验证:
1、关闭web1或者web1上任意一台web服务,看访问VIP是否正常
2、停止master节点上的heartbeat进程,看VIP是否会自动切换到backup节点;恢复master节点,停止backup上的heartbeat进程,看VIP是否会自动切换到master节点
3、将master节点关机,看VIP是否会自动切换到backup;开启master节点,关闭backup,看VIP是否会自动切换到master节点。测试时多观察一下heartbeat日志