heartbeat2.x技术学习笔记[技术]

heartbeat1.x的技术已经比较熟悉了,只能两台主机,只能监控硬件状况,有限的功能确实很局限,对于2.x的技术来讲有了很好的扩展,最高支持16台主机,可以对于资源程序进行监控等等,具体细节可以去heartbeat的官网查看,我这里不就在赘述了,只把功能上的实现做个总结。

试验环境:vmware6.0 centos4.4 heartbeat2.1.3 mysql-5.1.28

linux01    ip:192.168.202.128
linux02    ip:192.168.202.129
VIP           ip:192.168.202.110

试验目的:1,linux01上的mysql服务down了,会在linux01上恢复 
                    2,linux01意外断电,vip和mysql服务迁移到linux02上

linux01和linux02上的配置除了ha.cf中ucast的配置要指向另一个节点的网卡ip,其他都是一样的,这里只给出linux01上的配置,另外一台请自行调整。

先是ha.cf的配置

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 15
warntime 10
initdead 20
udpport 694
ucast eth0 192.168.202.129
auto_failback on
node    linux01
node    linux02
ping 192.168.202.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

crm yes

然后是haresources文件,但在2.x的模式下已经不在使用这个配置了,之所以这里我拿出来使用是,因为heartbeat提供了一个转换工具,可以根据这个文件生成cib.xml文件,所以我这里还是先编辑这个文件,稍后提供转换办法

linux01 192.168.202.110 mysqld

在最后就是authkeys文件,关于authkeys文件里的3中模式随意用哪种都行的,并把权限设置成600

auth 3
#1 crc
#2 sha1 HI!
3 md5 Hello!

接下来使用转换软件生成cib.xml文件

/usr/lib/heartbeat/haresources2cib.py haresources

这就就会在/var/lib/heartbeat/crm下生成cib.xml文件了,这样两台机器都准备好后,就可以进行测试了

先在两台机器上启动heartbeat软件,执行/etc/init.d/heartbeat start

可以看到linux01上启动了vip和mysql,02上只是启动了

首先在linux01执行/etc/init.d/mysqld stop命令停止mysql服务,然后查看日志,用tail -f的方式,大概2分钟左右的时候,heartbeat就把mysql服务启动起来了,关于mysql服务的监控在cib.xml中可以配置的,默认的interval="120s"。可自行调整

然后来测试linux01 down机,ip和mysql服务自动切换问题

因为我使用的vmware虚拟机,所以关机非常的方便,直接关电就行了,一是观察linux02上的日志,二是观察进程ip服务,发现很快的vip和mysql服务就可以起来了

对于上面的应用效果,我还发现了两个问题,有可能是我对于2.x的理解不够,接下来我会继续深入研究,我的问题是

1,如果我用kill mysql进程的方法,linux01上mysql怎么也不会再被启动起来,这时可以通过手动删除pid文件的方式让heartbeat来自动启动donw掉的mysql,但同时又出现一个问题,就是如果真因为mysql意外终止,但heartbeat调用的mysqld的lsb脚本是不会判断出来的,所以,mysql服务始终不会启动。
2,heartbeat默认配置是监控自己的机器的资源,当资源故障是先尝试在本机恢复的。所以如果linux01上的mysql服务真的因为什么情况没法继续提供服务,heartbeat是用什么机制将服务和vip都迁移到linux02这台正常的机器上。

lvs+HA+squid搭建稳定上网服务[原创]

今天有人在群里喊谁做过lvs+squid,正好以前做过一个,我就把过程整理下来,供大家参考。首先看看拓扑图如下
说下我写这篇文章所用的测试环境,vmvare6.0,模拟两个linux,用的是centos5.1
squid-1(192.168.211.128)
squid-2(192.168.211.130)
Vip(192.168.211.135)
实现方式lvs-dr
1,lvs配置部分
安装lvs所需要的软件

yum -y install heartbeat

yum y install heartbeatldirectord

yum -y install heartbeat-devel

yum y install ipvsadm

配置Ldirector
vi /etc/ha.d/ldirectord.cf设置如下内容,两台机器文件内容相同

# Global Directives

checktimeout=3

checkinterval=1

autoreload=yes

logfile=“/var/log/ldirectord.log”

logfile=“local0”

#emailalert=“admin@x.y.z”

#emailalertfreq=3600

#emailalertstatus=all

quiescent=yes

# Sample for an http virtual service

virtual=192.168.211.135:3128

real=192.168.211.128:3128 gate

real=192.168.211.130:3128 gate

