阿辉的博客

系统 网络 集群 数据库 分布式云计算等 研究

较全的lvs+ha文档(转CU) -> 集群配置基于高可用Lvs+heartbeat

二)集群配置基于高可用Lvs+heartbeat

主服务器配置: 
1- 修改/etc/hosts文件
192.168.1.196           ct1
192.168.1.197           ct2
192.168.1.191        xxx
192.168.1.192        xxxx
1- 修改haresources文件
ct1 IPaddr::192.168.1.198 lvsdr-basic ldirectord
a. 定义主服务器和主服务器eth0虚拟ip,
b. 定义heartbeat启动监控的服务 ,ldirectord   , lvsdr-basic
3- 修改authkeys文件   修改权限 chmod 600 authkeys
auth 1
1 crc
4- 修改ha.cf
   debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
deadtime 20
initdead 20
#bcast eth1 在eth1上发送心跳广播
ucast eth1 192.168.2.20
auto_failback on
node ct1
node ct2
ping_group group1 192.168.1.196 192.168.1.197
respawn root /usr/lib/heartbeat/ipfail    
apiauth ipfail gid=root uid=root

authkeys
这个配置文件非常简单,就是在auth选择一个值。每个值对应一种算法,这个算法是在主节点和从节点间数据校验用的。这个配置文件权限必须是0600。

chmod 0600 authkeys
配置文件的值如下:
auth 3
1 crc
#2 sha1 HI!
#3 md5 Hello!
haresources
这个文件配置的是节点要管理的资源也就你的高可用服务,这些资源在主节点down调时候,从节点就会开启这些资源。Heartbeat认为
你配置资源名称 start/stop
就可以开启/停止这些资源。所以让你的资源支持start/stop。其实这你只需要对你的应用服务作个脚本,脚本接受start参数就会启动应用服务, 接受stop参数就会停止服务。个人建议,你什么都不要做,就把应用程序名当作资源名就可以了,启动资源名的时候就自动启动你的服务了。而在down机的 时候,所有的程序都死了,根本就不需要heartbeat调用
你配置资源名称stop
命令来结束程序。
在文件中找到:
#node1   10.0.0.170 Filesystem::/dev/sda1::/data1::ext2
这一项,去掉#号,根据格式配置你的资源。第一字段(Node1):主节点名称(必须uname –n的保持一致);第二字段(10.0.0.170):对外虚拟服务IP;第三字段(Filesystem::/dev/sda1:: /data1::ext2):Filesystem表示资源名称,/dev/sda1表示资源启动时的第一个参数,/data1表示第二个参数, /ext2表示第三个参数,依此类推。

ha.cf
这个配置文件比较复杂。我只配了关键的几项:
debugfile /var/log/ha-debug
说明:调试日志文件文件,取默认值
logfile /var/log/ha-log
说明:系统运行日志文件,取默认值
logfacility local0
说明:日志等级,取默认值
keepalive 1
说明:心跳频率,自己设定。1:表示1秒;200ms:表示200毫秒
deadtime 10
说明:节点死亡时间阀值,就是从节点在过了10后还没有收到心跳就认为主节点死亡,自己设定
warntime 5
说明:发出警告时间,自己设定
udpport 28855
说明:心跳信息传递的udp端口,自己设定
#bcast eth0        # Linux
说明:采用udp广播播来通知心跳,建议在副节点不只一台时使用
ucast eth0 xxx
说明:采用网卡eth0的udp单播来通知心跳,eth0的IP
#mcast eth0 225.0.0.1 694 1 0
说明:采用udp多播播来通知心跳,建议在副节点不只一台时使用
auto_failback off
说明:主节点重启成功后,资源是自动拿回到主节点还是等到副节点down调后拿回资源
node heartbeat1
说明:主节点名称,与uname –n保持一致。排在第一的默认为主节点,所以不要搞措顺序
node heartbeat2
说明:副节点名称,与uname –n保持一致
watchdog /dev/watchdog
说明:看门狗。如果本节点在超过一分钟后还没有发出心跳,那么本节点自动重启

以上这些是我个人认为必配项,下面这些是可选项。
stonith baytech /etc/ha.d/conf/stonith.baytech
说明:主/副等所有节点的一种校验。
respawn userid /path/name/to/run
说明:和heartbeat必须一起启动的本地服务
ping 10.10.10.254
说明:伪节点IP,伪节点就是其失效时主/副节点不会正常工作但本身不是主/副节点之一。
respawn hacluster /usr/lib/heartbeat/ipfail
说明:与ping选项一起使用,取默认值。
baud 19200
说明:串口波特率,与serial一起使用。
serial /dev/ttyS0   # Linux
说明:采用串口来传递心跳信息。

ldirectord.cf
   checktimeout=3
checkinterval=1
autoreload=no
logfile="/var/log/ldirectord.log"
quiescent=no
virtual=192.168.1.198:80
       real=192.168.1.191:80 gate
       real=192.168.1.192:80 gate
       service=http // 服务名称http
       request="test.html" //   lvs服务器测试代码
       receive="Test"        //
       scheduler=sh // 按照source hash 调度
       protocol=tcp
在192,191机器apache htdocs里建立test.html文件 输入Test 确保web页面可访问

checktimeout=3   (一个真实的服务器被认为出错所需的时间间隔)
checkinterval=1 (发出检查的时间间隔)
#autoreload=no (自动重载,默认值是no,选yes时配置文件发生变化后就会自动载入)
#callback=配置文件的路径(用来重载配置文件)
fallback=127.0.0.1:80 (当所有的真实服务器出错时,web服务重定向的地址)
#logfile="/var/log/ldirectord.log" (日志文件的目录)
#logfile="local0"
#execute=”configuration”(为这个配置文件启动ldirectord的实例)
quiescent=yes(当选择yes时,一台真实服务器down以后,并不是把它从lvs的表中删除,而是把它的权值设为0,新的链接将不可达)
virtual=192.168.1.198:80   (虚拟的ip和端口号)
real=192.168.1.191:80 gate ( 真实的服务器)  
real=192.168.1.192:80 gate
fallback=127.0.0.1:80 gate
checktype=negotiate(检测类型,默认为negotiate)
service=http
checkport:80 (检查的端口号)
request="test.html" (负载平衡机将查询实际server的服务目录下面是不是 有该文件,如果有说明server还是在服务的,没有将认为它已经出错)
receive="Test "
scheduler=rr   (调度算法)
#persistent=600
#netmask=255.255.255.255
protocol=tcp (协议)
3.        启动
输入 ldirectord start 启动服务,ldirectord stop停止服务,ldirectord rload 重新载入配置信息。

同样   bak服务器也配置如上。  
另外,bak服务 cd /etc/ha.d
            ln –s tmp/harc .
/etc/rc.d/rc.local 中写入 /etc/init.d/heartbeat start
主服务器rc.local 中写入 /etc/init.d/lvsdr-basic start
                  /etc/init.d/heartbeat start
内网服务器可关闭iptables
公网服务器最好是heartbeat通讯口专用   iptables相对应的网口过滤

Ok 到此为止 高可用配完

较全的lvs+ha文档(转CU) -> 配置基于DR模式Lvs集群

近期配了几个lvs 一是给自己个小结
二是 所查网上lvs 大多陈旧 或语焉不详 所以补个较新的 有不对之处请大家指正

vip :
192.168.1.198
虚拟ip
master:192.168.1.196
主分发服务器
slave:
192.168.1.197
备份分发服务器
real1:
192.168.1.191
响应服务器1
real2:
192.168.1.192
响应服务器2

实现以下目的
一)配置基于DR模式简单Lvs
集群配置基于隧道模式Lvs
二)集群配置基于高可用Lvs+heartbeat
三)双机lvs-ha

一、
配置基于DR模式Lvs集群

1、下载ipvsadm管理程序
ipvsadm-*.tar.gz

tar zxvf ipvsadm-*.tar.gz
cd ipvsadm-*
make && make install

注意在make时可能会出现很多错误的信息,请按照如下操作就可以心编译正常
ln -s /usr/src/kernels/2.6.9-22.EL-i686//usr/src/linux

cd ipvsadm-*

make && make install
我机器是centos4
所以我yum安装
yum -y install ipvsadm
# ipvs管理器

yum -y installlibnet
# 库文件
yum -y install e2fsprogs
# 库文件
yum -y installheartbeat
# linux-ha
yum –y installheartbeat-ldirectord

cp/usr/share/doc/heartbeat-2.1.*/ha.cf /etc/ha.d/
cp/usr/share/doc/heartbeat-2.1.*/authkeys /etc/ha.d/
cp/usr/share/doc/heartbeat-2.1.*/haresources /etc/ha.d/
cp /usr/share/doc/heartbeat-ldirectord-2.1.*/ldirectord.cf/etc/ha.d/

2、配置VIP脚本

[root@ct1 ~]# more/etc/init.d/lvsdr-basic
#!/bin/sh
#
# This script willbe executed *after* all the other init scripts.
# You can put yourown initialization stuff in here if you don’t
# want to do thefull Sys V style init stuff.

VIP=192.168.1.198
RIP1=192.168.1.191
RIP2=192.168.1.192
###########################
# ifconfig a
#
#/sbin/ifconfigeth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
#
############################

#/sbin/route add-host $VIP dev eth0:0
#echo "1"> /proc/sys/net/ipv4/ip_forward

/etc/rc.d/init.d/functions

case "$1"in

start)

echo "startLVS of DirectorServer"
#Set the Virtual IPAddress

/sbin/ifconfigeth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add-host $VIP dev eth0:1

#Clear IPVS Table

/sbin/ipvsadm -C

#Set Lvs

/sbin/ipvsadm -A -t$VIP:80 -s rr

/sbin/ipvsadm -a -t$VIP:80 -r $RIP1:80 -g

/sbin/ipvsadm -a -t$VIP:80 -r $RIP2:80 -g

#Run Lvs

/sbin/ipvsadm

;;

stop)

echo "closeLVS Directorserver"

/sbin/ipvsadm -C

;;

*)
echo "Usage:$0 {start|stop}"

exit 1

esac

下例是其他类似的lvsdr配置文件

more /etc/init.d/lvsDR
#!/bin/sh
# description: start LVS of   Directorserver
VIP=192.168.1.198
RIP1=192.168.1.191
RIP2=192.168.1.192

. /etc/rc.d/init.d/functions

case "$1" in
start)
       echo " start LVS   ofDirectorServer"
   # set the Virtual   IP Address
   /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask255.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:80 -s rr   (如果需要session保持添加-p 默认保持300秒)
   /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
   /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
   #/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g
   #Run LVS
   /sbin/ipvsadm
   #end

       ;;
stop)
       echo "close LVS Directorserver"
       /sbin/ipvsadm -C
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

隧道模式
(tun )
more /etc/init.d/tunlvs
#!/bin/sh
# description: start LVS of   Directorserver
VIP=192.168.1.198
RIP1=192.168.1.191
RIP2=192.168.1.192

. /etc/rc.d/init.d/functions

case "$1" in
start)
       echo " start LVS   ofDirectorServer"
   # set the Virtual   IP Address
   /sbin/ifconfig tunl0 $VIP broadcast $VIP netmask255.255.255.255 up
   /sbin/route add -host $VIP dev tunl0
   #Clear IPVS table
   /sbin/ipvsadm -C
   #set LVS
   /sbin/ipvsadm -A -t $VIP:80 -s rr
   /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -i
   /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -i
   #/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -i
   #Run LVS
   /sbin/ipvsadm
   #end

       ;;
stop)
       echo "close LVS Directorserver"
       ifconfig tunl0 down
       /sbin/ipvsadm -C
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

(-s rr 是使用了轮叫算法,可以自行选择相应的算法,更改rr就可以了,ipvsadm -h查看帮助。-g 是使用lvs工作DR直接路由模式,也可自行修改)
如果有多个realserver直接添加就可以了,之后启动此脚本就可以了。
NAT用法本来是因为网络IP地址不足而把内部保留IP地址通过映射转换成公网地址的一种上网方式(原地址NAT)。如果把NAT的过程稍微变化,就可以 成为负载均衡的一种方式。原理其实就是把从客户端发来的IP包的IP头目的地址在DR上换成其中一台REAL SERVER的IP地址并发至此REALSERVER,而REAL SERVER则在处理完成后把数据经过DR主机发回给客户端,DR在这个时候再把数据包的原IP地址改为DR接口上的IP地址即可。期间,无论是进来的流 量,还是出去的流量,都必须经过DR。
隧道模式则类似于VPN的方式,使用网络分层的原理,在从客户端发来的数据包的基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给REAL SERVER,REAL SERVER收到后,先把DR发过来的数据包的头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。
直接路由模式比较特别,很难说和什么方面相似,前2种模式基本上都是工作在网络层上(三 层),而直接路由模式则应该是工作在数据链路层上(二层)。其原理为,DR和REAL SERVER都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有REALSERVER对本身这个IP的ARP请求保持静默。也就是说,网关 会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REALSERVER。这时REAL SERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于DR要对二层包头进行改换,所以DR和 REALSERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

3、配置realserver脚本

#!/bin/bash
#description : start realserver
VIP=192.168.1.198
/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
#end
此脚本使realserver不响应arp请求,将此脚本分别在realserver上执行就可以了。Ok后写入rc.local

测试:分别启动realserver上的httpd服务
在realserver1 执行   echo "191"   /var/www/html/index.html
在realserver2 执行   echo "192"   /var/www/html/index.html

打开浏览器输入http://192.168.1.198   应该可以分别看到:191 和 192.

以上是最简单的lvs 。   一个dr ,2个real 。 2个配置文件,几个rpm包。
我们需要的是高可用,主备dr,master down后 bak自动接管, master启动后bak交出管理权。
现在我们开始配置这样的lvs。 cluster.JPG (27.07 KB) 2008-7-2 15:12

Heartbeat_2.0.3配置MySQL5.0.18为高可用集群(转自CU)

测试环境为:rehdat linux 9.0
hostname    eth0                eth1   
mysql5       192.168.0.50/24        10.4.66.35/24
mysql6       192.168.0.60/24        10.4.66.36/24

heartbeat interface eth0, with crosscab
service ip 10.4.66.88/24, by eth1, default gateway 10.4.66.2

共享存储采用NAS服务器,数据访问地址为10.4.66.251:/data
在服务器本地的挂在目录也是/data

1. 安装MySQL5.0,安装到默认目录
清除准备安装MySQL的服务器上linux自带的mysql-server,
[root@c0101 bin]# rpm -e mysql-server
[root@c0101 bin]# rpm -qa|grep mysql
mysql-3.23.54a-11

[root@c0101 bin]# userdel mysql
[root@c0101 bin]# mv /etc/my.cnf /etc/my.cnf.bak

(1)首先在第一台服务器(HA系统的主节点服务器),
开始安装
1056   useradd mysql
1057   tar xzvf mysql-max-5.0.18-linux-i686-glibc23.tar.gz
1059   mv mysql-max-5.0.18-linux-i686-glibc23 /usr/local/mysql
1060   cd /usr/local/mysql
1088   chown -R root .
1089   chown -R mysql ./data/
1090   chgrp -R mysql .

设置数据路径,把数据库数据文件放在共享的NFS目录下(NAS服务器),
PID和innioDB文件要放到服务器本地目录上,才能正常启动、停止服务:
1125   vi /etc/my.cnf
[mysqld]
#Where to install a database data
datadir=/data/mysqldata

