现在的位置: 首页 > Linux > 服务器集群技术 > 正文
使用heartheat实现高可用web服务器集群
2013年10月14日 服务器集群技术 ⁄ 共 11206字 暂无评论 ⁄ 被围观 6,183 views+

从系统架构上来说,高可用集群要比负载均衡复杂得多,因为高可用集群需要实现对资源的管理(CRM)、还实现集群管理(Messaging Layer)、RA(Resource Agent,资源代理)等。而资源管理涉及到资源隔离、资源约束等。这里不详细讲解HA的各层次的原理。基本分层架构如下:

HA架构

前面介绍了使用keepalived实现lvs的高可用,keepalived是专为lvs而开发的一整套HA,使用单一软件就实现了上面的架构的Messaging Layer、CRM和RA,因此使用keepalived实现lvs高可用非常简单。

今天我们再介绍一个常见的高可用套件:Heartbeat

Heartbeat有三个版本,每个版本略有不同,heartbeat v1版自带有资源管理器(CRM)haresources,v2版本提供了独立的crm实现对资源的管理,同时为了兼容v1版,保留了haresources。而v3版中,资源管理器(CRM)发展为独立的项目:pacemaker。

使用Heartbeat实现Web服务器的高可用(HA)

HA Web涉及资源:

vip

httpd server:提供web服务

File System:实现附件等资源共享

我们以heartbeat v3版为例,需要两个web server节点,两个节点之间要满足如下:

  • 节点名称与IP的对应关系:一般使用hosts文件实现,且节点名称要与uname -n命令的结果一直;
  • 使用ssh基于密钥认证实现互相通信;
  • 节点间实现时间同步。

VIP:192.168.8.100

节点1名称:rs1

节点1 IP:192.168.8.101

节点2名称:rs2

节点2 IP:192.168.8.102

1、使用hosts文件实现名称解析:

RS1上执行:

[root@rs1 ~]# echo "192.168.8.101 rs1" >>/etc/hosts
[root@rs1 ~]# echo "192.168.8.102 rs2" >>/etc/hosts

RS2上执行:

[root@rs2 ~]# echo "192.168.8.101 rs1" >>/etc/hosts
[root@rs2 ~]# echo "192.168.8.102 rs2" >>/etc/hosts

测试解析:

[root@rs2 ~]# ping -c 1 rs1
PING rs1 (192.168.8.101) 56(84) bytes of data.
64 bytes from rs1 (192.168.8.101): icmp_seq=1 ttl=64 time=0.297 ms

--- rs1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.297/0.297/0.297/0.000 ms
[root@rs1 ~]# ping -c 1 rs2
PING rs2 (192.168.8.102) 56(84) bytes of data.
64 bytes from rs2 (192.168.8.102): icmp_seq=1 ttl=64 time=0.043 ms

--- rs2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.043/0.043/0.043/0.000 ms

2、配置基于ssh 秘钥认证的通信:

节点1生成rsa:

