LVS+Keepalived+Nginx高可用实现

前言

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

方案一

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

方案二

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

方案三

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

概念

一.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负载均衡技术。 

二.Keepalived

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,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.130和 192.168.232.131主机上安装Nginx;在 192.168.232.132和 192.168.232.133主机上安装Keepalived

1.依赖环境安装

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

yum install gcc-c++yum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-develyum install -y libnl libnl-develyum install -y libnfnetlink-devel

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

在 192.168.232.130和 192.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.132和 192.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/keepalivedcd 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#启动keepalivedsystemctl start keepalived.service#停止keepalivedsystemctl stop keepalived.service#重启keepalivedsystemctl restart keepalived.service

4.ipvsadm安装

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

yum install ipvsadm -y

三.配置

1.配置Nginx服务器,在 192.168.232.130和 192.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:1IPADDR=192.168.232.150NETMASK=255.255.255.255

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

service network restart

配置ARP

vim /etc/sysctl.conf

添加以下配置

net.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_announce = 2net.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/keepalivedvim keepalived.conf

修改配置内容

global_defs { router_id LVS_132# 设置lvs的id,在一个网络内唯一标识}vrrp_instance VI_1 {state MASTER #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写interface ens33#网卡id 换成你自己电脑的网卡id,查看:ip addrvirtual_router_id 41#虚拟id,主备要一致priority 100#定义优先级,数字越大,优先级越高,主DR必须大于备用DRadvert_int 1#检查间隔,默认为1sauthentication { #密码主备一致auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.232.150#设置虚拟IP(VIP)}}#配置集群地址访问的IP+端口,端口和nginx保持一致,都是80virtual_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#轮询的默认权重配比设置为1TCP_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/keepalivedvim keepalived.conf

修改配置内容

global_defs { router_id LVS_133# 设置lvs的id,在一个网络内唯一标识}vrrp_instance VI_1 {state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写interface ens33#网卡id 换成你自己电脑的网卡id,查看:ip addrvirtual_router_id 41#虚拟id,主备要一致priority 50#定义优先级,数字越大,优先级越高,主DR必须大于备用DRadvert_int 1#检查间隔,默认为1sauthentication { #密码主备一致auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.232.150#设置虚拟IP(VIP)}}#配置集群地址访问的IP+端口,端口和nginx保持一致,都是80virtual_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#轮询的默认权重配比设置为1TCP_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,可以正常显示以下两张图  停用主Keepalived

systemctl stop keepalived.service

停用前,主keepalived的VIP还在

停用后,VIP出现在从keepalived上

此时通过 192.168.232.150可以正常访问,当把主Keepalived重启启动后,VIP重新回到主Keepalived

测试停用nginx1

停用前两台nginx存在

停用nginx1,发现只有一个192.168.232.131的ip,挂掉的服务已经被移除,此时再去访问只能访问192.168.232.131的nginx

补充:

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