适用于访问量较小的业务,配置较为简单。

创建一个虚拟的IP提供给客户端来访问,虚拟IP会在两台服务器之间来回切换,heartbeat以脚本的方式检测两台服务器的存活状态,以此来实现高可用性。

Heartbeat+Nginx实现高可用集群_Linux

1)安装Nginx

https://nginx.org/download/nginx-1.20.2.tar.gz

(1)安装相关依赖包

这里通过挂载镜像的方式进行安装(挂载镜像步骤略)

yum install -y pcre pcre-devel zlib zlib-devel gcc*

(2)解压下载的软件包

tar -zxvf nginx-1.20.2.tar.gz

(3)编译安装

./configure --prefix=/usr/local/nginx
make && make install

(4)挂载NFS共享服务器目录

vim /etc/fstab
将共享服务器的目录挂载至nginx的网页文件存放目录
10.10.10.14:/opt/web1   /usr/local/nginx/html          nfs     defaults,_netdev        0 0

(5)启动nginx

#要想通过nginx命令直接启动,需要先从nginx安装目录中拷贝启动脚本到/usr/sbin/目录下
cp /usr/local/nginx/sbin/nginx /usr/sbin/

#启动nginx
nginx -c /usr/local/nginx/conf/nginx.conf
#停止nginx
nginx -s stop

2)安装Heartbeat

(1)下载Heartbeat包

#需要下载的rpm包
cluster-glue-1.0.5-6.el6.x86_64.rpm
cluster-glue-libs-1.0.5-6.el6.x86_64.rpm
heartbeat-3.0.4-2.el6.x86_64.rpm
heartbeat-libs-3.0.4-2.el6.x86_64.rpm
perl-TimeDate-2.30-2.el7.noarch.rpm
PyXML-0.8.4-27.99.fc19.x86_64.rpm
resource-agents-4.1.1-61.el7.x86_64.rpm

#在这两个地址搜索下载所需软件包
http://www.rpmfind.net/
https://crpm.cn/

(2)使用yum进行安装

yum install heartbeat* -y

(3)配置时间同步

注释掉官方提供的ntp服务器

vim /etc/ntp.conf
#添加ntp服务器为本地时间
server 127.127.1.0    #127.127.1.0 是NTP中预定义的,用于表示本地时钟源的地址.
fudge 127.127.1.0 stratum 10    #设置时钟源层级为10
#只允许10.10.10.0/24网段的地址使用ntp服务同步时间
restrict 10.10.10.0 mask 255.255.255.0 nomodify notrap

Heartbeat+Nginx实现高可用集群_集群_02

(4)在备份服务器上进行时间同步

ntpdate -u 主机IP

(5)配置主机名解析

在vim /etc/sysconfig/network 添加使其永久生效

NETWORKING=yes
HOSTNAME=nginx-server1

#修改保存后重新加载配置
systemctl restart network

(6)从默认的程序文档目录中拷贝配置文件

#ha.cf主配置文件;authkeys认证文件;haresources源文件,拷贝到heartbeat的默认存放目录中
cd /usr/share/doc/heartbeat-3.0.4/
cp -a ha.cf authkeys haresources /etc/ha.d/

(7)配置认证文件

生成随机数MD5值,提高安全性

tr -dc '0-9-a-z-A-Z-!-?' </dev/urandom |head -c 512|openssl md5

选择认证方式为MD5,将我们随机生成的MD5值填写进去

vim authkeys

Heartbeat+Nginx实现高可用集群_集群_03

authkeys的权限必须为600,如果不设置为600会判定为不安全禁止启动。

(8)配置主配置文件

配置心跳检测网卡,如果有多个网卡则根据示例进行添加

Heartbeat+Nginx实现高可用集群_服务器_04

配置node前必须确保通过uname -n 能够搜索到

Heartbeat+Nginx实现高可用集群_Linux_05

添加主服务器虚拟IP以及使用的脚本类型

#指定主服务器名使用IPaddr2的脚本,添加一个IP为10.10.10.100子网掩码为24的ens33:0子接口
nginx-server1   IPaddr2::10.10.10.100/24/ens33:0

3)故障切换测试

当主服务器故障时会自动切换至备份服务器,以此来实现高可用。

Heartbeat+Nginx实现高可用集群_服务器_06

4)heartbeat优化

由于heartbeat在检测过程中只是针对服务器本身进行检测,如果只是nginx服务故障,而服务器状态正常就不会触发切换。

Heartbeat+Nginx实现高可用集群_服务器_07

编写一个简单的shell脚本用来监控nginx的状态使用while循环每3秒检查一次,以此来弥补heartbeat的不足之处。

#!/bin/bash
function http_code(){
code=$(curl -I  -s   10.10.10.11|grep HTTP|cut -d' ' -f2)
if [ "$code" != 200 ];then
        echo "open fail!"
        systemctl stop heartbeat.service
elif [ "$code" == 200 ];then
        heartbeat_status=$(/etc/init.d/heartbeat status |grep "No")
        if [ "$heartbeat_status" ];then
                echo "Starting [heartbeat]......"
                systemctl start heartbeat.service
                if [ $? -eq 0 ];then
                    echo "starting Success!"
                fi
        fi
fi
}
while true
do
        http_code
        sleep 3
done

脚本测试效果图:

Heartbeat+Nginx实现高可用集群_集群_08