搭建一个高可用集群(httpd)

实验前准备:准备三台干净的虚拟机,其IP分别为192.168.0.20、192.168.0.21和192.168.0.1(此台主机为测试主机),VIP为192.168.0.251:从网上下载与heartbeat有关的rpm包:
heartbeat-2.1.4-9.el5.i386.rpm
heartbeat-devel-2.1.4-9.el5.i386.rpm
heartbeat-gui-2.1.4-9.el5.i386.rpm
heartbeat-ldirectord-2.1.4-9.el5.i386.rpm
heartbeat-pils-2.1.4-10.el5.i386.rpm
heartbeat-stonith-2.1.4-10.el5.i386.rpm
libnet-1.1.4-3.el5.i386.rpm
perl-MailTools-1.77-1.el5.noarch.rpm
把它们放到root目录下;虚拟机配好yum源;开始实验:

配置Primary Node:
1.)安装heartbeat(切换到root目录)
   yum -y --nogpgcheck localinstall *.rpm
2.)安装Apache:
   yum install httpd
   chkconfig --list httpd(查看httpd进程,保证开机时httpd进程不会自动启动)
   echo "<h1>Primary Node</h1>" >>  /var/www/html/index.html(为httpd服务创建一个静态网页)
3.)修改/etc/sysconfig/network文件,修改主机FQDN
   vim /etc/sysconfig/network
   HOSTNAME=node1.example.com
   hostname(查看当前主机FQDN)
   hostname node1.example.com(修改当前主机FQDN)
   uname -a(查看当前主机FQDN)
4.)配置/etc/hosts文件,在文件中添加语句
   vim  /etc/hosts
   192.168.0.20         node1.example.com       node1
   192.168.0.21         node2.example.com       node2
5.)拷贝配置文件到主配置目录(/etc/ha.d/)内:
   cd /etc/ha.d/
   cp /usr/share/doc/heartbeat-2.1.4/authkeys  ./
   cp /usr/share/doc/heartbeat-2.1.4/haresources  ./
   cp /usr/share/doc/heartbeat-2.1.4/ha.cf  ./
6.)配置heartbeat的主配置文件/etc/ha.d/ha.cf:
   vim /etc/ha.d/ha.cf
*****************************************************************
   keepalive  2
   deadtime  30
   warntime  10
   initdead    120
   bcast    eth0
   auto_failbask on                     
   node  node1.example.com
   node  node2.example.com
*****************************************************************
7.)配置资源管理文件/etc/ha.d/haresources:
   vim  /etc/ha.d/haresources
   node1.example.com        192.168.0.251        httpd
   cp /etc/init.d/httpd  resource.d/
8.)配置数据加密文件/etc/ha.d/authkeys:
   vim  /etc/ha.d/authkeys
   auth 1
   1      md5     "Hello"
   chmod 600 authkeys

配置Secondary Node:
1.)安装heartbeat(切换到root目录)
   yum -y --nogpgcheck localinstall *.rpm
2.)安装Apache:
   yum install httpd
   chkconfig --list httpd(查看httpd进程,保证开机时httpd进程不会自动启动)
   echo "<h1>Secondary Node</h1>" >>  /var/www/html/index.html(为httpd服务创建一个静态网页)
3.)修改/etc/sysconfig/network文件,修改主机FQDN
   vim /etc/sysconfig/network
   HOSTNAME=node1.example.com
   hostname(查看当前主机FQDN)
   hostname node1.example.com(修改当前主机FQDN)
   uname -a(查看当前主机FQDN)
4.)从Primary Node拷贝文件到Secondary Node
    scp 192.168.0.20:/etc/hosts   /etc/
    cd /etc/ha.d
    scp 192.168.0.20:/etc/ha.d/authkeys  ./
    scp 192.168.0.20:/etc/ha.d/haresources  ./
    scp 192.168.0.20:/etc/ha.d/ha.cf  ./
    cp /etc/init.d/httpd     resource.d/

测试:
1.)启动Primary Node和Secondary Node的heartbeat服务`service heartbeat start`
2.)用测试机client测试输入http://192.168.0.251会打开"Primary Node"的网页
3.)转到/usr/share/heartbeat目录下`cd /usr/share/heartbeat`,输入命令`./hb_standby`,是资源转换到Secondary Node里,然后用测试机client测试会打开"Secondary Node"的网页
4.)再输入命令`hb_takeover`,使Primary Node重新获得资源;在用测试机client测试会打开"Primary Node"的网页

 

 


                                                搭建一个高可用的LVS

对上述的高可用集群进行修改:
1.)关掉heartbeat服务:killall -9 heartbeat(一般不采用这种方法)
2.)在主配置目录/etc/ha.d/的resource.d/目录下创建一个ipvsadm是SYSTEM V风格的脚本ipvsd
   cd /etc/ha.d/resource.d/
   vim ipvsd
