转载

【每日一博】heartbeat+drbd实现健康检查后端realserver

1.首先配置好yum[root@server5 ha.d]# cat /etc/yum.repos.d/rhel-source.repo

# Main rhel6.5 server [base] name=Instructor Server Repository baseurl=http://172.25.254.250/rhel6.5 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release # HighAvailability rhel6.5 [HighAvailability] name=Instructor HighAvailability Repository baseurl=http://172.25.254.250/rhel6.5/HighAvailability gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release # LoadBalancer packages [LoadBalancer] name=Instructor LoadBalancer Repository baseurl=http://172.25.254.250/rhel6.5/LoadBalancer gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release # ResilientStorage [ResilientStorage] name=Instructor ResilientStorage Repository baseurl=http://172.25.254.250/rhel6.5/ResilientStorage gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release # ScalableFileSystem [ScalableFileSystem] name=Instructor ScalableFileSystem Repository baseurl=http://172.25.254.250/rhel6.5/ScalableFileSystem gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

安装如下软件

heartbeat-3.0.4-2.el6.x86_64.rpm        heartbeat.pdf

heartbeat-devel-3.0.4-2.el6.x86_64.rpm  ldirectord-3.9.5-3.1.x86_64.rpm

heartbeat-libs-3.0.4-2.el6.x86_64.rpm   libnet-1.1.2.1-2.1.i386.rpm

安装完成后在/etc/生成ha.d目录

然后look README 需要三个文件到这目录下才可运行

rpm -ql hearbeat 找到这三个文件复制到ha.d里

认证文件(/etc/ha.d/authkeys),资源文件(/etc/ha.d/haresources),主配置文件(/etc/ha.d/ha.cf)。

在ha.cf中添加的 keepalive 2 deadtime 30 warntime 10 initdead 60 udpport 694 bcast   eth0            # Linux auto_failback on node    server5.example.com node    server6.example.com ping 172.25.254.250 respawn hacluster /usr/lib64/heartbeat/ipfail  //安装heartbeat 会有有的可能是lib apiauth ipfail gid=haclient uid=hacluster

以上三行的意思是当网络中断时,他也能从load balancer 转到 backup ,heatbeat他不检

测出本身的其他服务和网络状态。

编辑authkeys auth 1 1 crc #2 sha1 HI! #3 md5 Hello!

auth x x从下面选一个选哪个输入那个这里选的是1crc安全性最低,适用于物理上比较安全

的网络,sha1提供最为有效的鉴权方式,占用的系统资源最高

haresources配置文件介绍:

主从节点上的/etc/ra.d/raresource文件必须完全相同。文件每行通常包含以下组成部分:

1、服务器名字:指正常情况下资源运行的那个节点(即主节点),后跟一个空格或tab;这

里指定的名字必须跟某个节点上的命令"uname -n"的返回值相同;

2、IP别名(即额外的IP地址,可选):在启动资源之前添加至系统的附加IP地址,后跟空>格或tab;IP地址后面通常会跟一个子网掩码和广播地址,彼此间用"/"隔开;3、资源脚本:即用来启动或停止资源的脚本,位于/etc/init.d/或/etc/ha.d/resourcd.d>目录中;如果需要传递参数给资源脚本,脚本和参数之间需要用两个冒号分隔,多个参数时

彼此间也需要用两个冒号分隔;如果有多个资源脚本,彼此间也需要使用空格隔开; haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以及启动的服务等。

其配置语句格式如下: node-name network-config <resource-group> 其中node-name指定

双机系统的主节点,取值必须匹配ha.cf文件中node选项设置的主机名中的一个,node选项>设置的另一个主机名成为从节点。 network-config用于网络设置,包括指定集群IP、子网>掩码、广播地址等。resource-group用于设置heartbeat启动的服务,该服务最终由双机系>统通过集群IP对外提供。

格式如下:

primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] resource2[::arg1::arg2]

例如:本次实验的 server5.example.com IPaddr::172.25.254.100/24/eth0 mysqld

在完成3个文件的配置后在另一主机上安装相同软件然后开启hearbeat即可完成HA的简单配>置。

测试效果:只有两台主机同时启动heatbeat才会产生虚拟ip 关闭一个heatbeat后一个会自>动接替,对启动的服务没有监控。虚拟ip转过去,服务按顺序启动转会去就关闭。如关闭mysqld是没有作用的。

