本文档采用的是lvs-DR模式,该模式的特点是客户端的请求从调度器进入分配到真实服务器,然后真实服务器的响应是直接交付给客户端的。
1.1 修改2个调度器的hosts文件
[root@LVS-1 ~]# vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
LVS-1 192.168.48.83
LVS-2 192.168.48.84
#!/bin/sh
# description: start LVS of Directorserver
VIP=192.168.48.88 (虚拟ip的地址)
RIP1=192.168.48.85 真实服务器1的ip地址
RIP2=192.168.48.86 真实服务器2的ip地址
#RIP3=221.236.28.106 如果有多个服务器节点的话,可以再这添加。
SERVICE=80 #http is used in this case
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "start LVS of DirectorServer"
# set ip_forward&send_redirects
echo "0" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/eth0/send_redirects
# set the Virtual IP Address
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:$SERVICE -s rr (如果需要session保持添加-p 默认保持300秒)
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP1:$SERVICE -g -w 1
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP2:$SERVICE -g -w 1
#/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP3:$SERVICE -g -w 1
/sbin/ipvsadm --set 30 120 300
#Run LVS
/sbin/ipvsadm
#end
;;
stop)
echo "close LVS Directorserver"
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
(-s rr 是使用了轮叫算法,可以自行选择相应的算法,更改rr就可以了,ipvsadm -h查看帮助。-g 是使用lvs工作DR直接路由模式,也可自行修改)
如果有多个realserver直接添加就可以了,之后启动此脚本就可以了。
lvs_switch代码
#!/bin/sh
# description: close lo:0 and arp_ignore
VIP=192.168.48.88 (虚拟ip的地址)
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "start director server and close lo:0"
#ifconfig lo:0 down
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
echo "start Real Server"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP 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
;;
*)
echo "Usage: lvs {start|stop}"
exit 1
esac
chmod +x /etc/ha.d/resource.d/lvs_dr
chmod +x /etc/ha.d/resource.d/lvs_switch
1.3.2 把ha.cf,haresources,authkeys,ldirectord.cf都复制到/etc/ha.d/
cp -rf /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d
cp -rf /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d
cp -rf /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d
cp -rf /usr/share/doc/heartbeat-ldirectord-2.1.3/ldirectord.cf /etc/ha.d
配置authkeys,
auth 3
#1 crc
#2 sha1 HI!
3 md5 Hello!
1,2,3表示认证算法选择,这里选择了md5算法
Authkeys的权限必须是0600。
chmod 0600 authkeys
配置haresources
该文件主节点和备份节点上要完全一致:
LVS-1 lvs_switch 192.168.48.88 lvs_dr ldirectord
语法格式:
主节点机器名 脚本名称 虚拟ip 脚本名称 ldirectord
注:节点名字就查看计算机名
uname -n (注节点必须写这个命令显示的名字)
(注:lvs_switch ,lvs_dr脚本必须位于/etc/init.d/或/etc/ha.d/resource.d下,且不能随机一启动)
配置ha.cf
debugfile /var/log/ha-debug debbug日志文件路径
logfile /var/log/ha-log heartbeat 日志文件路径
logfacility local0
keepalive 2 心跳检测时间间隔
#initdead 120 heartbeat第一次启动时启动其所控资源的时间
deadtime 10 多久没有检测到心跳时宣布死亡
warntime 10 指明心跳延迟的时间为十秒。当10秒钟内备份机不能联系上主机(当前活动的服务器,即无心跳信号),就会往日志中写入一个警告日志,但此时不会切换服务。
udpport 28855 heartbeat监听端口
#bcast eth0 # Linux心跳路径,最好不要与正常生产网络中的设备混在一起
#mcast eth0 225.0.0.1 694 1 0 #说明:采用udp多播播来通知心跳,建议在副节点不只一台时使用
ucast eth0 对端节点IP 采用网卡eth0的udp单播来通知心跳,ip应为对方IP
ucast eht0 192.168.48.84 (在备份dr上 这里的ip就写主dr的ip)
#注:广播,单播,多播,以上三种任选其一即可
#ping 192.168.1.1 ping我内部网关地址,主要是利用ipfail功能检测主服务器网络是否正常
auto_failback on 主节点重启成功后,资源是自动拿回到主节点还是等到副节点down调后拿回资源
watchdog /dev/watchdog 启动内核看门狗功能,能让系统在出现故障1分钟后重启该机器。这个功能可以帮助服务器在确实停止心跳后能够重新恢复心跳。如果使用该特性,则在内核中装入softdog内核模块,用来生成实际的设备文件,输入insmod softdog加载模块。
# stonith用来保证共享存储环境中的数据完整性
node 主节点机器名 (必须同uname -n返回的主机名相同)
node 备份节点机器名
node LVS-1
node LVS-2
配置ldirectord.cf
# Global Directives
checktimeout=3 超时时间
checkinterval=1 检测真实服务器的间隔
fallback=127.0.0.1:80
autoreload=yes 表示修改ldirectord.cf配置文件ldirectord自动加载
logfile="/var/log/ldirectord.log"
quiescent=yes 如果真实服务器失败,ldirectord所采取的动作,注意如果主里设为yes,则必须在内核中修改下列文件:
echo "1" >/proc/sys/net/ipv4/vs/expire_quiescent_template
echo "1" >/proc/sys/net/ipv4/vs/expire_nodest_conn
# Sample for an http virtual service
virtual=虚拟IP:80
real=(真实服务器IP1):80 gate
real=(真实服务器IP2):80 gate
real= 192.168.48.85:80 gate
real= 192.168.48.86:80 gate
fallback=127.0.0.1:80 gate 如果两台真实服务器都无效,则定向本机的lo地址
service=http 指定服务类型
request="lvstest.html" 检查真实服务器时用到的页面
receive="lvstest" 所请求页面内的内容
scheduler=rr 调度方法,rr表示循环调用
#persistent=600 tcp连接时间
#netmask=255.255.255.255
protocol=tcp 协议类型
checktype=negotiate ldirectord检测真实服务器的方式
checkport=80
request="lvstest.html"
receive="lvstest”
在http配置的根目录增加lvetest.html,文件内容是lvestest
在ftp配置的根目录增加lvetest.html,文件内容是lvestest
在/etc/rc.d/init.d/中新建一个脚本。
注:我会提供已经写好的脚本,只需复制就行了,脚本名字叫lvs_rs,复制到/etc/rc.d/init.d下(如下)
lvs_rs脚本代码
#!/bin/sh
# chkconfig: 2345 72 08
# description: Config realserver lo:0 port and apply arp patch
VIP=192.168.48.88 (这个是服务器虚拟ip地址)
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "lo:0 port starting"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP 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
;;
stop)
echo "lo:0 port closing"
ifconfig lo:0 down
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
chmod +x /etc/rc.d/init.d/lvs_rs
chkconfig --add lvs_rs
将lvs_dr和lvs_switch复制到/etc/ha.d/resource.d/
注:lvs_dr和lvs_switch的脚本我会提供。(如下)
主节点 备用节点都起动服务 service heartbeat start
/etc/ha.d/resource.d/ldirectord start
查看主lvs的ip信息,现在vip在主lvs上面。
[root@LVS-1 ha.d]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:8F:E7:BB
inet addr:192.168.48.83 Bcast:192.168.48.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe8f:e7bb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:89174618 errors:0 dropped:0 overruns:0 frame:0
TX packets:89490628 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1239724978 (1.1 GiB) TX bytes:1269730040 (1.1 GiB)
Interrupt:67 Base address:0x2000
eth1 Link encap:Ethernet HWaddr 00:0C:29:8F:E7:C5
inet addr:192.168.48.96 Bcast:192.168.48.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe8f:e7c5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:434447 errors:0 dropped:0 overruns:0 frame:0
TX packets:47667 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:102561548 (97.8 MiB) TX bytes:4773970 (4.5 MiB)
Interrupt:67 Base address:0x2080
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:283823 errors:0 dropped:0 overruns:0 frame:0
TX packets:283823 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:34704953 (33.0 MiB) TX bytes:34704953 (33.0 MiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.48.88 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
运行 watch ipvsadm -L -n 查看连接情况
你应该看到一个IPVS表:
关闭真实服务器上的Apache或断开它的网络连线测试ldirectord,在20秒内或你指定的checktimeout时间范围内,真实服务器的权重被设置为0,因此未来将不会有连接发向它
用vip访问只能访问到3个web站点了,因为192.168.48.86那台的httpd被我停了!
关掉主节点 查看备用节点是否能够接管 主节点的服务,通过ifconfig查看eth0:0的192.168.48.83会在某台服务器上分配上了,说明这台目前是活动服务器,而另外一台没有分配上
当我断掉lvs 主调度器后,权重指向了lvs-2
Vip现在也在eth0:0上面生效
当我恢复主lvs后,权重有继续回到主lvs上面
通过ifconfig发现两台机器都分配上了eth0:0的192.168.0.2这个虚拟IP,并在/var/log/syslog中产生大量日志:
WARN: nodename ha uuid changed to ha2
ERROR: should_drop_message: attempted replay attack
可能原因:ha和ha2的uuid改变引起,可能ha2是通过VMware克隆复制方式产生的或hostname设置在安装heartbeat之后
解决方案:让uuid重新生成,可以先卸载heartbeat,删除/var/lib/heartbeat目录(uuid文件就在这个目录下,该目录在卸载时不被删除,需手动删除,如果不手动删除,重新安装还会使用原来uuid)