lvs+heartbeat-ldirectord实现高可用负载均衡

拓扑:


wKioL1ZAG92j8cLYAAA6jMo4xNc160.png

IPVS规则与heartbeat

ipvs规则不再使用ipvsadm配置,而是依靠heartbeat的包工具ldirectord去生成规则

并且ldirectord有检测后端RS健康状况的机制(利用权重,非常正常剔除(w=0),正常后添加)。


删除之前 heartbeat v2 crm lamp配置的约束和资源

wKioL1YvNp-DGjlYAAFGq99OqgE501.jpg

节点分别停止heartbeat:/etc/init.d/heartbeat stop


规划

ipvs-ld节点: 192.168.0.190  node1

ipvs-ld点: 192.168.0.201 node2

RS: 192.168.0.193 node3 ,192.168.0.202 node4

lvs vip 192.168.0.199


ldirectord依赖于自己的配置文件生成ipvs规则,因此,定义集群服务,添加RS都在配置文件中指定,而无需手动执行ipvsadm命令;

ldirectord能对各RS的健康状态做检测,并能实现按需添加或者删除各RS。


1,两个节点安装 heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm 

[root@node2 heartbeat2]# rpm -ivh heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm 
error: Failed dependencies:
ipvsadm is needed by heartbeat-ldirectord-2.1.4-12.el6.x86_64
perl(LWP::Debug) is needed by heartbeat-ldirectord-2.1.4-12.el6.x86_64
perl(LWP::UserAgent) is needed by heartbeat-ldirectord-2.1.4-12.el6.x86_64
perl(Mail::Send) is needed by heartbeat-ldirectord-2.1.4-12.el6.x86_64

[root@node2 heartbeat2]#yum install heartbeat-ldirectord-2.1.4-12.el6.x86_64.rpm -y

依赖包如下:

spacer.gifwKiom1YvNpDzQlAdAAIa2QHjLEQ771.jpg

2,LVS,DR模式配置

配置RS

node3 ,node4主机分别同样配置主机:

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

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

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

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

ifconfig eth0:0 192.168.0.199 broadcast 192.168.0.199 netmask 255.255.255.255

sysctl -p

route add -host 192.168.0.199 dev eth0:0 

/etc/init.d/httpd start 

curl 192.168.0.194 

配置DR主机ipvs

ifconfig eth0:0 192.168.0.199 broadcast 192.168.0.199 netmask 255.255.255.255

route add -host 192.168.0.199 dev eth0:0

[root@node1 ~]# ipvsadm -A -t 192.168.0.199:80 -s rr
[
root@node1 ~]# ipvsadm -a -t 192.168.0.199:80 -r 192.168.0.202 -g -w 1
[
root@node1 ~]# ipvsadm -a -t 192.168.0.199:80 -r 192.168.0.194 -g -w 1

访问测试成功:

wKioL1YvN0KiJfULAAA9asxxsZg598.jpg

spacer.gif

3,测试出成功后,删除ipvs规则;

[root@node1 ~]# ipvsadm -C
[
root@node1 ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[
root@node1 ~]# route del -host 192.168.0.199

[root@node1 ~]# ifconfig eth0:0 down

4,使用ldirectord文件配置规则

 cd /usr/share/doc/heartbeat-ldirectord-2.1.4/

cp ldirectord.cf /etc/ha.d/ 

配置文件说明:


# Global Directives
checktimeout=3  #超时时间间隔

checkinterval=1 #向后端检查的时间,即每1秒检查一次,3秒超时。
#fallback=127.0.0.1:80 #sorry page
autoreload=yes  #自己不用做reload,文件改变后自动装载。
logfile="/var/log/ldirectord.log"       #自己的日志
#logfile="local0"
#emailalert="
admin@x.y.z"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=yes

...


以ftp为列说明:

#virtual=192.168.6.240:21    #vip
#       real=192.168.16.3:21 masq    #rs
#       real=192.168.16.5:21 masq    #rs
#       fallback=127.0.0.1:21            #sorry page
#       service=ftp                            #表示用ftp协议检查
#       checkport=21                        #表示检查21号端口,在tcp层
#       scheduler=wlc                        #调度算法
#       scheduler=rr                            #调度算法
#       #persistent=600                #持久连接时间为600秒。注视表示没开启持久连接
#       #netmask=255.255.255.255
#       protocol=tcp                            #集群服务协议类型
#       checktype=negotiate                #协商类型检查,表示下面的登录和密码
#       login="anonymous"                #用anonymous登录
#       passwd="ldirectord@localhost"    #密码
#       request="welcome.msg"            #请求获取到welcome.msg文件
#       receive="test"                            #回答test字符串

以http说明:

virtual=192.168.6.240:80
        real=192.168.6.2:80 gate
        real=192.168.6.3:80 gate
        real=192.168.6.6:80 gate
        fallback=127.0.0.1:80 gate
        service=http
        request="index.html"   #请求哪个页面
        receive="Test Page"        #必须返回哪个字符串,RS才算是正常的
        virtualhost=some.domain.com.au    #对虚拟主机单独检测
        scheduler=rr
        #persistent=600
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
        receive="Test Page"
        virtualhost=www.x.y.z


常用的检测类型:

checktype = connect|external|negotiate|off|on|ping|checktimeoutN

ip层:connect: syn ,ack就行了

网络层:ping

应用层:negotiate


配置文件修改:

# Sample for an http virtual service

virtual=192.168.0.199:80

        real=192.168.0.194:80 gate

        real=192.168.0.202:80 gate

        fallback=127.0.0.1:80 gate

        protocol=tcp

        checkport=80

        checktype=negotiate

        service=http

        request=".health.html"

        receive="OK"

        scheduler=rr

        #persistent=600

        #netmask=255.255.255.255

将配置文件复制到node2节点

[root@node1 ha.d]# scp ldirectord.cf node2:/etc/ha.d/

两台DR添加sorry page:

vim /var/www/html/index.html

node1 sorry server

两台RS 添加.health.html

vim /var/www/html/.health.html

测试网页都能访问。

5,配置hb_gui crm

定义组ipvs

    定义集群ip clusterip

    定义 ipvs规则 ipsrules  (使用ldirectord定义)

启动组

spacer.gif

wKiom1YvN1WjPiLSAAIZgWB-45c119.jpg

wKioL1YvN4iQrCt2AAKO6TgbMdk775.jpg

wKiom1YvN1Xwo0FkAAENYQTM4IA258.jpg

spacer.gif

spacer.gif

6,测试

注意:两个HA-DR应该开机自动启动httpd,sorry page页面展示

sorry server页面,两台RS,httpd都stop,HA-LVS权重Weight 为1

通过设置权重为0来剔除RS。

spacer.gifwKioL1YvN6TCWUB1AAFai_XvmE4008.jpg