下文假定 192.168.1.100、192.168.1.101 为两台 keepalived+Nginx 服务器,192.168.1.102 为虚拟 IP(即 VIP)。
在架构设计中,可以利用 Nginx 反向代理和负载均衡实现后端应用的高可用性,同时我们还需要考虑 Nginx 的单点故障。因此可改成多 Nginx 服务,每台 Nginx 服务器上用 keepalived 监测 Nginx 是否正常,不正常会重新启动 Nginx,启动不成功会自己杀掉自己由另一台 keepalived 服务器接管,真正做到架构高可用性。
其实并非两台机器 100、101 都绑定了 VIP,两台 keepalived 配置有主备优先级配置,优先级高的会拿到 VIP,例如 100 拿到 VIP 后,那访问 102 就是实际访问的是 100 上的 Nginx,当把 100 上 Keepalived 进程关闭,101 会得到 VIP,这是访问 VIP 就是访问 101 上的 Nginx 了。
安装 keepalived 依赖的包
若在步骤二编译安装 keepalived 时候提示缺 libnl/libnl3 dev,需上传依赖至文件夹 /opt/rpm:libnl-1.1.4-3.el7.x86_64.rpm、libnl-devel-1.1.4-3.el7.x86_64.rpm
x86_64 下载:https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/
cd /opt/rpm
rpm -ivh *.rpm --nodeps --force
执行上述命令进行安装依赖。
对于安装过程中出现的 undefined reference to OPENSSL_init_ssl 报错需升级 openssl 依赖
上传新版本依赖 openssl-devel-1.0.2k-19.el7.x86_64.rpm 至服务器,并执行安装:
rpm -Uvh openssl-devel-1.0.2k-19.el7.x86_64.rpm #安装新版本依赖
rpm -qa|grep openssl #查看依赖,确认已安装新版依赖
亦可使用 rpm - e 卸载旧依赖再用 rpm -ivh 安装新版依赖。
编译安装 keepalived
将 keepalived 的安装包 上传到 /usr/local/software 目录下
cd /usr/local/software
tar -zxvf keepalived-2.2.0.tar.gz
cd keepalived-2.2.0
./configure --prefix=/usr/local/keepalived
make && make install
将 keepalived 安装成 Linux 系统服务
安装完成之后, 需要做一些工作复制默认配置文件到 默认路径
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cd /usr/local/software/keepalived-2.2.0
cp ./keepalived/etc/init.d/keepalived /etc/init.d/
chmod 755 /etc/init.d/keepalived
编写 nginx 检测脚本
新建脚本文件
vi /etc/keepalived/nginx_check.sh
内容如下:
#!/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
赋予执行权限
chmod +x /etc/keepalived/nginx_check.sh
修改 keepalived 的 Master 配置文件
vi /etc/keepalived/keepalived.conf
内容如下:
# 全局配置,配置收件人
global_defs {
notification_email { ## 通知机制,收件人
10000@qq.com
}
notification_email_from keepalived@domain.com #### 发件人
smtp_server 192.168.1.100 ## 发件服务器
smtp_connect_timeout 30 ## 服务器连接超时时间
router_id LVS_DEVEL ## 路由器标志
}
# 集群资源监控,组合 track_script 进行
vrrp_script check_haproxy {
script "/etc/keepalived/nginx_check.sh" #检测 nginx 状态的脚本路径
interval 2 #检测时间间隔
weight -20 #条件成立 权重减 20
}
vrrp_instance HAPROXY_HA {
# 设置当前主机为主节点,如果是备用节点,则设置为 BACKUP
state MASTER
# 指定 HA 监测网络接口,可以用 ifconfig 查看来决定设置哪一个
interface eth0
# 虚拟路由标识,同一个 VRRP 实例要使用同一个标识,主备机
virtual_router_id 80
# 因为当前环境中 VRRP 组播有问题,改为使用单播发送 VRRP 报文 如果 VRRP 组播没问题,以下这块的内容可以注释掉。
# 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了 MASTER,并且绑定了 VIP
# 主节点时,内容为:
#unicast_src_ip 192.168.1.100
# unicast_peer {
# 192.168.1.101
#}
# 设置优先级,确保主节点的优先级高过备用节点
priority 100
# 用于设定主备节点间同步检查时间间隔
advert_int 2
# 设置高可用集群中不抢占功能,在主机 down 后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患
#nopreempt
# 设置主备节点间的通信验证类型及密码,同一个 VRRP 实例中需一致
authentication {
auth_type PASS
auth_pass 1234
}
# 集群资源监控,组合 vrrp_script 进行
track_script {check_haproxy}
# 设置虚拟 IP 地址,当 keepalived 状态切换为 MASTER 时,此 IP 会自动添加到系统中
# 当状态切换到 BACKUP 时,此 IP 会自动从系统中删除
# 可以通过命令 ip add 查看切换后的状态
virtual_ipaddress {192.168.1.102 #虚拟 ip 配置完之后就用它访问}
}
修改 keepalived 的 BACKUP 配置文件
# 全局配置,配置收件人
global_defs {
notification_email { ## 通知机制,收件人
10000@qq.com
}
notification_email_from keepalived@domain.com #### 发件人
smtp_server 192.168.1.100 ## 发件服务器
smtp_connect_timeout 30 ## 服务器连接超时时间
router_id LVS_DEVEL ## 路由器标志
}
# 集群资源监控,组合 track_script 进行
vrrp_script check_haproxy {
script "/etc/keepalived/nginx_check.sh" #检测 nginx 状态的脚本路径
interval 2 #检测时间间隔
weight -20 #条件成立 权重减 20
}
vrrp_instance HAPROXY_HA {
# 设置当前主机为主节点,如果是备用节点,则设置为 BACKUP
state BACKUP
# 指定 HA 监测网络接口,可以用 ifconfig 查看来决定设置哪一个
interface eth0
# 虚拟路由标识,同一个 VRRP 实例要使用同一个标识,主备机
virtual_router_id 80
# 因为当前环境中 VRRP 组播有问题,改为使用单播发送 VRRP 报文 如果 VRRP 组播没问题,以下这块的内容可以注释掉。
# 这个地方需要关注,之前未做此设置,结果主备节点互相不能发现,因此主备节点都升级成了 MASTER,并且绑定了 VIP
# 主节点时,内容为:
#unicast_src_ip 192.168.1.101
# unicast_peer {
# 192.168.1.100
#}
# 设置优先级,确保主节点的优先级高过备用节点
priority 90
# 用于设定主备节点间同步检查时间间隔
advert_int 2
# 设置高可用集群中不抢占功能,在主机 down 后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患
nopreempt
# 设置主备节点间的通信验证类型及密码,同一个 VRRP 实例中需一致
authentication {
auth_type PASS
auth_pass 1234
}
# 集群资源监控,组合 vrrp_script 进行
track_script {check_haproxy}
# 设置虚拟 IP 地址,当 keepalived 状态切换为 MASTER 时,此 IP 会自动添加到系统中
# 当状态切换到 BACKUP 时,此 IP 会自动从系统中删除
# 可以通过命令 ip add 查看切换后的状态
virtual_ipaddress {192.168.1.102 #虚拟 ip 配置完之后就用它访问}
}
测试高可用
第一步:启动 nginx 和 keepalived 服务
启动 nginx:
# 启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx
#停止
/usr/local/nginx/sbin/nginx -s stop
killall nginx
#重载
/usr/local/nginx/sbin/nginx -s reload
启动 keepalived:
# 启动
systemctl start keepalived
#停止
systemctl stop keepalived
killall keepalived
#重启
systemctl restart keepalived
启动之后, 使用ip addr
(centos6 之前版本使用 ifconfig
) 其中一台服务器会出现虚拟 ip 绑定到网卡
第二步:通过虚拟 ip 访问服务
通过虚拟 ip 访问服务, 会跳转到 nginx 的服务上。
第三步:杀掉一台服务器上的 keepalived 再次访问服务
注意:杀掉 nginx 是不行的, 因为上面的脚本 是检测到 nginx 宕机 会重启 nginx 的,例如这里杀死 192.168.1.101 上的 keepalived 进程。
第四步:再次访问服务
会发现虚拟 ip 从 192.168.1.101 上取消了, 重新绑定到 192.168.1.100 上了。
查看日志
tail -f /var/log/messages
查询安装位置
find / -name svnserve
whereis svnserve
- 第一步:启动 nginx 和 keepalived 服务
- 第二步:通过虚拟 ip 访问服务
- 第三步:杀掉一台服务器上的 keepalived 再次访问服务
- 第四步:再次访问服务
- 查看日志
- 第一步:启动 nginx 和 keepalived 服务
- 第二步:通过虚拟 ip 访问服务
- 第三步:杀掉一台服务器上的 keepalived 再次访问服务
- 第四步:再次访问服务
- 查看日志