热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lvs+keepalived+gninx高性能负载均衡

1,nginx作为负载均衡器,在应用层实现了负载均衡和反向代理,在分布式集群中,能够有效的去处理大数据量,高访问的应用。但是,如果nginx服务挂了怎么办?为此,可以实现两台n

1,nginx 作为负载均衡器,在应用层实现了负载均衡和反向代理,在分布式集群中,能够有效的去处理大数据量,高访问的应用。但是,如果nginx 服务挂了怎么办?  

      为此,可以实现两台nginx或者多台nginx服务器,也就是双机主从热备,或者多机多主多从。当主nginx(master)挂了之后,备机器(backup)顶上。

      主nginx 和备nginx 由谁来控制?lvs

      主nginx 和备nginx 都挂了怎么办?keepalived

 

 2,lvs + keepalived + gninx

    lvs 简介:

    LVS是一个开源的软件,可以实现传输层四层负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

    LVS 在linux 2.6 之后,已经嵌入到Linux 内核之中,所以不需要单独安装

    虚拟ip

 

    keepalived:

    keepalived是一个类似于Layer2,4,7交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。

    keepalived的工作原理:

    keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障

    VRRP原理:https://www.cnblogs.com/pickKnow/p/11236532.html

 

3,搭建

 

  实现效果,本地开启服务192.168.178.1:8080 ,192.168.178.1:8081 ,由主的nignx 服务器分发,192.168.178.1:8082,192.168.178.1:8083 由备用的nignx 服务器分发

                     nginx 集群:192.168.178.115(MASTER),192.168.178.110(BACKUP),由lvs+ keepalived 分发,nginx 的主次是由keepalived 服务决定的

                     Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,

                    用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。

                    于是就会调 用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

                     默认情况下,是由主的nginx 分发至web 集群(8080.8081),当主nginx服务宕机之后,自动切换到备机。

 

step 1: 本地开启了四个服务192.168.178.1:8080 ,192.168.178.1:8081,192.168.178.1:8082,192.168.178.1:8083

step2: linux 两台机器分别是192.168.178.115 (master) 192.168.178.110 (backup),虚拟vip 192.168.178.116

step3:   在115 和 110 机器上分别安装 nginx 和  keepalived

安装keepalived 如下:

1.下载keepalived
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
2.解压安装:
tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
3.下载插件openssl
yum install -y openssl openssl-devel(需要安装一个软件包)
4.开始编译keepalived
cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
5.make一下
make && make install


报错: eepalived执行./configure --prefix=/usr/local/keepalived时报错:configure: error: Popt libraries is required
出现此错误的原因:
未安装popt的开发包
解决方法:
yum install popt-devel
安装好popt的开发包。重新./configure 即可。


keepalived安装成Linux系统服务

将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:
首先创建文件夹,将keepalived配置文件进行复制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
然后复制keepalived脚本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived/sbin/
可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!
keepalived 常用命令
service keepalived start
service keepalived stop

启动报错Starting keepalived (via systemctl):  Job for keepalived.service failed. See 'systemctl status keepalived.service' and 'journalctl -xn' for details.  
解决办法
[root@edu-proxy-01 sbin]# cd /usr/sbin/  
[root@edu-proxy-01 sbin]# rm -f keepalived   
[root@edu-proxy-01 sbin]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/  

  step4:115,110 机器上分别配置keepalived

115: 

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

# 心跳检测的脚本,去执行这个sh 文件 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 20 weight -20 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 121 mcast_src_ip 192.168.178.115 priority 100 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 }
# 心跳检测的脚本 track_script { chk_nginx } virtual_ipaddress { 192.168.178.116 } }

脚本sh 文件如下:

#!/bin/bash
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then /usr/local/nginx/sbin/nginx; sleep 5; if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived; fi; fi

意思就是查看有没有nginx线程,如果nginx 挂了,重启nginx 服务,睡眠5秒,如果重启失败,则关闭这个主的keepalived 服务。

