文档章节

利用heartbeat+drbd实现HA,ldirectord健康检查后端realserver。

月黑风高杀人夜
 月黑风高杀人夜
发布于 2015/07/17 16:05
字数 3649
阅读 3715
收藏 78

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

© 著作权归作者所有

共有 人打赏支持
月黑风高杀人夜
粉丝 11
博文 112
码字总数 90868
作品 0
深圳
私信 提问
加载中

评论(7)

月黑风高杀人夜
月黑风高杀人夜

引用来自“neo-chen”的评论

Pacemaker 跟 keeplived
另外
Piranha 也不要用了redhat 以经放弃他。

多谢大神提点
netkiller-
netkiller-
Pacemaker 跟 keeplived
另外
Piranha 也不要用了redhat 以经放弃他。
月黑风高杀人夜
月黑风高杀人夜

引用来自“neo-chen”的评论

heartbeat 与 ldirectord 已经停止更新很多年了,建议不要在使用。

那现在用什么最稳定好用阿
netkiller-
netkiller-
heartbeat 与 ldirectord 已经停止更新很多年了,建议不要在使用。
开源中国最大五毛
开源中国最大五毛
drbd这样玩…
月黑风高杀人夜
月黑风高杀人夜

引用来自“change_solider”的评论

能概括一下,做这个的目标吗?
前面做了高可用,比如数据库的高可用,这两台高可用机子又做了后端realserver负载均衡的调度器。达成的效果就是前端一个坏了不影响调度,后端一个坏了还有一个能用。 自由发挥
change_solider
change_solider
能概括一下,做这个的目标吗?
lvs学习笔记

libnet下载地址: http://search.cpan.org/dist/libnet/ ipvsadm下载地址: http://www.linuxvirtualserver.org/software/ipvs.html#kernel-2.6 从Linux内核版本2.6起,ipvs code已经被整合进......

Mr_chen
2017/08/15
0
0
heartbeat+ldirectord+lvs实现高可用负载

Lvs + heartbeat+ldirectord高可用测试 1、实验环境 OS:centos 6.7 mini LVS mode :DR Heartbeat: version 2.1.4 Iptables:off Selinux:disabled Lvs master ip:192.168.6.122 Lvs bac......

Mr_chen
2017/09/04
0
0
Lvs+heartbeat高可用高性能web站点的搭建

这是我们公司在实际的生产环境当中使用的一套东西,希望对大家有所帮助(实际的公网ip,我已经做了相应的修改): 说明:每台服务器需要有两块网卡:eth0连接内网的交换机,用私网ip,实现服务器...

gehailong
2011/10/21
0
0
LVS+Heartbeat+Ldirectord

LVS+Heartbeat+Ldirectord 集群技术主要分为三大类: 高可用性(High Available Cluster),例:Linux-HA 负载均衡(Load balancing Cluster),例:LVS、MOSIX 高性能计算(High Performance Computi......

lee_ypp
2014/07/25
0
2
lvs + heatbeat +dr

环境描述:本文在配置 LVS时使用三台linux,虚拟VIP:192.168.62.111 一台做Directorserver(192.168.62.129 ),操作系统RedhatAS4 两台做realserver( 192.168.62 .5,192.168.62 .6 )操作...

三十那年
2012/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
2
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部