什么是高可用HA?
HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,避免了因为单点故障带来的风险,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点,各节点之间会传递心跳信息确认对方是否运行正常。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。
Messaging Layer Cluster Infrastucture 集群的基础架构层:提供底层的高可用服务。
Cluster Resource Manager 集群资源管理器:通过收集底层的心跳信息来确定哪个节点依然存活,它能够接受上层服务的委托,与底层通信,管理哪个服务运行在哪个节点上,它可以实现,想要提供高可用服务实现高可用性,但本身不具备高可用能力,也无法与基础架构层通信的服务,都作为资源来管理。 需要在各节点转移的,都可称为资源,如 IP,Web服务,ftp服务等。
资源约束:
位置约束:约束资源优先运行在哪个节点上。
排列约束:用于定义资源与资源间的关系,资源之间能否运行在一起,比如约束当某个资源启动时,另一个才可以启动,如果它没启动那另一个也一定不会启动。
顺序约束:定义资源与资源间的启动顺序。
RA(Resource Agent) 资源代理:
LSB:Linux Standard Base Linux基础标准
OCF:Open Cluster Framework 开放集群框架
RA还会实现资源的检测,当服务运行不正常时,会尝试重启该服务,再不行会通知CRM实施转移。
DC(Designated Coordinator):
是节点中自动推举的协调员,负责收集心跳信息,协调各个节点。
LRM (Local Resource Manager):每个节点都有运行一个LRM作为CRM的一部分存在,运行流程DC——>LRM——>RA——>执行脚本启动服务。
实验一、使用heartbeat构建一个Web高可用集群。
实验规划:
主节点:admin1.tuchao.com 192.168.18.201/24
备节点:admin2.tuchao.com 192.168.18.202/24
vip:192.168.18.222/24
myip:192.168.18.220/24
NFS服务器:192.168.18.203/24
实验目标:
1、主节点上面提供HTTP服务,运行着一个动态Blog站点。备节点上提供了MySQL服务。
2、当主节点故障时,备节点在运行MySQL的情况下,会自动启动httpd服务,接续主节点提供Web服务
3、当备节点故障时,主节点会启动MySQL服务接续工作,这就实现了两个节点之间互为主备。
4、网站程序与MySQL数据目录,存放至NFS服务器上,实现共享存储。
准备存储,先配置NFS服务器:
-
mkdir /mysqldata --用于存放MySQL数据文件
-
mkdir /http --用于存放网站程序
-
vim /etc/exports --修改配置文件,加入以下行。
-
/http 192.168.18.0/24(rw,no_root_squash)
-
/mysqldata 192.168.18.0/24(rw,no_root_squash)
-
/etc/init.d/nfs start --启动nfs服务
-
useradd -r -u 300 mysql --添加mysql用户
-
chown -R mysql.mysql /mysqldata --给予权限
主节点admin1.tuchao.com配置:
MySQL的安装 略
-
cp support-files/mysql.server /etc/init.d/mysqld --复制服务脚本
-
chkconfig --add mysqld --添加到系统服务
-
chkconfig mysqld off --禁止开机自启动,注意如果要作为高可用集群的话,一定要禁止。
-
useradd -r -u 300 mysql --添加mysql用户
-
mkdir /mydata --创建挂载点
-
mount -t nfs 192.168.1.110:/mysqldata /mydata --挂载共享存储
-
mkdir /mydata/data --创建数据目录
-
修改/etc/my.cnf文件,指定datadir=/mydata/data
初始化MySQL,创建库,创建用户,授权用户。(给网站程序连接数据库时使用)
-
./scripts/mysql_install_db --user=mysql --datadir=/mydata/data
-
service mysqld start
-
create database wpdb;
-
create user wpuser;
-
grant all on wpdb.* to 'wpuser'@'192.168.18.%' identified by '123456';
修改hosts文件。
-
vim /etc/hosts
192.168.18.201 admin1.tuchao.com admin1
192.168.18.202 admin2.tuchao.com admin2
安装PHP,配置httpd服务,解压网站程序,配置接口。略
首页可以访问到了,代表Web服务和MySQL配置是没问题的。
现在停止服务卸载共享存储,安装heartbeat,开始配置高可用集群:
-
/etc/init.d/httpd stop
-
/etc/init.d/mysqld stop
-
chkconfig httpd off //这里注意一旦打算把服务定义为集群资源,一定不能设置开机启动。
-
chkconfig mysqld off
-
umount /var/www/html
-
umount /mydata
-
yum install heartbeat-2.1.4-12.el6.i686.rpm heartbeat-stonith-2.1.4-12.el6.i686.rpm heartbeat-gui-2.1.4-12.el6.i686.rpm ipvsadm-1.26-2.el6.i686.rpm libnet-1.1.6-7.el6.i686.rpm heartbeat-pils-2.1.4-12.el6.i686.rpm
复制配置文件
-
cd /usr/share/doc/heartbeat-2.1.4/
-
cp authkeys ha.cf /etc/ha.d/
生成随机数,配置authkeys文件,用于认证。
-
chmod 600 authkeys
-
openssl rand -hex 8 >> authkeys
配置ha.cf文件,启动heartbeat服务。
crm respawn,也可以使用crm on,crm yes //用于启动额外的crm
#下面是对传输的数据进行压缩,是可选项
compression bz2
compression_threshold 2
keepalive 2 //持久连接
deadtime 30 //30秒后认为节点死亡
initdead 30 //在某些配置下,重启后网络需要一些时间才能正常工作。这个单独的”initdead”选项可以处理这种情况。它的取值至少应该为通常deadtime的两倍。
udpport 694 //侦听的UDP端口,这个值是默认的。
bcast eth0 eth1 //广播接口
auto_failback on //是否开启,节点恢复后资源自动返回原节点。
启动heartbeat关闭selinux和防火墙。
-
service heartbeat start
-
/etc/init.d/iptables stop
-
chkconfig iptables off
-
setenforce 0
备节点admin2.tuchao.com,配置和主节点相同,只需要安装好程序,然后把配置文件拷贝过去就可以了。
-
scp authkeys ha.cf admin2:/etc/ha.d
-
scp /etc/hosts admin2:/etc/hosts
-
scp /etc/httpd/conf/httpd.conf admin2:/etc/httpd/conf/httpd.conf
-
scp /etc/my.cnf admin2:/etc
-
scp /etc/ld.so.conf.d/mysql.conf admin2:/etc/ld.so.conf.d/mysql.conf
-
scp /etc/profile.d/mysql.sh admin2:/etc/profile.d/mysql.sh
-
ldconfig
-
. /etc/profile.d/mysql.sh
-
service heartbeat start
启动heartbeat后,需要给hacluster用户一个密码,就可以使用hb_gui图形界面来配置资源。
-
hb_gui &
-
echo 123456 |passwd --stdin hacluster
配置资源
我将资源分为以下两组:
webserver 运行在主节点
vip:192.168.18.222 cidr_netmask 24
store device:192.168.18.203:/http directory:/var/www/html fstype:nfs
httpd //这个使用的是LSB标准类型,没有额外参数。
mysql 运行在备节点
myip:192.168.18.220 cidr_netmask 24
mystore device:192.168.18.203:/mysqldata directory:/mydata fstype:nfs
mysqld //LSB类型
定义完成后,启动成功如下图:
我们访问vip对应解析的域名(www.tuchao.com)
可以正常访问到我们的站点
模拟故障,这时把我们主节点的network服务给stop。
/etc/init.d/network stop
尝试用备节点ping 主节点,已经ping不通了。
这时尝试下我们的站点还能不能正常访问。
哈哈,访问正常,我们明明把提供http服务的admin1节点的网络功能给停了呀。
我们来看看heartbeat。
这里显示主节点已关闭,主节点的资源组已经自动切换到备节点上来了。
现在我们把主节点网络功能给恢复,因为这里开启了auto_failback on,资源又会自动切换回主节点了。
我们把备节点网络功能给关掉,主节点也会自动接替备节点的工作。
这就实现了互为主备的高可用模型。
实验二、LVS负载均衡+高可用,使用heartbeat-ldirectord对后端RealServer做健康状况检测。
实验环境:
RHEL6.4
主节点:admin1.tuchao.com 192.168.18.201/24
备节点:admin2.tuchao.com 192.168.18.202/24
安装ipvsadm
-
yum install ipvsadm -y
安装heartbeat-ldirectord,复制配置文件样列。
-
yum install heartbeat-ldirectord -y
-
cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
编辑配置文件:
checktimeout=3 //等待超时时间
checkinterval=1 //检查时间间隔
#fallback=127.0.0.1:80
autoreload=yes //自动装载配置文件
#logfile="/var/log/ldirectord.log" //定义服务自我管理的日志
#logfile="local0" //定义日志发送给rsyslog
#emailalert="admin@x.y.z" //管理员邮箱
#emailalertfreq=3600 //邮件发送频率
#emailalertstatus=all
quiescent=yes //是否以静默模式工作(当某一个Realserver故障了如何处理,yes表示把realserver权重设置为0,no表示把realserver删除。
virtual=192.168.18.100:80 //定义虚拟IP
real=192.168.18.191:80 gate //定义RealServer,gate表示DR模型。
real=192.168.18.192:80 gate 3
fallback=127.0.0.1:80 gate //当RealServer全部故障时,使用本机响应请求。
service=http //当检测类型为协商的时候,指定检测方式是基于什么服务实现的。
request=".test.html"
receive="OK"
virtualhost=www.tuchao.com //虚拟主机
scheduler=wrr //指定调度算法
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate //检查类型为协商
checkport=80
配置文件写好以后,复制一份到备节点。
启动图像界面定义资源
vip
ldirectord
配置好两台realserver分别是192.168.18.191,192.168.18.192。
-
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
-
ifconfig lo:0 192.168.18.100 broadcast 192.168.18.100 netmask 255.255.255.255 up
-
route add -host 192.168.18.100 dev lo:0
创建首页文件 略
创建检测文件
echo "OK" > /var/www/html/.test.hmtl
启动httpd服务
service httpd start
第二台RealServer配置相同。
启动资源
资源运行在了节点二上
我们访问下director试试。
刷新一下,这里为了更好的分别有没有生效,设置了两个不同的网页内容。
现在模拟节点二故障,在节点二上执行halt。
资源已经自动切换到节点一上来了,负载均衡正常运作。
配置节点一与节点二httpd服务,实现fallback功能。
echo “Server is repairing”>/var/www/html/index.html
service httpd start
这时候模拟realserver全部都故障了,ldirectord会自动把故障的realserver权重标记为0。
尝试下访问,这时director就响应我们了。
HA高可用实验完成,这里提一个小细节,实际工作中配置heartbeat还是不要启用auto_failback,当损坏的节点突然好了以后,资源切回来有时会出错,要手动到clearup一下资源就可以了。
有更好的建议欢迎大家与我多多交流QQ:1183710107
本文转自qw87112 51CTO博客,原文链接:http://blog.51cto.com/tchuairen/1436086