高可用集群HA的配置和使用

1. HA介绍

高可用集群,即HA集群(high available),也长称作双机热备,用于关键性业务。常见实现高可用的开源软件有heartbeat和keepalived(keepalived也有负载均衡的功能)。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机时,备用服务器顶替。

HA简单示例

如图所示为一个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:

1
2
3
4
# hostname aming
# vim /etc/sysconfig/network
#<==编辑文件,使
HOSTNAME=aming

从上设置hostname:

1
2
3
4
# hostname aming1
# vim /etc/sysconfig/network
#<==编辑文件,使
HOSTNAME=aming1

2. 关闭防火墙和SELinux

主和从上都操作:

  • 关闭防火墙

    1
    2
    # iptables -F
    # service iptables save
  • 关闭SELinux

    1
    2
    # setenforce 0
    # sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

3. 配置hosts

主和从上都这样编辑:

1
2
3
4
# vim /etc/hosts
#<==增加内容如下
192.168.31.166 aming
192.168.31.100 aming1

4. 安装epel扩展源和heartbeat

主和从上都执行:

1
2
# yum install -y epel-release
# yum install -y heartbeat* libnet nginx

在这里用Nginx作为服务,所以安装了Nginx。

5. 主上(aming)的配置

拷贝相关配置文件

1
2
3
# cd /usr/share/doc/heartbeat-3.0.4/ #<==这个目录下面有模板配置文件
# cp authkeys ha.cf haresources /etc/ha.d/
# cd /etc/ha.d

编辑authkeys并修改其权限

1
2
3
4
5
6
# vim authkeys #<==这个配置文件是与验证相关的,关于心跳线
#<==更改成如下:
auth 3
3 md5 Hello!
#<==保存后修改其权限
# chmod 600 authkeys

编辑haresources文件

1
2
3
# vim haresources
#<==编辑haresources文件,加入下面的一行
aming 192.168.31.110/24/eth0:0 nginx

说明:

  • aming围殴主节点hostname
  • 192.168.31.110为VIP
  • /24为24网段
  • eth0:0为VIP的设备名
  • nginx为heartbeat监控的服务,也是两台机器对外提供的核心服务。当然,在这里这样写是因为/etc/init.d/下面有ngixn,可以在服务列表中查到,所以可以直接使用。

然后编辑ha.cf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# vim ha.cf
#<==改为如下内容
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth1 192.168.21.100
auto_failback on
node aming
node aming1
ping 192.168.21.1
respawn hacluster /usr/lib/heartbeat/ipfail

配置说明:

  • 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

1
2
# cd /etc/ha.d/
# scp authkeys ha.cf haresources aming1:/etc/ha.d/

7. 到从上(amng1)编辑ha.cf

1
2
3
4
5
# vim /etc/ha.d/ha.cf
#<==只需要更改一个地方
#<==ucast eth1 192.168.21.100改为
ucast eth1 192.168.21.166

8. 启动heartbeat

先主后从:

1
# service heartbeat start

9. 检查

  • ifconfig查看是否有eth0:0
  • ps 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)来完成以下操作。

在两台机器上执行如下操作:

1
# yum install -y keepalived

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配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# vim /etc/keepalived/keepalived.conf #<==更改成如下内容
global_defs {
notification_email {
aming@aminglinux.com #<==定义接受告警的人
}
notification_email_from root@aminglinux.com #<==定义发邮件地址(实际上没用)
smtp_server 127.0.0.1 #<==定义发邮件地址,若为127.0.0.1则使用本机自带的邮件服务器发送
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx { #<==chk_nginx为自定义名字,后面还会用到它
script "/usr/local/sbin/check_ng.sh" #<==自定义脚本,该脚本为监控Nginx服务的脚本
interval 3 #<==每隔3s执行一次该脚本
}
vrrp_instance VI_1 {
state MASTER #<==角色为master
interface ens33 #<==针对哪个网卡监听VIP
virtual_router_id 51
priority 100 #<==权重为100,master要比backup大
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com #<==定义密码,这个密码自定义
}
virtual_ipaddress {
192.168.188.100 #<==定义VIP
}
track_script {
chk_nginx #<==定义监控脚本,这里和上面vrr_script后面的字符串保持一致
}
}

上面的配置文件去掉注释如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
global_defs {
notification_email {
aming@aminglinux.com
}
notification_email_from root@aminglinux.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.188.100
}
track_script {
chk_nginx
}
}

keepalived要实现高可用,监控Nginx服务是必不可少的,它本身没有这个功能,需要借助自定义脚本实现,所以我们还需要定义一个监控Nginx服务的脚本,如下:

1
2
3
# vim /usr/loca/sbin/check_ng.sh
#<==添加下面的脚本内容后,需要给它执行权限,否则无法被keepalived调用
# chmod a+x /usr/local/sbin/check_ng.sh

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi

做完上面的操作后,就可以启动master桑的keepalived了,如果没有启动Nginx服务,它会帮我们自动拉起来,并监听VIP。

  • CentOS7上:systemctl start keepalived
  • CentOS6上:service keepalived start

检查是否启动:

  • ip add查看是狗有192.168.188.100这个VIP
  • pa aux | grep nginx查看是否有nginx这个服务

到此master已经大功告成。接下来配置backup。

2. 配置backup

首先编辑配置文件:内容和master大部分一致,只是state和priority有变化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
aming@aminglinux.com
}
notification_email_from root@aminglinux.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.188.100
}
track_script {
chk_nginx
}
}

编辑监控脚本如下,vim /usr/local/sbin/check_ng.sh,脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi

然后赋予执行权限给这个脚本:chmod a+x /usr/local/sbin/check_ng.sh

由于backup(129)上还未安装Nginx,暂时还不能启动keepalived服务,还需要做如下操作:

1
2
# yum install -y epel-release
# yum install -y nginx

通过上面的步骤安装完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的监控脚本不一样。

0%