#Where to install a innoDB engine
innodb_data_home_dir = /usr/local/mysql/data
innodb_log_group_home_dir= /usr/local/mysql/data
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

1106   cp ./support-files/mysql.server /etc/rc.d/init.d/
vi /etc/rc.d/init.d/mysql.server
编译第222开始的相关的两行,把PID文件放在服务器本地目录上:
pid_file=/usr/local/mysql/data/mysqlmanager-`/bin/hostname`.pid
server_pid_file=/usr/local/mysql/data/`/bin/hostname`.pid

安装MySQL的基本数据库:
1123   mount 10.4.66.251:/data /data
1124   mkdir /data/mysqldata
1127   ./scripts/mysql_install_db –user=mysql
1145   chown -R mysql.mysql /data/mysqldata/

如果正常的话,可以看到mysql正常启动了;

1146   /etc/rc.d/init.d/mysql.server   start
1146   /etc/rc.d/init.d/mysql.server   stop

配置HA高可用,不要设置NFS挂载和mysql服务在启动服务器时自动运行;

(2)然后在第二台服务器(HA系统的备份节点服务器),

1090   tar xzvf mysql-max-5.0.18-linux-i686-glibc23.tar.gz
1092   mv mysql-max-5.0.18-linux-i686-glibc23 /usr/local/mysql
1093   cd /usr/local/mysql/
1095   chown -R root .
1096   chown -R mysql ./data/
1097   chgrp -R mysql .
  
设置数据路径,把数据库数据文件放在共享的NFS目录下(NAS服务器),
PID和innioDB文件要放到服务器本地目录上,才能正常启动、停止服务:
1125   vi /etc/my.cnf
[mysqld]
#Where to install a database data
datadir=/data/mysqldata

#Where to install a innoDB engine
innodb_data_home_dir = /usr/local/mysql/data
innodb_log_group_home_dir= /usr/local/mysql/data
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

1106   cp ./support-files/mysql.server /etc/rc.d/init.d/
vi /etc/rc.d/init.d/mysql.server
编译第222开始的相关的两行,把PID文件放在服务器本地目录上:
pid_file=/usr/local/mysql/data/mysqlmanager-`/bin/hostname`.pid
server_pid_file=/usr/local/mysql/data/`/bin/hostname`.pid

在NFS目录/data/下,已经有了基本数据库,所以只需要
设置一下,就可以启动了,
1123   mount 10.4.66.251:/data /data
1149   /etc/rc.d/init.d/mysql.server start

如果首次启动失败,察看一下日志,
使用ps -A命令查看进程,杀掉失败的进程,应该可以正常启动的;
killall -9 mysqld_safe
killall -9 mysqld

(3)保证在两台服务器上,都可以正常启动、停止MySQL服务,
由于数据共享的原因,要注意保证,同时只有1台服务器启动MySQL服务
/etc/rc.d/init.d/mysql.server start
/etc/rc.d/init.d/mysql.server stop

2.安装Heartbeat HA,安装到默认目录,
两台服务器安装方法相同:

(1)安装libnet,这是编译Heartbeat HA需要的:
1046   tar xzvf libnet.tar.gz
1047   cd libnet
1048   ls
1049   ./configure
1051   make
1052   make install

(2)编译安装Heartbeat HA
1019   groupadd haclient
1020   useradd hacluster -g haclient
1058   tar xzvf heartbeat-2.0.3.tar.gz
1059   ls
1060   cd heartbeat-2.0.3
1061   ls
1062   ./ConfigureMe configure
1063   make
1064   make install

3. 编辑Heartbeat HA的三个配置文件,配置MySQL的HA服务
两台服务器配置方法相同:

1067   cd /etc/ha.d
1068   cp /root/heartbeat-2.0.3/doc/ha.cf .
1069   vi ha.cf
logfile /var/log/ha-log # Log file
keepalive 2          # Heartbeat interval
deadtime 30          # How long to say the server’s death
warntime 10

udpport 694          # Heartbeat port
bcast eth0          # Linux Heartbeat interface

auto_failback on        # How to do when the failure server comes back
node mysql5          # How many servers in the HA system
node mysql6
ping 10.4.66.2       #ping a robust server to ensure the server’s health;
                     #here is the default gateway
respawn hacluster /usr/lib/heartbeat/ipfail

配置心跳的加密,本次测试因为采用交叉电缆,所以采用最简单的crc方式:
1076   cp /root/heartbeat-2.0.3/doc/authkeys .
1077   vi authkeys
auth 1
1 crc

1078   chmod 600 authkeys

1073   cp /root/heartbeat-2.0.3/doc/haresources .

配置资源,本次测试mysql服务的迁移,配置资源文件是关键
1074   vi haresources
mysql5 IPaddr::10.4.66.88/24/eth1 Filesystem::10.4.66.251:/data::/data::nfs mysql.server
这一行配置了3个资源,第一个是IP地址,第二个是NFS共享数据,
第三个是mysql.server服务,文件在/etc/rc.d/init.d/目录,
可以使用mysql.server start或stop来启动或停止服务。

4.设置Heartbeat HA服务自动启动,
heartbeat会自动把/data目录挂载,会自动启动MySQL Server;
配置HA高可用,不要设置NFS挂载和mysql服务在启动服务器时自动运行,
也就是说,把与HA相关资源交给Heartbeat HA去自动管理,
cd /etc/rc.d/rc0.d ; ln -s ../init.d/heartbeat K05heartbeat
cd /etc/rc.d/rc3.d ; ln -s ../init.d/heartbeat S75heartbeat
cd /etc/rc.d/rc5.d ; ln -s ../init.d/heartbeat S75heartbeat
cd /etc/rc.d/rc6.d ; ln -s ../init.d/heartbeat K05heartbeat

可以拔掉主节点服务器的网线,看看有什么情况发生,测试是否正常?
然后再把网线插回去,看看HA服务是否运行,MySQL服务能否自动切换回来?

各位网友如有指点之处,请发送邮件

使用 Linux Virtual Server 和 Linux-HA.org 的 Heartbeat 进行构建和运行Web服务器集群(三)

故障诊断

活动节点在一个 HA 集群中不能正常运作有多种原因,自愿的或非自愿的。节点可能丢失与其他节点的网络连接,heartbeat 进程可能被停止,可能出现任何环境事件等等。要故意地让活动节点失效,您可以要求该节点暂停,或将其设为备用模式,方法是使用 hb_gui(完全关闭)命令。如果您希望测试环境的健壮性,您可能需要一些更激进的方式。

指示器和故障恢复

系统管理员可以使用两种日志文件指示器配置 Linux HA heartbeat 系统。日志文件与系统是否为浮动资源 IP 地址的接收方有关。没有接收浮动资源 IP 地址的集群成员的日志结果类似于:

清单 10. 落选者的日志结果

litsha21:~ # cat /var/log/messages

Jan 16 12:00:20 litsha21 heartbeat: [3057]: WARN: node litsha23: is dead

Jan 16 12:00:21 litsha21 cib: [3065]: info: mem_handle_event: Got an event

OC_EV_MS_NOT_PRIMARY from ccm

Jan 16 12:00:21 litsha21 cib: [3065]: info: mem_handle_event: instance=13, nodes=3,

new=1, lost=0, n_idx=0, new_idx=3, old_idx=6

Jan 16 12:00:21 litsha21 crmd: [3069]: info: mem_handle_event: Got an event

OC_EV_MS_NOT_PRIMARY from ccm

Jan 16 12:00:21 litsha21 crmd: [3069]: info: mem_handle_event: instance=13, nodes=3,

new=1, lost=0, n_idx=0, new_idx=3, old_idx=6

Jan 16 12:00:21 litsha21 crmd: [3069]: info: crmd_ccm_msg_callback:callbacks.c Quorum

lost after event=NOT PRIMARY (id=13)

Jan 16 12:00:21 litsha21 heartbeat: [3057]: info: Link litsha23:eth1 dead.

Jan 16 12:00:38 litsha21 ccm: [3064]: debug: quorum plugin: majority

Jan 16 12:00:38 litsha21 ccm: [3064]: debug: cluster:linux-ha, member_count=2,

member_quorum_votes=200

Jan 16 12:00:38 litsha21 ccm: [3064]: debug: total_node_count=3,

total_quorum_votes=300

……………… Truncated For Brevity ………………

Jan 16 12:00:40 litsha21 crmd: [3069]: info: update_dc:utils.c Set DC to litsha21

(1.0.6)

Jan 16 12:00:41 litsha21 crmd: [3069]: info: do_state_transition:fsa.c litsha21:

State transition S_INTEGRATION ->

S_FINALIZE_JOIN [ input=I_INTEGRATED cause=C_FSA_INTERNAL

origin=check_join_state ]

Jan 16 12:00:41 litsha21 crmd: [3069]: info: do_state_transition:fsa.c All 2 cluster

nodes responded to the join offer.

Jan 16 12:00:41 litsha21 crmd: [3069]: info: update_attrd:join_dc.c Connecting to

attrd…

Jan 16 12:00:41 litsha21 cib: [3065]: info: sync_our_cib:messages.c Syncing CIB to

all peers

Jan 16 12:00:41 litsha21 attrd: [3068]: info: attrd_local_callback:attrd.c Sending

full refresh

……………… Truncated For Brevity ………………

Jan 16 12:00:43 litsha21 pengine: [3112]: info: unpack_nodes:unpack.c Node litsha21

is in standby-mode

Jan 16 12:00:43 litsha21 pengine: [3112]: info: determine_online_status:unpack.c Node

litsha21 is online

Jan 16 12:00:43 litsha21 pengine: [3112]: info: determine_online_status:unpack.c Node

litsha22 is online

Jan 16 12:00:43 litsha21 pengine: [3112]: info: IPaddr_1

(heartbeat::ocf:IPaddr): Stopped

Jan 16 12:00:43 litsha21 pengine: [3112]: notice: StartRsc:native.c litsha22

Start IPaddr_1

Jan 16 12:00:43 litsha21 pengine: [3112]: notice: Recurring:native.c litsha22

IPaddr_1_monitor_5000

Jan 16 12:00:43 litsha21 pengine: [3112]: notice: stage8:stages.c Created transition

graph 0.

……………… Truncated For Brevity ………………

Jan 16 12:00:46 litsha21 mgmtd: [3070]: debug: update cib finished

Jan 16 12:00:46 litsha21 crmd: [3069]: info: do_state_transition:fsa.c litsha21:

State transition S_TRANSITION_ENGINE ->

S_IDLE [ input=I_TE_SUCCESS cause=C_IPC_MESSAGE origin=do_msg_route ]

Jan 16 12:00:46 litsha21 cib: [3118]: info: write_cib_contents:io.c Wrote version

0.53.593 of the CIB to disk (digest: 83b00c386e8b67c42d033a4141aaef90)

如清单 10 所示,获取了一份名单,有足够的 quorum 成员可以投票。获取投票,不需要执行其他操作即可恢复正常运作。

相反,接收了浮动资源 IP 地址的集群成员的日志结果如下:

清单 11. 资源持有者的日志文件

litsha22:~ # cat /var/log/messages

Jan 16 12:00:06 litsha22 syslog-ng[1276]: STATS: dropped 0

Jan 16 12:01:51 litsha22 heartbeat: [3892]: WARN: node litsha23: is dead

Jan 16 12:01:51 litsha22 heartbeat: [3892]: info: Link litsha23:eth1 dead.

Jan 16 12:01:51 litsha22 cib: [3900]: info: mem_handle_event: Got an event

OC_EV_MS_NOT_PRIMARY from ccm

Jan 16 12:01:51 litsha22 cib: [3900]: info: mem_handle_event: instance=13, nodes=3,

new=3, lost=0, n_idx=0, new_idx=0, old_idx=6

Jan 16 12:01:51 litsha22 crmd: [3904]: info: mem_handle_event: Got an event

OC_EV_MS_NOT_PRIMARY from ccm

Jan 16 12:01:51 litsha22 crmd: [3904]: info: mem_handle_event: instance=13, nodes=3,

new=3, lost=0, n_idx=0, new_idx=0, old_idx=6

Jan 16 12:01:51 litsha22 crmd: [3904]: info: crmd_ccm_msg_callback:callbacks.c Quorum

lost after event=NOT PRIMARY (id=13)

Jan 16 12:02:09 litsha22 ccm: [3899]: debug: quorum plugin: majority

Jan 16 12:02:09 litsha22 crmd: [3904]: info: do_election_count_vote:election.c

Election check: vote from litsha21

Jan 16 12:02:09 litsha22 ccm: [3899]: debug: cluster:linux-ha, member_count=2,

member_quorum_votes=200

Jan 16 12:02:09 litsha22 ccm: [3899]: debug: total_node_count=3,

total_quorum_votes=300

Jan 16 12:02:09 litsha22 cib: [3900]: info: mem_handle_event: Got an event

OC_EV_MS_INVALID from ccm

Jan 16 12:02:09 litsha22 cib: [3900]: info: mem_handle_event: no mbr_track info

Jan 16 12:02:09 litsha22 cib: [3900]: info: mem_handle_event: Got an event

OC_EV_MS_NEW_MEMBERSHIP from ccm

Jan 16 12:02:09 litsha22 cib: [3900]: info: mem_handle_event: instance=14, nodes=2,

new=0, lost=1, n_idx=0, new_idx=2, old_idx=5

Jan 16 12:02:09 litsha22 cib: [3900]: info: cib_ccm_msg_callback:callbacks.c

LOST: litsha23

Jan 16 12:02:09 litsha22 cib: [3900]: info: cib_ccm_msg_callback:callbacks.c

PEER: litsha21

Jan 16 12:02:09 litsha22 cib: [3900]: info: cib_ccm_msg_callback:callbacks.c

PEER: litsha22

……………… Truncated For Brevity ………………

Jan 16 12:02:12 litsha22 crmd: [3904]: info: update_dc:utils.c Set DC to litsha21

(1.0.6)

Jan 16 12:02:12 litsha22 crmd: [3904]: info: do_state_transition:fsa.c litsha22:

State transition S_PENDING -> S_NOT_DC [ input=I_NOT_DC cause=C_HA_MESSAGE

origin=do_cl_join_finalize_respond ]

Jan 16 12:02:12 litsha22 cib: [3900]: info: cib_diff_notify:notify.c Update (client:

3069, call:25): 0.52.585 ->

0.52.586 (ok)

……………… Truncated For Brevity ………………

Jan 16 12:02:14 litsha22 IPaddr[3998]: INFO: /sbin/ifconfig eth0:0 192.168.71.205

netmask 255.255.255.0 broadcast 192.168.71.255

Jan 16 12:02:14 litsha22 IPaddr[3998]: INFO: Sending Gratuitous Arp for

192.168.71.205 on eth0:0 [eth0]

Jan 16 12:02:14 litsha22 IPaddr[3998]: INFO: /usr/lib64/heartbeat/send_arp -i 500 -r

10 -p

/var/run/heartbeat/rsctmp/send_arp/send_arp-192.168.71.205 eth0 192.168.71.205 auto

192.168.71.205 ffffffffffff

Jan 16 12:02:14 litsha22 crmd: [3904]: info: process_lrm_event:lrm.c LRM operation

(3) start_0 on IPaddr_1 complete

Jan 16 12:02:14 litsha22 kernel: send_arp uses obsolete (PF_INET,SOCK_PACKET)

Jan 16 12:02:14 litsha22 kernel: klogd 1.4.1, ———- state change ———-

Jan 16 12:02:14 litsha22 kernel: NET: Registered protocol family 17

