高可用群集:在同一时刻只有一台机器处于活动状态,另一台处于备份状态
通常采用下图做法,将director做成高性能群集,使任何时候都有一台处于活动状态;将下层的服务器做成负载均衡群集使请求交与多台服务器进行处理
实现方法:
1.heartbeat :比较常用 版本 v1 v2 v3
2.rhcs :redhat 集群套件--redhat cluster suite 图形界面,实现方便,可有100多个节点
3.corosync/openais +paceker
2个节点:
采用主备模式:一台激活,另一台备份,对外呈现一个虚拟ip地址。两个节点之间采用心跳线,备份节点使用心跳线来探测活动节点是否处于活动状态。
心跳线:双绞线 或光纤跳线或 serial线
采用主主模式:两个节点,在提供web服务时,左侧为激活状态,右侧为备份状态;在实现mail服务时, 一个为激活状态,一个为备份状态
HA群集的资源:
ip地址 脚本 服务
群集分裂:
当一台活动节点处于假死状态(可能是心跳线故障,使备份节点自动激活),备份节点自动激活,两个节点将出现抢占资源状态。 split-brain
群集分裂处理方法:
stonth :shoot the other in the head 使用电源交换机,当出现资源争抢时,自动切断另一台节点的电源
fence:在rhcs说法
案例一:两个节点node1.a.com和node2.a.com ,都有web服务,二者之间用心跳线进行监控,使同一时刻只有一台服务器提供web服务,另一台作为备份。对外呈现唯一的一个ip地址10.101 (主备模式)
拓扑图:
正确配置node1和node2的ip地址:
1.做高可用群集要求两台机器能够互相进行解析,先把node的名字对应的修改一下,这里就修改hosts值,也可以实现解析的功能。
[root@localhost ~]# vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node1.a.comtest
[root@localhost ~]# vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=node2.a.comtest
2.设置hosts值
[root@localhost ~]# vim /etc/hosts
192.168.10.201 node1.a.com
192.168.10.202 node2.a.com
挂载光盘并配置yum源
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom
3.安装httpd服务并且启动服务。
创建的网页 分别为test1 test2
测试网页正常后关闭httpd服务,以便后面的测试。
.在每个服务器上安装heartbeat服务,使两个服务器成为高可用群集(需要以下几个包)
yum localinstall heartbeat-2.1.4-11.el5.i386.rpm heartbeat-pils-2.1.4-11.el5.i386.rpm heartbeat-stonith-2.1.4-11.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm --nogpgcheck -y
4.安装后在/etc下会生成目录ha.d目录,在这里可以设置心跳在哪个网卡上运行,采用广播、组播还是单播;虚拟ip是多少,刚开始启动时激活的设备是哪台服务器
rpm -ql heartbeat|less 查看安装heartbeat后文件的路径
/usr/share/doc/heartbeat-2.1.4/authkeys #群集成员之间的验证,验证是否是合法成员。
/usr/share/doc/heartbeat-2.1.4/ha.cf
/usr/share/doc/heartbeat-2.1.4/haresources #定义群集资源
5.切换至/usr/share/doc/heartbeat-2.1.4,将authkeys haresources ha.cf 文件复制到/etc/ha.d下
cd /usr/share/doc/heartbeat-2.1.4/
cp authkeys haresources ha.cf /etc/ha.d/
6.切换至目录/etc/ha.d下,编辑文件ha.cf,该文件主要用来定义心跳探测机制
[root@localhost ha.d]# vim ha.cf
95 bcast eth1 采用广播从eth1上来测试心跳。
213 node node1.a.com
214 node node2.a.com 成员有两个而且要进行域名解析
[root@localhost ha.d]# vim authkeys
7.编辑文件authkeys ,该文件主要用来验证成员之间的有效性,需要将文件权限设置为600,否则服务将无法启动
#1 crc 验证方式1表示crc校验
#2 sha1 HI! 验证方式2表示采用哈希值 ,“HI!”为密码
#3 md5 Hello! 验证方式3表示md5加密 ,“Hello!”为密码
24 #1 crc
25 #2 sha1 HI!
26 #3 md5 Hello!
auth 3
3 md5 8a730ebbe9c05ec3a84d16a60506fa49 #两个node使用同一个值
第三种验证即md5验证,需要使用密文密码,可以使用命令# dd if=/dev/random bs=512 count=1 |openssl md5 残生一个随机数,并使用md5加密,然后将该字符串作为成员之间的验证密码
8.修改权限
[root@node2 ha.d]# chmod 600 authkeys
不修改权限会出现如下错误:
heartbeat[4981]: 2012/12/30_02:07:30 ERROR: Bad permissions on keyfile [/etc/ha.d/authkeys], 600 recommended.
9.修改haresources
[root@localhost ha.d]# vim haresources
45 node1.a.com 192.168.10.101/24/eth0/空格 httpd
# node为主(这里在node2上也要设置node1.a.com)不然的话就会出现httpd都在运行
10.将httpd的脚本文件复制到/etc/ha.d/resource.d
[root@localhost ha.d]# cp /etc/init.d/httpd /etc/ha.d/resource.d
在两个节点上都启用heartbeat服务,并将该服务设置为开机自启动
[root@node1 ~]# service heartbeat start
[root@node1 ~]# chkconfig heartbeat on #自动启动。
Node2上做同样的设置。
11.验证 通过外网访问虚拟ip
[root@node1 ~]# ifconfig
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:56:00:D6 #群集ip地址。
inet addr:192.168.10.101 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:67 Base address:0x2000
可以发现node1.a.com上的httpd服务自动启动,node2.a.com 上没有启动
[root@node1 ~]# service httpd status
httpd (pid 7734) 正在运行...
[root@node2 ha.d]# service httpd status
httpd 已停
12.在node2.a.com上没隔一秒查看一次httpd的状态
# watch -n 1 'service httpd status'
关掉node1 查看
[root@node1 heartbeat]# cd /usr/lib/heartbeat/
[root@node1 heartbeat]# ./hb_standby 关闭
//也可以使用[root@node1 heartbeat]# service heartbeat stop
2012/12/30_02:32:30 Going standby [all].
在node2上可以发现
[root@node2 ~]# service httpd status
httpd (pid 8202) 正在运行...
浏览器访问虚拟ip就只能访问到node2
启动node1的heartbeat就会发现node1的httpd服务已经启动,node2的httpd服务已经停止。
两台服务器之间互相备份,同时只有一台服务器运行,符合高可用群集特性。
案例二:此案例是在上个案例的基础之上做出修改。
由于两个节点node1.a.com和node2.a.com可以提供高可用性,但是这两台服务器不能够提供负载均衡,所以将两个节点node1.a.com和node2.a.com作为director,然后再开启两台linux作为web服务器,此时node1.a.com和node2.a.com将会有一台工作,并提供负载均衡将请求发送至两台web服务器上。案例使用LVS-DR直接路由模型,使用heartbeat来控制两台director的ipvsadm服务
拓扑图:
1.关闭director上的heartbeat
[root@node1 heartbeat]# service heartbeat stop
[root@node1 heartbeat]# yum remove httpd -y
[root@node2 heartbeat]# service heartbeat stop
[root@node2 heartbeat]# yum remove httpd -y
2.在两个节点node1.a.com和node2.a.com上分别安装ipvsadm工具用于实现LVS
在两个节点上分别配置yum工具
[root@node1 ha.d]# vim /etc/yum.repos.d/rhel-debuginfo.repo
1 [rhel-server]
2 name=Red Hat Enterprise Linux Server
3 baseurl=file:///mnt/cdrom/Server/
4 enabled=1
5 gpgcheck=0
6 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
7 [rhel-Cluster]
8 name=Red Hat Enterprise Linux Cluster
9 baseurl=file:///mnt/cdrom/Cluster/
10 enabled=1
11 gpgcheck=0
12 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
3.使用yum安装ipvsadm服务。
[root@node1 ~]# yum install ipvsadm -y
[root@node1 ~]# service ipvsadm save
[root@node1 ~]# service ipvsadm start
[root@node1 ~]# ipvsadm -A -t 192.168.10.101:80 -s rr
[root@node1 ~]# ipvsadm -a -t 192.168.10.101:80 -r 192.168.10.203 -g
[root@node1 ~]# ipvsadm -a -t 192.168.10.101:80 -r 192.168.10.204 -g
[root@node1 ~]# service ipvsadm save
Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
#LVS 的DR 模式
[root@node1 ~]# service ipvsadm stop
[root@node1 ~]# chkconfig ipvsadm off #开机关闭
#群集里的资源是要自动分配的不能自己启动,stop是为了后面的测试。
4.把同样的配置copy到node2上一份。(yes, passwd)
[root@node1 ~]# scp /etc/sysconfig/ipvsadm 192.168.10.202:/etc/sysconfig
修改控制脚本
[root@node1 ha.d]# pwd
/etc/ha.d
[root@node1 ha.d]# vim haresources
45 node1.a.com 192.168.10.101/24/eth0/空格 ipvsadm
[root@node1 ha.d]# scp /etc/init.d/ipvsadm /etc/ha.d/resource.d/
5.和node2 同步
[root@node1 ha.d]# scp /etc/ha.d/haresources node2.a.com:/etc/ha.d
[root@node1 ha.d]# scp /etc/init.d/ipvsadm node2.a.com:/etc/init.d
6.Director1和director2重启服务重新加入群集
在director上查看群集资源,而且规则已经启动
可以发现director1上有了群集资源eth0:0,而director2两者都没有出现。
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:56:00:D6
inet addr:192.168.10.101 Bcast:192.168.10.255 Mask:255.255.255.0
[root@node1 ha.d]# ipvsadm
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:http rr
-> 192.168.10.203:http Route 1 0 0
-> 192.168.10.204:http Route 1 0 0
按照拓扑图要求对realserver1和realserver2 的ip进行配置重点如下:(vip的配置)
而且要安装web服务,并启动。
7.将arp_announce的值改为2,将arp_ignore的值改为为1,/etc/sysctl.conf
[root@node1 ~]# echo "net.ipv4.conf.eth0.arp_announce = 2" >> /etc/sysctl.conf
[root@ node1~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
[root@node1t ~]# echo "net.ipv4.conf.eth0.arp_ignore = 1" >> /etc/sysctl.conf
[root@node1 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
[root@node1~]# sysctl -p #使服务生效
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
8.在server1和server2上添加临时路由
[root@server1 ~]# route -add -host 192.168.10.10 dev lo:0
[root@server2 ~]# route add -host 192.168.10.101 dev lo:0
9.验证一下:
现在HA 是主备模式 其中node1是主,node2是备份(基于LVS的DR模式),server1和server2是负载均衡的web群集。
通过浏览器访问vip刷新web1和web2交替出现。说明访问的时候是轮询模式,即用户方vip时server1和server2交替工作,实现负载均衡。
10.查看director可以发现director1已经得到群集资源,而且启动了ipvsadm
[root@node1 ha.d]# ifconfig
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:56:00:D6
inet addr:192.168.10.101 Bcast:192.168.10.255 Mask:255.255.255.0
11.[root@node1 ha.d]# watch -n 1 'ipvsadm' #每一秒钟查看一次
假如director1出现故障。Director2上马上就会获得群集资源,而且ipvsadm也启动。
[root@node1 ha.d]# cd /usr/share/heartbeat/
[root@node1 heartbeat]# ./hb_standby
#或者[root@node1 ha.d]# service heartbeat stop
[root@node2 ~]# ifconfig
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:44:FB:AA
inet addr:192.168.10.101 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:67 Base address:0x2000
12.[root@node2 ~]# watch -n 1 'ipvsadm' #刷新访问vip 就会出现如下。
13.如果director1恢复正常的话,群集资源就会在director1上。
[root@node1 heartbeat]# ./hb_takeover 启动 或者service heartbeat start
这样就能实现director的高可用性,而且能够实web服务器的负载均衡。