全部博文(106)
分类: 架构设计与优化
2015-07-25 05:00:53
1.首先配置好yum[root@server5 ha.d]# cat /etc/yum.repos.d/rhel-source.repo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# Main rhel6.5 server
[base]
name=Instructor Server Repository
baseurl=
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
# HighAvailability rhel6.5
[HighAvailability]
name=Instructor HighAvailability Repository
baseurl=
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
# LoadBalancer packages
[LoadBalancer]
name=Instructor LoadBalancer Repository
baseurl=
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
# ResilientStorage
[ResilientStorage]
name=Instructor ResilientStorage Repository
baseurl=
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
# ScalableFileSystem
[ScalableFileSystem]
name=Instructor ScalableFileSystem Repository
baseurl=
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)。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
在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他不检
测出本身的其他服务和网络状态。
1
2
3
4
5
|
编辑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对外提供。
格式如下:
/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共享存储的简单配置》按照那上面的方法很快就完成了部署。补充连接:/blog/478662
配置好了以后呢
1
2
|
编辑/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
1
|
/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分别主机执行
1
2
|
配置 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配置
1
2
3
4
5
6
7
8
|
#!/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):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 添加健康检查
1
2
|
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地址一样对外通告的,不要搞得这么特殊.
问题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_ignore为1,那么即使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.1的arp查询会回应(转))
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默认的eth0的arp_ignore和arp_announce的值如果不是0,那么即使设置了all也有可能不会生效。这里需要特殊主义,建议加上如下两句
echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce
根据如上的叙述,RealServer的配置脚本应该改为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#!/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
|
永远完结,知识无止境,有疑问留言哦。/blog/478662