Jan 16 12:02:15 litsha22 crmd: [3904]: info: do_lrm_rsc_op:lrm.c Performing op

monitor on IPaddr_1 (interval=5000ms, key=0:f9d962f0-4ed6-462d-a28d-e27b6532884c)

Jan 16 12:02:15 litsha22 cib: [3900]: info: cib_diff_notify:notify.c Update (client:

3904, call:18): 0.53.591 ->

0.53.592

(ok)

Jan 16 12:02:15 litsha22 mgmtd: [3905]: debug: update cib finished

如清单 11 所示,/var/log/messages 文件展示了此节点已经获得了浮动资源。ifconfig 行显示将动态创建 eth0:0 设备以维持服务。

如清单 11 所示,获取了一份名单,有足够的 quorum 成员可以投票。获取投票后,发出的 ifconfig 命令索要浮动资源 IP 地址。

另外一种指示何时发生故障的方法是,您可以登录到任何一个集群成员并执行 hb_gui 命令。使用这种方法,您可以通过亲自查找拥有浮动资源的系统来确定故障发生时间。

最后,如果我们不展示一个非 quorum 情形的样例日志文件似乎有些说不过去。如果某个单一节点无法与任何一个其他节点进行通信,那么它就丢失了 quorum(因为在 3 个成员的投票中 2/3 是多数)。在这种情况下,节点获悉已丢失 quorum,然后调用 no quorum policy 处理程序。清单 12 展示了一个来自这类事件的日志文件示例。丢失 quorum 时,日志条目将会有所显示。显示此日志条目的集群节点认为自己不具有浮动资源。ifconfig down 语句将释放资源。

清单 12. 显示丢失 quorum 的日志条目

litsha22:~ # cat /var/log/messages

………………..

Jan 16 12:06:12 litsha22 ccm: [3899]: debug: quorum plugin: majority

Jan 16 12:06:12 litsha22 ccm: [3899]: debug: cluster:linux-ha, member_count=1,

member_quorum_votes=100

Jan 16 12:06:12 litsha22 ccm: [3899]: debug: total_node_count=3,

total_quorum_votes=300

……………… Truncated For Brevity ………………

Jan 16 12:06:12 litsha22 crmd: [3904]: info: crmd_ccm_msg_callback:callbacks.c Quorum

lost after event=INVALID (id=15)

Jan 16 12:06:12 litsha22 crmd: [3904]: WARN: check_dead_member:ccm.c Our DC node

(litsha21) left the cluster

……………… Truncated For Brevity ………………

Jan 16 12:06:14 litsha22 IPaddr[5145]: INFO: /sbin/route -n del -host 192.168.71.205

Jan 16 12:06:15 litsha22 lrmd: [1619]: info: RA output: (IPaddr_1:stop:stderr)

SIOCDELRT: No such process

Jan 16 12:06:15 litsha22 IPaddr[5145]: INFO: /sbin/ifconfig eth0:0 192.168.71.205

down

Jan 16 12:06:15 litsha22 IPaddr[5145]: INFO: IP Address 192.168.71.205 released

Jan 16 12:06:15 litsha22 crmd: [3904]: info: process_lrm_event:lrm.c LRM operation

(6) stop_0 on IPaddr_1 complete

Jan 16 12:06:15 litsha22 cib: [3900]: info: cib_diff_notify:notify.c Update (client:

3904, call:32): 0.54.599 ->

0.54.600 (ok)

Jan 16 12:06:15 litsha22 mgmtd: [3905]: debug: update cib finished

如清单 12 所示,当某个给定节点丢失 quorum 时,它将放弃所有资源,因为选择了 no quorum policy 配置。是否选择 no quorum policy 完全取决于您自己。

Fail-back 动作和消息

正确配置的 Linux HA 系统的一个更有趣的含义是,您不需要执行任何操作就可重新实例化集群成员。只需要激活 Linux 实例即可让节点自动地重新加入其他节点。如果您配置了一个主节点(即,一个可以优先于其他节点获得浮动资源的节点),它将自动重新获得浮动资源。非优先的 系统将只是加入合格节点池并正常运作。

将其他的 Linux 实例往回添加到池中将使每个节点获得通知,并且如果可能的话,重新建立 quorum。如果可以重新建立 quorum,那么将在某个节点上重新建立浮动资源。

清单 13. 重新建立 Quorum

litsha22:~ # tail -f /var/log/messages

Jan 16 12:09:02 litsha22 heartbeat: [3892]: info: Heartbeat restart on node litsha21

Jan 16 12:09:02 litsha22 heartbeat: [3892]: info: Link litsha21:eth1 up.

Jan 16 12:09:02 litsha22 heartbeat: [3892]: info: Status update for node litsha21:

status init

Jan 16 12:09:02 litsha22 heartbeat: [3892]: info: Status update for node litsha21:

status up

Jan 16 12:09:22 litsha22 heartbeat: [3892]: debug: get_delnodelist: delnodelist=

Jan 16 12:09:22 litsha22 heartbeat: [3892]: info: Status update for node litsha21:

status active

Jan 16 12:09:22 litsha22 cib: [3900]: info: cib_client_status_callback:callbacks.c

Status update: Client litsha21/cib now has status [join]

Jan 16 12:09:23 litsha22 heartbeat: [3892]: WARN: 1 lost packet(s) for [litsha21]

[36:38]

Jan 16 12:09:23 litsha22 heartbeat: [3892]: info: No pkts missing from litsha21!

Jan 16 12:09:23 litsha22 crmd: [3904]: notice:

crmd_client_status_callback:callbacks.c Status update: Client litsha21/crmd now has

status [online]

………………..

Jan 16 12:09:31 litsha22 crmd: [3904]: info: crmd_ccm_msg_callback:callbacks.c Quorum

(re)attained after event=NEW MEMBERSHIP (id=16)

Jan 16 12:09:31 litsha22 crmd: [3904]: info: ccm_event_detail:ccm.c NEW MEMBERSHIP:

trans=16, nodes=2, new=1, lost=0 n_idx=0, new_idx=2, old_idx=5

Jan 16 12:09:31 litsha22 crmd: [3904]: info: ccm_event_detail:ccm.c CURRENT:

litsha22 [nodeid=1, born=13]

Jan 16 12:09:31 litsha22 crmd: [3904]: info: ccm_event_detail:ccm.c CURRENT:

litsha21 [nodeid=0, born=16]

Jan 16 12:09:31 litsha22 crmd: [3904]: info: ccm_event_detail:ccm.c NEW:

litsha21 [nodeid=0, born=16]

Jan 16 12:09:31 litsha22 cib: [3900]: info: cib_diff_notify:notify.c Local-only

Change (client:3904, call: 35):

0.54.600 (ok)

Jan 16 12:09:31 litsha22 mgmtd: [3905]: debug: update cib finished

………………..

Jan 16 12:09:34 litsha22 crmd: [3904]: info: update_dc:utils.c Set DC to litsha22

(1.0.6)

Jan 16 12:09:35 litsha22 cib: [3900]: info: sync_our_cib:messages.c Syncing CIB to

litsha21

Jan 16 12:09:35 litsha22 crmd: [3904]: info: do_state_transition:fsa.c litsha22:

State transition S_INTEGRATION ->

S_FINALIZE_JOIN [ input=I_INTEGRATED cause=C_FSA_INTERNAL origin=check_join_state ]

Jan 16 12:09:35 litsha22 crmd: [3904]: info: do_state_transition:fsa.c All 2 cluster

nodes responded to the join offer.

Jan 16 12:09:35 litsha22 attrd: [3903]: info: attrd_local_callback:attrd.c Sending

full refresh

Jan 16 12:09:35 litsha22 cib: [3900]: info: sync_our_cib:messages.c Syncing CIB to

all peers

…………………….

Jan 16 12:09:37 litsha22 tengine: [5119]: info: send_rsc_command:actions.c Initiating

action 4: IPaddr_1_start_0 on litsha22

Jan 16 12:09:37 litsha22 tengine: [5119]: info: send_rsc_command:actions.c Initiating

action 2: probe_complete on litsha21

Jan 16 12:09:37 litsha22 crmd: [3904]: info: do_lrm_rsc_op:lrm.c Performing op start

on IPaddr_1 (interval=0ms,

key=2:c5131d14-a9d9-400c-a4b1-60d8f5fbbcce)

Jan 16 12:09:37 litsha22 pengine: [5120]: info: process_pe_message:pengine.c

Transition 2: PEngine Input stored in: /var/lib/heartbeat/pengine/pe-input-72.bz2

Jan 16 12:09:37 litsha22 IPaddr[5196]: INFO: /sbin/ifconfig eth0:0 192.168.71.205

netmask 255.255.255.0 broadcast 192.168.71.255

Jan 16 12:09:37 litsha22 IPaddr[5196]: INFO: Sending Gratuitous Arp for

192.168.71.205 on eth0:0 [eth0]

Jan 16 12:09:37 litsha22 IPaddr[5196]: INFO: /usr/lib64/heartbeat/send_arp -i 500 -r

10 -p

/var/run/heartbeat/rsctmp/send_arp/send_arp-192.168.71.205 eth0 192.168.71.205 auto

192.168.71.205 ffffffffffff

Jan 16 12:09:37 litsha22 crmd: [3904]: info: process_lrm_event:lrm.c LRM operation

(7) start_0 on IPaddr_1 complete

Jan 16 12:09:37 litsha22 cib: [3900]: info: cib_diff_notify:notify.c Update (client:

3904, call:46): 0.55.607 -> 0.55.608 (ok)

Jan 16 12:09:37 litsha22 mgmtd: [3905]: debug: update cib finished

Jan 16 12:09:37 litsha22 tengine: [5119]: info: te_update_diff:callbacks.c Processing

diff (cib_update): 0.55.607 -> 0.55.608

Jan 16 12:09:37 litsha22 tengine: [5119]: info: match_graph_event:events.c Action

IPaddr_1_start_0 (4) confirmed

Jan 16 12:09:37 litsha22 tengine: [5119]: info: send_rsc_command:actions.c Initiating

action 5: IPaddr_1_monitor_5000 on litsha22

Jan 16 12:09:37 litsha22 crmd: [3904]: info: do_lrm_rsc_op:lrm.c Performing op

monitor on IPaddr_1 (interval=5000ms, key=2:c5131d14-a9d9-400c-a4b1-60d8f5fbbcce)

Jan 16 12:09:37 litsha22 cib: [5268]: info: write_cib_contents:io.c Wrote version

0.55.608 of the CIB to disk (digest: 98cb6685c25d14131c49a998dbbd0c35)

Jan 16 12:09:37 litsha22 crmd: [3904]: info: process_lrm_event:lrm.c LRM operation

(8) monitor_5000 on IPaddr_1 complete

Jan 16 12:09:38 litsha22 cib: [3900]: info: cib_diff_notify:notify.c Update (client:

3904, call:47): 0.55.608 -> 0.55.609 (ok)

Jan 16 12:09:38 litsha22 mgmtd: [3905]: debug: update cib finished

在清单 13 中,您可以看见 quorum 已被重新建立。重新建立 quorum 后,执行投票,而 litsha22 将变为具有浮动资源的活动节点。



回页首

结束语

digg 提交到 Digg del.icio.us 发布到 el.icio.us

高可用性被视为一系列挑战,本文介绍的解决方案描述了第一个步骤。从这里开始,在您的开发环境中有多种方法可以继续操作:您可以选择安装冗余的网络、集群文件系统以支持 realserver,或安装更高级的中间件直接支持集群。

使用 Linux Virtual Server 和 Linux-HA.org 的 Heartbeat 进行构建和运行Web服务器集群(二)

步骤 4:使用 ipvsadm 命令创建 LVS 规则

下一步是获取浮动资源 IP 地址并在其上进行构建。因为 LVS 要求对远端 Web 浏览器客户机透明,所以所有的 Web 请求都必须经过控制器过滤并传给一个 realserver。然后,所有结果都需要传回控制器,后者向发出 Web 页面请求的客户机返回响应。

为了完成上述的请求和响应流程,首先配置每个 LVS 控制器,从而发出以下命令启用 IP 转发(因此允许将请求传给 realserver):

# echo "1" >/proc/sys/net/ipv4/ip_forward

# cat /proc/sys/net/ipv4/ip_forward

如果所有的操作都成功,那么第二个命令将返回一个 “1” 作为终端输出。要永久性地添加此选项,请添加:

'' IP_FORWARD="yes"

到 /etc/sysconfig/sysctl 中。

接下来,要通知控制器将引入的 HTTP 请求传递给 HA 浮动 IP 地址,接着再传给 realserver,使用 ipvsadm 命令。

首先,清除旧的 ipvsadm 表:

# /sbin/ipvsadm -C

在配置新表之前,您需要决定希望 LVS 控制器使用何种工作负载分配。收到来自客户机的连接请求后,控制器根据一个 “进度表” 将 realserver 指派给客户机,然后使用 ipvsadm 命令设置调度程序类型。可用的调度程序包括:

  • Round Robin (RR):新的引入连接被依次指派给每个 realserver。
  • Weighted Round Robin (WRR):使用附加的权重因子进行 RR 调度以补偿各种 realserver 功能(如附加 CPU、更多内存等)的差异。
  • Least Connected (LC):新连接指向具有最少连接数量的 realserver。不要求是最空闲的 realserver,但是以此为方向。
  • Weighted Least Connection (WLC):带权重的 LC。

使用 RR 调度进行测试是个不错的方法,因为易于确认。您可能希望将 WRR 和 LC 添加到测试例程中以确认它们能够按预期运作。此处给出的示例使用 RR 调度及类似调度。

接下来,创建脚本以启用转发至 realserver 的 ipvsadm 服务,并且在每个 LVS 控制器中放置一个副本。当完成 mon 的后续配置以自动监控活动的 realserver 后,就不需要再使用这个脚本,但在此之前它会有助于测试 ipvsadm 组件。请记住在执行此脚本之前重新检查网络和 http/https 与每个 realserver 之间的连接是否正常。

清单 5. HA_CONFIG.sh 文件

#!/bin/sh

# The virtual address on the director which acts as a cluster address

VIRTUAL_CLUSTER_ADDRESS=192.168.71.205

REAL_SERVER_IP_1=192.168.71.220

REAL_SERVER_IP_2=192.168.71.150

REAL_SERVER_IP_3=192.168.71.121

REAL_SERVER_IP_4=192.168.71.145

REAL_SERVER_IP_5=192.168.71.185

REAL_SERVER_IP_6=192.168.71.186

# set ip_forward ON for vs-nat director (1 on, 0 off).

cat /proc/sys/net/ipv4/ip_forward

echo "1" >/proc/sys/net/ipv4/ip_forward

# director acts as the gw for realservers

# Turn OFF icmp redirects (1 on, 0 off), if not the realservers might be clever and

# not use the director as the gateway!

echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects

echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects

echo "0" >/proc/sys/net/ipv4/conf/eth0/send_redirects

# Clear ipvsadm tables (better safe than sorry)

/sbin/ipvsadm -C

# We install LVS services with ipvsadm for HTTP and HTTPS connections with RR

# scheduling

/sbin/ipvsadm -A -t $VIRTUAL_CLUSTER_ADDRESS:http -s rr

/sbin/ipvsadm -A -t $VIRTUAL_CLUSTER_ADDRESS:https -s rr

# First realserver

# Forward HTTP to REAL_SERVER_IP_1 using LVS-NAT (-m), with weight=1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:http -r $REAL_SERVER_IP_1:http -m -w 1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:https -r $REAL_SERVER_IP_1:https -m -w 1

