LVS+Keepalived+Nginx高可用实现

2,180 阅读9分钟

前言

本文搭建LVS+Keepalived+Nignx高可用,搭建之前,先看下以下几种方案架设示意图的演进。

方案一

起初是一个Nginx服务器,但是当Nginx挂掉后,用户就直接访问不了网站,进而演进第二种方案。
Nginx单体.png

方案二

这个方案通过Keepalived解决了Nginx主节点挂掉后,从节点的Nginx会启用,实现了双机主备,这样虽然解决了第一种方案的弊端,但是高迸发场景下,一个Nginx承受不住,无论有多少从节点,还是会挂掉,从而演进第三种方案。
keepalived双机主备.png

方案三

通过LVS+Keepalived+Nginx,搭建了Nginx集群,对于LVS使用DR模式,请求转发响应不通过LVS,直接通过Nginx响应给用户,这样LVS负载就更高了,从而提高性能,下面以方案三搭建LVS+Keepalived+Nginx高可用
LVS.png

概念

一.LVS

  • 什么是LVS? LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
  • 宗旨 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器. 很好的可伸缩性(Scalability) 很好的可靠性(Reliability) 很好的可管理性(Manageability)
  • 特点 可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。 其他更多知识点请参照百度百科-LVS

二.Keepalived

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。 更多详细介绍参照其他博文Keepalived详解

搭建

一.准备

准备4台虚拟机(CentOS 7),用于测试使用

主机IP作用
主机1192.168.232.130Nginx1
主机2192.168.232.131Nginx2
主机3192.168.232.132Keepalived Master
主机4192.168.232.133Keepalived Backup
192.168.232.150虚拟IP(VIP)

二.软件安装

192.168.232.130192.168.232.131主机上安装Nginx; 在192.168.232.132192.168.232.133主机上安装Keepalived

1.依赖环境安装

一定要先安装依赖环境,如果下面安装的过程中遇到一些错误信息,按照提示安装以下依赖

yum install gcc-c++

yum install -y pcre pcre-devel

yum install -y zlib zlib-devel

yum install -y openssl openssl-devel

yum install -y libnl libnl-devel

yum install -y libnfnetlink-devel

2.Nginx安装,如果已经安装可以跳过这步

192.168.232.130192.168.232.131主机上安装Nginx,将下载好的Nginx上传到Linux系统,然后解压

#解压命令,版本替换为你自己下载的版本
tar -zxvf nginx-1.61.1.tar.gz 

编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错

mkdir /var/temp/nginx -p

在nginx目录中,输入如下命令配置,目的是为了创建makefile文件

./configure 
--prefix=/usr/local/nginx 
--pid-path=/var/run/nginx/nginx.pid 
--lock-path=/var/lock/nginx.lock 
--error-log-path=/var/log/nginx/error.log 
--http-log-path=/var/log/nginx/access.log 
--with-http_gzip_static_module 
--http-client-body-temp-path=/var/temp/nginx/client 
--http-proxy-temp-path=/var/temp/nginx/proxy 
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi 
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi 
--http-scgi-temp-path=/var/temp/nginx/scgi 
--with-http_ssl_module 
--with-http_stub_status_module

然后之行以下命令,进行编译安装

make && make install

进入nginx安装目录下的sbin

#启动nginx
./nginx

#停止nginx
./nginx -s stop

#重新加载nginx
./nginx -s reload

打开浏览器,访问虚拟机所处内网ip即可打开nginx默认页面,此时表示已经安装成功。

注意事项:虚拟机安装需要关闭防火墙,否则访问不

3.Keepalived安装,如果也已经安装可以跳过这个步骤

192.168.232.132192.168.232.133主机上安装Keepalived,将下载好的Keepalived安装包上传到Linux系统,然后解压

#解压命令,版本替换为你自己下载的版本
tar -zxvf keepalived-2.0.18.tar.gz

#进入到keepalived解压目录
cd keepalived-2.0.18

配置keepalived

./configure --prefix=/usr/local/keepalived --sysconf=/etc

然后之行以下命令,进行编译安装

make && make install

然后到keepalived安装目录

cd /usr/local/keepalived

cd sbin

#启动keepalived
./keepalived

为了方便启动,将Keepalived注册到Linux系统,进入到解压的keepalived目录(注意:这里是一开始解压的目录,不是keepalived安装目录)

#keepalived目录中有个文件夹keepalived,下面还有个etc,进入
cd keepalived/etc

#然后执行,如果提示是否覆盖,输入y覆盖
sudo cp init.d/keepalived /etc/init.d/

sudo cp sysconfig/keepalived /etc/sysconfig/ 

#使配置生效
systemctl daemon-reload

#启动keepalived
systemctl start keepalived.service

#停止keepalived
systemctl stop keepalived.service

#重启keepalived
systemctl restart keepalived.service

4.ipvsadm安装

用于查看lvs转发及代理情况的工具,只需要在192.168.232.132192.168.232.133上安装即可

yum install ipvsadm -y

三.配置

1.配置Nginx服务器,在192.168.232.130192.168.232.131构建虚拟网络接口子接口

进入到/etc/sysconfig/network-scripts

cd /etc/sysconfig/network-scripts

拷贝一份ifcfg-lo命名为ifcfg-lo:1

cp ifcfg-lo ifcfg-lo:1