2.drbd配置

详见我的另一篇文章 《drbd共享存储的简单配置》 按照那上面的方法很快就完成了部署。

配置好了以后呢

编辑/etc/ha.d/haresource  写入  server5.example.com IPaddr::172.25.254.100/24/eth0 drbddisk::mysqldata Filesystem::/dev/drbd1::/var/lib/mysql::ext4 mysqld

然后启动heartbeat

/etc/init.d/heartbeat start

他会自动挂载数据库共享存储,启动数据库呢。并且不需要你去手动切换drbd的primary.secondary  !!!

是不是很NB阿 这就是一个简单heartbeat+drbd双机热备的典型范例。

3.现在我们给后端配置两台realserver主机作为http服务器,我们的HA主机对其有健康检查功能,一个realserver坏掉 ipvsadm查看权值会变小,我们访问VIP时会自动掠过只访问健康的realserver

后端整两个realserver VIP为172.25.254.100

之前两台HA分别主机执行

配置 ip_forwardvi /etc/sysctl.confnet.ipv4.ip_forward = 1sysctl -p  打开内核IP转发 //同一网段比如本次都为172.25.254.X就可以不用设置。              ipvsadm -A -t 172.25.254.100:80 -s rr    ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.1:80 -g    ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -g

添加规则

realserver配置

#!/bin/bash ifconfig lo:0 172.25.254.100 netmask 255.255.255.255 up route add -host 172.25.254.100 dev lo:0 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 sysctl -p

directord健康检查配置配置(/etc/ha.d/ldirectord.cf):

checktimeout=3checkinterval=1 autoreload=yes logfile="/var/log/ldirectord.log" quiescent=yes virtual=192.168.0.200:80 real=192.168.0.1:80 gate real=192.168.0.2:80 gate fallback=127.0.0.1:80 gate service=http scheduler=rr protocol=tcp checktype=negotiate checkport=80

heartbeat 添加健康检查

vim /etc/ha.d/haresources server5.example.com IPaddr::172.25.254.100/24/eth0  ldirectord httpd

启动hearbeat 尽情体验吧。

下面是复制的网友的问答,我想对于理解很有帮助:

1. LVS/DR如何处理请求报文的,会修改IP包内容吗?

1.1 lvs/dr本身不会关心IP层以上的信息,即使是端口号也是tcp/ip协议栈去判断是否正确,vs/dr本身主要做这么几个事:

1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;

2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;

3)在hash table中记录连接信息。

vs/dr做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少。

数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client

1.2 前面已作了回答,vs/dr不会修改IP包的内容.

2. RealServer为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?

2.1 既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。

在lo上配置vip能够完成接收包并将结果返回client。

2.2 答案是不可以将VIP设置在出口网卡上,否则会响应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。

3. RealServer为什么要抑制arp帧?

这个问题在上一问题中已经作了说明,这里结合实施命令进一步阐述。我们在具体实施部署的时候都会作如下调整:

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我相信很多人都不会弄懂它们的作用是什么,只知道一定得有。我这里也不打算拿出来详细讨论,只是作几点说明,就当是补充吧。

3.1

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announce这两条是可以不用的,因为arp对逻辑接口没有意义。

3.2 如果你的RS的外部网络接口是eth0,那么

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce其实真正要执行的是:

echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是0,那有可能是会出问题滴。

4. LVS/DR load balancer(director)与RS为什么要在同一网段中?

从第一个问题中大家应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,所以director必须和RS在同一网段里面。

5. 为什么director上lo接口除了VIP另外还要在eth0配一个ip(即DIP)?

5.1 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。

5.2 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。

6. LVS/DR ip_forward需要开启吗?

不需要。因为director跟realserver是同一个网段,无需开启转发。

7. director的vip的netmask一定要是255.255.255.255吗?

lvs/dr里,director的vip的netmask 没必要设置为255.255.255.255,也不需要再去

route add -host $VIP dev eth0:0director的vip本来就是要像正常的ip地址一样对外通告的,不要搞得这么特殊.

问题 1 arp_ignore arp_announce 一定要更改么

首先来介绍下 arp_ignore( 官方配置这里就不说明,说下自己的理解 )

0 :当有人发送 arp 请求时,如果任何一个设备上面有这个 ip ,就响应 arp 请求,并且发送 mac 地址应答

