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是没有作用的。
详见我的另一篇文章 《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
添加规则
#!/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
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
vim /etc/ha.d/haresources server5.example.com IPaddr::172.25.254.100/24/eth0 ldirectord httpd
启动hearbeat 尽情体验吧。
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.1 既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。
在lo上配置vip能够完成接收包并将结果返回client。
2.2 答案是不可以将VIP设置在出口网卡上,否则会响应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。
这个问题在上一问题中已经作了说明,这里结合实施命令进一步阐述。我们在具体实施部署的时候都会作如下调整:
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,那有可能是会出问题滴。
从第一个问题中大家应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,所以director必须和RS在同一网段里面。
5. 为什么director上lo接口除了VIP另外还要在eth0配一个ip(即DIP)?
5.1 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。
5.2 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。
不需要。因为director跟realserver是同一个网段,无需开启转发。
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的配置脚本应该改为:
#!/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
永远完结,知识无止境,有疑问留言哦。