前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx+Keepalived实现服务的高可用

Nginx+Keepalived实现服务的高可用

作者头像
胡齐
发布2019-09-25 15:15:31
8140
发布2019-09-25 15:15:31
举报
文章被收录于专栏:运维猫

1.Keepalived高可用软件

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。

keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

2.Keepalived高可用故障切换转移原理

Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

一般情况下,如果我们做小型项目,前端用一个nginx做反向代理即可,大概是这样的

但是,作为互联网项目,纯2C的话必然需要做高可用,不仅后端的Server有N个,Nginx同样需要有N个,一主N备,当有一个服务器挂掉的时候,服务能瞬间切换到其他服务器,大概是这样的

下面就以上图为例,说明一下如何实现server的高可用。

1、准备

  虚拟机两台,同样安装nginx,keepalived,最简单的安装方法

yum -y install nginx,

yum -y install keepalived。

如果找不到安装到哪儿了,可以使用whereis nginx查看,这里不再赘述。

  网络划分如下

  名称 IP  虚拟IP 操作系统

  虚拟机1(VM1) 172.17.1.150 172.17.1.160 centos7.5

  虚拟机2(VM2) 172.17.1.151 172.17.1.160 centos7.5

2、两台机器都要操作:关闭防火墙,修改nginx首页,启动nginx

* 关闭防火墙

systemctl stop firewalld.service #临时关闭,重启失效

systemctl disable firewalld.service #禁止开机启动

  安装nginx

[root@localhost ~]# yum install nginx

  修改nginx首页(两台机器分别操作)

[root@localhost ~]# echo "yunweimao" > /usr/share/nginx/html/index.html

[root@localhost ~]# echo "maoxiaopu" > /usr/share/nginx/html/index.html

  启动nginx

[root@localhost ~]# service nginx restart

  报错:

nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)

nginx: configuration file /etc/nginx/nginx.conf test failed

  修改:

[root@localhost ~]# vim /etc/nginx/conf.d/default.conf

* 简单起见,我们认为每个nginx都是代理一个服务,只用nginx默认带的静态页作为测试,分别修改页面内容为"yunweimao"和“maoxiaopu”

* 启动nginx

systemctl start nginx

3、修改keepalived的配置文件

  主配置如下(默认配置文件:/etc/keepalived/keepalived.conf):

! Configuration File for keepalived

global_defs {

# notification_email {

# acassen@firewall.loc

# failover@firewall.loc

# sysadmin@firewall.loc

# }

# notification_email_from Alexandre.Cassen@firewall.loc

# 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 chk_nginx {

script "/etc/keepalived/nginx_check.sh"

interval 2

weight -20

}

vrrp_instance VI_1 {

state MASTER # 标识为主服务

interface eth0 #绑定虚拟机的IP

virtual_router_id 51 # 虚拟路由id,和从机保持一致

#mcast_src_ip 172.17.1.150 #本机ip

priority 100 #权重,需要高于从机

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_nginx ## 执行 Nginx 监控的服务

}

virtual_ipaddress {

172.17.1.160 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虚拟IP地址

}

}

从机配置(默认配置文件:/etc/keepalived/keepalived.conf)

! Configuration File for keepalived

global_defs {

# notification_email {

# acassen@firewall.loc

# failover@firewall.loc

# sysadmin@firewall.loc

# }

# notification_email_from Alexandre.Cassen@firewall.loc

# smtp_server 192.168.200.1

# smtp_connect_timeout 30

router_id dreamer1

# vrrp_skip_check_adv_addr

# vrrp_strict

# vrrp_garp_interval 0

# vrrp_gna_interval 0

}

vrrp_script chk_nginx {

script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径

interval 2 ## 检测时间间隔

weight -20 ## 如果条件成立,权重-20

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 51

mcast_src_ip 172.17.1.151 ## 本机 IP 地址

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_nginx ## 执行 Nginx 监控的服务

}

virtual_ipaddress {

172.17.1.160

}

}

3、编写监测心跳脚本

  上面配置中可以看到有一个脚本文件:/etc/keepalived/nginx_check.sh

  查看nginx是否启动,如果没启动则启动,如果启动不起来,停掉keepalived服务,此时心跳断掉,服务转向另一个nginx。

#!/bin/bash

counter=$(ps -C nginx --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

/usr/sbin/nginx

sleep 2

counter=$(ps -C nginx --no-heading|wc -l)

if [ "${counter}" = "0" ]; then

/etc/init.d/keepalived stop

fi

fi

4、测试

* 启动172.17.1.150上的nginx和keepalive

* 启动172.17.1.151上的nginx和keepalive

* 访问虚拟IP:http://172.17.1.160

* 停掉172.17.1.150上的keepalive

[root@localhost ~]# service keepalived stop

* 重新启动172.17.1.150上的keepalive,又会回到yunweimao

[root@localhost ~]# service keepalived start

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档