1. HA介绍
高可用集群,即HA集群(high available),也长称作双机热备,用于关键性业务。常见实现高可用的开源软件有heartbeat和keepalived(keepalived也有负载均衡的功能)。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机时,备用服务器顶替。
如图所示为一个HA架构,一个交换机下面有两台机器Web1和Web2,其中Web1为主节点,正常是它在提供服务,而Web2备用节点是闲置的。Web1和Web2中间有一根心跳线,检查对方的存活状态。流动IP,也叫VIP,是对外提供服务的IP,正常情况下是配置在Web1上的,当Web1宕机后,Web2会自动配置该VIP,对外提供服务。
2. heartbeat的配置
下面使用heartbeat来做HA集群,并且把Nginx服务作为HA对应的服务。
2.1. 实验环境说明
有两台机器,各有两个网卡(eth0和eth1),一个对外,一个对内(对内用来做心跳线)。都是CentOS6.5。
两个eth0网卡的IP如下:
- aming 192.168.31.166
- aming1 192.168.31.100
两个eth1网卡的IP如下:
- aming 192.168.21.166
- aming1 192.168.21.100
2.2. 具体配置步骤
下面的1-5步的操作都是在两个机器上操作
1. 设置hostname
设置hostname,分别为aming和aming1。
主上设置hostname:
从上设置hostname:
2. 关闭防火墙和SELinux
主和从上都操作:
关闭防火墙
12iptables -Fservice iptables save关闭SELinux
12setenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3. 配置hosts
主和从上都这样编辑:
4. 安装epel扩展源和heartbeat
主和从上都执行:
在这里用Nginx作为服务,所以安装了Nginx。
5. 主上(aming)的配置
拷贝相关配置文件
编辑authkeys并修改其权限
编辑haresources文件
说明:
aming
围殴主节点hostname192.168.31.110
为VIP/24
为24网段eth0:0
为VIP的设备名nginx
为heartbeat监控的服务,也是两台机器对外提供的核心服务。当然,在这里这样写是因为/etc/init.d/下面有ngixn,可以在服务列表中查到,所以可以直接使用。
然后编辑ha.cf
配置说明:
- debugfile /var/log/ha-debug 改文件保存heartbeat的调试信息
- logfile /var/log/ha-log heartbeat的日志文件
- logfacility local0 一种日志级别
- keepalive 2 心跳的时间间隔,默认时间单位为秒
- deadtime 30 超出该时间间隔未收到对方节点的心跳,则认为对方已经死亡
- warntime 10 超出该时间间隔未收到对方节点的心跳,则发出警告并记录到日志中
- initdead 60 在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍
- udpport 694 设置广播通信使用的端口,694为默认使用的端口号
- ucast eth1 192.168.21.100 设置对方机器心跳检测的网卡和IP
- auto_failback on :heartbeat的两台主机分别为主节点和从节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点并由从节点运行服务。在该选项设为on的情况下,一旦朱姐带你恢复运行,则自动获取资源并取代从节点,否则不取代从节点
- node :指定主和从,各占一行,主在上从在下
- ping 192.168.21.1 :用来监视的
- respawn hacluster /usr/lib/heartbeat/ipfai :指定与heartbeat一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。最常用的进程是ipfail,该进程用于检测和处理网络故障,需要配合ping语句指定的ping_node来检测网络连接。如果你的系统是64位,要注意改文件的路径
6. 把主上的三个配置文件拷贝到从上
在这里用scp来拷贝,如果没有这个命令,用这个命令安装:yum install -y openssh-clients
7. 到从上(amng1)编辑ha.cf
|
|
8. 启动heartbeat
先主后从:
9. 检查
ifconfig
查看是否有eth0:0ps aux | grep nginx
查看是否有nginx进程
10. 测试
- 测试1:主上故意禁ping:
iptables -I INPUT -p icmp -j DROP
- 测试2:主上停止heartbeat服务:
service heartbeat stop
- 测试3:主和从都down掉eth1网卡:
ifdown eth1
3. keepalived的配置
3.1. keepalived工作原理
首先介绍一个协议VRRP(Virtual Pouter Redundancy Protocol,虚拟路由冗余协议)。它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master(主)角色和N(N>=1)个backup(备用)角色。工作时,master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
而keepalived就是采用这种VRRP协议实现的高可用。keepalived主要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析;check模块复制健康检查;vrrp模块用来实现VRRP协议。
3.2. 安装keepalived
上面提到了VRRP协议有1个master角色和至少1个backup角色,所以做本实验需要准备至少2台Linux主机。在这里拿两台Linux虚拟机(128和129,其中128作为master,129作为backup)来完成以下操作。
在两台机器上执行如下操作:
CentOS默认的yum源里就有keepalived包,版本虽然有点老,但不影响使用。安装keepalived非常简单,重点在于配置,下面会以一个实际的案例来阐述一下keepalived的高可用功能。
3.3. keepalived+Nginx实现Web高可用
生产环境中,诸多企业把Nginx作为负载均衡器来使用,它的重要性很高,一旦宕机会当值整个站点不能访问,所以有必要再准备一台备用Nginx,keepalived用在这种场景下非常合适。可以这样做,用两台Nginx做负载均衡,每一台上面都安装了keepaived,也就是说keepalived和Nginx安装在一起。
在配置之前,先把要做实验的两台机器的IP、角色说明一下:
- mster:192.168.188.128 安装keepalived+Nginx
- backup:192.168.188.129 安装keepalived+Nginx
- VIP:192.168.188.100(虚拟IP,也叫浮动IP,这个IP是有keepalived给服务器配置上的,服务器靠这个VIP对外提供服务,当master宕机后,VIP被分配到backup上,这样用户看来是无感知的)
1. 配置master
编辑master(128)的keepalived配置文件:
上面的配置文件去掉注释如下:
keepalived要实现高可用,监控Nginx服务是必不可少的,它本身没有这个功能,需要借助自定义脚本实现,所以我们还需要定义一个监控Nginx服务的脚本,如下:
脚本内容如下:
做完上面的操作后,就可以启动master桑的keepalived了,如果没有启动Nginx服务,它会帮我们自动拉起来,并监听VIP。
- CentOS7上:
systemctl start keepalived
- CentOS6上:
service keepalived start
检查是否启动:
ip add
查看是狗有192.168.188.100这个VIPpa aux | grep nginx
查看是否有nginx这个服务
到此master已经大功告成。接下来配置backup。
2. 配置backup
首先编辑配置文件:内容和master大部分一致,只是state和priority有变化:
编辑监控脚本如下,vim /usr/local/sbin/check_ng.sh
,脚本内容如下:
然后赋予执行权限给这个脚本:chmod a+x /usr/local/sbin/check_ng.sh
由于backup(129)上还未安装Nginx,暂时还不能启动keepalived服务,还需要做如下操作:
通过上面的步骤安装完Nginx后,我们就可以启动keepalived服务了:
- CentOS7上:
systemctl start keepalived
- CentOS6上:
service keepalived start
到此,backup也配置完成。接下来就可以测试一下keepalived的高可用了。虽然在backup(129)上安装了Nginx,但并不需要启动Nginx服务,因为正常情况下只要master提供Nginx服务即可。只有master宕机后,backup上的Nginx才会自动被keepalived调用起来。
验证过程省略了。
3. 补充
如果把上面的Nginx换成其他服务,比如说MySQL,那么该如何做呢?其实很简单,它们的配置思路是一样的,唯一不同的是对MySQL的监控脚本不一样。