一、应用场景:
nginx+keepalived可实现前端调度器的高可用,但如果使用一主一备的方案,会使得主调度器一直处于工作状态直到宕机而从服务器却一直闲着等待主调度器宕机。所以使用双工模式(或者说是双主模式)可以充分利用备用调度器的空闲资源。
二、注意事项:
采用双主模式,理论上应该保持每台调度器的并发访问量最大不超过单台调度器可以承受的最大并发量的50%。实际生产中建议调整为40%,以防其中一台调度器宕机后,高并发量直接撑死另一台调度器。
三、实现原理:
keepalived配置双vip,结合DNS轮询现实现双机双工
四、部署过程
1、环境准备(nginx使用源码安装,直接官网下载;keepalived使用yum安装,这里不做详细介绍):
nginx1: 192.168.247.129 ---》 master-vip:192.168.247.100
nginx2: 192.168.247.130 ---》 master-vip:192.168.247.200
client:192.168.247.128 ---》 配置DNS服务
2、配置vip:
nginx1:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 192.168.200.1
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 check_nginx {
script "/etc/keepalived/check_nginx_status.sh" #检查nginx服务状态的脚本
inerval 5 #每五秒执行一次
}
vrrp_instance VI_1 {
state MASTER
nopreempt #vip不抢占
interface eth0
virtual_router_id 51 #两个vip的id不能一样
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.247.100
}
track_script { #调用健康检查脚本
check_nginx
}
}
vrrp_instance VI_2 {
state BACKUP
# nopreempt
interface eth0
virtual_router_id 52 #上边为51,这里设置为52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.247.200 #设置vip
}
track_script {
check_nginx
}
}
nginx2:
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 192.168.200.1
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 check_nginx {
script "/etc/keepalived/check_nginx_status.sh"
inerval 5
}
vrrp_instance VI_1 {
state BACKUP
# nopreempt
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.247.100
}
track_script {
check_nginx
}
}
vrrp_instance VI_2 {
state MASTER
nopreempt
interface eth0
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.247.200
}
track_script {
check_nginx
}
}
3、编写自动切换脚本(nginx1和nginx2上都做):
vim /etc/keepalived/check_nginx_status.sh
#!/bin/bash
curl localhost &>/dev/null
if [ $? -ne 0 ];then
killall keepalived
fi
4、启动服务(nginx1和nginx2都做):
/usr/local/nginx/sbin/nginx
systemctl start keepalived
5、查看并验证双机双工:
ipaddr
down调一台nginx查看vip是否切换成功
6、配置dns轮询解析(client上操作):
yum -y install bind-chroot bind
vim /etc/named.conf
options {
directory "/var/named";
allow-query { any; };
rrset-order { order cyclic; };
};
zone "zywa.com" IN {
type master;
file "zywa.com.zone";
};
cp -p /var/named/named.empty /var/named/zywa.com.zone # -p 保证新产生的配置文件可以由用户named加载
vim /var/named/zywa.com.zone
$TTL 3H
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
zywa.com. NS yum #这个名字可以随便起,与下行的一致即可
yum A 192.168.247.128 #DNS服务器ip
www A 192.168.247.200
www A 192.168.247.100
7、启动dns服务,并验证轮询:
systemctl start named
vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.247.128
curl www.zywa.com #验证轮询效果。