# Second realserver

# Forward HTTP to REAL_SERVER_IP_2 using LVS-NAT (-m), with weight=1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:http -r $REAL_SERVER_IP_2:http -m -w 1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:https -r $REAL_SERVER_IP_2:https -m -w 1

# Third realserver

# Forward HTTP to REAL_SERVER_IP_3 using LVS-NAT (-m), with weight=1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:http -r $REAL_SERVER_IP_3:http -m -w 1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:https -r $REAL_SERVER_IP_3:https -m -w 1

# Fourth realserver

# Forward HTTP to REAL_SERVER_IP_4 using LVS-NAT (-m), with weight=1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:http -r $REAL_SERVER_IP_4:http -m -w 1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:https -r $REAL_SERVER_IP_4:https -m -w 1

# Fifth realserver

# Forward HTTP to REAL_SERVER_IP_5 using LVS-NAT (-m), with weight=1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:http -r $REAL_SERVER_IP_5:http -m -w 1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:https -r $REAL_SERVER_IP_5:https -m -w 1

# Sixth realserver

# Forward HTTP to REAL_SERVER_IP_6 using LVS-NAT (-m), with weight=1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:http -r $REAL_SERVER_IP_6:http -m -w 1

/sbin/ipvsadm -a -t $VIRTUAL_CLUSTER_ADDRESS:https -r $REAL_SERVER_IP_6:https -m -w 1

# We print the new ipvsadm table for inspection

echo "NEW IPVSADM TABLE:"

/sbin/ipvsadm

如清单 5 中所示,脚本只是启用了 ipvsadm 服务,然后实际上使用了相同的代码节以便将 Web 和 SSL 请求转发给每个单个的 realserver。我们使用了 -m 选项指定 NAT,并给每个 realserver 赋以权重 1(-w 1)。使用正常的轮循调度时,指定的权重会出现冗余(因为默认的权重总是 1)。显示此选项的惟一目的是让您倾向于选择加权的轮循。 为此,在关于使用轮循的注释下的 2 个连续的行中将 rr 改为 wrr,当然不要忘了相应地调整权重。有关各种调度程序的更多信息,请查询 ipvsadm 手册。

您 现在已经配置了每个控制器,可以处理引入的对浮动服务 IP 的 Web 和 SSL 请求,方法是重写这些请求并连续地将工作传递给 realserver。但是为了从 realserver 收回通信量,并且为了在将请求返回给发出请求的客户机之前执行相反的过程,您需要对控制器更改几个连网设置。其原因是需要在平面网络拓扑结构中实现 LVS 控制器和 realserver(即,同一子网上的所有组件)。我们需要执行以下步骤以强制 Apache 通过控制器返回响应通信量,而不是自己直接应答:

echo "0" > /proc/sys/net/ipv4/conf/all/send_redirects
echo "0" > /proc/sys/net/ipv4/conf/default/send_redirects
echo "0" > /proc/sys/net/ipv4/conf/eth0/send_redirects

执行此操作的目的是为了防止活动的 LVS 控制器通知 realserver 和浮动服务 IP 直接相互通信,从而获取 TCP/IP 捷径(因为它们位于同一个子网中)。一般情况下,重定向是有用的,因为它们通过清除网络连接中不必要的中间件提高了性能。但是此时,它可能阻碍了响应通信 量的重写,而这又是对客户机透明所必需的。实际上,如果在 LVS 控制器上没有禁用重定向,那么从 realserver 直接发往客户机的通信量将被客户机视为未被请求的网络响应而被丢弃。

此时,可将每个 realserver 的默认路由设为指向服务的浮动 IP 地址,从而确保所有的响应都被传回控制器以进行包重写,然后再传回最初发出请求的客户机。

一旦在控制器上禁用重定向,并且 realserver 被配置为通过浮动服务 IP 发送所有的通信量,那么您可能需要测试 HA LVS 环境。要测试迄今为止所做的工作,可让一个远端客户机上的 Web 浏览器指向 LVS 控制器的浮动服务地址。

为了在实验室进行测试,我们使用的是基于 Gecko 的浏览器(Mozilla),但是任何其他浏览器也可以满足要求。为了确保部署成功,在浏览器中禁用缓存,并多次单击刷新按钮。在每次刷新时,您应看见显 示的 Web 页面是 realserver 上配置的一个自识别页面。如果您要使用 RR 调度,您应可以看到连续通过每个 realserver 的页面循环。

您是否正在思考确保 LVS 配置在引导时自动启动?现在千万别这样做!还有一个步骤尚未完成(步骤 5),此步骤将执行 realserver 的活动监控(因此保留一个动态 Apache 节点列表,其中的节点可以为工作请求提供服务)。



回页首

步骤 5:在 LVS 控制器上安装和配置 mon

迄今为止,您已经建立了一个高度可用的服务 IP 地址,并将其绑定到 realserver 实例池。但是在任何给定时间您决不能信任任何单个的 Apache 服务器是正常运作的。通过选择 RR 调度,如果任何给定的 realserver 被禁用,或者以一种即时的方式停止响应网络通信量,那么 1/6 的 HTTP 请求将会失败!

因此有必要实施 realserver 对每个 LVS 控制器的监控,以便动态地将其添加到服务池中或从中删除。另一个著名的称为 mon 的开源包很适合这项任务。

mon 解决方案一般用于监控 LVS 真实节点。Mon 的配置相对容易,并且对于熟悉 shell 脚本编程的人而言可扩展性很好。让所有组件正常运作大致分以下三个主要步骤:安装、服务监控配置和警报创建。使用包管理工具处理 mon 的安装。完成安装后,您只需要调整监控配置,并创建一些警报脚本。当监视器确定 realserver 已经脱机或恢复联机时,将触发警报脚本。

注意,安装 heartbeat v2 后,监控 realserver 可通过构建所有的 realserver 服务资源来完成。 或者,您可以使用 Heartbeat ldirectord 包。

默认情况下,mon 附带了几个可以直接使用的监视器机制。我们修改了 /etc/mon.cf 中的样例配置文件以使用 HTTP 服务。

在 mon 配置文件中,确保标题可以反映正确的路径。SLES10 是一个 64 位的 Linux 图像,但是随附的样例配置用于默认的(31 位或 32 位)位置。配置文件样例假定警报和监视器位于 /usr/lib 中,这对于我们的特定安装而言并不正确。我们修改的参数如下:

alertdir = /usr/lib64/mon/alert.d
mondir = /usr/lib64/mon/mon.d

如您所见,我们只是将 lib 更改为 lib64。对于您所使用的版本可能不需要这种更改。

对配置文件的下一个更改是指定要监控的 realserver 列表。这可以通过以下 6 个指令完成:

清单 6. 指定要监控的 realserver

hostgroup litstat1 192.168.71.220 # realserver 1

hostgroup litstat2 192.168.71.150

hostgroup litstat3 192.168.71.121

hostgroup litstat4 192.168.71.145

hostgroup litstat5 192.168.71.185

hostgroup litstat6 192.168.71.186 # realserver 6

如果您希望添加额外的 realserver,直接在此添加额外的条目即可。

一旦您处理好所有的定义,就需要告知 mon 如何查看故障,以及如何处理故障。为此,添加以下的监视器段(分别针对每个 realserver)。完成后,您需要将 mon 配置文件和警报置于每个 LVS heartbeat 节点之上,启用每个 heartbeat 集群节点以独立地监控所有的 realserver。

清单 7. /etc/mon/mon.cf 文件

#
# global options
#
cfbasedir = /etc/mon
alertdir = /usr/lib64/mon/alert.d
mondir = /usr/lib64/mon/mon.d
statedir = /var/lib/mon
logdir = /var/log
maxprocs = 20
histlength = 100
historicfile = mon_history.log
randstart = 60s
#
# authentication types:
# getpwnam standard Unix passwd, NOT for shadow passwords
# shadow Unix shadow passwords (not implemented)
# userfile "mon" user file
#
authtype = getpwnam
#
# downtime logging, uncomment to enable
# if the server is running, don’t forget to send a reset command
# when you change this
#
#dtlogfile = downtime.log
dtlogging = yes
#
# NB: hostgroup and watch entries are terminated with a blank line (or
# end of file). Don’t forget the blank lines between them or you lose.
#
#
# group definitions (hostnames or IP addresses)
# example:
#
# hostgroup servers www mail pop server4 server5
#
# For simplicity we monitor each individual server as if it were a "group"
# so we add only the hostname and the ip address of an individual node for each.
hostgroup litstat1 192.168.71.220
hostgroup litstat2 192.168.71.150
hostgroup litstat3 192.168.71.121
hostgroup litstat4 192.168.71.145
hostgroup litstat5 192.168.71.185
hostgroup litstat6 192.168.71.186
#
# Now we set identical watch definitions on each of our groups. They could be
# customized to treat individual servers differently, but we have made the
# configurations homogeneous here to match our homogeneous LVS configuration.
#
watch litstat1
service http
description http check servers
interval 6s
monitor http.monitor -p 80 -u /index.html
allow_empty_group
period wd {Mon-Sun}
alert dowem.down.alert -h
upalert dowem.up.alert -h
alertevery 600s
alertafter 1
watch litstat2
service http
description http check servers
interval 6s
monitor http.monitor -p 80 -u /index.html
allow_empty_group
period wd {Mon-Sun}
alert dowem.down.alert -h
upalert dowem.up.alert -h
alertevery 600s
alertafter 1
watch litstat3
service http
description http check servers
interval 6s
monitor http.monitor -p 80 -u /index.html
allow_empty_group
period wd {Mon-Sun}
alert dowem.down.alert -h
upalert dowem.up.alert -h
alertevery 600s
alertafter 1
watch litstat4
service http
description http check servers
interval 6s
monitor http.monitor -p 80 -u /index.html
allow_empty_group
period wd {Mon-Sun}
alert dowem.down.alert -h
upalert dowem.up.alert -h
alertevery 600s
alertafter 1
watch litstat5
service http
description http check servers
interval 6s
monitor http.monitor -p 80 -u /index.html
allow_empty_group
period wd {Mon-Sun}
alert dowem.down.alert -h
upalert dowem.up.alert -h
alertevery 600s
alertafter 1
watch litstat6
service http
description http check servers
interval 6s
monitor http.monitor -p 80 -u /index.html
allow_empty_group
period wd {Mon-Sun}
alert dowem.down.alert -h
upalert dowem.up.alert -h
alertevery 600s
alertafter 1

清单 7 告知 mon 使用 http.monitor,默认情况下它由 mon 附带。另外,指定使用端口 80。清单 7 还提供了要请求的特殊页面;您可能会选择为 Web 服务器传输一小段更有效率的 html 作为操作成功的证明,而不是传输一个复杂的默认 html 页面。

alertupalert 行调用的脚本必须置于配置文件顶部指定的 alertdir 中。其目录通常是发行版所默认的目录,比如 “/usr/lib64/mon/alert.d”。警报负责告知 LVS 将 Apache 服务器添加到合格的列表中或从中删除(方法是调用 ipvsadm 命令,我们很快就要介绍到)。

当一个 realserver 的 http 测试失败时,dowem.down.alert 将由 mon 使用几个参数自动执行。同样地,当监视器确定 realserver 已经恢复联机时,mon 进程使用大量的参数自动执行 dowem.up.alert。您可以随意地修改警报脚本的名称以适应您的部署。

保存此文件,在 alertdir 中创建警报(使用简单的 bash 脚本编程)。清单 8 展示了一个 bash 脚本警报,重新建立 realserver 连接时由 mon 调用。

清单 8. 简单警报:已连接上

#! /bin/bash

# The h arg is followed by the hostname we are interested in acting on

# So we skip ahead to get the -h option since we don’t care about the others

REALSERVER=192.168.71.205

while [ $1 != "-h" ] ;

do

shift

done

ADDHOST=$2

# For the HTTP service

/sbin/ipvsadm -a -t $REALSERVER:http -r $ADDHOST:http -m -w 1

# For the HTTPS service

/sbin/ipvsadm -a -t $REALSERVER:https -r $ADDHOST:https -m -w 1

清单 9 展示了一个 bash 脚本警报,当 realserver 连接丢失时由 mon 调用。

清单 9. 简单警报:连接已丢失

#! /bin/bash

# The h arg is followed by the hostname we are interested in acting on

# So we skip ahead to get the -h option since we dont care about the others

REALSERVER=192.168.71.205

while [ $1 != "-h" ] ;

do

shift

done

BADHOST=$2

# For the HTTP service

/sbin/ipvsadm -d -t $REALSERVER:http -r $BADHOST

# For the HTTPS service

/sbin/ipvsadm -d -t $REALSERVER:https -r $BADHOST

这两组脚本都使用 ipvsadm 命令行工具动态地将 realserver 添加到 LVS 表中或从中删除。注意,这些脚本远谈不上完美。mon 只对于简单的 Web 请求监控 http 端口,此处阐述的架构在下述情形中容易受到攻击:给定的 realserver 对于 http 请求可能正常运作,但对于 SSL 请求却不行。在这些情况下,我们将无法从 https 备选列表中删除有问题的 realserver。当然,除了为 mon 配置文件中的每个 realserver 启用另一个 https 监视器外,构建更多专门针对每种类型的 Web 请求的高级警报也可以轻松地解决这个问题。这可以留给读者作为练习。

为确保监视器已被激活,依次为每个 realserver 启用并禁用 Apache 进程,观察每个控制器对事件的反应。只有当您确认每个控制器正常地监控每个 realserver 后,您才可以使用 chkconfig 命令确保 mon 进程可以在引导时自动启动。使用的特定命令为 chkconfig mon on,但是这可能随发行版的不同而有所区别。

完成这个最后的部分后,您就已完成构建跨系统的高度可用的 Web 服务器基础设施的任务。当然,您现在可能想要执行一些更高级的工作。例如,您可能已经注意到,mon 守护程序本身没有被监控(heartbeat 项目可以为您监控 mon),但是最后的步骤已为此打下基础。



回页首

使用 Linux Virtual Server 和 Linux-HA.org 的 Heartbeat 进行构建和运行Web服务器集群(一)


使用 Linux Virtual Server 和 Heartbeat v2,分 5 个步骤跨越多个物理或虚拟 Linux® 服务器轻松构建高度可用的 Apache Web 服务器集群。

通过在多个处理器之间分担工作负载并采用多种软件恢复技术,能够提供高度可用的环境并提高环境的总体 RAS(可靠性、可用性和可服务性)。可以得到的好处包括:更快地从意外中断中恢复运行,以及将意外中断对终端用户的影响降至最低。

为 了更好地理解这篇文章,您需要熟悉 Linux 和连网的基本知识,还需要配置好 Apache 服务器。本文的示例基于标准的 SUSE Linux Enterprise Server 10 (SLES10) 安装,但是使用其他版本的明智用户也应该可以采用文中展示的方法。

本 文展示了健壮的 Apache Web 服务器堆栈,它拥有 6 个 Apache 服务器节点(虽然 3 个节点就足以支持文中阐述的步骤),以及 3 个 Linux Virtual Server (LVS) 控制器。我们使用 6 个 Apache 服务器节点,可以在测试时实现更高的工作负载吞吐量,从而模拟更大型的部署。文中展示的架构应该可以支持更多的控制器和后端 Apache 服务器(在资源允许的情况下),但是我们并未进行更深入的尝试。图 1 展示了使用 Linux Virtual Server 和 linux-ha.org 组件的实现。