( 例如 : 我做了实验,在 200 eth0=192.168.30.200lo:0=192.168.30.149, 如果 arp_ignore 0 ,那么从 192.168.0.237 发过来对 192.168.30.149 arp 消息, 200 ech0 也会相应,但是这个消息原本应该有 LinuxDirector 相应,这就导致的负载均衡的失效,所有的请求 ( 不止是 80 端口 ) ,都会被 192.168.30.200 接受 ------- 话说当初没有配置,这个问题也困扰了我好久好久 )

1 :当有人发送 arp 请求时,如果接受设备上面有这个 ip ,就响应 arp 请求 ( 例如:对于上面的例子,如果设置 arp_ignore1 ,那么即使 192.168.30.200 收到访问 192.168.30.149 的消息,也不会做出相应,因为 lo:0 并非接受设备 )

2 :当有人发送 arp 请求时,如果接受设备上面有这个 ip ,且源 ip 必须在该网络接口的子网段内的就响应 arp 请求 ( 比如 eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1 收到来自 10.1.1.2 这样地址发起的对 192.168.0.1 的查询不会回答,而对 192.168.0.2 发起的对 192.168.0.1arp 查询会回应 ())

3 :不回应该网络界面的 arp 请求,而只对设置的唯一和连接地址做出回应 ( 这里本人也不是很理解,希望有人帮助解答 )

内核文档原文是说:
do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied
ip有个scope属性,host,link,global分别表示ip属于本机、本子网和所有域。应该是说ip的scope配置为host时不响应arp广播吧。没有测试过。

4-7 :保留位

8 :不回应所有 ( 本地地址 )arp 查询

再来看下 arp_announce 介绍,理解起来应该不难:

0( 默认 ) 在任意网络接口上的任何本地地址

1 :尽量避免不在该网络接口子网段的本地地址 . 当发起 ARP 请求的源 IP 地址是被设置应该经由路由达到此网络接口的时候很有用 . 此时会检查来访 IP 是否为所有接口上的子网段内 ip 之一 . 如果改来访 IP 不属于各个网络接口上的子网段内 , 那么将采用级别 2 的方式来进行处理 .

2 :对查询目标使用最适当的本地地址 . 在此模式下将忽略这个 IP 数据包的源地址并尝试选择与能与该地址通信的本地地址 . 首要是选择所有的网络接口的子网中外出访问子网中包含该目标 IP 地址的本地地址 . 如果没有合适的地址被发现 , 将选择当前的发送网络接口或其他的有可能接受到该 ARP 回应的网络接口来进行发送

问题 2 dr 模式中 LinuxDirector 要和 RealService 在一个网段内么?

查看昨天的 tcp 流图,可以看出, vs/dr 转发请求是通过修改源 / 目的 mac 地址来完成的,也就是说在数据链路层完成了上述操作,所以必须在同一个网段内。

问题 3 :设置 /proc/sys/net/ipv4/conf/lo/arp_ignore 有没有意义 ?

网上有人说 lo 数据逻辑接口,对逻辑接口设置这些没有意义,本人也做了测试,目前没有发现任何问题,所以可以去掉。

问题 4 :为何不设置 /proc/sys/net/ipv4/conf/eth0/arp_ignore

在设置 /proc/sys/net/ipv4/conf/all/ 时,其实主要想要执行的就是 eth0 的配置修改。但是有一种情况,就是 linux 默认的 eth0arp_ignorearp_announce 的值如果不是 0 ,那么即使设置了 all 也有可能不会生效。这里需要特殊主义,建议加上如下两句

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

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

根据如上的叙述, RealServer的配置脚本应该改为:

#!/bin/sh   VIP=172.25.254.100     Usage ()   {     echo "Usage:`basename $0` (start|stop)"     exit 1   }      if [ $# -ne 1 ];then     Usage   fi      case $1 in     start)     echo "reparing for Real Server"     echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore     echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce     echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore     echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce     /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255  up     /sbin/route add -host $VIP dev lo:0     ;;     stop)     /sbin/ifconfig lo:0 down     echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore     echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce     echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore     echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce     echo "stop Real Server"     ;;     *)     Usage   esac

永远完结,知识无止境,有疑问留言哦。

正文到此结束
Loading...