利用heartbeat+drbd实现HA,ldirectord健康检查后端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对外提供。
格式如下:http://my.oschina.net/loveleaf/blog/478662primary-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共享存储的简单配置》按照那上面的方法很快就完成了部署。补充连接:http://my.oschina.net/loveleaf/blog/478662

配置好了以后呢

编辑/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 尽情体验吧。

补充以下虽然配置好了我想还是有些地方不是很清楚,我就给大家描述一下这些的作用

heartbeat:心跳,高可用的基础,配置都在ha.d/haresource 可以控制宕机重启时启动那些东西,这里要按顺序

ldirectord:这个阿里面试官问我呢我说了健康检查,完了我又想起来他可以主动配置你的ipvsadm表,也就是说他还有调度lvs后端realserver的作用。

其他的我也不清楚了希望网友可以补充。

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

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_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce这两条是可以不用的,因为arp对逻辑接口没有意义。

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

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所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是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地址一样对外通告的,不要搞得这么特殊.


问题1arp_ignorearp_announce一定要更改么

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

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

(例如:我做了实验,在200eth0=192.168.30.200lo:0=192.168.30.149,如果arp_ignore0,那么从192.168.0.237发过来对192.168.30.149arp消息,200ech0也会相应,但是这个消息原本应该有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回应的网络接口来进行发送

问题2dr模式中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

                                                                                                                                                           永远完结,知识无止境,有疑问留言哦。http://my.oschina.net/loveleaf/blog/478662

你可能感兴趣的:(利用heartbeat+drbd实现HA,ldirectord健康检查后端realserver。)