高可用集群(High Availability Cluster,简称 HA)包括两台及以上的服务器,通常为两台服务器,其中一台工作,另一条冗余,当提供服务的服务器宕机时,冗余的那台服务器将接替宕机的服务器继续提供服务。只有两个节点的高可用集群又称为双机热备,即使用两台服务器互相备份。从而在不需要人工干预的 情况下,自动保证系统能持续对外提供服务。
本文实现原理图如上,实现方案主要是通过nginx+keepalived。实现步骤主要介绍keepalived服务的高可用性,nginx安装及其负载均衡的配置可用参照其他文章
一、环境说明
本机+vmware+2台centos 7虚拟机+两个tomcat应用
实现思路:
两台centos做负债均衡,一台为主机(1921.168.132.10),一台为从机(1921.168.132.11),本地机器启动两个tomcat应用,通过centos上Nginx分别实现负债均衡(这里使用轮询的模式)通过centos分别安装keepalived开启虚拟IP,通过对虚拟IP进行访问来实现主从模式的高可用。
1.1 keepalived 简介
Keepalived 是通过 VRRP(Virtual Router Redundancy Protocal)协议来实现高可用的。VRRP 协议会将多台功能相同的路由器组成一个小组,这个小组里有一个 master 主节点和 N(N >=1)个 backup 备用节点。工作时, master 会通过组播的形式向各个 backup 发送 VRRP 协议的数据包,当 backup 收到 master 发来的 VRRP 数据包时,就会认为 master 宕机了。此时就需要根据各个 backup 的优先级来决定谁称为新的 master,来提供服务。
1.2 keepalived安装
#检查是否存在keepalived
rpm -ql keepalived
#安装
yum install -y keepalived
#查看安装位置
rpm -qa | grep keepalived
#安装位置一般路径 /etc/keepalived
1.3 Nginx安装以及负载均衡配置(略)
1.4 修改keepalive配置文件
#进入目录
cd /etc/keepalived
#编辑配置文件
vim keepalived.conf
配置文件内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.132.10
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_chk.sh"
interval 2 #检测脚本执行的间隔
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将MASTER改为BACKUP
interface ens33 # 网卡
virtual_router_id 51 #主 备机的virtual_router_id 必须相同
priority 100 # 主 备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.132.13 # 虚拟地址
}
}
....
这里主要配置在于以下几点
- 设置当前虚拟机的IP
smtp_server 192.168.132.10 #设置当前虚拟机的IP
- 注释vrrp_strict,这里至关重要,如果不注释此项,下面配置的虚拟ip无法ping通也不能正常使用
# vrrp_strict
- 设置nginx监控服务脚本,注意!这里设置了chk_http_port之后需要在下面的vrrp_instance VI_1中配置
vrrp_script chk_http_port {
script "/usr/local/src/nginx_chk.sh"
interval 2 #检测脚本执行的间隔
weight 2
}
#
vrrp_instance VI_1 {
track_script {
chk_http_port
}
}
- 需要注意的其他地方
vrrp_instance VI_1 {
state MASTER # 备份服务器上将MASTER改为BACKUP
interface ens33 # 网卡
virtual_router_id 51 #主 备机的virtual_router_id 必须相同
priority 100 # 主 备机取不同的优先级,主机值较大,备份机值较小
virtual_ipaddress {
192.168.132.13 # 虚拟地址,目前还未使用的,最好是和两台虚拟机紧挨着的ip地址段
}
......
}
5.监控脚本内容
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
以上就是keepalived主服务器的配置,备份服务器配置以此类推对照配置。
- keepalived常用命令
#启动
systemctl start keepalived.service
#关闭
systemctl stop keepalived.service
注意事项:
- vrrp_strict一定要注释
- 关闭centos防火墙
- 关闭selinux 这里不关闭会出现Nginx服务停用之后上面的脚本文件不会执行,keepalived的主服务器控制权一直在当前服务器上,而Nginx服务挂掉之后就会导致服务不可用。
- 关于keepalived主从切换,可以在部署完成之后查看ip地址信息(可以看到配置的虚拟ip已经生效) ,关闭主服务器的keepalived,然后再次查看本服务器发现虚拟IP丢失,而查看从服务器会再次发现虚拟ip。这种现象表示keepalived安装基本完成
关于selinux具体内容请参照其他文章对其介绍,selinux操作如下
#获取当前selinux状态
getenforce
#临时关闭
setenforce 0
#永久关闭selinux
vim /etc/sysconfig/selinux
#将 SELINUX=enforcing 替换为SELINUX=disabled
#重启后,运行命令sestatus
SELinux status
disabled
最终演示效果需要满足任意停止一台服务器上的nginx服务或keepalived服务,依然能够访问到tomcat服务,表明其负载均衡和高可用特性已经生效。