Keepalive+Nginx高可用集群
双机高可用方法目前分为两种:
(1)Nginx+keepalived 双机主从模式:
即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠,但是对于主从服务器配置差异很大的机器可以作为一种选择(从服务器就临时用一下嘛)
(2)Nginx+keepalived 双机主主模式:
即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。一般来说,两个机器的性能都要相差无几,能够提供正常的业务访问量
实操案例
1、配置阿里源
2台主机都配置
[root@localhost ~]# rm -rf /etc/yum.repos.d/*
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# yum install wget -y
[root@localhost ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
2、安装nginx、keepalived
2台主机都配置
[root@localhost ~]# yum install nginx -y
[root@localhost ~]# yum install keepalived -y
3、修改 nginx 首页面内容
2台主机都配置
这一步是为了我们配置好后,方便观察
修改为节点IP就可以
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# mv index.html index.html.bak
[root@localhost html]# vi index.html
节点一
<body>
<h1>192.168.1.115</h1>
</body>
节点二
<body>
<h1>192.168.1.116</h1>
</body>
4、启动nginx
2台主机都配置
[root@localhost ~]# setenforce 0 ; systemctl stop firewalld
[root@localhost ~]# systemctl restart nginx
在浏览器输入ip地址
5、配置keepalived
节点一配置
[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
# 路由ID,不能重复,通常为 hostname
router_id 192.168.1.115
}
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
# 检测 nginx 状态的脚本路径
script "/etc/keepalived/nginx_check.sh"
# #每2秒运行一次上面的脚本
interval 2
# 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
# 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
weight -20
}
# 定义实例
vrrp_instance VI_1 {
# 可选值为 MASTER 或者 BACKUP
state MASTER
# 网卡名称,与本机 IP 地址所在的网卡名称相同
interface eth0
# 虚拟路由的ID,MASTER和BACKUP必须是一致的。
virtual_router_id 99
# 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
priority 100
# 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒
advert_int 1
# 设置验证类型和密码,两个节点必须一致
authentication {
# 认证方式,此处PASS表示为密码
auth_type PASS
# 生产环境设置6位随机密码
auth_pass 000000
}
# 设置虚拟IP地址
virtual_ipaddress {
192.168.1.211
}
# 执行脚本
track_script {
# 对应vrrp_script配置的脚本
chk_nginx
}
}
节点二配置
[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak
[root@localhost keepalived]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
# 全局配置
global_defs {
# 路由ID,不能重复,通常为 hostname
router_id 192.168.1.116
}
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
# 检测 nginx 状态的脚本路径
script "/etc/keepalived/nginx_check.sh"
# #每2秒运行一次上面的脚本
interval 2
# 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
# 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
weight -20
}
# 定义实例
vrrp_instance VI_1 {
# 可选值为 MASTER 或者 BACKUP
state BACKUP
# 网卡名称,与本机 IP 地址所在的网卡名称相同
interface eth0
# 虚拟路由的ID,MASTER和BACKUP必须是一致的。
virtual_router_id 51
# 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
priority 100
# 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒
advert_int 1
# 设置验证类型和密码,两个节点必须一致
authentication {
# 认证方式,此处PASS表示为密码
auth_type PASS
# 生产环境设置6位随机密码
auth_pass 000000
}
# 设置虚拟IP地址
virtual_ipaddress {
192.168.1.211
}
# 执行脚本
track_script {
# 对应vrrp_script配置的脚本
chk_nginx
}
}
6、检测脚本
[root@localhost ~]# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
# 这里需要替换成自己的nginx安装路径
# 尝试重新启动nginx
/usr/sbin/nginx
# 睡眠2秒
sleep 2
if [ $A -eq 0 ];then
#启动失败,将keepalived服务杀死。
killall keepalived
fi
fi
[root@localhost ~]# yum install -y psmisc
[root@localhost ~]# chmod +x /etc/keepalived/nginx_check.sh
7、测试
启动 Keepalived
[root@localhost keepalived]# systemctl restart keepalived.service
查看2台主机的ip会发现节点一多了一个IP地址92.168.1.211
这就是我们配置的VIP,因为我们是主备模式,不是主主模式,VIP只会在一台主机上
[root@localhost keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether bc:24:11:d6:61:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.115/24 brd 192.168.1.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 192.168.1.211/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::b00c:ac13:38a4:1591/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether bc:24:11:4f:84:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.116/24 brd 192.168.1.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::83a6:a788:f7e2:3c2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
当我们关闭master,VIP 机会飘逸到节点二上,
[root@localhost ~]# systemctl stop keepalived
我们用VIP访问页面会发现是节点二的IP地址
我们启动节点一,再次查看页面会发现又回到了节点一的地址
[root@localhost keepalived]# systemctl restart keepalived.service
评论区