haproxy-负载均衡,访问控制,动静分离,读写分离以及常用负载均衡软件对比

news/2024/7/10 3:22:44 标签: 负载均衡, 网络, 运维
https://www.scalescale.com/nginx-haproxy-varnish-comparison/#
四层转发tcp(lvs) 七层代理http(haproxy)
稳定性的适合用lvs  网站负载适合用haproxy nginx

haproxy类似nginx、apache 均是7层负载:动静分离,比较智能,可以实现高可用+负载均衡+支持虚拟主机
和nginx很像,但是haproxy(不可以缓存)和nginx(可以缓存),二者都是httpd的代理

haproxy

HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。支持虚拟主机。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。

包括 GitHub、Bitbucket[3]、Stack Overflow[4]、Reddit、Tumblr、Twitter[5][6]和
Tuenti[7]在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。 [1]

事件驱动 (计算机领域的事件驱动)

事件驱动是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。在计算机编程、公共关系、经济活动等领域均有应用。

haproxy的功能

HAProxy是TCP / HTTP反向代理服务器,尤其适合于高可用性环境
可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息

配置HAProxy Session亲缘性的三种方式
haproxy负载均衡保持客户端和服务器Session亲缘性的三种方式:

1 用户IP 识别

haproxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令) 配置指令 balance source

2.cookie 识别

haproxy 将WEB服务端发送给客户端的cookie中插入(或添加前缀)haproxy定义的后端的服务器COOKIE ID。
配置指令例举 cookie SESSION_COOKIE insert indirect nocache
用firebug可以观察到用户的请求头的cookie里 有类似" Cookie jsessionid=0bc588656ca05ecf7588c65f9be214f5; SESSION_COOKIE=app1"
SESSION_COOKIE=app1就是haproxy添加的内容
3 session 识别
haproxy 将后端服务器产生的session和后端服务器标识存在haproxy中的一张表里。客户端请求时先查询这张表。
配置指令例举 appsession JSESSIONID len 64 timeout 5h request-learn

haproxy相关的概念

(1)有关代理的概念
正向代理:
在这里插入图片描述
正向代理通过上面的图理解其实就是用户想从服务器拿资源数据,但是只能通过proxy服务器才能拿到
所以用户A只能去访问proxy服务器然后通过proxy服务器去服务器B拿数据
这种情况用户是明确知道你要访问的是谁,在我们生活中最典型的案例就是“翻墙“了,也是通过访问代理服务器最后访问外网的

反向代理:
在这里插入图片描述
反向代理其实就是客户端去访问服务器时,他并不知道会访问哪一台,感觉就是客户端访问了Proxy一样
而实则就是当proxy关口拿到用户请求的时候会转发到代理服务器中的随机(算法)某一台
而在用户看来,他只是访问了Proxy服务器而已,典型的例子就是负载均衡

实验环境

准备三台新的虚拟机
在这里插入图片描述

三台7版本的虚拟机+一台7版本的物理机
主机名 	IP 	服务
虚拟机server1 	172.25.63.1 	haproxy,httpd,代理服务器
虚拟机server2 	172.25.63.2 	httpd,php,后端服务器
虚拟机server3 	172.25.63.3 	httpd,php,后端服务器
物理机 	172.25.63.250 	测试端

搭建一个基本的haproxy服务器

三台虚拟机:
虚拟机1调度器:
yum install haproxy -y (建议用rpm包装)
cd /etc/haproxy/
vim haproxy.cfg

在这里插入图片描述
查看该服务的版本
在这里插入图片描述
查看安装后生成了什么文件
在这里插入图片描述
在这里插入图片描述

global
log         127.0.0.1 local2 #全局的日志配置,使用log关键字
chroot      /var/lib/haproxy #改变当前工作目录
#修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限

pidfile     /var/run/haproxy.pid #当前进程id文件
maxconn     4000   #设定每个haproxy进程所接受的最大并发连接数
user        haproxy
group       haproxy
daemon  #让haproxy以守护进程的方式工作于后台

defaults
    mode                    http  #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
    log                     global    #应用全局的日志配置
    option                  httplog  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
    option                  dontlognull    # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器  或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
    option http-server-close #每次请求完毕后主动关闭http通道
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;
而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请
求强制定向到另外一个后端server上,以保证服务的正常。

    retries                 3  # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端
                                                                  服务器标记为不可用
    timeout http-request    10s  #http请求超时时间
    timeout queue           1m    #一个请求在队列里的超时时间
    timeout connect         10s   #连接超时
    timeout client          1m     #客户端超时
    timeout server          1m     #服务器端超时
    timeout http-keep-alive 10s     #设置http-keep-alive的超时时间
    timeout check           10s     #检测超时
    maxconn                 3000     #每个进程可用的最大连接数