图 1. Linux Virtual Servers 和 Apache
Linux Virtual Servers 和 Apache

如图 1 所示,外部客户机向单个 IP 地址发送通信量,而该 IP 地址可能存在于某个 LVS 控制器机器上。控制器机器积极地监控接收其发送工作的 Web 服务器池。

注意,图 1 左侧的工作负载进程指向右侧。此集群的浮动资源地址在一个给定时间将位于某个 LVS 控制器实例上。可以使用一个图形化的配置工具手动地移动服务地址,或者(这种方法更常见)自行管理服务地址,视 LVS 控制器的状态而定。如果某个控制器变得不合格(由于连接丢失、软件故障或类似原因),那么服务地址将自动地被重新分配给一个合格的控制器。

浮动服务地址必须跨越两个或多个离散的硬件实例,以便在一个物理机器连接丢失的情况下继续操作。使用本文展示的配置决策,每个 LVS 控制器都可以将包转发给任何的实际 Apache Web 服务器,并且与服务器的物理位置或服务器与提供浮动服务地址的活动控制器的接近程度无关。本文展示了每个 LVS 控制器如何积极地监控 Apache 服务器,以确保只向正常运作的后端服务器发送请求。

使用这种配置,技术人员可以成功地让整个 Linux 实例失效,而且不会中断在浮动服务地址上启用的用户服务(通常是 http 和 https Web 请求)。

Linux Virtual Server 术语新手必读

LVS 控制器:Linux Virtual Server 控制器是一种系统,该系统接受任意的引入通信量并将其传递给任意数量的 realserver。然后接受来自 realserver 的响应并将其传回发出请求的客户机。控制器需要以一种透明的方式执行任务,使客户机永远不会知道执行实际工作负载处理的是 realserver。

LVS 控制器本身需要能够实现资源(具体而言,指的是用于侦听引入通信量的虚拟 IP 地址)之间的浮动,从而避免单点故障。LVS 控制器实现浮动 IP 地址的方法是利用 LVS 的 Heartbeat 组件。这允许每个配置好的、运行 Heartbeat 的控制器确保有且只有一个控制器声明处理引入请求的虚拟 IP 地址。

除了能够浮动服务 IP 地址外,控制器还需要能够监控执行实际工作负载处理的 realserver 的状态。控制器必须要了解哪些 realserver 可以一直用于工作负载处理。为监控 realserver 使用了 mon 包。继续阅读,了解关于 配置 Heartbeat配置 mon 的细节。

Realserver:这 些系统是提供 HA 服务的真正的 Web 服务器实例。使用多个 realserver 提供 HA 所需的服务。在本文的环境中,实现了 6 个 realserver,但是一旦 LVS 基础设施的其余部分就绪后,添加更多的 realserver 就是小事一桩了。

在本文中,假定 realserver 运行的都是 Apache Web Server,但是其他服务实现起来也同样容易(实际上,作为文中展示的方法的附加测试,受支持的 SSH 服务也很容易实现)。

使 用的 realserver 是常用的 Apache Web 服务器,只有一个明显的区别,即它们被配置为以类似 LVS 控制器的浮动 IP 地址的形式进行响应,或以控制器使用的浮动 IP 地址所对应的虚拟主机名的形式响应。更改 Apache 配置文件中的一行即可完成这一操作。

您 可以使用一个完全开源的软件组合复制这些配置,该软件组合包括,linux-ha.org 所提供的 Heartbeat 技术组件,以及通过 mon 和 Apache 进行监控的服务器。正如前面提到的,我们将使用 SUSE Linux Enterprise Server 测试配置。

LVS 场景中使用的所有机器都位于同一个子网中,使用的是 Network Address Translation (NAT) 配置。在 Linux Virtual Server Web 站点(请参阅 参考资料)上描述了很多其他网络结构;为简便起见我们使用 NAT。为了更加安全,您应该限制穿过防火墙的通信量,只允许浮动 IP 地址在 LVS 控制器之间传递。

Linux Virtual Server 套件提供了几种不同的方法以完成透明的 HA 后端基础设施。每种方法都各有利弊。LVS-NAT 操作控制器服务器的方式是,获取发往特定配置的端口的引入包,并动态地在包的头部重写目的地址。控制器本身并不处理包的数据内容,而是将其传给 realserver。包中的目的地址被重写为指向集群中的一个给定的 realserver。然后将包放回网络中以传递给 realserver,而 realserver 并没有意识到发生了什么情况。对于 realserver,它只是直接从外部接收请求。接着,realserver 的回复被发回控制器,在控制器中重写回复,使其具有客户机所指向的浮动 IP 地址的源地址,然后再发往原始客户机。

使用 LVS-NAT 方法意味着 realserver 需要简单的 TCP/IP 功能。LVS 操作的其他模式,即 LVS-DR 和 LVS-Tun,需要更加复杂的连网概念。选择 LVS-NAT 的最主要的好处是只需对 realserver 配置做很少量的更改。实际上,最难的部分是牢记适当地设置路由语句。

步骤 1:构建 realserver 图像

以构建 Linux 服务器实例池开始,每个实例运行 Apache Web 服务器,并确保服务器按预想的情况运作,将 Web 浏览器指向每个 realserver 的 IP 地址。通常,标准安装被配置为在自己的 IP 地址上侦听 80 端口(换言之,为每个 realserver 使用不同的 IP)。

接下来,在每个服务器上配置默认的 Web 页面以显示一个静态页面,其中包含了为页面提供服务的机器的主机名。这确保了您可以一直了解测试期间您所连接的机器。

为防万一,检查在这些系统上转发的 IP 是否为 OFF,方法是发出以下命令:

# cat /proc/sys/net/ipv4/ip_forward

如果不是 OFF 并且您需要禁用它,请发出以下命令:

# echo "0" >/proc/sys/net/ipv4/ip_forward

确保每个 realserver 都正常地侦听 http 端口 (80) 的一个简单方法是,使用外部系统并执行扫描。在一些与您的服务器连网的其他系统中,可以使用 nmap 工具以确保服务器执行侦听操作。

清单 1. 使用 nmap 确保服务器执行侦听操作

