LVS+Keepalived+Nginx高可用实现

 前言

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

方案一

起初是一个Nginx服务器,可是当Nginx挂掉后,用户就直接访问不了网站,进而演进第二种方案。
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=linux

方案二

这个方案经过Keepalived解决了Nginx主节点挂掉后,从节点的Nginx会启用,实现了双机主备,这样虽然解决了第一种方案的弊端,可是高迸发场景下,一个Nginx承受不住,不管有多少从节点,仍是会挂掉,从而演进第三种方案。
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=nginx

方案三

经过LVS+Keepalived+Nginx,搭建了Nginx集群,对于LVS使用DR模式,请求转发响应不经过LVS,直接经过Nginx响应给用户,这样LVS负载就更高了,从而提升性能,下面以方案三搭建LVS+Keepalived+Nginx高可用
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=c++

概念

一.LVS

  • 什么是LVS?

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最先出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此以前的内核版本则须要从新编译内核。web

  • 宗旨

使用集群技术和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),用于测试使用vim

主机 IP 做用
主机1 192.168.232.130 Nginx1
主机2 192.168.232.131 Nginx2
主机3 192.168.232.132 Keepalived Master
主机4 192.168.232.133 Keepalived 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,能够正常显示如下两张图 watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=
watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=停用主Keepalived

systemctl stop keepalived.service
  • 停用前,主keepalived的VIP还在

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

  • 停用后,VIP出如今从keepalived上

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=
此时经过192.168.232.150能够正常访问,当把主Keepalived重启启动后,VIP从新回到主Keepalived

测试停用nginx1

  • 停用前两台nginx存在

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

补充:

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

  一直想整理出一份完美的面试宝典,可是时间上一直腾不开,这套一千多道面试题宝典,结合今年金三银四各类大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传之后,毫无心外的短短半个小时点赞量就达到了 13k,说实话仍是有点难以想象的。

一千道互联网 Java 工程师面试题

内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java核心知识点合集(283页)》

内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java中高级核心知识点合集(524页)》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

《Java高级架构知识点整理》

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk= watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 因为篇幅限制,详解资料太全面,细节内容太多,因此只把部分知识点截图出来粗略的介绍,每一个小节点里面都有更细化的内容!

须要的小伙伴,能够一键三连,下方获取免费领取方式!

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

相关文章
相关标签/搜索