正常的互联网架构图
当用户请求到nginx服务器的时候,服务器会通过反向代理,把用户请求转发给后端服务器。
后端服务器可以有多台,通过配置负载均衡,即使其中某台服务器出现问题,其它机器或备用机也可以立即上线,保持服务正常。
但如果这台做反向代理的nginx服务器突然宕机不可用了怎么办?
我们可以通过keepalived解决这个问题。
简单理解keepalived
keepalived是一个小软件,它可以实现多台服务器之间互相通信,互相检测对方是否在线(有没有挂掉)。
两台或多台机器同时对外提供服务,各自有独立的固定IP,keepalived通过这个ip互相通信。
一台机器可以有多张网卡,一张网卡可以设置多个ip地址。
keepalived会在当前的master服务器上设置一个虚拟ip,用户访问的时候,入口是这个虚拟的ip地址。
通过keepalived,实现虚拟ip在机器之间来回漂移,漂过的ip由keepalived管理。
在多台机器中,通过keepalived的竞选机制,做出主备之分,keepalived的配置文件可以设置优先级,优先级越高,竞选时成为master的几率就越高。
注意
keepalived只是把虚拟ip来回切换,每次都是在网卡上新增ip地址,并没有改变固定的原ip地址。
通过下面这张图,做初步理解
上面的图片只针对服务器故障的情况,假设服务器运行正常,但Nginx挂掉了,keepalived之间可以正常通信。
解决这种情况,创建脚本,不断检测Nginx运行状态,若发现Nginx异常,主动杀掉keepalived进程,当备用机发现与master通信失败,它即可转正临时成为master,如下面的图片
编译安装网址
https://www.keepalived.org/download.html
使用apt安装
apt install keepalived
安装成功后,所有配置示例都在/usr/share/doc/keepalived/samples/目录下,
找到keepalived.conf.vrrp,将其复制到/etc/keepalived/目录下,并改名keepalived.conf
cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf
修改/etc/keepalived/keepalived.conf
nano /etc/keepalived/keepalived.conf
保留以下主要参数,其它可以删除
! Configuration File for keepalived
global_defs {
router_id lb_201 #自定义的主机唯一标识ID
}
vrrp_instance VI_1 {
state MASTER #设置初始状态,MASTER或BACKUP,一般都是配置BACKUP,该值无法决定身份,最终还是通过比较priority的值
interface ens18 #网卡名称
virtual_router_id 51 #虚拟路由id,同组主备机保持一致
priority 80 #优先级,主备竞选时优先级高的为master,范围:1-254
advert_int 1 #间隔检测的时间,默认1s
authentication { #组认证机制,同组的保持一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.168.1.200 #虚拟IP地址
}
}
保存后重启keepalived服务
systemctl restart keepalived.service
此时查看IP信息,可看到ens18网卡多了一个IP
如上面的图片,10.168.1.150为固定IP,10.168.1.200是keepalived的虚拟IP,两个IP都可以访问。
注意:
1、同组的参数:vrrp_instance、virtual_router_id、authentication,必须保持一致;
2、设置state MASTER并不代表此台机器就是主机,其它机器设置state BACKUP后,但priority的值高,依然能通过竞选称为master
下面是配置文件默认参数注解
! Configuration File for keepalived
global_defs {
notification_email {
acassen #发生故障时,给谁发送Email
}
notification_email_from Alexandre.Cassen@firewall.loc #通知邮件的邮箱
smtp_server 192.168.200.1 #通知邮件的smtp地址
smtp_connect_timeout 30 #连接smtp服务器超时的时间
router_id LVS_DEVEL #主机唯一标识ID,自定义名字
}
#vrrp:keepalived在内网中通讯的协议
#VI_1 实例的名称,可以自定义,同组内的名称必须一致
vrrp_instance VI_1 {
state MASTER #设置初始状态,状态为MASTER或BACKUP
interface eth0 #网卡的名称
garp_master_delay 10 #设置当切为主状态后多久更新ARP缓存
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
virtual_router_id 51 #虚拟路由id,同组主备机保持一致
nopreempt #设置非抢占模式,配置文件默认无此参数,详细解释看下面
priority 100 #优先级,主备竞选时,优先级高的为master,范围:1-254,仅state MASTER时生效
advert_int 1 #vrrp通告的时间间隔,可以理解为间隔检测的时间,默认1s
authentication { #组认证机制,同一组的保持一致
auth_type PASS #AH(不推荐)或PASS
auth_pass 1111 #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
}
virtual_ipaddress { #虚拟IP地址,可以是好几个
192.168.200.16
192.168.200.17
192.168.200.18
# optional label. should be of the form "realdev:sometext" for
# compatibility with ifconfig.
192.168.200.18 label eth0:1
}
track_script { #定义检测脚本
check_nginx_server
}
}
注:
nopreempt:当master宕机之后,原先的backup会升级成master,配置该参数之后原先的master即使恢复了,也不会抢占现在的master(该参数需要准备都配置为backup的时候才生效)。