scheduler=rr

#persistent=600

#netmask=255.255.255.255

protocol=tcp

checktype=negotiate

checkport=3128

配置heartbeat

vi /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

ucast eth0 192.168.211.130 #另外一台这里要设置成另外的ip

auto_failback on

node contos5-1-1 #通过uanme -n得到

node contos5-1-2

ping_group group1 192.168.211.128 192.168.211.130

respawn hacluster /usr/lib/heartbeat/ipfail

这里之所以使用ucast而不用bcast是因为,如果同网段你还有另外的一套lvs的话,bcast广播也会发到这套lvs里,虽说应用上不会给另外一套lvs带来影响,但日志里会出现很多错误

cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/

vi /etc/ha.d/authkeys,将如下两行的注释去掉

# crc adds no security , except from packet corruption.

# Use only on physically secure networks.

#

auth 1

1 crc

#2 sha1

#3 md5

chomd 600 /etc/ha.d/authkeys

vi /etc/ha.d/haresources文件,加入

contos5-1-1 closelo 192.168.211.135 ldirectord::ldirectord.cf startlo

在/etc/ha.d/resource.d下建立closelo脚本,内容如下

#!/bin/sh

VIP=192.168.211.135

case “$1” in

start)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del -host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

stop)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add -host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

*)

echo $“Usage: $0 (start|stop)”

exit 1

;;

esac

/etc/ha.d/resource.d下建立startlo脚本

# ! /bin/sh

VIP=192.168.211.135

case “$1” in

stop)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

start)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

* )

echo $“Usage: $0 (start|stop)”

exit 1

; ;

esac

到此,lvs部分就全部完成了,接下来说squid的设置,具体配置我就不写了,网上这方面的文章很多,我仅仅完成一个可以做正向代理的出来

squid我使用的是3.0stable8
./configure –prefix=/usr/local/squid
make && make install
完成安装后,配置文件内容如下

visible_hostname 2

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl localnet src 172.16.0.0/12 # RFC1918 possible internal network

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

acl purge method PURGE

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow purge localhost

http_access allow localnet

http_access deny all

icp_access allow localnet

icp_access deny all

htcp_access allow localnet

htcp_access deny all

#always_direct allow all

#http_port 80 accel vhost vport

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/var/logs/access.log squid

cache_dir ufs /usr/local/squid/cache 10 2 4

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern . 0 20% 4320

cache_effective_user squid

cache_effective_group squid

然后启动squid,接下来就可以测试了,到此一个可用的而且强健的双机squid就完成了(除非两台机器同时挂掉)

注:每次启动heartbeat前,请先执行 /etc/ha.d/resource.d/closelo脚本,使得lo:o网卡启动,不然这套配置将不起作用了,我目前还没有找到更好的解决办法

如对以上配置有何不明了的还请提出共同讨论

lvs学习笔记02-ldirectord的使用

上次实现了最基础的LVS,可这种最基础的LVS不能满足真正的实际应用,为什么呢,因为他的实用性不高,一但后端RS有当机的情况,LB并不会发现,如果后端有3台RS就说明会有1/3的用户会看到出错的页面,所以此次的总结就是为了解决这个问题

实现方式,使用heartbeat中自带的ldirector程序,该程序可以对后端RS进行健康监控,发现有RS服务不可用,则将这台RSserver从列表中删除

环境和上次一样
LVS架构:

             LB-2.187(vip:2.186)
               |      |
              |        |
              |         |
            RS01        RS02
          (2.188)    (2.189)

实现目的:
1,实现roundrobin方式的投递请求
2,进行RS的健康检查

Libnet的安装
可以去这里下载libnet.tar.gz安装包
下载后进行解压
按默认安装即可
./configure
make && make install

hearbeat安装
可以去这里下载heartbeat安装包
安装方法也比较简单
解压后按默认安装即可
我使用的2.1.3

groupadd haclient
useradd -g haclient hacluster

./ConfigureMe configure
make && make install

mkdir -p /etc/ha.d/conf
cd heartbeat-2.1.3/ldirectord
cp ldirectord.cf /etc/ha.d/conf

此站点下载对应linux版本的rpm包进行安装,ldirectord启动需要这些包的支持
perl-TimeDate-1.16-1.2.el4.rf.noarch.rpm
perl-MailTools-2.02-1.el4.rf.noarch.rpm

配置Ldirector
vi /etc/ha.d/conf/ldirectord设置如下内容

