适用于访问量较小的业务,配置较为简单。
创建一个虚拟的IP提供给客户端来访问,虚拟IP会在两台服务器之间来回切换,heartbeat以脚本的方式检测两台服务器的存活状态,以此来实现高可用性。
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
(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
authkeys的权限必须为600,如果不设置为600会判定为不安全禁止启动。
(8)配置主配置文件
配置心跳检测网卡,如果有多个网卡则根据示例进行添加
配置node前必须确保通过uname -n 能够搜索到
添加主服务器虚拟IP以及使用的脚本类型
#指定主服务器名使用IPaddr2的脚本,添加一个IP为10.10.10.100子网掩码为24的ens33:0子接口
nginx-server1 IPaddr2::10.10.10.100/24/ens33:0
3)故障切换测试
当主服务器故障时会自动切换至备份服务器,以此来实现高可用。
4)heartbeat优化
由于heartbeat在检测过程中只是针对服务器本身进行检测,如果只是nginx服务故障,而服务器状态正常就不会触发切换。
编写一个简单的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