高可用群集:在同一时刻只有一台机器处于活动状态,另一台处于备份状态
通常采用下图做法,将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地址145.101
拓扑图:
用到的软件:
heartbeat-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
1.按照拓扑图规划,分别为各个网卡配置ip地址
node1.a.com的ip地址设置:
node2.a.com的ip地址设置:
2.由于在做高可用性群集时要解析两台服务器的主机名,所以要更改主机名,还要有名称解析服务,在这里就修改hosts文件
node1.a.com的/etc/sysconfig/network文件:
node2.a.com的/etc/sysconfig/network文件:
由于刚刚的修改需要重启系统后才会生效,可以临时将两台服务器的主机名修改正确
3.分别在两台服务器上配置yum工具
# vim /etc/yum.repos.d/rhel-debuginfo.repo
4. 在两台服务器上分别创建挂载点,挂载光盘文件
node1.a.com:
node2.a.com:
5.在两台服务器上分别安装httpd服务
node1.a.com:
node2.a.com:
6.为两个服务器分别创建网页,并将httpd服务启动,用于测试httpd是否正确,然后再关闭掉两个服务器的httpd服务,设为开机不启动,交由群集控制器来集中管理httpd服务
node1.a.com:
node2.a.com:
7.在每个服务器上安装heartbeat服务,使两个服务器成为高可用群集
# yum localinstall heartbeat-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 --nogpgcheck
node1.a.com:
node2.a.com:
8.安装后在/etc下会生成目录ha.d目录,在这里可以设置心跳在哪个网卡上运行,采用广播、组播还是单播;虚拟ip是多少,刚开始启动时激活的设备是哪台服务器
node1.a.com:
# rpm -ql heartbeat|less 查看安装heartbeat后文件的路径
9.切换至/usr/share/doc/heartbeat-2.1.4,将authkeys haresources ha.cf 文件复制到/etc/ha.d下
node1.a.com:
10.切换至目录/etc/ha.d下,编辑文件ha.cf,该文件主要用来定义心跳探测机制
11.编辑文件authkeys ,该文件主要用来验证成员之间的有效性,需要将文件权限设置为600,否则服务将无法启动
#auth 1 采用的验证方式为1
#1 crc 验证方式1表示crc校验
#2 sha1 HI! 验证方式2表示采用哈希值 ,“HI!”为密码
#3 md5 Hello! 验证方式3表示md5加密 ,“Hello!”为密码
本实验使用第三种验证即md5验证,需要使用密文密码,可以使用命令# dd if=/dev/random bs=512 count=1 |openssl md5 残生一个随机数,并使用md5加密,然后将该字符串作为成员之间的验证密码
12.
编辑文件haresources ,资源管理文件,用于定义哪些是资源,便于群集控制这些资源
下图说明:
node1.a.com:刚开始启动的节点名称
192.168.145.101/24:ip资源,此处为vip地址
eth0:该地址在eth0接口上配置着
192.168.145.255:该ip资源的广播地址,可省略
httpd 服务资源,
13.将httpd脚本复制到resource.d目录下
# cp /etc/rc.d/init.d/httpd /etc/ha.d/resource.d/
14.同理在node2.a.com上将/usr/share/doc/heartbeat-2.1.4下的文件ha.cf haresources authkeys 复制到/etc/ha.d下
15.修改文件.etc/ha.cf
16.修改authkeys文件
17.编辑文件haresources
18. 将httpd的肩脚本文件复制到/etc/ha.d/resource.d
19.在两个节点上都启用heartbeat服务,并将该服务设置为开机自启动
20.此时查看node1.a.com 的网卡,出现群集ip地址;在node2.a.com上却没有
21. node1.a.com上的httpd服务自动启动,node2.a.com 上没有启动
22.通过外网访问虚拟ip,访问到了node1.a.com服务器的网页
23.在node2.a.com上没隔一秒查看一次httpd的状态
# watch -n 1 'service httpd status'
24.模拟节点1失效的情况。使用命令/usr/lib/heartbeat/hb_standby
25.查看节点2的监控,httpd运行成功
此时节点1的httpd已停止
26.再次访问vip,访问到了node2.a.com的站点
27.两台服务器之间互相备份,同时只有一台服务器运行,符合高可用群集特性
案例二:此案例是在上个案例的基础之上做出修改。由于两个节点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.停用node1.a.com和node2.a.com的heartbeat服务,并卸载httpd服务
2.在两个节点node1.a.com和node2.a.com上分别安装ipvsadm工具用于实现LVS
在两个节点上分别配置yum工具
3. 先修改arp_announce 和arp_ignore的值,然后在分别配置两台realserver的loopback 的vip,否则将会出现vip地址冲突
使用命令:sysctl -a |grep arp 查看arp_announce和arp_ignore的值
需要将arp_announce的值改为2,将arp_ignore的值为1,写入文件/etc/sysctl.conf
4.按照拓扑图要求配置realserver1和realserver2的ip地址
realserver1的ip地址:
vip地址;
重启网络服务
realserver2的ip地址:
vip地址:
5.在两台realserver上分别配置路由,使到达realserver的请求,但是目的地址为192.168.145.101的数据包交给网卡lo:0来处理即由其向外回复请求。详细请参照我的上一篇博客:LVS负载均衡群集之NAT模型&&DR模型
realserver1:
realserver2:
6.使heartbeat来 控制ipvsadm服务,需要将ipvsadm加入heartbeat的资源管理器
分别在node1.a.com和node2.a.com 上执行以下动作:
# vim /etc/ha.d/haresources
7.将ipvsadm的脚本复制到/etc/ha.d/resource.d/
8.分别编辑ipvsadm参数,定义服务,添加服务器
9.保存ipvsadm参数数据,然后关闭服务,交由heartbeat控制
10.分别启动node1.a.com和node2.a.com的heartbeat服务
11.此时查看node1.a.com的ipvsadm数据,发现有数据,说明node1.a.com的ipvsadm服务已经启动
但是node2.a.com的ipvsadm数据还是为空
12.模拟node1.a.com节点失效的情况,先监控node2.a.com的ipvsadm -ln 显示情况,若有信息显示,说明node1.a.com的ipvsadm功能启动
此时node2.a.com上有数据,说明node2.a.com的ipvsadm启动成功
13.下面在realserver1和realserver2上配置httpd服务
realserver1:
产生网页文件,并启动服务器:
realserver2:
14.此时访问192.168.145.101
15.模拟node1.a.com失效,然后访问文本服务
网页依旧可以访问
这样就将node1.a.com和node2.a.com作为高可用性群集,而下游的两台web服务器作为了负载均衡群集
案例三:
上个案例中,两台director中时刻保持有一台处于活动状态,其中维护一个ipvsadm转发表,表中的条目一直不会发生变化,若下游的某台realserver忽然失效,但是director上的ipvsadm转发表将依旧把请求发送至失效的服务器来处理数据,将会出现网页访问失败的情况。所以,应该有一种机制,用来探测下游的服务器是否处于活动状态,若某台服务器失效,则自动修改ipvsadm转发表,将该发送给失效服务器的请求发送至活动的服务器来处理。
1.将realserver1 的httpd访问停掉,访问192.168.145.101将会出现网页访问不到的情况(只能访问web2)
2.发送至realserver1的转发条目依旧存在
3.要想实现一种动态的ipvsadm转发规则表,需要安装heartbeat-ldirectord ,它能够将heartbeat与LVS紧密结合,而且能够探测后方的服务器状态,当服务器失效时,自动删除该条转发条目
在两台director:node1.a.com和node2.a.com上安装heartbeat-ldirectord
4.拷贝heartbeat-ldirectord的配置文件/usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf 到/etc/ha.d下,编辑该文件
checkinterval=1 每一秒检查一次后方服务器
checktimeout=3 三秒检测不到服务器就删除到该服务器的转发条目
autoreload=yes 修改该文件后,不用重启服务就进行加载该文件内容
fallback=127.0.0.1:80 如果后方的服务器全都无法探测到的话,就将本机作为服务器提供服务,不过本机的服务要处于停止状态,有heartbeat进行控制
logfile="local0" 将ldirectord的日志和/var/log/messages混合
quiescent=yes 静默模式 当无法探测到后方的服务器时就调整到该服务器的条目的权重为0,而不删除该条目,则该服务器将不能访问
virtual=192.168.145.101:80 director虚拟出的ip地址
real=192.168.145.200:80 gate 转发到该服务器的80 端口 ,使用直接路由模型
real=192.168.145.201:80 gate 转发到该服务器的80 端口 ,使用直接路由模型
#fallback=127.0.0.1:80 gate 和上面的fallback用处一样
service=http 提供的服务
request=".test.html" 探测页面名字
receive="Test Page" 探测页面的文件内容
scheduler=rr 使用轮循调度算法,
protocol=tcp 协议tcp,相当于ipvsadm 的 -t 选项
5.修改资源文件/etc/ha.d/haresources,定义HA群集的资源
定义node1.a.com为主节点,虚拟ip为145.101 ,将该虚拟地址添加到eth0上,eth0:0 ;资源2为 ldirectord,他的、、它的配置文件名称为ldirectord.cf
6.删除ipvsadm的转发数据
7.在node2.a.com ,将/usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf 复制到/etc/ha.d/下
8.编辑/etc/ha.d/ldirectord.cf文件
9.修改node2.a.com的资源文件,清空ipvsadm规则
10.分别重启两台节点的heartbeat 服务
11.在node1.a.com上查看哪个网卡使用vip
12.查看node1.a.com 的ipvsadm的转发表,发现权重都变为0,默认为1;这会由于调整的静默模式为开启,而测试页面不存在,所以将两个转发条目权重调小
13.在realserver1和realserver2 上创建探测页面:.test.html文件
14.再次查看node1.com 的ipvsadm -ln 显示结果,权重变为1
15.两个web页面都能访问成功
16.若此时realserver1 的httpd访问关闭掉,则会自动将转发到该服务器的条目权重变为0,就不会访问该服务器,就不会出现页面访问不到的情况出现
查看权重
再访问网页将只会出现web2的页面
17.若后方的两台服务器都失效,则用户将无法访问到页面。这是可以使用回滚fallback,将请求发送到本机(director1)上进行处理。所以在director1和director2上安装httpd服务,并将该服务处于停止状态,然后将httpd加入haresource文件,成为一种资源,然后将/etc/init.d/httpd 复制到 /etc/ha.d/resource.d 下
两台director上分别安装httpd服务,并产生页面,将httpd服务处于关闭状态
此处省略。。。。。
修改/etc/ha.d/ldirectord.cf文件
修改/etc/ha.d/resources,添加httpd
将httpd的控制脚本复制到/etc/ha.d/resource.d
重新启动heartbeat服务,然后停用后方的两台web服务器
此时查看director的转发表和httpd的状态,出现本机的条目
此时访问页面能访问到node1.a.com的页面
若此时后方两台服务器恢复服务,此时将会停掉director1(node1.a.com)的httpd服务
自动删除到本地的转发条目
本文持续撰写中……..