# Global Directives
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
autoreload=yes
logfile="/var/log/ldirectord.log"
logfile="local0"
#emailalert="admin@x.y.z"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=yes

# Sample for an http virtual service
virtual=192.168.2.186:80
        real=192.168.2.188:80 ipip
        real=192.168.2.189:80 ipip
        service=http
        request="index.html"
        scheduler=rr
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"

然后执行/usr/sbin/ldirectord start启动ldirectord服务,可以执行/usr/sbin/ldirectord status查看ldirectord运行状态

/usr/sbin/ldirectord status ldirectord for /etc/ha.d/conf/ldirectord.cf is running with pid: 1522

接下来进行测试,使用软件仍然是webserver stress tool,模拟500了连接
1,正常测试,两台RS服务器正常

ipvsadm
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.188:http Tunnel 1 0 250
  -> 192.168.2.189:http Tunnel 1 1 250

ipvsadm显示每个RS投递请求各250
来看下websever显示结果:

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
251 0 0.00 2,677 11

没有error

2,将任意一台RS80服务关掉

ipvsadm
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.188:http Tunnel 0 0 0
  -> 192.168.2.189:http Tunnel 1 0 500

ipvsadm显示结果,已经将所有的请求投递到2.189这个台服务正常的RS上了
来看下Webserver显示结果:

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
250 0 0.00 2,658 11

同样没有出现error

到此,一个能用于健康检查的lvs就配置完毕了
关于ldirectord的用法可以到这个网页查看,这是ldirectord的manpage页

 

lvs学习笔记01

最近对LVS技术相当痴迷,相应的技术这里我就不在赘述了,有兴趣的朋友可以去LVS的官网上去看,哪里写的很详细,这里我仅把我的配置心得写出来,有不正确的地方还望各位看客指出

首先说下我的配置环境
大环境:vmware6.0,centOS4.4

LVS架构:

             LB-2.187(vip:2.186)
               |      |
              |        |
             |          |
            RS01       RS02
          (2.188)   (2.189)

实现目的:
    1,简单实现负载均衡
    2,不对后端服务器进行健康检查

IPVS安装
可以到这里下载最新的ipvsadm软件,下载后执行以下操作

ln -s /usr/src/kernels/2.6.9-42.EL-i686/ /usr/src/linux
rpmbuild –rebuild ipvsadm-1.24-6.src.rpm
rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.24-6.i386.rpm

LB上的配置
在/usr/local/bin下建立startlvs.sh脚本,加入如下内容

echo 1 >/proc/sys/net/ipv4/ip_forward
ifconfig eth0:0 192.168.2.186 netmask 255.255.255.255 broadcast 192.168.2.186 up

/sbin/route add -host 192.168.2.186 dev eth0:0

ipvsadm -A -t 192.168.2.186:80 -s rr
ipvsadm -a -t 192.168.2.186:80 -r 192.168.2.188 -i
ipvsadm -a -t 192.168.2.186:80 -r 192.168.2.189 -i

然后将脚本加入到/etc/rc.local中以便开机自动运行

Realserver上的配置
在/usr/local/bin下建立starttunl.sh,加入如下内容:

modprobe ipip

ifconfig tunl0 192.168.2.186 netmask 255.255.255.255 broadcast 192.168.2.186 up

/sbin/route add -host 192.168.2.186 dev tunl0

echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1">/proc/sys/net/ipv4/conf/tunl0/arp_ignore

如此,已经简单的lvs就配置完成了,我使用webserver stress tool进行的模拟用户访问,realsever上启动lighttp,在LB上执行ipvsadm -l,显示如下:

[root@LVS-LB01 bin]# ipvsadm -l

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.189:http Tunnel 1 0 250
  -> 192.168.2.188:http Tunnel 1 0 251

webserver stress tool返回的结果如下

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
250 0 0.00 3,695 15

如果此时我将后端的RS服务停一台会看到如下显示结果:

IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.186:http rr
  -> 192.168.2.189:http Tunnel 1 0 250
  -> 192.168.2.188:http Tunnel 1 0 250

ipvsadm依然会把请求投递到后端RS
来看下webserver stress tool的结果

URL No. Name Clicks Errors Errors [%] Time Spent [ms] Avg. Click Time [ms]
1
492 242 49.19 1,865 7

很明显已经能看到有一半的errors了

几点说明:
1,此lvs并支持健康检查,一但后端有一台服务停了,LB并不会知道,依旧会把服务投递到后端
2,我是用的VS/TUN的方式实现的LVS
3,策略我使用的rr方式,如需要其他策略,请自行更改