监控页面添加认证:
#listen:可以理解为frontend和backend的组合体
listen admin *:8080
       stats enable
       stats uri /status  # 监控页面地址
       stats auth admin:westos  # 管理帐号和密码
       stats refresh 5s  #刷新频率


listen  westos *:80      #监听的实例名称,地址和端口 
        balance roundrobin   #负载均衡算法
        server web1 172.25.42.13:80 check
        server web2 172.25.42.14:80 check

安装改服务为之后会建立这个用户

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
设置加密访问,并且监控页面5s刷新一次

监控页面添加认证:
#listen:可以理解为frontend和backend的组合体
listen admin *:8080
       stats enable
       stats uri /status  # 监控页面地址
       stats auth admin:westos  # 管理帐号和密码
       stats refresh 5s  #刷新频率


listen  westos *:80      #监听的实例名称,地址和端口 
        balance roundrobin   #负载均衡算法
        server web1 172.25.42.13:80 check
        server web2 172.25.42.14:80 check

在这里插入图片描述

两台real server
/etc/init.d/httpd start

在这里插入图片描述编辑测试页面,并开启http
在这里插入图片描述
在这里插入图片描述
编辑测试页面,并开启http

![在这里插入图片描述](https://img-blog.csdnimg.cn/20191101174206229.png在这里插入图片描述在这里插入图片描述

监控页面添加认证:
#listen:可以理解为frontend和backend的组合体
listen admin *:8080
       stats enable
       stats uri /status  # 监控页面地址
       stats auth admin:westos  # 管理帐号和密码
       stats refresh 5s  #刷新频率

在这里插入图片描述
在这里插入图片描述在这里插入图片描述关掉server3的htppd服务
在这里插入图片描述
刷新页面
在这里插入图片描述在这里插入图片描述
后端服务器恢复正常
在这里插入图片描述
监控页面又显示正常
在这里插入图片描述
在这里插入图片描述

日志监控:

$ModLoad imudp     #接受 haproxy 日志
$UDPServerRun 514

vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none;local2.none     /var/log/messages
local2.*                       /var/log/haproxy.log   #日志文件位置

自带健康检查:(测试)

给haproxy服务器添加日志

查看日志格式
在这里插入图片描述在这里插入图片描述编辑日志服务的配置文件,打开UDP接口,创建haproxy的日志文件,重启服务
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
查看日志
在这里插入图片描述可以使用多curl 172.25.63.1访问几次,就可以在日志中看到访问的是后端的服务器日志
在这里插入图片描述

动态静态访问分离:(可以自己加虚拟主机)

server1安装apache
在这里插入图片描述
修改HTTP的的端口,因为haproxy已经使用了80端口
在这里插入图片描述在这里插入图片描述
编辑重定向页面
在这里插入图片描述在这里插入图片描述开启服务
在这里插入图片描述

#frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
frontend  westos *:80
    acl url_static       path_beg       -i  /images
    acl url_static       path_end       -i .jpg .gif .png

    use_backend static          if url_static
    default_backend  app (默认访问app)
#backend:定义后端服务器集群
backend static (静态) 
        #balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        #balance roundrobin
        server web1 172.25.42.13:80 check
	server local 172.25.42.12:8000 backup (如果后端real server down掉 则调度报错页面 但是正常情况下不会访问 因为 是“backup”)

在这里插入图片描述在这里插入图片描述在这里插入图片描述
默认到server2,app
在这里插入图片描述
8000端口访问server1
在这里插入图片描述
url_static 默认根目录
在这里插入图片描述

错误重定向:

frontend  westos *:80
    acl url_static       path_beg       -i  /images  (以什么开头 默认根目录)
    acl url_static       path_end       -i .jpg .gif .png (以什么结尾)

    acl badhost  src  172.25.42.250  (设定谁不能访问我)
    block if badhost
    errorloc 403 http://172.25.42.12:8000 (注意端口不要冲突)
    (403:服务器拒绝你的访问 服务器设定你是坏的 )(如果是403错误就重定向到 172.25.254.12:8000)

     use_backend static          if url_static
     default_backend  app

backend static
        balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        balance roundrobin
        server web1 172.25.42.13:80 check

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

frontend  westos *:80
    acl url_static       path_beg       -i  /images  (以什么开头 默认根目录)
    acl url_static       path_end       -i .jpg .gif .png (以什么结尾)

    acl badhost  src  172.25.42.250  (设定谁不能访问我)
    redirect location http://172.25.42.12:8000 if badhost (如果出现错误访问 就重定向 不管是什么错误)

     use_backend static          if url_static
     default_backend  app


backend static
        balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        balance roundrobin
        server web1 172.25.42.13:80 check

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
301永久重定向:(一般推荐用301 302临时重定向 有恶意刷点击的嫌疑)

    acl westos.org hdr_beg(host) -i westos.org  
    acl 172.25.42.12 hdr_beg(host) -i 172.25.42.12
#    block if badhost
#    errorloc 403 http://172.25.42.12:8000 

#    redirect location http://172.25.42.12:8000 if badhost
     redirect code 301 location http://www.westos.org if westos.org
     (以westos.org访问 自动重定向 www.westos.org)
     redirect code 301 location http://www.westos.org if 172.25.42.12
     (以172.25.42.12访问 自动重定向 www.westos.org)
     use_backend static          if url_static
     default_backend  app

在这里插入图片描述在这里插入图片描述
物理机添加本地解析
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
回车,此处503报错为服务器出错,与我们无关
在这里插入图片描述在这里插入图片描述
回车
在这里插入图片描述
连上网就可以
在这里插入图片描述

"""
301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(emporarily Moved )
  ps:这里也顺带记住了两个比较相近的英语单词(permanently、temporarily),嘻哈!

详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

读写分离:

利用haproxy实现客户端访问的读写分离

real server(两台!!!!!!!!): yum install php -y
php页面:
chmod 777 upload (默认上传目录一定要给权限)
 
调度机器:
    acl read method GET      
    acl read method HEAD     //两个read write 只用一个就行
    acl write method PUT
    acl write method POST

     use_backend app          if write  
     default_backend  static (默认静态页面 为了测试 刚开始 www.westos.org 时是172.25.42.14 而写(上传时 却是在172.25.254.13 上进行的) 做到了读写分离)

backend static
        balance roundrobin
        server web2 172.25.42.14:80 check

backend app
        balance roundrobin
        server web1 172.25.42.13:80 check (默认会上传到这个real server)
        server local 172.25.42.12:8000 backup
  
注意: /etc/init.d/haporxy reload   real server:/etc/init.d/httpd restart
http://172.25.0.1/index.php

在这里插入图片描述在这里插入图片描述在这里插入图片描述
php页面:
chmod 777 upload (默认上传目录一定要给权限)
在这里插入图片描述在这里插入图片描述
普通用户从网页上传照片会自动(也就是写操作)上传到upload目录下,因此该目录一定要给权限哦
在这里插入图片描述在这里插入图片描述
为了便于区分:我们可以在index.html页面添加服务器的名称Filename(server2) 我这里忘了做了,可以添加上在网页进行区分
在这里插入图片描述
在这里插入图片描述
server3一样
在这里插入图片描述在这里插入图片描述
同理:vim index.php 填写Filename:(server3)
在这里插入图片描述在这里插入图片描述
server1重启服务
在这里插入图片描述
网页进行写操作(上传照片)
如果上部在index.html写了Filaname名称,此时页面应该显示Filename(server3):Browse… 因为默认在server3上

在这里插入图片描述在这里插入图片描述
表示上传成功
在这里插入图片描述
注意如果出现invalid file说明图片格式不对
上传到server2的upload目录下
在这里插入图片描述
而server3的目录下并没有
在这里插入图片描述
如果后台两个服务器都宕机
在这里插入图片描述
在这里插入图片描述
haproxy服务器就会安全检测的信息
在这里插入图片描述

nginx:
编译源码:
tar zxf nginx-1.10.3.tar.gz
cd nginx-1.10.3
cd auto
cd cc
vim gcc (debug注释掉)
yum install pcre-devel -y
yum install openssl-devel -y
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
#--with-http_ssl_module 使支持https请求,需已安装openssl
#--with-http_stub_status_module stub_status模块主要用于查看Nginx的一些状态信息
make && make install
useradd -u 900 -s /sbin/nologin nginx
cd /usr/local/nginx
cd conf
vim nginx.conf
ln -s /usr/local/nginx/sbin/nginx  /usr/local/bin/
nginx -t (检查有无语法错误)

cd /usr/local/nginx/conf
vim vim nginx.conf

user  nginx nginx;
worker_processes  auto; (不能超过cpu的最大数)
worker_cpu_affinity 01 10 (cpu的进程绑定 避免来会切换带来的上下文改变而消耗资源)

events {
       use epoll;
      worker_connections  4096;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

          upstream westos {
          server 172.25.42.13:80;
          server 172.25.42.14:80;

}
server {
              listen 80;
              server_name www.westos.org;
              location /  {
                      proxy_pass http://westos;
              }

       }

nginx -s reload
lscpu:
测试:







nginx虚拟主机配置
基于域名的虚拟主机
就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站使用的都是基于域名的虚拟主机
    server {
        listen       80;
        server_name  www.westos.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
}


    server {
        listen       80;
        server_name  bbs.westos.org;
        location / {
            root   html/bbs;
            index  index.html index.htm;
         }
}


    server {
        listen       80;
        server_name  blog.westos.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
}


虚拟主机的别名配置
    server {
        listen       80;
        server_name  www.westos.org westos.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
}


查看nginx状态信息
with-http_stub_status_module 这个模块的主要功能是记录nginx的基本访问状态信息,让使用者了解nginx的工作装陶,例如连接数等信息

检查编译安装nginx时是否设定了上述模块:
../sbin/nginx -V
nginx version: nginx/1.10.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module

mkdir /usr/local/nginx/conf/extra
cd /usr/local/nginx/conf/extra
vim status.conf
server{
     listen 80;
     server_name status.westos.org;
     location / {
       stub_status on;
       access_log  off;
    }
 }
cd /usr/local/nginx/conf
vim nginx.conf
    include extra/status.conf;
 38     
 39     #gzip  on;
 40     
 41     server {
 42         listen       80;
 43         server_name  www.westos.org westos.org;
 44         location / {
 45             root   html/www;
 46             index  index.html index.htm;
 47         }
物理:vim /etc/hosts
添加域名:status.westos.org

location语法
这个URL可以是普通的字符串地址路径,或者是正则表达,匹配成功则执行后面大括号里的相关指令
正则表达式的前面还可以有‘~’或‘~*’等特殊的字符

    server {
        listen       80;
        server_name  www.westos.org westos.org;
        root   html/www;
        location / { #所有location都不能匹配后的默认匹配
            return 401;
        }
        location = / {  #精确匹配/
            return 402;
        }
        location /documents/ { #匹配常规字符串,如果有正则,则优先匹配正则
      #匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

            return 403;
        }
        location ^~ /images/ { #匹配常规字符串,不做正则匹配检查
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
            return 404;
        }
        location ~* \.(gif|jpg|jpeg)$ { #正则匹配
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
            return 500;
        }
}

location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ] 
}

location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ] 
}

location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ] 
}

location ~ /documents/Abc {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ] 
}

location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ] 
}

location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ] 
}


 server {
        listen       80;
        server_name  www.westos.org westos.org;
        root   html/www;

location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
     return 401;
     }
location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有
请求
  #    但是正则和最长字符串会优先匹配
      return 402;
       }
location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还
要继续往下搜索
  #   # 只有后面的正则表达式没有匹配到时,这一条才会采>用这一条
       return 403;
       }

location ~ /documents/Abc {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还
要继续往下搜索
  #   # 只有后面的正则表达式没有匹配到时,这一条才会采>用这一条
       return 503;
       }
location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止>往下搜索正则,采用这一条。
      return 404;
     }
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  #   # 然而,所有请求 /images/ 下的图片会被 config D >处理,因为 ^~ 到达不了这一条正则
  return 405;
    }

}
}

[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images/abc/def
000
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images
402
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images/
404
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images/abc
407
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/documents/Abc.jpg
503
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/documents/images
403
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images
402
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images/abc
407
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images/l/jpg
404
[root@foundation0 Desktop]# curl -s -o /dev/null -I -w "%{http_code}\n" http://www.westos.org/images/l.jpg

四层和七层负载均衡的特点及常用负载均衡Nginx、Haproxy、LVS对比

一、四层与七层负载均衡在原理上的区别

四层负载均衡与七层负载均衡在工作原理上的简单区别如下图:
在这里插入图片描述

概述:
1.四层负载均衡工作在OSI模型中的四层,即传输层。四层负载均衡只能根据报文中目标地址和源地址对请求进行转发,而无法修改或判断所请求资源的具体类型,然后经过负载均衡内部的调度算法转发至要处理请求的服务器。四层负载均衡单纯的提供了终端到终端的可靠连接,并将请求转发至后端,连接至始至终都是同一个。LVS就是很典型的四层负载均衡

2.七层负载均衡工作在OSI模型的第七层应用层,所以七层负载均衡可以基于请求的应用层信息进行负载均衡,例如根据请求的资源类型分配到后端服务器,而不再是根据IP和端口选择。七层负载均衡的功能更丰富更灵活,也能使整个网络更智能。如上图所示,在七层负载均衡两端(面向用户端和服务器端)的连接都是独立的。

3.简言之,四层负载均衡就是基于IP+端口实现的。七层负载均衡就是通过应用层资源实现的。

二、常用负载均衡软件对比

LVS的特点:

1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
2、工作在网络4层,通过vrrp协议转发( vrrp就是虚拟路由冗余协议)(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
2、稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
3、应用范围比较广,工作在四层,所以不用考虑要处理的具体应用,可以对所有应用做负载均衡;
4、不支持正则处理,不能做动静分离。
5、支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
6、配置 复杂,对网络依赖比较大,稳定性很高。

LVS缺点:
(1)软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
(2)如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了

Ngnix的特点:

1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
2、Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
5、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
6、Nginx对请求的异步处理可以帮助节点服务器减轻负载;
7、Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
8、不支持Session的直接保持,但能通过ip_hash来解决。
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
10、Nginx还能做Web服务器即Cache功能。

nginx的缺点:
(1)适应范围较小,仅能支持http、https、Email协议。
(2)对后端服务器的健康检查,只支持通过端口检测,不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。

HAProxy的特点:

1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。  /images
4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
9、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
10、不能做Web服务器即Cache

HAPorxy缺点:

(1)不支持POP/SMTP协议
(2) 不支持SPDY协议
(3) 不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。
(4)重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。
(5)多进程模式支持不够好

https://www.cnblogs.com/skyflask/p/6970151.html
在这里插入图片描述
在这里插入图片描述
总结:

大型网站架构:对性能有严格要求的时候可以使用lvs或者硬件F5,单从负载均衡的角度来说,lvs也许会成为主流,更适合现在大型的互联网公司;
中型网站架构:对于页面分离请求由明确规定,并且性能有严格要求时,可以使用haproxy
中小型网站架构:比如日访问量小于1000万,需要进行高并发的网站或者对网络不太严格的时候,可以使用nginx

https://blog.csdn.net/yaya_12345678/article/details/88790235

https://www.sohu.com/a/233936157_262549 LVS、Nginx 及 HAProxy 工作原理


http://www.niftyadmin.cn/n/779173.html

相关文章

子网掩码那些事

子网掩码工作过程是:将32位的子网掩码与IP地址进行二进制形式的按位逻辑“与”运算得到的便是网络地址,将子网掩码二进制按位取反,然后IP地址进行二进制的逻辑“与”(AND)运算,得到的就是主机地址。如&…

理解Inode

原文链接:http://www.ruanyifeng.com/blog/2011/12/inode.html inode的深入理解 一、inode是什么? 理解inode,要从文件储存说起。 文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储…

k8s-普罗米修斯-grafana

1.https://github.com/prometheus-operator/kube-prometheus 查看版本是19 在上面的网站下面找对应的kube-prometheus版本 get clone 代码 修改配置文件 查看nodeport方式 NodePort 模仿该文件修改。type和nodePort 修改服务 生效 稍等一下就好了 浏览器访问iP&a…

prometheus operator之在monitoring/kube-schedule下创建service

这个文件是用来收集kubelet的metric的数据的 意思就是会匹配kube-system命名空间下的k8s-appkubelet的servers,会把这些server纳入到prometheus的监控里面去 数据接口 1.10版本会把kubelet数据接口的metrics数据放到10255上,但是这里是10250,所以需要改…

prometheus自定义监控项(no)

Prometheus Operator默认的监控指标并不能完全满足实际的监控需求,这时候就需要我们自己根据业务添加自定义监控。添加一个自定义监控的步骤如下: 1、创建一个ServiceMonitor对象,用于Prometheus添加监控项 2、为ServiceMonitor对象关联metri…

k8s学习内容

go语言是解释性语言 在语言级别支持进程管理,不需要人为控制。所以由他开发的k8s对系统占用的资源是非常小的。 轻量级指的就是其消耗的资源少。 弹性伸缩:可以增加节点和删除节点 资源管理器 知识图谱 Borg系统 导演–演员 资源清单就是剧本----…

k8s组件说明

Borg系统架构 k8s架构 scheduler会把任务交给api server. api server再负责吧请求写入到etcd。 rc:控制器—维护副本的数目或者是期望值的。举例子想要这个容器运行几个副本 就是由这个控制的。一旦数目不对,rc会创建或删除对应的pod达到期望值。 a…

Pod介绍+网络通讯方式

试想两个容器 一个apache 一个php。在移植的时候很麻烦 因为在容器里面还需要映射。因此产生了pod。 Pod类型: 1.自主式Pod2.控制器管理的Pod1.自主式Pod 只要启动一个pod就会启动一个pause容器。再再次pod中启动两个容器。他们会共用pause的网络栈。存储卷 。 容…