实验环境: rhel6.3 iptables && selinux disabled
LB: 192.168.0.2
BACKUP: 192.168.0.3
RS1: 182.168.0.4
RS2:192.168.0.5
vip:192.168.0.100
192.168.0.2 && 192.168.0.3
软件包的安装与配置
#yum localinstall -y heartbeat-3.0.4-1.el6.x86_64.rpm \ heartbeat-libs-3.0.4-1.el6.x86_64.rpm \ heartbeat-devel-3.0.4-1.el6.x86_64.rpm \ ldirectord-3.9.2-1.2.x86_64.rpm \ perl-IO-Socket-INET6
复制所需要的配置文件到配置文件目录
#cd /usr/share/doc/heartbeat #cp authkeys ha.cf haresource /etc/ha.d/
主配置文件(/etc/ha.d/ha.cf):
debugfile /var/log/ha-debug ##调试日志文件文件,取默认值
logfile /var/log/ha-log ##系统运行日志文件,取默认值
logfacility local0 ##日志等级,取默认值
keepalive 2 ##心跳频率,自己设定。1:表示 1 秒;200ms:表示 200 毫秒
deadtime 30 ##节点死亡时间阀值,就是从节点在过了 30 后还没有收到心跳就认为主节点死亡,自己设定
warntime 10 ##发出警告时间,自己设定
initdead 120 ##守护进程首次启动后应该等待 120 秒后再启动主服务器上的资源
udpport 694 ##心跳信息传递的 udp 端口,使用端口 694 进行 bcast 和 ucast 通信,取默认值
#baud 19200 ##串口波特率,与 serial 一起使用。
#serial /dev/ttyS0 ## 采用串口来传递心跳信息。
bcast eth1 ##采用 udp 广播播来通知心跳
#ucast eth1 10.0.0.3 ##采用网卡 eth1 的 udp 单播来通知心跳,eth1 的 IP
#mcast eth0 225.0.0.1 694 1 0 ## 采用 udp 多播播来通知心跳
auto_failback on ##当主节点恢复后,是否自动切回
#stonith baytech /etc/ha.d/conf/stonith.baytech
stonith ##用来保证共享存储环境中的数据完整性
watchdog /dev/watchdog
watchdog 能让系统在出现故障 1 分钟后重启该机器,这个功能可以帮助服务器在确实停止心
跳后能够重新恢复心跳。 如果使用该特性,修改系统中/etc/modprobe.conf, 添加如下行
options softdog nowayout=0 ##这样在系统启动的时候,在内核中装入"softdog"内核模块,用来生成实际的设备文件
/dev/watchdog
node server2.example.com ##主节点名称,与 uname –n 保持一致。排在第一的默认为主节点,所以不要搞措顺序
node server3.example.com ##副节点名称,与 uname –n 保持一致
ping 192.168.0.254
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
##默认 heartbeat 并不检测除本身之外的其他任何服务,也不检测网络状况。
所以当网络中断时,并不会进行 Load Balancer 和 Backup 之间的切换。
可以通过 ipfail 插件,设置'ping nodes'来解决这一问题,但不能使用一个集群节点作为
ping 的节点。
资源文件(/etc/ha.d/haresources):
server2.example.com IPaddr::192.168.0.100/24/eth0 httpd ldirectord
##这个文件中定义了实现集群所需的各个软件的启动脚本,这些脚本必须放在/etc/init.d 或者
/etc/ha.d/resource.d 目录里 IPaddr 的作用是启动 Virutal IP,它是 HeartBeart 自带的一个
脚本;ldirectord 的作用是启动 ldirectord 监控程序,它会使 ldirectord.cf 中定义的 lvs 生效,
并监听其健康状;httpd 是 apache 服务的启动脚本
认证文件(/etc/ha.d/authkeys),文件的权限必须是 600(否则会出错):
auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!
分别在主备上启动heartbeat:
#/etc/init.d/heartbeat start #tail -f /var/log/ha-log #查看日志,是否出现了eth0:0接口,或者使用ifconfig查看是否有eth0:0出现。 #若停止 server2 上的 heartbeat 服务,则 servcer3 会接管,并产生一个 eth0:0 接口.
配置(/etc/ha.d/ldirectord.cf):
#rpm -qpl ldirectord-3.9.2-1.2.x86_64.rpm #cp /usr/share/doc/packages/ldirectord/ldirectord.cf /etc/ha.d/ #/etc/init.d/ldirectord start
查看rs的连接状态
#ipvsadm -ln
分别在 realserver 上执行以下命令:
配置 arp 机制:
#vi /etc/sysctl.conf net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2 #sysctl -p #ifconfig eth0:0 192.168.0.100 netmask 255.255.255.255 up #ip addr add 192.168.0.100 dev eth0
在使用 LVS 中的 DR 与 IP Tunnel 的时候,会需要有一块网络卡要设定两个 IP 的情形,但是
Linux 在 2.2.14 之后,就将 eth0:1 的-NOARP 这个 FLAG 关闭。也 就是说在 kernel 2.2.14
以后,eth0:1 就视为 eth0 的别名,任何对 eth0:1 的设定也同样作用在 eth0,换句话说,
我对 eth0:1 下-NOARP,同样 也会对 eth0 有作用,这样会使得整张网络卡收不到封包。
在 直接路由、 隧道模式下,因为我所有的机器都放在同一个网段,当该网段的 Router 接收
IP
到客户端(Client)对虚拟 IP(Virtual IP)的 TCP connection 要求时,会先在网段中利用 Arp
request 询问谁有 VIP 的地址,而包含 Director 与 RealServers 上所有的 interface(不管
Primary 还是 Subinterface),只要他有那个 ip,都会发送 arp reply 回去,造成网段内所
有拥有 Virtual IP 的 interface 都会 reply 给 Router,最后结果就是看谁的速度快,Router
就将该封包送给谁,如此会造成 LVS 的 Server 并无 法发挥其效果,
在每个 RealServer 的中添加监控页:
#echo `hostname` >> /var/www/html/index.html #/etc/init.d/httpd start
测试:
访问 http://192.168.0.100,看到页面在两个 realserver 上切换表示成功!
你也可以通过 ipvsadm -Lnc 查看详细连接情况!