[root@rs1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa  -P ''

拷贝公钥到节点2:

[root@rs1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@rs2
The authenticity of host 'rs2 (192.168.8.102)' can't be established.
RSA key fingerprint is f8:c3:9e:e9:30:f5:41:da:c0:da:fa:5e:1c:5c:da:a9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'rs2,192.168.8.102' (RSA) to the list of known hosts.
root@rs2's password:
Now try logging into the machine, with "ssh 'root@rs2'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

测试:

[root@rs1 ~]# ssh rs2 'hostname'
rs2

节点2生成rsa:

[root@rs2 ~]#  ssh-keygen -t rsa -f ~/.ssh/id_rsa  -P ''

拷贝公钥到节点1:

[root@rs2 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@rs1
The authenticity of host 'rs1 (192.168.8.101)' can't be established.
RSA key fingerprint is f8:c3:9e:e9:30:f5:41:da:c0:da:fa:5e:1c:5c:da:a9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'rs1,192.168.8.101' (RSA) to the list of known hosts.
root@rs1's password:
Now try logging into the machine, with "ssh 'root@rs1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

测试连接:

[root@rs2 ~]# ssh rs1 'hostname'
rs1

3、配置时间同步:

使用一个统一的时间源进行时间同步即可,我这里使用内网一台服务器为两台服务器提供时间源,为了防止同步一次后慢慢出现时间偏差,可以使用crond实现定期同步。

[root@rs1 ~]# ntpdate 192.168.8.1
13 Oct 23:41:46 ntpdate[1474]: step time server 192.168.8.1 offset -28799.231199 sec

[root@rs2 ~]# ntpdate 192.168.8.1
13 Oct 23:41:46 ntpdate[1474]: step time server 192.168.8.1 offset -28799.231199 sec

查看同步后的时间情况:

[root@rs1 ~]# date && ssh rs2 'date'
2013年 10月 13日 星期日 23:42:50 CST
2013年 10月 13日 星期日 23:42:50 CST

计划任务实现没半小时一次同步:

[root@rs1 ~]# crontab -e
no crontab for root - using an empty one

30 * * * * /usr/sbin/ntpdate 192.168.8.1 &>/dev/null

[root@rs2 ~]# crontab -e
no crontab for root - using an empty one

30 * * * * /usr/sbin/ntpdate 192.168.8.1 &>/dev/null

4、安装heartbeat:

heartbeat3.x版本把安装包分成了4个部分,分别是:Cluster Glue、Resource Agents、heartbeat和pacemaker,所以要分别安装,可以从http://hg.linux-ha.orghttp://hg.clusterlabs.org下载对应的软件包,这里使用的软件版本分别为:
glue-1.0.7、agents-1.0.3、heartbeat-STABLE-3.0.4、Pacemaker-1.0.10。heartbeat依赖较多,因此建议使用yum方式安装。另外只使用heartbeat自带的CRM管理器haresources进行资源管理,因此不需要安装其他组件。

安装clusterlabs.org提供的yum源:

# rpm -Uivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

# wget -O /etc/yum.repos.d/pacemaker.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo

安装heartbeat:

# yum install -y  heartbeat

查看安装后生成文件:

[root@rs2 ~]# rpm -ql heartbeat
/etc/ha.d     <--配置文件主目录
/etc/ha.d/README.config
/etc/ha.d/harc
/etc/ha.d/rc.d   <--RA主目录
/etc/ha.d/rc.d/ask_resources
/etc/ha.d/rc.d/hb_takeover
/etc/ha.d/rc.d/ip-request
/etc/ha.d/rc.d/ip-request-resp
/etc/ha.d/rc.d/status
/etc/ha.d/resource.d   <-- CRM主目录
/etc/ha.d/resource.d/AudibleAlarm
/etc/ha.d/resource.d/Delay
/etc/ha.d/resource.d/Filesystem
/etc/ha.d/resource.d/ICP
/etc/ha.d/resource.d/IPaddr
/etc/ha.d/resource.d/IPaddr2
/etc/ha.d/resource.d/IPsrcaddr
/etc/ha.d/resource.d/IPv6addr
/etc/ha.d/resource.d/LVM
/etc/ha.d/resource.d/LinuxSCSI
/etc/ha.d/resource.d/MailTo
/etc/ha.d/resource.d/OCF
/etc/ha.d/resource.d/Raid1
/etc/ha.d/resource.d/SendArp
/etc/ha.d/resource.d/ServeRAID
/etc/ha.d/resource.d/WAS
/etc/ha.d/resource.d/WinPopup
/etc/ha.d/resource.d/Xinetd
/etc/ha.d/resource.d/apache
/etc/ha.d/resource.d/db2
/etc/ha.d/resource.d/hto-mapfuncs
/etc/ha.d/resource.d/ids
/etc/ha.d/resource.d/portblock
/etc/init.d/heartbeat   <--服务启动脚本
/etc/logrotate.d/heartbeat
/usr/bin/cl_respawn
/usr/bin/cl_status
/usr/share/doc/heartbeat-3.0.4  <--帮助文档,包含一些配置示例文件

……下略……

5、配置heartbeat

heartbeat至少需要三个配置文件:

  • authkeys:密钥文件,权限600
  • ha.cf:主配置文件
  • haresources:资源管理配置文件(这里使用兼容v2的CRM)

5.1 配置authkeys:

heartbeat默认安装后在配置文件目录中是没有相应的配置文件的,示例配置文件可以/usr/share/doc/heartbeat-3.0.4目录下拷贝:

[root@rs1 ~]# cd /usr/share/doc/heartbeat-3.0.4/
[root@rs1 heartbeat-3.0.4]# cp -p ha.cf authkeys haresources /etc/ha.d/   <--一次拷贝三个配置文件

[root@rs1 heartbeat-3.0.4]# cd /etc/ha.d/
[root@rs1 ha.d]# chmod 600 authkeys  <--修改密钥文件权限

为了防止非法节点加入集群,需要对集群通讯进行加密,默认提供了三种方式,crc,sha1,md5,crc极不安全,因此我这里选用md5进行加密。

使用随机数生成一段秘钥:

[root@rs1 ~]# dd if=/dev/random count=1 bs=512 |md5sum
记录了0+1 的读入
记录了0+1 的写出
17字节(17 B)已复制,0.0001273 秒,134 kB/秒
a8b4fe20085182f02eb371d9bcf39c32  -

使用上述随机数作为authkeys密钥:

[root@rs1 ha.d]# vim authkeys

#auth 1
#1 crc
#2 sha1 HI!
#3 md5 Hello!
auth 1
1 md5 a8b4fe20085182f02eb371d9bcf39c32

5.2 配置heartbeat主配置文件:

[root@rs1 ha.d]# vi ha.cf   <--加粗的为修改过的,未加粗注释行为默认值

logfile /var/log/ha-log  #使用独立日志文件

#logfacility    local0  #默认启用的,启用了独立日志文件,这项就可以注释掉

#debugfile /var/log/ha-debug  ##调试信息
keepalive 1 ##心跳间隔时间
deadtime 10 ##10s后确认该节点死亡
warntime 5 ##日志中发出最后心跳late Heartbeat前的警告时间
#initdead 120 ##初始化时间,主节点启动后等待备加点加入的等待时间
#udpport    694  ##监听端口UDP694
#baud    19200  ##如果使用串口连接心跳,传输速率
#serial    /dev/ttyS0    # Linux
#serial    /dev/cuaa0    # FreeBSD
#serial /dev/cuad0      # FreeBSD 6.x
#serial    /dev/cua/a    # Solaris
bcast    eth0        # Linux 我这里为了简化,使用广播发布心跳信息
#bcast    eth1 eth2    # Linux
#bcast    le0        # Solaris
#bcast    le1 le2        # Solaris

auto_failback on ##故障恢复策略,主节点恢复后默认返回
#mcast eth0 225.0.0.1 694 1 0  ##使用多播发送心跳信息,建议生产环节使用
#ucast eth0 192.168.1.2  ##单播,只有两个节点时使用
#stonith baytech /etc/ha.d/conf/stonith.baytech  ##如下几行均是定义资源隔离
#stonith_host *     baytech 10.0.0.3 mylogin mysecretpassword
#stonith_host ken3  rps10 /dev/ttyS1 kathy 0
#stonith_host kathy rps10 /dev/ttyS1 ken3 0
#watchdog /dev/watchdog  ##初始使用stonith外,还可以使用看门狗
node    rs1  ##定义节点,hosts文件中要有解析,且要与uname -n值相同
node    rs2
ping 192.168.8.8  ##定义ping第三方地址连协助实现心跳判断,一般ping网关
#ping_group group1 10.10.10.254 10.10.10.253  ##同上,只是ping多个地址
#hbaping fc-card-name  ##定义光纤接口检查
respawn hacluster /usr/lib64/heartbeat/ipfail  ##故障时如何处理,使用ipfail脚本处理
apiauth ipfail gid=haclient uid=hacluster ##设置ipfail进程启动的权限
#hopfudge 1
#deadping 30
#hbgenmethod time
#realtime off
#debug 1
#apiauth ipfail uid=hacluster
#apiauth ccm uid=hacluster
#apiauth cms uid=hacluster
#apiauth ping gid=haclient uid=alanr,root
#apiauth default gid=haclient
#msgfmt  classic/netstring
#conn_logd_time 60
#compression    bz2  ##集群信息是否压缩,bz2为压缩算法
#compression_threshold 2  ##如果启用压缩,则定义超过多少压缩,单位为k

5.3 配置haresources:

haresources每一行表示定义一种服务的资源,各类资源的使用方法示例文件中都有详细说,这里不做过多解析:

##资源定义语法如下:

#node-name resource1 resource2 ... resourceN

rs1     IPaddr::192.168.8.100/24/eth0:0 httpd

##可以使用Filesystem定义文件系统,如自动挂载共享存储

5.4 拷贝全部配置至另一节点:

[root@rs1 ha.d]# scp authkeys ha.cf haresources rs2:/etc/ha.d/

6、配置httpd服务:

httpd的安装和服务配置这里不做讲解,但需要注意的是,httpd不能自动启动,heartbeat会自动管理httpd。为了方便演示效果,我为每个节点定义一个不同的主页:

##关闭httpd服务开机启动

[root@rs1 ha.d]# chkconfig httpd off

##定义节点1主页

[root@rs1 ha.d]# echo "<h1>This is RS1</h1>" >/var/www/html/index.html

##定义节点2主页

[root@rs2 ~]# echo "<h1>This is RS2</h1>" >/var/www/html/index.html

可以使用手动启动httpd服务进程测试访问,如果正常后务必关闭

同时注意iptables策略,需要开发相应端口,包含udp694,如果开启了selinux,还需注意相关上下文配置

7、启动heartbeat服务测试

启动服务:

[root@rs1 ha.d]# service heartbeat start
Starting High-Availability services: INFO:  Resource is stopped
Done.

[root@rs1 ha.d]# ssh rs2 'service heartbeat start'  ##使用SSH启动节点2服务
Starting High-Availability services: 2013/10/16_00:44:13 INFO:  Resource is stopped
Done.

查看日志

[root@rs1 ha.d]# tail -f /var/log/ha-log
Oct 16 00:44:27 rs1 heartbeat: [4336]: info: remote resource transition completed.
harc(default)[4461]:    2013/10/16_00:44:27 info: Running /etc/ha.d//rc.d/ip-request-resp ip-request-resp
ip-request-resp(default)[4461]:    2013/10/16_00:44:27 received ip-request-resp IPaddr::192.168.8.100/24/eth0:0 OK yes
ResourceManager(default)[4482]:    2013/10/16_00:44:27 info: Acquiring resource group: rs1 IPaddr::192.168.8.100/24/eth0:0 httpd
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.8.100)[4509]:    2013/10/16_00:44:28 INFO:  Resource is stopped
ResourceManager(default)[4482]:    2013/10/16_00:44:28 info: Running /etc/ha.d/resource.d/IPaddr 192.168.8.100/24/eth0:0 start
IPaddr(IPaddr_192.168.8.100)[4592]:    2013/10/16_00:44:28 INFO: Using calculated netmask for 192.168.8.100: 255.255.255.0
IPaddr(IPaddr_192.168.8.100)[4592]:    2013/10/16_00:44:28 INFO: eval ifconfig eth0:0 192.168.8.100 netmask 255.255.255.0 broadcast 192.168.8.255
/usr/lib/ocf/resource.d//heartbeat/IPaddr(IPaddr_192.168.8.100)[4566]:    2013/10/16_00:44:28 INFO:  Success
ResourceManager(default)[4482]:    2013/10/16_00:44:28 info: Running /etc/init.d/httpd  start

从上述日志可以看出,VIP和httpd服务都已正常启动

访问VIP测试:

heartbeat1

查看网卡信息:

[root@rs1 ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:65:6A:A4 
          inet addr:192.168.8.101  Bcast:192.168.8.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe65:6aa4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:30244 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18882 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:14704257 (14.0 MiB)  TX bytes:2269920 (2.1 MiB)

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:65:6A:A4 
          inet addr:192.168.8.100  Bcast:192.168.8.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

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:38 errors:0 dropped:0 overruns:0 frame:0
          TX packets:38 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:8868 (8.6 KiB)  TX bytes:8868 (8.6 KiB)

故障转移测试:

模拟故障可关机、down网卡,或者启用一条iptables规则等方式来模拟,不管用那种方式模拟故障,节点2都会马上接管所有资源:

heartbeat2

[root@rs2 ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:27:62:D4 
          inet addr:192.168.8.102  Bcast:192.168.8.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe27:62d4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22366 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11154 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:13408539 (12.7 MiB)  TX bytes:1384686 (1.3 MiB)

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:27:62:D4 
          inet addr:192.168.8.100  Bcast:192.168.8.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

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:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

通过测试,我们发现使用heartbeat通过简单的配置即可实现Web或其他服务的高可用性。

给我留言

留言无头像?


×