# nmap -P0 192.168.71.92

Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2006-01-13 16:58 EST
Interesting ports on 192.168.71.92:
(The 1656 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
22/tcp open ssh
80/tcp filtered http
111/tcp open rpcbind
631/tcp open ipp

要注意的是,某些组织不赞成使用端口扫描工具,如 nmap:在使用工具之前请获取组织的批准。

接下来,将 Web 浏览器指向每个 realserver 的实际 IP 地址,从而确保每个 realserver 按照预期为相应页面提供服务。完成此操作后请转到步骤 2。



回页首

步骤 2:安装和配置 LVS 控制器

现在,您可以构建所需的 3 个 LVS 控制器实例。如果您第一次为每个 LVS 控制器安装 SUSE Linux Enterprise Server 10,在初始安装时,请确保选择与 heartbeat、ipvsadm 和 mon 相关的高可用性包。如果您拥有现有的安装,您就可以一直使用包管理工具,如 YAST,在完成基础安装之后添加这些包。强烈建议您将每个 realserver 添加到 /etc/hosts 文件中。这将确保为引入请求提供服务时,不会产生 DNS 相关的延迟。

此时,再次检查每个目录是否都能对每个 realserver 执行即时的 ping 操作:

清单 2. 对 realserver 执行 Ping 操作

# ping -c 1 $REAL_SERVER_IP_1

# ping -c 1 $REAL_SERVER_IP_2

# ping -c 1 $REAL_SERVER_IP_3

# ping -c 1 $REAL_SERVER_IP_4

# ping -c 1 $REAL_SERVER_IP_5

# ping -c 1 $REAL_SERVER_IP_6

完成此操作后,从服务器中的本地包管理工具中安装 ipvsadm、Heartbeat 和 mon。回想一下,Heartbeat 将被用于控制器内部通信,而 mon 将被每个控制器用于维护关于每个 realserver 的状态信息。



回页首

步骤 3:在控制器上安装和配置 Heartbeat

如果您以前使用过 LVS,请记住,在 SLES10 上配置 Heartbeat Version 2 与在 SLES9 上配置 Heartbeat Version 1 截然不同。其中,Heartbeat Version 1 使用的文件(haresource、ha.cf 和 authkey)存储在 /etc/ha.d/ 目录中,而 Version 2 使用新的基于 XML 的 Cluster Information Base (CIB)。推荐的升级方法是使用 haresource 文件生成新的 cib.xml 文件。典型的 ha.cf 文件的内容如清单 3 所示。

我们从 SLES9 系统中获取 ha.cf 文件,并且为 Version 2 添加底部的 3 行(respawnpingdcrm)。如果您拥有现有的 version 1 配置,您也可以选择执行同样的操作。如果您要使用这些指令执行新安装,您可以复制清单 3 并进行修改以适应您的生产环境。

清单 3. /etc/ha.d/ha.cf config 文件样例

# Log to syslog as facility "daemon"
use_logd on
logfacility daemon

# List our cluster members (the realservers)
node litsha22
node litsha23
node litsha21

# Send one heartbeat each second
keepalive 3

# Warn when heartbeats are late
warntime 5

# Declare nodes dead after 10 seconds
deadtime 10

# Keep resources on their "preferred" hosts – needed for active/active
#auto_failback on

# The cluster nodes communicate on their heartbeat lan (.68.*) interfaces
ucast eth1 192.168.68.201
ucast eth1 192.168.68.202
ucast eth1 192.168.68.203

# Failover on network failures
# Make the default gateway on the public interface a node to ping
# (-m) -> For every connected node, add <integer> to the value set
# in the CIB, * Default=1
# (-d) -> How long to wait for no further changes to occur before
# updating the CIB with a changed attribute
# (-a) -> Name of the node attribute to set, * Default=pingd
respawn hacluster /usr/lib/heartbeat/pingd -m 100 -d 5s

# Ping our router to monitor ethernet connectivity
ping litrout71_vip

#Enable version 2 functionality supporting clusters with > 2 nodes
crm yes

respawn 指令在运行时指定某个程序的运行和监控。如果此程序退出时的退出码不是 100,程序将自动重启。第一个参数是运行程序的用户 id,第二个参数是要运行的程序。-m 参数将 pingd 属性设为从当前机器可获得的 ping 节点数的 100 倍,而 –d 参数在修改 CIB 中的 pingd 属性之前将延迟 5 秒。ping 指令用于声明 Heartbeat 的 PingNode,而 crm 指令指定了 Heartbeat 应运行 1.x-style 集群管理器或 2.x-style 集群管理器,后者支持 2 个以上的节点。

对于所有的控制器这个文件都应该相同。适当地设置权限使 hacluster 守护程序可以读取文件也绝对重要。否则将导致日志文件中出现大量难于调试的警告。

对于某个版本的 1-style Heartbeat 集群,haresources 文件指定了节点名和连网信息(浮动 IP、关联接口和广播)。对我们而言,此文件仍然没有变化:

litsha21 192.168.71.205/24/eth0/192.168.71.255

此文件将只用于生成 cib.xml 文件。

authkeys 文件指定了一个共享的密匙以允许控制器之间进行通信。共享密钥就是一个密码,所有的 heartbeat 节点都知道这个密码并使用它进行相互通信。密钥的使用避免了无关方对 heartbeat 服务器节点的影响。此文件也没有变化:

auth 1

1 sha1 ca0e08148801f55794b23461eb4106db

接下来的几步将向您展示如何将 version 1 的 haresources 文件转换为 version 2 的基于 XML 的配置格式 (cib.xml)。虽然可以直接复制并使用清单 4 中的配置文件作为起点,但是强烈建议您针对自己的部署进行配置调整。

为了将文件格式转换为部署中使用的基于 XML 的 CIB (Cluster Information Base) 文件,请发出以下命令:

python /usr/lib64/heartbeat/haresources2cib.py /etc/ha.d/haresources > /var/lib/heartbeat/crm/test.xml

将会生成一个类似清单 4 所示的配置文件,并置于 /var/lib/heartbeat/crm/test.xml 中。

清单 4. CIB.xml 样例文件

<cib admin_epoch="0" have_quorum="true" num_peers="3" cib_feature_revision="1.3"
generated="true" ccm_transition="7" dc_uuid="114f3ad1-f18a-4bec-9f01-7ecc4d820f6c"
epoch="280" num_updates="5205" cib-last-written="Tue Apr 3 16:03:33 2007">
<configuration>
<crm_config>
<cluster_property_set id="cib-bootstrap-options">
<attributes>
<nvpair id="cib-bootstrap-options-symmetric_cluster"
name="symmetric_cluster" value="true"/>
<nvpair id="cib-bootstrap-options-no_quorum_policy"
name="no_quorum_policy" value="stop"/>
<nvpair id="cib-bootstrap-options-default_resource_stickiness"
name="default_resource_stickiness" value="0"/>
<nvpair id="cib-bootstrap-options-stonith_enabled"
name="stonith_enabled" value="false"/>
<nvpair id="cib-bootstrap-options-stop_orphan_resources"
name="stop_orphan_resources" value="true"/>
<nvpair id="cib-bootstrap-options-stop_orphan_actions"
name="stop_orphan_actions" value="true"/>
<nvpair id="cib-bootstrap-options-remove_after_stop"
name="remove_after_stop" value="false"/>
<nvpair id="cib-bootstrap-options-transition_idle_timeout"
name="transition_idle_timeout" value="5min"/>
<nvpair id="cib-bootstrap-options-is_managed_default"
name="is_managed_default" value="true"/>
<attributes>
<cluster_property_set>
<crm_config>
<nodes>
<node uname="litsha21" type="normal" id="01ca9c3e-8876-4db5-ba33-a25cd46b72b3">
<instance_attributes id="standby-01ca9c3e-8876-4db5-ba33-a25cd46b72b3">
<attributes>
<nvpair name="standby" id="standby-01ca9c3e-8876-4db5-ba33-a25cd46b72b3"
value="off"/>
<attributes>
<instance_attributes>
<node>
<node uname="litsha23" type="normal" id="dc9a784f-3325-4268-93af-96d2ab651eac">
<instance_attributes id="standby-dc9a784f-3325-4268-93af-96d2ab651eac">
<attributes>
<nvpair name="standby" id="standby-dc9a784f-3325-4268-93af-96d2ab651eac"
value="off"/>
<attributes>
<instance_attributes>
<node>
<node uname="litsha22" type="normal" id="114f3ad1-f18a-4bec-9f01-7ecc4d820f6c">
<instance_attributes id="standby-114f3ad1-f18a-4bec-9f01-7ecc4d820f6c">
<attributes>
<nvpair name="standby" id="standby-114f3ad1-f18a-4bec-9f01-7ecc4d820f6c"
value="off"/>
<attributes>
<instance_attributes>
<node>
<nodes>
<resources>
<primitive class="ocf" provider="heartbeat" type="IPaddr" id="IPaddr_1">
<operations>
<op id="IPaddr_1_mon" interval="5s" name="monitor" timeout="5s"/>
<operations>
<instance_attributes id="IPaddr_1_inst_attr">
<attributes>
<nvpair id="IPaddr_1_attr_0" name="ip" value="192.168.71.205"/>
<nvpair id="IPaddr_1_attr_1" name="netmask" value="24"/>
<nvpair id="IPaddr_1_attr_2" name="nic" value="eth0"/>
<nvpair id="IPaddr_1_attr_3" name="broadcast" value="192.168.71.255"/>
<attributes>
<instance_attributes>
<primitive>
<resources>
<constraints>
<rsc_location id="rsc_location_IPaddr_1" rsc="IPaddr_1">
<rule id="prefered_location_IPaddr_1" score="200">
<expression attribute="#uname" id="prefered_location_IPaddr_1_expr"
operation="eq" value="litsha21"/>
<rule>
<rsc_location>
<rsc_location id="my_resource:connected" rsc="IPaddr_1">
<rule id="my_resource:connected:rule" score_attribute="pingd">
<expression id="my_resource:connected:expr:defined" attribute="pingd"
operation="defined"/>
<rule>
<rsc_location>
<constraints>
<configuration>
<cib>

一旦生成配置文件后,将 test.xml 移到 cib.xml 中,将所有者改为 hacluster,将组改为 haclient,然后重启 heartbeat 进程。

现已完成 heartbeat 配置,对 heartbeat 进行设置,使其在每个控制器的引导阶段启动。为此,在每个控制器上发出以下命令(或相对您的发行版的等效命令):

# chkconfig heartbeat on

重启每个 LVS 控制器以确保 heartbeat 服务在引导阶段正常启动。通过首先暂停保存浮动资源 IP 地址的机器,您可以等候其他 LVS Director 映像建立 quorum,然后在几秒钟内实例化最新选择的主节点上的服务地址。当您将暂停的控制器映像重新联机时,机器将在所有的节点间重新建立 quorum,此时浮动资源 IP 可能传输回来。整个过程只会耗费几秒钟。

另外,此时,您可能希望使用图形化工具处理 heartbeat 进程 hb_gui(如图 2 所示),手动地将 IP 地址在集群中移动,方法是将各种节点设置为备用或活动状态。多次重试这些步骤,禁用并重新启用活动的或不活动的各种机器。因为先前选中了配置策略,只要可 以建立 quorum,并且至少有一个节点合格,那么浮动资源 IP 地址就保持正常运作。在测试期间,您可以使用简单的 ping 确保不会发生丢失包的情况。当您完成试验后,应该对配置的健壮性有一个深刻的体会。在继续操作之前请确保浮动资源 IP 的 HA 配置适当。

图 2. 用于 heartbeat 进程的图形化配置工具 hb_gui
图 2. 用于 heartbeat 进程的图形化配置工具 hb_gui

图 2 展示了登录后的图形控制台的外观,上面显示了托管资源和相关的配置选项。注意,当您首次启动应用程序时,必须登录到 hb_gui 控制台;使用何种凭证将取决于您的部署。

注意,图 2 中 litsha2* 系统集群中的每个节点都处于运行状态。标记为 litsha21 的系统目前是活动节点,如 (IPaddr_1) 正下方锯齿状的附加资源所示。

另外要注意标记为 “No Quorum Policy” 的选项的值为 “stop”。这指的是任何单独的节点将释放它所拥有的资源。这个决策的含义是,在任何给定时间,必须有 2 个 heartbeat 节点是活动状态,以便建立 quorum(换言之,一种 “少数服从多数” 的投票规则)。即使只有一个节点是活动的,完全运行的节点也会由于网络故障丢失它与同级系统之间的连接,或者,如果两个非活动的同级系统同时暂停,资源将 被自动释放。



回页首

Heartbeat 2.0

在商業服務的Rails HTTP Cluster觀念及測試中,我提到了failover也是cluster的其中一個觀念。幾年前我用heartbeat,只是單純架設 pgcluster的load balancer,那個時候也是簡單的active / standby。在那個時候,有這樣的架構已經減輕大部分人所遇到的問題:有一台掛掉另一台可以馬上取代其服務,讓維護者有時間可以救,使用者不會罵,已 經是很偷笑的事情了。不然一般的維護者可能要急得像熱鍋上的螞蟻,拼命地輸入指令試著想要拯救資料或服務,而在數小時的工作後,服務還是救不起來,使用者 罵聲四起。但是其實對我而言,這些比起硬體的方案,還是多多少少嫌不方便。

參考這個網頁,可以瞭解有那些failover的方式。
http://www.ukingdom.com.tw/pro/lifekeeper/lifekeeper.htm

先不管後面的階層化或是多方向failover,其中提到的active/active及active/standby,為啥要有這些分別呢?我來一個一個介紹。

  1. Failover的種類
    1. active/standby
    2. active/active
    3. Cluster Resource Management
  2. 實做
    1. 安裝
    2. 結論

Failover的種類active/standby

對於一般架設LAMP來建置phpbb論壇,或是一些簡單Web服務(如wiki)的管理者,在經費拮据的情況下,通常都是先跑一台,在想辦法生另 一台。這時進行active/standby的好處是,原理單純設定簡單,兩台跑同樣的OS同樣的服務,一台掛了另一台頂替。但缺點就會造成 standby的那一台會浪費CPU資源,所以在很久以前的小論壇都沒有問題,但是到現在,要應付可能會日漸成長的web 2.0社群式的論壇,可能一開始就不能考量這樣玩了。

active/active

另一種作法是兩台主機都維持上線的狀態,也就是可以說有主站,也有個副站。而一旦任何一方掛了,另一方就可以直接抓下對方的IP,就當作是一樣的服 務了。當然這樣還是可以讓管理者有時間可以去處理。然而在商用服務的狀況下,通常使用者會比較難接受有兩個以上的IP或是URL,這個算是缺點之一。但優 點就是相對地如果使用者可以接受副站的情況之下,就會有效地疏散流量及CPU負載。

以上就是1.0版的時候提供的功能。有關heartbeat 1.0可以參考舊文章
http://kiwi.csie.chu.edu.tw/blog/archives/48

Cluster Resource Management

而在heartbeat 2.0中已經引進了資源管理的觀念,意思就是將一個服務程式或是一個IP視作一種資源, 而這個資源可以任意在cluster裡的任意的node中migrate(遷移)。當然與上述兩種不同的是,在這種情況下node就可以是兩個以上了。這 並不是process migration(行程遷移),還沒有那樣進步連程式或設定檔都可以自己搬走。所有node要拿來當作資源的服務,一開始就必須全部自行建置好在完全正 常的狀態。當進行遷移的時候,heartbeat還是會以service {服務名稱} start/stop的方式來完成這樣的工 作。其實這個方式基本上是和active/standby一樣,不過重要的是搭配cluster的load balance機制,也就是像下圖一樣。因為本來就要做load balance,每個node預設將apache啟動,而需要遷移的資源也頂多只有ip和haproxy,就不需要浪費時間啟動較慢的apache。

另一點是資源的群組,數量,相依性,啟動順序,甚至限制在哪些node上跑,全部都可以調整。也因此如果要做active/active那樣主站副站的作法也完全可行。

heartbeat_1.png

如這兩張圖,假設有一個 cluster有四個node,在正常的情況下,使用者會透過Virtual Server的IP連到Real Server的真實服務,這個我們在之前的文章已經談過。然而套用heartbeat 2.0的觀念,我們將virtual server ip及haproxy設定為資源,接著這個資源就可以進行手動或自動的遷移。手動遷移就像是,當你點下移往第二台的按鈕後,第一台就會停止服務,而第二台 就會開啟服務。自動遷移會發生在整個cluster的服務被斷定為無法使用的情況下,其他node自動地挑出下一個Quorum(服務候選人),並且將該 候選人的服務喚起,來完成資源遷移。根據硬體執行完服務的速度,遷移大概會在10秒到30間完成,像haproxy是個小程式,整個遷移的動作在10秒內 就完成了。而當cluster上所有node偵測到原本斷線的node回復,又會自動將資源遷移回第一個node,這個是因為heartbeat執行的演 算法必須要維持一致性的關係。

heartbeat_2.png

儘管heartbeat 2.0多個了這個他稱為CRM(Cluster Resource Management)的技術,卻像是以plugin的方式掛上,核心設定還是沒有啥改變,只要加上crm yes選項就可以啟動了。此外也有附上另一個做的不錯的GUI介面,讓資源建立,監控和操作更為順暢。

此外在閱讀過後heartbeat的wiki後,我確實覺得他們的編排有點「偷懶」,就是提到了2.0版更新的部分,然後讓你把1.0的說明和2.0的說明混在一起看。其實這樣子並沒有辦法好好解釋2.0的觀念。

實做安裝

在所有linux平台上,包括fedora 6、7, CentOS 5,SuSE Enterprise 10,Ubuntu,Gentoo上都可以找到heartbeat的蹤跡。在這裡就只提到redhat系列平台基本上是採用yum,所以打yum install heartbeat就可以了。不過如果要安裝heartbeat_gui,請確定要有XWindow或是VNC,然後打yum install heartbeat_gui

兩個設定檔
以下兩個步驟和heartbeat 1.0一樣,先從/usr/share/doc/heartbeat-{version} /複製ha.cf, authkeys兩個檔案至/etc/ha.d/
編輯ha.cf,在node設定的部分,依照你的主機名稱,依序打上。請注意這些名稱一定要符合在該主機上打uname -n所顯示的值

PLAIN TEXTBASH:

  1. node web01
  2. node web02
  3. node web03
  4. crm yes

接著編輯authkeys,使用以下設定即可。如果你的網路環境沒有啥防火牆,建議使用md5或是sha1

PLAIN TEXTBASH:

  1. auth 1
  2. 1 crc

接著在其他主機也依此安裝,也順手裝好你想要當作資源的服務,就可以service heartbeat start來啟動。

與1.0不相同的是,接著可以參考這段影片,瞭解heartbeat gui怎樣操作。

http://www.linux-ha.org/Education/Newbie/IPaddrScreencast

那我稍微解釋各張投影片在說啥:

  1. 這邊最主要是介紹,與打指令啟動hb_gui
  2. 這邊要提示你,本來在安裝的時候就有新增了一個群組叫haclient,你可以編輯/etc/group然後把你想要的帳號加進去
  3. 這邊可以看到主畫面,如果點選linux-ha,也就是cluster的名字,可以看見其設定。Status會顯示with quorum或是without quorum,表示是否能夠找的到服務候選人。記住要是沒有服務候選人的話(通常是只有一台的情形),是無法儲存設定的,服務基本上也不會啟動。畫面右邊 可以看見cluster的屬性,這些都可以在ha.cf修改。
  4. 將nodes展開後,可以看見有標著DC的node,這個表示協調者目前是位於哪一個node。以他的設計,協調者也會遷移的,無須擔心。
  5. 這邊可以點+圖示來新增資源
  6. 資源視窗裡,可以看見現在可以使用資源種類的列表。注意到class/provider會有lsb或是osf,表示是從/etc/init.d讀取到的,或是heartbeat自己提供的。
  7. 接著他在名稱裡就打了our_ipaddr,名稱當然是取的看得懂就好。此外旁邊group最好也要填,讓接著要加入的資源也填同一個group 的名字。基本上IP當然跟服務綁在同一個群組裡,除非你是想要做active/active。選好填好之後,可以自己刪除或新增parameters,一 般來說lsb的通常都可以把parameters全刪了。然後在這裡你可以看見他填入ip address。
  8. 如果資源還沒啟動,就按播放圖示吧!
  9. 接著因為target_role本來是表示資源啟動的狀態,但因為使用GUI本來就可以看得到,怕會讓自己搞混,就刪了吧
  10. 接著只是單純展示資源可以停止,或是可以增加額外的parameters。我在這邊在多解釋一個功能是,可以在任何一個 node上點右選standby來模擬該node斷線,或是點上下的箭頭圖示來遷移資源,這就讓大家自己玩了。

結論

要測試其實很簡單,把網路線拔掉就可以了。不過要注意的是,拔拔插插的動作不要太頻繁,會導致反應很慢;但因為CRM所使用的演算法在node有兩 個以上,不修改預設設定的情況下,是不會產生死結的,算是可以放心試。此外也不一定要使用hb_gui來監控,在文字介面下有一個crm_mon指令,可 以監控而不會像gui有時候會卡住不更新。

初學者還是要注意,千萬別將load balance和failover所用的程式搞混了。Linux上有名的ip load balance程式為ipvsadm與ldirectord,儘管heartbeat有附資源script來操作ldirectord,但其執行檔還是要 自己用RPM裝的。

ipvsadm命令参考

对ipvsadm 的命令参考,并根据自己使用的经验,进行了一个简单的翻译,希望
对ipvsadm 的使用者有一定的帮助。
为了更好的让大家理解这份命令手册,将手册里面用到的几个术语先简单的介绍
一下:
1,virtual-service-address:是指虚拟服务器的ip 地址
2,real-service-address:是指真实服务器的ip 地址
3,scheduler:调度方法
(lna@networksbase.com 翻译 ipvsadm v1.21 2004 年4 月)
ipvsadm 的用法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p
[timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm –set tcp tcpfin udp
ipvsadm –start-daemon state [–mcast-interface interface]
ipvsadm –stop-daemon
ipvsadm -h
命令选项解释:
有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可
以。
-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C –clear 清除内核虚拟服务器表中的所有记录。
-R –restore 恢复虚拟服务器规则
-S –save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器
记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list 显示内核虚拟服务器表
-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)
–set tcp tcpfin udp 设置连接超时值
–start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说
明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的
VRRP 功能。
–stop-daemon 停止同步守护进程
-h –help 显示帮助信息
其他的选项:
-t –tcp-service service-address 说明虚拟服务器提供的是tcp 的服务
[vip:port] or [real-server-ip:port]
-u –udp-service service-address 说明虚拟服务器提供的是udp 的服务
[vip:port] or [real-server-ip:port]
-f –fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s –scheduler scheduler 使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
默认的调度算法是: wlc.
-p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真实的服务器[Real-Server:port]
-g –gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i –ipip 指定LVS 的工作模式为隧道模式
-m –masquerading 指定LVS 的工作模式为NAT 模式
-w –weight weight 真实服务器的权值
–mcast-interface interface 指定组播的同步接口
-c –connection 显示LVS 目前的连接 如:ipvsadm -L -c
–timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout
–daemon 显示同步守护进程状态
–stats 显示统计信息
–rate 显示速率信息
–sort 对虚拟服务器和真实服务器排序输出
–numeric -n 输出IP 地址和端口的数字形式

集群LVS+GFS+ISCSI+TOMCAT

作者: hosyp    发表于:2006-02-15 21:24:28

LVS是中国人发起的项目,真是意外呀!大家可以看http://www.douzhe.com/linuxtips/1665.html

我是从最初的HA(高可用性)开始的,别人的例子是用VMWARE,可以做试验但不能实际应用,我又没有光纤卡的Share Storage,于是就选用ISCSI,成功后又发现ISCSI+EXT3不能用于LVS,倒最后发现GFS可用,我最终成功配成可实际应用的LVS,前 后断断续续花了四个月,走了很多弯路。我花了三天时间写下这篇文章,希望对大家有用。

这里要感谢linuxfans.org、linuxsir.com、chinaunix.com以及其它很多网站,很多资料都是从他们的论坛上找到的。参考文档及下载点
a.http://www.gyrate.org/misc/gfs.txt
b.http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/cluster-suite/index.html
http://www.redhat.com/docs/manuals/csgfs/admin-guide/index.html
c.ftp://ftp.redhat.com/pub/redhat/linux/updates/enterprise/3ES/en/RHGFS/SRPMS
d.http://distro.ibiblio.org/pub/linux/distributions/caoslinux/centos/3.1/contrib/i386/RPMS/

LVS结构图:
eth0=10.3.1.101
eth0:1=10.3.1.254
Load Balance
Router
eth1=192.168.1.71
eth1:1=192.168.1.1
| |
| |
Real1 Real2
eth0=192.168.1.68 eth0=192.168.1.67
(eth0 gateway=192.168.1.1)
eth1=192.168.0.1—eth1=192.168.0.2
(双机互联线)
|
|
GFS
ISCSI
Share storage
eth0=192.168.1.124

1.Setup ISCSI Server
Server: PIII 1.4,512M, Dell 1650,Redhat 9,IP=192.168.1.124
从http://iscsitarget.sourceforge.net/下载ISCSI TARGET的Source code
(http://sourceforge.net/project/showfiles.php?group_id=108475&package_id=117141)
我选了iscsitarget-0.3.8.tar.gz,要求kernel 2.4.29
从kernel.org下载kernel 2.4.29,解开编译重启后编译安装iscsitarget-0.3.8:
#make KERNELSRC=/usr/src/linux-2.4.29
#make KERNELSRC=/usr/src/linux-2.4.29 install
#cp ietd.conf /etc
#vi /etc/ietd.conf

# Example iscsi target configuration
#
# Everything until the first target definition belongs
# to the global configuration.
# Right now this is only the user configuration used
# during discovery sessions:
# Users, who can access this target
# (no users means anyone can access the target)
User iscsiuser 1234567890abc
Target iqn.2005-04.com.my:storage.disk2.sys1.iraw1
User iscsiuser 1234567890abc
Lun 0 /dev/sda5 fileio
Alias iraw1
Target iqn.2005-04.com.my:storage.disk2.sys1.iraw2
User iscsiuser 1234567890abc
Lun 1 /dev/sda6 fileio
Alias iraw2
Target iqn.2005-04.com.my:storage.disk2.sys2.idisk
User iscsiuser 1234567890abc
Lun 2 /dev/sda3 fileio
Alias idisk
Target iqn.2005-04.com.my:storage.disk2.sys2.icca
User iscsiuser 1234567890abc
Lun 3 /dev/sda7 fileio
Alias icca

说明:password 长度必须不小于12个字符, Alias是别名, 不知为何这个别名在Client端显示不出来.
分区:我只有一个SCSI盘,所以:

/dev/sda3: Share storage,容量越大越好
/dev/sda5: raw1, 建Cluster要的rawdevice, 我给了900M
/dev/sda6: raw2, 建Cluster要的rawdevice, 我给了900M
/dev/sda7: cca, 建GFS要的,我给了64M
(/dev/sda4是Extended分区,在其中建了sda5,6,7)

#Reboot,用service iscsi-target start启ISCSI server(我觉得比建议的好,可以
用service iscsi-target status看状态)
2.Setup ISCSI Client(on two real server)
Server: PIII 1.4,512M, Dell 1650,Redhat AS3U4(用AS3U5更好),2.4.21-27.EL
#vi /etc/iscsi.conf

DiscoveryAddress=192.168.1.124
OutgoingUsername=iscsiuser
OutgoingPassword=1234567890abc
Username=iscsiuser
Password=1234567890abc
LoginTimeout=15
IncomingUsername=iscsiuser
IncomingPassword=1234567890abc
SendAsyncTest=yes

#service iscsi restart
#iscsi-ls -l
…, 精简如下:
/dev/sdb:iraw2
/dev/sdc:iraw1
/dev/sdd:idisk
/dev/sde:icca
注意: 在real server中ISCSI device的顺序很重要,两个real server中一定要一样,如不一样
就改ISCSI Server中的设置,多试几次
3.Install Redhat Cluster suite
先下载Cluster Suite的ISO, AS3的我是从ChinaUnix.net找到的下载点, 安装clumanager和
redhat-config-cluster。没有Cluster Suite的ISO也没关系,从
ftp://ftp.redhat.com/pub/redhat/linux/updates/enterprise/3ES/en/RHCS/SRPMS/下载
clumanager-1.2.xx.src.rpm,redhat-config-cluster-1.0.x.src.rpm,编译后安装,应该更好:
#rpm -Uvh clumanager-1.2.26.1-1.src.rpm
#rpmbuild -bs /usr/src/redhat/SPECS/clumanager.spec
#rpmbuild –rebuild –target i686 /usr/src/redhat/SRPMS/clumanager-1.2.26.1-1.src.rpm
还有redhat-config-cluster-1.0.x.src.rpm,也装好
4.Setup Cluster as HA module
详细步骤我就不写了,网上有很多文章,我也是看了别人的文章学会的,不过人家是用VMWARE,
而我是用真的机子+ISCSI,raw device就是/dev/sdb,/dev/sdc, 然后就
mount /dev/sdd /u01, mkfs.ext3 /u01 ……
设好后会发现ISCSI有问题:同时只能有一个Client联接写盘,如果
两个Client同时联ISCSI的Share Storge,一个Client写,另一个Client是看不到的,而且此时文
件系统已经破坏了,Client重联ISCSI时会发现文件是坏的,用fsck也修复不了。
ISCSI真的是鸡肋吗?
NO!从GOOGLE上我终于查到ISCSI只有用Cluster File System才能真正用于Share Storage!
而Redhat买下的GFS就是一个!
5.Setup GFS on ISCSI
GFS只有Fedora Core4才自带了,而GFS又一定要用到Cluster Suite产生的/etc/cluster.xml文件,
我没见FC4有Cluster Suite,真不知Redhat给FC4带GFS干嘛,馋人吗?
好,闲话少说,下载:c处的GFS-6.0.2.20-2.src.rpm, 按a处的gfs.txt编译安装,不过关于
cluster.ccs,fence.ccs,nodes.ccs的设置没说,看b的文档,我总算弄出来了,都存在
/root/cluster下,存在别的地方也行,不过我不知道有没有错,我没有光纤卡,文档又没讲ISCSI
的例子,不过GFS能启动的。
#cat cluster.ccs

cluster {
name = "Cluster_1"
lock_gulm {
servers = ["cluster1", "cluster2"]
heartbeat_rate = 0.9
allowed_misses = 10
}
}

注:name就是Cluster Suite设置的Cluster name, servers就是Cluster member的Hostname,别忘
了加进/etc/hosts;allowed_misses我开始设为1,结果跑二天GFS就会死掉,改为10就没死过了。
#cat fence.ccs

fence_devices{
admin {
agent = "fence_manual"
}
}

#cat nodes.ccs

nodes {
cluster1 {
ip_interfaces {
hsi0 = "192.168.0.1"
}
fence {
human {
admin {
ipaddr = "192.168.0.1"
}
}
}
}
cluster2 {
ip_interfaces {
hsi0 = "192.168.0.2"
}
fence {
human {
admin {
ipaddr = "192.168.0.2"
}
}
}
}
}

注:ip就是心跳线的ip
这三个文件建在/root/cluster下,先建立Cluster Configuration System:
a.#vi /etc/gfs/pool0.cfg
poolname pool0
minor 1 subpools 1
subpool 0 8 1 gfs_data
pooldevice 0 0 /dev/sde1
b.#pool_assemble -a pool0
c.#ccs_tool create /root/cluster /dev/pool/pool0
d.#vi /etc/sysconfig/gfs
CCS_ARCHIVE="/dev/pool/pool0"

再Creating a Pool Volume,就是我们要的共享磁盘啦,
a.#vi /etc/gfs/pool1.cfg
poolname pool1
minor 2 subpools 1
subpool 0 128 1 gfs_data
pooldevice 0 0 /dev/sdd1
b.#pool_assemble -a pool1
c.#gfs_mkfs -p lock_gulm -t Cluster_1:gfs1 -j 8 /dev/pool/pool1
d.#mount -t gfs -o noatime /dev/pool/pool1 /u01
下面是个GFS的启动脚本,注意real1和real2必须同时启动lock_gulmd进程,第一台lock_gulmd
会成为Server并等Client的lock_gulmd,几十秒后没有响应会fail,GFS启动失败。Redhat建议
GFS盘不要写进/etc/fstab。
#cat gfstart.sh

#!/bin/sh
depmod -a
modprobe pool
modprobe lock_gulm
modprobe gfs
sleep 5
service iscsi start
sleep 20
service rawdevices restart
pool_assemble -a pool0
pool_assemble -a pool1
service ccsd start
service lock_gulmd start
mount -t gfs /dev/pool/pool1 /s02 -o noatime
service gfs status

6. Setup Linux LVS

LVS是章文嵩博士发起和领导的优秀的集群解决方案,许多商业的集群产品,比如RedHat的Piranha,Turbolinux公司的Turbo Cluster等,都是基于LVS的核心代码的。

我的系统是Redhat AS3U4,就用Piranha了。从rhel-3-u5-rhcs-i386.iso安装piranha-0.7.10-2.i386.rpm, ipvsadm-1.21-9.ipvs108.i386.rpm (http://distro.ibiblio.org/pub/linux/distributions/caoslinux/centos/3.1/contrib/i386/RPMS/) 装完后service httpd start & service piranha-gui start,就可以从http://xx.xx.xx.xx:3636管理或设置了,当然了,手工改/etc/sysconfig/ha/lvs.cf也 一样。

#cat /etc/sysconfig/ha/lvs.cf

serial_no = 80
primary = 10.3.1.101
service = lvs
rsh_command = ssh
backup_active = 0
backup = 0.0.0.0
heartbeat = 1
heartbeat_port = 1050
keepalive = 6
deadtime = 18
network = nat
nat_router = 192.168.1.1 eth1:1
nat_nmask = 255.255.255.0
reservation_conflict_action = preempt
debug_level = NONE
virtual lvs1 {
active = 1
address = 10.3.1.254 eth0:1
vip_nmask = 255.255.255.0
fwmark = 100
port = 80
persistent = 60
pmask = 255.255.255.255
send = "GET / HTTP/1.0rnrn"
expect = "HTTP"
load_monitor = ruptime
scheduler = wlc
protocol = tcp
timeout = 6
reentry = 15
quiesce_server = 1
server Real1 {
address = 192.168.1.68
active = 1
weight = 1
}
server Real2 {
address = 192.168.1.67
active = 1
weight = 1
}
}
virtual lvs2 {
active = 1
address = 10.3.1.254 eth0:1
vip_nmask = 255.255.255.0
port = 21
send = "n"
use_regex = 0
load_monitor = ruptime
scheduler = wlc
protocol = tcp
timeout = 6
reentry = 15
quiesce_server = 0
server ftp1 {
address = 192.168.1.68
active = 1
weight = 1
}
server ftp2 {
address = 192.168.1.67
active = 1
weight = 1
}
}

设置完后service pulse start, 别忘了把相关的client加进/etc/hosts
#iptables -t mangle -A PREROUTING -p tcp -d 10.3.1.254/32 –dport 80 -j MARK –set-mark 100
#iptables -t mangle -A PREROUTING -p tcp -d 10.3.1.254/32 –dport 443 -j MARK –set-mark 100
#iptables -A POSTROUTING -t nat -p tcp -s 10.3.1.0/24 –sport 20 -j MASQUERADE
运行以上三行命令并存入/etc/rc.d/rc.local,用ipvsadm看状态:
#ipvsadm

IP Virtual Server version 1.0.8 (size=65536)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.3.1.254:ftp wlc
-> cluster2:ftp Masq 1 0 0
-> cluster1:ftp Masq 1 0 0
FWM 100 wlc persistent 60
-> cluster1:0 Masq 1 0 0
-> cluster2:0 Masq 1 0 0

注意:a.Firewall Mark可以不要,我反正是加了,文档说有https的话加上,值我选了100,
b.Virtual IP别加进/etc/hosts,我上过当,80端口时有时无的,
c.eth0:1,eth1:1是piranha产生的,别自己手工设置,我干过这画蛇添足的事,网上有
些帖子没说清,最后是看Redhat的文档才弄清楚的。
d.The LVS router can monitor the load on the various real servers by using
either rup or ruptime. If you select rup from the drop-down menu, each real
server must run the rstatd service. If you select ruptime, each real server
must run the rwhod service.Redhat的原话,就是如选rup的监控模式real server上
都要运行rstatd进程,如选ruptime就要运行rwhod进程。
e.Real Server同Router相联的网卡的Gateway必须是Router的那块网卡的VIP,举本例:
Router的eth1同两个real server的eth0相联,如VIP eth1:1=192.168.1.1,则real
server 的eth0的Gateway=192.168.1.1

echo "1" > /proc/sys/net/ipv4/ip_forward

7.Setup TOMCAT5.59+JDK1.5(用Redhat自带的Apache)
a.#tar xzvf jakarta-tomcat-5.5.9.tar.gz
#mv jakarta-tomcat-5.5.9 /usr/local
#ln -s /usr/local/jakarta-tomcat-5.5.9 /usr/local/tomcat
b.#jdk-1_5_0_04-linux-i586.bin
#mv jdk1.5.0_4 /usr/java
#ln -s /usr/java/jdk1.5.0_4 /usr/java/jdk
c.#vi /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export TOMCAT_HOME=/usr/local/tomcat
d.#vi /etc/profile.d/jdk.sh

if ! echo ${PATH} | grep "/usr/java/jdk/bin" ; then
JAVA_HOME=/usr/java/jdk
export JAVA_HOME
export PATH=/usr/java/jdk/bin:${PATH}
export CLASSPATH=$JAVA_HOME/lib
fi

e.#chmod 755 /etc/profile.d/*.sh
f.重新用root登录,让tomcat.sh和jdk.sh起作用,
#tar xzvf jakarta-tomcat-connectors-jk2-src-current.tar.gz
#cd jakarta-tomcat-connectors-jk2-2.0.4-src/jk/native2/
#./configure –with-apxs2=/usr/sbin/apxs –with-jni –with-apr-lib=/usr/lib
#make
#libtool –finish /usr/lib/httpd/modules
#cp ../build/jk2/apache2/mod_jk2.so ../build/jk2/apache2/libjkjni.so /usr/lib/httpd/modules/
g.#vi /usr/local/tomcat/bin/catalina.sh
在# Only set CATALINA_HOME if not already set后加上以下两行:
serverRoot=/etc/httpd
export serverRoot
h.#vi /usr/local/tomcat/conf/jk2.properties
serverRoot=/etc/httpd
apr.NativeSo=/usr/lib/httpd/modules/libjkjni.so
apr.jniModeSo=/usr/lib/httpd/modules/mod_jk2.so
i.#vi /usr/local/tomcat/conf/server.xml,

在前加上以下几行,建了两个VirtualPath:myjsp和local,一个指向share storage,一个指向real server本地

j.#vi /etc/httpd/conf/workers2.properties

#[logger.apache2]
#level=DEBUG
[shm]
file=/var/log/httpd/shm.file
size=1048576
[channel.socket:localhost:8009]
tomcatId=localhost:8009
keepalive=1
info=Ajp13 forwarding over socket
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
[status:status]
info=Status worker, displays runtime informations
[uri:/*.jsp]
worker=ajp13:localhost:8009
context=/

k.#vi /etc/httpd/conf/httpd.conf
改:DocumentRoot "/u01/www"
加:
在LoadModule最后加:
LoadModule jk2_module modules/mod_jk2.so
JkSet config.file /etc/httpd/conf/workers2.properties
在#

<%@ page contentType="text/html" %>;
<%@ page import="java.sql.*"%>;
<?xml version="1.0"?>;
<html">;
<head>;
<meta http-equiv="Content-Type" content="text/html" />;
<title>;Test ORACLE Employees</title>;
</head>;
<body>;
<%
String OracleDBDriver="oracle.jdbc.driver.OracleDriver";
String DBUrl="jdbc:oracle:thin:@10.3.1.211:1521:MYID";
String UserID="my";
String UserPWD="1234";

Connection conn=null;

Statement stmt=null;
ResultSet rs=null;
try
{
Class.forName(OracleDBDriver);
}
catch(ClassNotFoundException ex)
{
System.out.println("Class.forname:"+ex);
}
conn=DriverManager.getConnection(DBUrl,UserID,UserPWD);
stmt=conn.createStatement();
String sql="select * from EMPLOYEES";

rs = stmt.executeQuery(sql);

out.print("<table border>;");
out.print("<tr>;");
out.print("<th width=100>;"+"EMPLOYEE_ID");
out.print("<th width=50>;"+"FIRST_NAME");

out.print("<th width=50>;"+"LAST_NAME");
out.print("<th width=50>;"+"EMAIL");
out.print("<th width=50>;"+"PHONE_NUMBER");
out.print("<th width=50>;"+"HIRE_DATE");
out.print("<th width=50>;"+"JOB_ID");

out.print("<tr>;");
try
{
while(rs.next())
{
out.print("<tr>;");
int n=rs.getInt(1);
out.print("<td>;"+n+"</td>;");

String e=rs.getString(2);
out.print("<td>;"+e+"</td>;");
//String e=rs.getString(3);
out.print("<td>;"+rs.getString(3)+"</td>;");
out.print("<td>;"+rs.getString(4)+"</td>;");

out.print("<td>;"+rs.getString(5)+"</td>;");
out.print("<td>;"+rs.getString(6)+"</td>;");
out.print("<td>;"+rs.getString(7)+"</td>;");

out.print("</tr>;");

}
}
catch(SQLException ex)
{
System.err.println("ConnDB.Main:"+ex.getMessage());
}

out.print("</table>;");
rs.close();
stmt.close();
conn.close();
%>;

</body>;
</html>;

p:#vi /u01/www/index.html

<HTML>
<HEAD>
<META HTTP-EQUIV="Refresh" CONTENT="10 URL=http://10.3.1.254/myjsp/testoracle.jsp">
</HEAD>
<BODY>
<a href="http://10.3.1.254/local/index.jsp">;WEB Local</a>
<p>
<a href="http://10.3.1.254/myjsp/testoracle.jsp">;Test Oracle WEB</a>
</BODY>
</HTML>

q:在两台real server上分别
#vi /usr/local/tomcat/conf/tomcat-users.xml
加下面一行,允许页面管理:

anon_root=/u01/ftproot
local_root=/u01/ftproot
setproctitle_enable=YES

#service vsftpd start

现在LVM+GFS+ISCSI+TOMCAT就设置好了,我们可以用Apache Jmeter来测试LVM的性能,两台机子上分别运行jmeter,都指向10.3.1.254/myjsp/testoracle.jsp,各200个 threads同时运行,在Router上用ipvsadm可以监控,Oracle Server的性能可要好,否则大量的http进程会hang在real server上,ipvsadm也会显示有个real server失去了。测试时real server的CPU idle会降到70%,而Router的CPU idle几乎不动。

LVS集群技术

LVS集群技术

作者:

最后更新:2005年5月18日

目录

Preface

集群技术主要分为三大类:

  • 高可用性(High Available Cluster),例:Linux-HA
  • 负载均衡(Load balancing Cluster),例:LVSMOSIX
  • 高性能计算(High Performance Computing),例:Beowulf

我们这里使用RedHat AS 3.x,LVS,Linux-HA,Ldirectord,构造一个高可用的负载均衡集群系统。如图:

各层的作用:

  • Load Balancer(负载均衡器):

    Load Balancer是整个集群系统的前端,负责把客户请求转发到Real Server上。

    Backup是备份Load Balancer,当Load Balancer不可用时接替它,成为实际的Load Balancer。

    Load Balancer通过Ldirectord监测各Real Server的健康状况。在Real Server不可用时
    把它从群中剔除,恢复时重新加入。

  • Server Array(服务器群):

    Server Array是一组运行实际应用服务的机器,比如WEB, Mail, FTP, DNS, Media等等。

    在实际应用中,Load Balancer和Backup也可以兼任Real Server的角色。

  • Shared Storage(共享存储):

    Shared Storage为所有Real Server提供共享存储空间和一致的数据内容。

各服务器IP分配:

Virtual IP: 192.168.136.10 Load Balancer: 192.168.136.11 Backup: 192.168.136.12 Real Server 1: 192.168.136.101 Real Server 2: 192.168.136.102 Real Server 3: 192.168.136.103 IPVS

IPVS是LVS集群系统的核心软件,它的主要作用是:

  • 安装在Load Balancer上,把发往Virtual IP的请求转发到Real Server上。

IPVS的负载均衡机制有三种,这里使用IP Tunneling机制:

  • Virtual Server via NAT
  • Virtual Server via IP Tunneling
  • Virtual Server via Direct Routing

IPVS的负载调度算法有十种:

  • 轮叫(Round Robin)
  • 加权轮叫(Weighted Round Robin)
  • 最少链接(Least Connections)
  • 加权最少链接(Weighted Least Connections)
  • 基于局部性的最少链接(Locality-Based Least Connections)
  • 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
  • 目标地址散列(Destination Hashing )
  • 源地址散列(Source Hashing)
  • 最短期望延迟(Shortest Expected Delay)
  • 无须队列等待(Never Queue)

IPVS安装主要包括三方面:

  • 在Load Banlancer上安装IPVS内核补丁
  • 在Load Banlancer上安装IPVS管理软件
  • 在Real Server上安装ARP hidden内核补丁

关于如何编译内核请参考其他文档,这里使用从UltraMonkey下载的已编译好的内核。

在Load Banlancer、Backup和Real Server上使用同一内核,IPVS和ARP hidden都已编译在这个内核里:

wget http://www.ultramonkey.org/download/2.0.1/rh.el.3.0/RPMS/mkinitrd-3.5.13-1.um.1.i386.rpm
wget http://www.ultramonkey.org/download/2.0.1/rh.el.3.0/RPMS/kernel-2.4.21-27.0.2.EL.um.1.i686.rpm
wget http://www.ultramonkey.org/download/2.0.1/rh.el.3.0/RPMS/kernel-smp-2.4.21-27.0.2.EL.um.1.i686.rpm
rpm -Fhv mkinitrd-3.5.13-1.um.1.i386.rpm

rpm -Fhv kernel-2.4.21-27.0.2.EL.um.1.i686.rpm

在Load Banlancer和Backup上安装IPVS管理软件:

wget http://www.linuxvirtualserver.org/software/kernel-2.4/ipvs-1.0.10.tar.gz

tar zxf ipvs-1.0.10.tar.gz

cd ipvs-1.0.10/ipvs/ipvsadm

make install

chkconfig –del ipvsadm

配置IPVS(/etc/sysconfig/ipvsadm),添加Real Server:

-A -t 192.168.136.10:80 -s rr

-a -t 192.168.136.10:80 -r 192.168.136.11:80 -i

-a -t 192.168.136.10:80 -r 192.168.136.12:80 -i

-a -t 192.168.136.10:80 -r 192.168.136.101:80 -i

-a -t 192.168.136.10:80 -r 192.168.136.102:80 -i

-a -t 192.168.136.10:80 -r 192.168.136.103:80 -i

相关链接:

Kernel:http://www.kernel.org/

IPVS和IPVSadm:http://www.linuxvirtualserver.org/software/ipvs.html

ARP hidden:http://www.ssi.bg/~ja/#hidden

注意事项:

1. Kernel,IPVS,IPVSadm,ARP hidden之间的版本必须对应。

2. 自己编译内核时,从http://www.kernel.org/下载标准内核源文件,不要使用发行版的内核源文件。

3. Kernel 2.4.28和2.6.10及以上版本已内置IPVS,有些Linux发行版也在其内核里编译了IPVS。

4. ARP hidden可以用arp_ignore/arp_announce或者arptables代替 HeartBeat

HeartBeat是Linux-HA的高可用性集群软件,它的主要作用是:

  • 安装在Load Balancer和Backup上,运行于active/standby模式。

    当Load Balancer失效时,Backup自动激活,成为实际的Load Balancer。

  • 切换到active模式时,按顺序启动Virtual IP、IPVS和Ldirectord。

    切换到standby模式时,按顺序关闭Ldirectord、IPVS和Virtual IP。

HeartBeat串口线连接测试方法:

在Load Balancer上:cat < /dev/ttyS0

在Backup上:echo hello > /dev/ttyS0

修改主机名(/etc/hosts):

127.0.0.1         localhost.localdomain localhost

192.168.136.11    loadbalancer

192.168.136.12    backup

安装:

groupadd -g 694 haclient

useradd -u 694 -g haclient hacluster

rpm -ivh /mnt/cdrom/RedHat/RPMS/glib2-devel-*

wget http://www.packetfactory.net/libnet/dist/libnet.tar.gz

tar zxf libnet.tar.gz

cd libnet

./configure

make

make install

wget http://www.linux-ha.org/download/heartbeat-1.99.4-tar.gz

tar zxf heartbeat-1.99.4.tar.gz

cd heartbeat-1.99.4

./ConfigureMe configure –disable-swig –disable-snmp-subagent

make

make install

cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/

cp ldirectord/ldirectord.cf /etc/ha.d/

chkconfig –add heartbeat

chkconfig –del ldirectord

主配置文件(/etc/ha.d/ha.cf):

#debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

baud 19200

serial /dev/ttyS0

mcast eth0 225.0.0.1 694 1 0

# 当主节点恢复后,是否自动切回

auto_failback on

# stonith用来保证共享存储环境中的数据完整性

#stonith baytech /etc/ha.d/conf/stonith.baytech

# watchdog能让系统在出现故障1分钟后重启该机器。这个功能可以帮助服务器在确实停止心跳后能够重新恢复心跳。

# 如果使用该特性,则在内核中装入"softdog"内核模块,用来生成实际的设备文件,输入"insmod softdog"加载模块。

# 输入"grep misc /proc/devices"(应为10),输入"cat /proc/misc | grep watchdog"(应为130)。

# 生成设备文件:"mknod /dev/watchdog c 10 130" 。

#watchdog /dev/watchdog

node loadbalancer

node backup

# 默认heartbeat并不检测除本身之外的其他任何服务,也不检测网络状况。

# 所以当网络中断时,并不会进行Load Balancer和Backup之间的切换。

# 可以通过ipfail插件,设置’ping nodes’来解决这一问题。详细说明参考hearbeat文档。

#ping 192.168.136.1 172.16.0.1

ping_group group1 192.168.136.1 192.168.136.2

respawn root /usr/lib/heartbeat/ipfail

apiauth ipfail gid=root uid=root

# 其他一些插件可以在/usr/lib/heartbeat下找到

#apiauth ipfail uid=hacluster

#apiauth ccm uid=hacluster

#apiauth cms uid=hacluster

#apiauth ping gid=haclient uid=alanr,root

#apiauth default gid=haclient

资源文件(/etc/ha.d/haresources):

loadbalancer lvs IPaddr::192.168.136.10/24/eth0 ipvsadm ldirectord

认证文件(/etc/ha.d/authkeys),选取一种认证方式,这个文件的权限必须是600:

auth 1

1 crc

#2 sha1 sha1_any_password

#3 md5 md5_any_password

相关链接:

Linux-HA:http://www.linux-ha.org ldirectord

安装HeartBeat过程中,已经自动安装了Ldirectord,它的作用是:

  • 监测Real Server,当Real Server失效时,把它从Load Balancer列表中删除,恢复时重新添加。

配置(/etc/ha.d/ldirectord.cf):

# Global Directives

checktimeout=3

checkinterval=1

fallback=127.0.0.1:80

autoreload=yes

logfile="/var/log/ldirectord.log"

quiescent=yes

# A sample virual with a fallback that will override the gobal setting

virtual=192.168.136.10:80

         real=192.168.136.11:80 ipip

         real=192.168.136.12:80 ipip

         real=192.168.136.101:80 ipip

         real=192.168.136.102:80 ipip

         real=192.168.136.103:80 ipip

         fallback=127.0.0.1:80    gate

         service=http

         request="test.html"

         receive="Test Page"

         virtualhost=www.funbsd.net

         scheduler=rr

         #persistent=600

         #netmask=255.255.255.255

         protocol=tcp

在每个Real Server的中添加监控页:

echo "Test Page" >> /var/www/html/test.html Patch

在启动集群系统之前,我们认为包括Load Balancer和Backup在内的所有服务器都是Real Server。

在服务器上添加以下脚本/etc/init.d/tunl,用来配置tunl端口,应用arp补丁:

#!/bin/sh

# chkconfig: 2345 70 10

# description: Config tunl port and apply arp patch

VIP=192.168.136.10

. /etc/rc.d/init.d/functions

case "$1" in

     start)

         echo "Tunl port starting"

         ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up

         echo 1 > /proc/sys/net/ipv4/ip_forward

         echo 1 > /proc/sys/net/ipv4/conf/all/hidden

         echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden

         ;;

     stop)

         echo "Tunl port closing"

         ifconfig tunl0 down

         echo 1 > /proc/sys/net/ipv4/ip_forward

         echo 0 > /proc/sys/net/ipv4/conf/all/hidden

         ;;

     *)

         echo "Usage: $0 {start|stop}"

         exit 1

esac

如果有多个Virutal IP,可以使用tunl0:0,tunl0:1…。

chmod 755 /etc/init.d/tunl

chkconfig –add tunl

在Load Balancer和Backup上,这个脚本的启动级必须先于heartbeat,关闭级必须后于heartbeat。

Scripts

在HeartBeat资源文件(/etc/ha.d/haresources)中定义了实现集群所需的各个软件的启动脚本。

这些脚本必须放在/etc/init.d或者/etc/ha.d/resource.d目录里,启动顺序不能变:

loadbalancer lvs IPaddr::192.168.136.10/24/eth0 ipvsadm ldirectord

IPaddr的作用是启动Virutal IP,它是HeartBeart自带的一个脚本。

ipvsadm的作用是在启动的时候把所有Real Server加入群中。

ldirectord的作用是启动ldirectord监控程序。

lvs的作用是为启动Load Balancer做准备,关闭tunl端口,取消arp补丁:

#!/bin/sh

# chkconfig: 2345 90 10

# description: Preparing for Load Balancer and Real Server switching

VIP=192.168.136.10

. /etc/rc.d/init.d/functions

case "$1" in

     start)

         echo "Preparing for Load Balancer"

         ifconfig tunl0 down

         echo 1 > /proc/sys/net/ipv4/ip_forward

         echo 0 > /proc/sys/net/ipv4/conf/all/hidden

         ;;

     stop)

         echo "Preparing for Real Server"

         ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up

         echo 1 > /proc/sys/net/ipv4/ip_forward

         echo 1 > /proc/sys/net/ipv4/conf/all/hidden

         echo 1 > /proc/sys/net/ipv4/conf/tunl0/hidden

         ;;

     *)

         echo "Usage: lvs {start|stop}"

         exit 1

esac

chmod 755 /etc/ha.d/resource.d/lvs

启动集群系统:

/etc/init.d/heartbeat start Reference

http://www.linuxvirtualserver.org/

http://www.linux-ha.org/

http://www.ultramonkey.org/

http://www.linuxts.com/modules/sections/index.php?op=viewarticle&artid=375

http://www.yesky.com/SoftChannel/72341302397632512/20040311/1776261.shtml

http://www-900.ibm.com/developerWorks/cn/linux/theme/special/index.shtml#cluster