首页 > 技术分享 > LNMP|WAMP
收藏

Nginx高可用场景双机热备解决方案,keepalived原理与入门实战

01/23 23:24
大潇博客 原创文章,转载请标明出处

正常的互联网架构图

当用户请求到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的时候才生效)。


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311