*********************************************************************
#!/bin/bash
#
# LVS script for VS/DR
#
. /etc/rc.d/init.d/functions
#
VIP=192.168.0.251
RIP=192.168.0.25
RIP2=192.168.0.26
PORT=80

#
case "$1" in
start)          

  /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
  /sbin/route add -host $VIP dev eth0:1

# Since this is the Director we must be able to forward packets
  echo 1 > /proc/sys/net/ipv4/ip_forward

# Clear all iptables rules.
  /sbin/iptables -F

# Reset iptables counters.
  /sbin/iptables -Z

# Clear all ipvsadm rules/services.
  /sbin/ipvsadm -C

# Add an IP virtual service for VIP 192.168.0.21 port 80
# In this recipe, we will use the round-robin scheduling method.
# In production, however, you should use a weighted, dynamic scheduling method.
  /sbin/ipvsadm -A -t $VIP:80 -s wlc

# Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2

  /bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;

stop)
# Stop forwarding packets
  echo 0 > /proc/sys/net/ipv4/ip_forward

# Reset ipvsadm
  /sbin/ipvsadm -C

# Bring down the VIP interface
  /sbin/ifconfig eth0:1 down
  /sbin/route del $VIP
 
  /bin/rm -f /var/lock/subsys/ipvsadm
 
  echo "ipvs stopped..."
;;

status)
  if [ ! -e /var/lock/subsys/ipvsadm ]; then
    echo "ipvsadm stopped ..."
  else
    echo "ipvs is running ..."
    ipvsadm -L -n
  fi
;;
*)
  echo "Usage: $0 {start|stop|status}"
;;
esac
********************************************************************
3.)修改资源配置文件/etc/ha.d/haresources,把原先的httpd服务哪一行注释或删除,在添加一行:
   vim /etc/ha.d/haresources
   node1.example.com  ipvsd
4.)把修改过的内容传送给Secondary Node
   scp /etc/ha.d/resource.d/ipvsd 192.168.0.21:/etc/ha.d/resource.d
   scp /etc/ha.d/haresources 192.168.0.21:/etc/ha.d/
5.)开启heartbeat服务`service heartbeat start`, 在Primary Node内使用`ipvsadm -Ln`测试会打印"httpd的服务规则;而在Secondary Node里用`ipvsadm -Ln`测试不会打印"httpd的服务规则
6.)转到/usr/share/heartbeat目录下`cd /usr/share/heartbeat`,输入命令`./hb_standby`,是资源转换到Secondary Node里,然后在Secondary Node里用`ipvsadm -Ln`测试会打印"httpd的服务规则;而在Primary Node内使用`ipvsadm -Ln`不会打印httpd的服务规则
7.)再输入命令`hb_takeover`,使Primary Node重新获得资源;在Primary Node使用`ipvsadm -Ln`测试会打印"httpd的服务规则;而在Secondary Node里用`ipvsadm -Ln`测试不会打印"httpd的服务规则

 

 

高可用集群相关知识:
HA的LVS集群有两台Director,在启动时,主节点占有集群负载均衡资源(VIP和LVS的转发及高度规则),备用节点监听主节点的“心跳”信息并在主节点出现异常时进行“故障转移”而取得资源使用权,这包括如下步骤:
1.)添加VIP至其网络接口
2.)广播GARP信息,通知网络内的其它主机目前本Director其占有VIP
3.)创建IPVS表以实现入站请求连接的负载均衡
4.)Stonith

Heartbeat的控制信息:
1.)“心跳”信息: (也称为状态信息)仅150 bytes大小的广播、组播或多播数据包。可为以每个节点配置其向其它节点通报“心跳”信息的频率,以及其它节点上的heartbeat进程为了确认主节点出节点出现了运行等错误之前的等待时间。

2.)集群变动事务(transition)信息:ip-request和ip-request-rest是相对较常见的两种集群变动信息,它们在节点间需要进行资源迁移时为不同节点上heartbeat进程间会话传递信息。比如,当修复了主节点并且使其重新“上线”后,主节点会使用ip-request要求备用节点释放其此前从因主节点故障而从主节点那里接管的资源。此时,备用节点则关闭服务并使用ip-request-resp通知主节点其已经不再占用此前接管的资源。主接点收到ip-request-resp后就会重新启动服务。

3.)重传请求:在某集群节点发现其从其它节点接收到的heartbeat控制信息“失序”(heartbeat进程使用序列号来确保数据包在传输过程中没有被丢弃或出现错误)时,会要求对方重新传送此控制信息。Heartbeat一般每一秒发送一次重传请求,以避免洪泛。