当主的keepalived 服务挂了之后,根据vrrp 协议,虚拟vip 会切换到backup 机器(也就是192.168.178.110),这就是心跳检测,加上故障转移。但是我这边没有成功,脚本没有执行。问题还没找到。

 

110:操作也是一样,就是个别地方需要改一下:

 vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2 #检测时间间隔
    weight -20 #如果条件成立的话,则权重 -20
}

vrrp_instance VI_2 {
    state BACKUP #来决定主从
    interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
    virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.178.110 #填写本机ip
    priority 100 # 节点优先级,主要比从节点优先级高
    nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
    track_script {
        chk_nginx
    }
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.178.116 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
    }
}

 

脚本sh 文件如下:

#!/bin/bash
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then /usr/local/nginx/sbin/nginx; sleep 5; if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived; fi; fi

step5: 两台机器上分别设置nginx 负载均衡,反向代理

    upstream aiyuesheng {
      server 192.168.178.1:8080;
      server 192.168.178.1:8081;
     }
    
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass   http://aiyuesheng;
            index  index.html index.htm;
        }
         ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
          proxy_connect_timeout 1s;
         ###nginx发送给上游服务器(真实访问的服务器)超时时间
         proxy_send_timeout 1s;
          ### nginx接受上游服务器(真实访问的服务器)超时时间
         proxy_read_timeout 1s;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

 

    upstream aiyuesheng {
      server 192.168.178.1:8082;
      server 192.168.178.1:8083;
     }
    
    server {
        listen       80;
        server_name  localhost;
        location / {
            proxy_pass   http://aiyuesheng;
            index  index.html index.htm;
        }
         ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
          proxy_connect_timeout 1s;
         ###nginx发送给上游服务器(真实访问的服务器)超时时间
         proxy_send_timeout 1s;
          ### nginx接受上游服务器(真实访问的服务器)超时时间
         proxy_read_timeout 1s;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

 

step6:效果:115,110,分别启动nignx ,keepalived ,通过 ip a 命令可以看到115 机器上多了个ip 192.168.178.116

浏览器输入192.168.178.116(虚拟vip),转发到了nginx 集群上的192.168.178.115 机器上,nginx 服务又通过反向代理和负载均衡分发到192.168.178.1:8080,192.168.178.1:8081

当把192.168.178.115 的nginx 服务stop ,192.168.178.116(虚拟vip)因该到192.168.178.110 机器上,nginx 服务又通过反向代理和负载均衡分发到192.168.178.1:8082,192.168.178.1:8083

最后一步没有成功,原因还不清楚。

 

注意:写shell 脚本要在linux 上写,因为windows 上格式和linux 不一样,windows 换行\r\n linux 编译不出来

web 集群,也可以做备用服务,比如一直访问 192.168.178.1:8080,当192.168.178.1:8080 挂了之后才访问192.168.178.1:8081

upstream testproxy {
      server 192.168.178.1:8080;
      server 192.168.178.1:8081 backup;
  }

 

 所以,综上,当生产的项目出现宕机,对应的策略是:

 1,故障转移.....从master 转到 backup

 2,  心跳检测,keepalived每隔多长时间会执行脚本,查看nginx 服务是否还在

 3,自动重启,检查服务不在了,会执行/usr/local/nginx/sbin/nginx 的命令开启nginx

 

 

 

 

 

 

 

 

 

 

 

  

      


推荐阅读
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文详细介绍了在Linux虚拟化部署中进行VLAN配置的方法。首先要确认Linux系统内核是否已经支持VLAN功能,然后配置物理网卡、子网卡和虚拟VLAN网卡的关系。接着介绍了在Linux配置VLAN Trunk的步骤,包括将物理网卡添加到VLAN、检查添加的VLAN虚拟网卡信息以及重启网络服务等。最后,通过验证连通性来确认配置是否成功。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
author-avatar
青岛淘宝摄影
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有