修改里面配置文件

DEVICE=lo:1
IPADDR=192.168.232.150
NETMASK=255.255.255.255

重启网络,就会看到lo下面多个虚拟IP

service network restart

配置ARP

vim /etc/sysctl.conf

添加以下配置

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

刷新文件

sysctl -p

添加一个host,去接收报文交给lo:1处理

#这样添加重启后会失效
route add -host 192.168.232.150 dev lo:1

#查看
route -n

#添加开启自启动
echo "route add -host 192.168.232.150 dev lo:1" >> /etc/rc.local

2.配置keepalived,在192.168.232.132和192.168.232.133上

  • 配置MASTER,进入192.168.232.132服务器
cd /etc/keepalived

vim keepalived.conf

修改配置内容

global_defs {
   router_id LVS_132  # 设置lvs的id,在一个网络内唯一标识
}
vrrp_instance VI_1 {
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface ens33  #网卡id 换成你自己电脑的网卡id,查看:ip addr
    virtual_router_id 41  #虚拟id,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication { 
	#密码主备一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.232.150  #设置虚拟IP(VIP)
    }
}
#配置集群地址访问的IP+端口,端口和nginx保持一致,都是80
virtual_server 192.168.232.150 80 {
    delay_loop 6 #健康检查时间,单位:秒
    lb_algo rr # 配置负载均衡的算法,默认为轮询
    lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三个模式
    persistence_timeout 5 #设置会话持久化的时间
    protocol TCP #协议 -t
    #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
    real_server 192.168.232.130 80 {  
        weight 1    #轮询的默认权重配比设置为1
	#设置健康检查
        TCP_CHECK {
           #检查的80端口
	   connect_port 80
	   #检查超时时间
           connect_timeout 2
	   #重试的次数
           nb_get_retry 3
	   #间隔时间
           delay_before_retry 3
        }
    }
    #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
    real_server 192.168.232.131 80 {  
        weight 1    #轮询的默认权重配比设置为1
        TCP_CHECK {
	   #检查的80端口
	   connect_port 80
	   #检查超时时间
           connect_timeout 2
	   #重试的次数
           nb_get_retry 3
	   #间隔时间
           delay_before_retry 3
        }
     }
}

保存退出,重启keepalived服务

systemctl restart keepalived
  • 配置BACKUP,进入192.168.232.133服务器
cd /etc/keepalived

vim keepalived.conf

修改配置内容

global_defs {
   router_id LVS_133  # 设置lvs的id,在一个网络内唯一标识
}
vrrp_instance VI_1 {
    state BACKUP     #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface ens33  #网卡id 换成你自己电脑的网卡id,查看:ip addr
    virtual_router_id 41  #虚拟id,主备要一致
    priority 50  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication { 
	#密码主备一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.232.150  #设置虚拟IP(VIP)
    }
}
#配置集群地址访问的IP+端口,端口和nginx保持一致,都是80
virtual_server 192.168.232.150 80 {
    delay_loop 6 #健康检查时间,单位:秒
    lb_algo rr # 配置负载均衡的算法,默认为轮询
    lb_kind DR # 配置LVS的模式,有NAT、TUN、DR三个模式
    persistence_timeout 5 #设置会话持久化的时间
    protocol TCP #协议 -t
    #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
    real_server 192.168.232.130 80 {  
        weight 1    #轮询的默认权重配比设置为1
	#设置健康检查
        TCP_CHECK {
           #检查的80端口
	   connect_port 80
	   #检查超时时间
           connect_timeout 2
	   #重试的次数
           nb_get_retry 3
	   #间隔时间
           delay_before_retry 3
        }
    }
    #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
    real_server 192.168.232.131 80 {  
        weight 1    #轮询的默认权重配比设置为1
        TCP_CHECK {
	   #检查的80端口
	   connect_port 80
	   #检查超时时间
           connect_timeout 2
	   #重试的次数
           nb_get_retry 3
	   #间隔时间
           delay_before_retry 3
        }
     }
}

保存退出,重启keepalived服务

systemctl restart keepalived

测试

查看当前配置的虚拟服务和各个RS的权重

ipvsadm -Ln

查看当前ipvs模块中记录的连接

ipvsadm -Lnc

通过访问192.168.232.150,可以正常显示以下两张图 image.png
image.png 停用主Keepalived

systemctl stop keepalived.service
  • 停用前,主keepalived的VIP还在
    image.png
  • 停用后,VIP出现在从keepalived上
    image.png
    此时通过192.168.232.150可以正常访问,当把主Keepalived重启启动后,VIP重新回到主Keepalived

测试停用nginx1

  • 停用前两台nginx存在
    image.png
  • 停用nginx1,发现只有一个192.168.232.131的ip,挂掉的服务已经被移除,此时再去访问只能访问192.168.232.131的nginx
    image.png

补充:

绝大多数公司到这一步基本就能解决接入层高可用、扩展性、负载均衡的问题了。假设LVS每秒能处理10w的请求,一天也只能处理80亿的请求(10w秒吞吐量*8w秒),那万一系统的日PV超过80亿怎么办呢?这里补充说明下,可以使用DNS轮询,搭建多个虚拟IP(VIP),每个VIP的配置都和上面的配置一样,这样通过DNS去解析多个VIP,就可以达到更高的负载能力。