七层负载均衡HAproxy生产环境LVS+Keepalived+HAproxy

Posted 今天不学习,明天变"咸鱼" >_x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七层负载均衡HAproxy生产环境LVS+Keepalived+HAproxy相关的知识,希望对你有一定的参考价值。

LB-Haproxy/nginx

💯 解析:七层负载均衡器,为与七层模型上的应用层,通过URL地址(应用层)进行负载均衡。

优点:详细地址,数据精准定位

缺点:地址长、范围广

一、HAproxy

原理解析

别名:七层负载均衡、应用程序负载、URL负载、动静分离技术 用80端口
简介: 免费、快速可靠、高性能的负载均衡软件
亲缘性:

  • 后方有三台Web服务器,用户进行数据请求,当用户访问Web1时(一些特定的敏感话题会进行认证)
  • 当我们的用户再次访问时,请求分发到我们的Web2上,又要进行认证。
  • 所有我们通过用户访问得特性让用户访问到固定的服务器(IP port seesion cookie…),解决了身份再次验证导致的用户体验感。

seesion(会话窗口 服务器): 用户进行身份认证,保存信息 ==> 用户访问淘宝,加购物车,第一次要进行身份认证,后面无需认证
cookie(缓存 浏览器): 保存用户身份认证信息,通常由浏览器存储,windows端

TCP连接(秒表)

  • User <==> Web

    • 当User向Web请求数据时,会有一个计时器,当在一定的时间没响应,直接返还给用户,数据未找到。

    • 当三次握手完成之后,向Web请求数据,服务器没反应,开启秒表,将数据进行重传递

  • User <=> HA <=> Web

    • 多了中间人(HAproxy)作为代理,用户访问HA,HA在分发给Web,HA的两边都是互相无感知的

    • 会出现问题,当User在请求数据后直接关机,请求到达HA,HA不将数据发送给Web,
      如果Web服务出现问题,HA将User的请求分发给其他的Web(这时,秒表计时器有很大的体现)。

1、环境准备

1、HAproxy:192.168.178.60
2、Web1:192.168.178.7
3、Web2:192.168.178.16

# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0

2、Web

1、安装httpd:
# yum -y install httpd
2、Web1 添加内容:
# echo "Web1" > /var/www/html/index.html
3、Web2 添加内容
# echo "Web2" > /var/www/html/index.html

3、HAproxy

3.1、安装软件

# yum -y install epel-release haproxy

3.2、编写配置文件

# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global				#全局配置
   log 127.0.0.1 local3 info	#日志配置
   maxconn 4096					#最大连接数
   uid   99						#用户
   gid   99						#用户组
   daemon						#进程守护
   nbproc   1					#HAproxy的进程数,该值与服务器的CPU核心数一致,比如2颗8核心的,这是设置值为16
   pidfile  /run/haproxy.pid	#进程ID存储位置
#----------------------------------------------------------------
defaults			#系统默认配置
   log   global		#日志使用上方的全局配置
   mode  http		#模式为7层LB
   maxconn  2048	#最大连接数
   retries  3		#健康检测,3次连接失败认为服务器不可用
   option   redispatch		# 服务器不可用,重定向到其他服务器,进行服务器之间的故障转移
   timeout connect 50000	# HAproxy 将 用户请求 转至 后端的超时时长
   timeout client 50000		# HAproxy作为客户端,与后端空闲的交互超时时长
   timeout server 50000		# HAproxy作为服务端,与用户之间空闲交互的超时时长

   option   abortonclose	# 当服务端负载较高时,自动结束当前队列比较久的链接
   stats uri /admin?stats	# 监控页面的URL IP:/admin?stats
   stats auth Private land	# 登入监控页面提示的内容
   stats auth admin:admin	# 登入页面使用的 用户与密码  用户:密码
   stats hide-version		# 隐藏监控页面的 HAproxy版本号,
#----------------------------------------------------------------
frontend httpd-in			# 前端配置,面向与用户			
      bind 0.0.0.0:80		# HAproxy 的监听端口,用户通过 IP+端口访问
      mode  http			# 模式为 七层的 http请求
      log   global			# 使用上方的全局Log
      option   httplog		# 日志格式变得更丰富,获取更详细的信息
      option   httpclose	# 每次请求后,关闭 http 通道

   acl html url_reg -i \\.html$		# (html自定义名,方便下方的调用) 如果用户访问以 .html 结尾的页面
   use_backend html-server if html	# 如果命中上方的 html 定义的策略,分发到 html-server 后端
   default_backend html-server		# 默认用户请求的 后端
#-----------------------------------------------------------------
backend html-server					# 定义 后端的服务器
      mode http						# 模式为 七层 http请求
      balance roundrobin			# 负载算法 为 轮询
      option httpchk GET /index.html			# 允许 HAproxy 进行 HTTP-GET Web服务的 /index.html,进行健康检查
      cookie SERVERID insert indirect nocache	# 增加亲缘性,Web服务返回给用户带有Cookie的数据,用户可以访问到相同的服务器
      server Web1 192.168.178.7:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
      server Web2 192.168.178.16:80 weight 1 cookie 4 check inter 2000 rise 1 fall 3
  #  server1 服务器ID 真实Web-IP端口 权重 cookie值 进行检测 检测5次,其中连续有2次成功,代表该Web服务器健康,反之Web服务器故障

3.3、启动HAproxy

1、启动服务:
# systemctl start haproxy
2、查看是否有报错信息:
# vim /var/log/messages
3、查看服务启动成功:
# ss -anpt | grep 80

3.4、进行测试

# curl 192.168.178.60
web2
# curl 192.168.178.60
web1

3.5、登入 Web 监控页面

二、实战一 动静分离技术+Keepalived

动静分离技术
简介:

  • 用户请求数据时,访问的是图片,到达后方的图片服务器
  • 访问的是视频,到达后方的视频服务器
  • 访问的文本服务器,到达文字服务器

1、环境准备

1、HAproxy1-keepalived1:192.168.178.60
2、HAproxy2-keepalived2:192.168.178.61
3、keepalived-VIP:192.168.178.200
2、Web1-html静:192.168.178.7
3、Web2-php动:192.168.178.16

# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0

2、Web

2.1、Web1-html静

# yum -y install httpd
# echo 'Web1-html' > /var/www/html/index.html
# systemctl --now enable httpd
# curl  localhost
Web1-html

2.2、Web2-php动

a、安装软件
# yum -y install epel-release && yum -y install php php-fpm nginx
b、配置nginx 连接PHP
# vim /etc/nginx/nginx.conf
#在Server 中进行添加
server 
.........
location / 
                html    index.php index.html index.htm;
        
         location ~ \\.php$        #连接PHP服务器
            root /usr/share/nginx/html;   #php存放文件的目录
            fastcgi_pass 127.0.0.1:9000;   #PHP服务器的地址:端口 !!!!!!
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
       
.........
	

因为Nginx 与 PHP 部署在一台机器上,不许要修改PHP 配置,直接启动
c、 启动服务
1、重启nginx 与 启动 php-fpm:
# systemctl restart nginx
# systemctl start php-fpm

2、查看服务是否启动成功:
# ss -anpt | egrep '(80|9000)'
d、编写index.php,访问
# echo '<?php phpinfo() ?>' > /usr/share/nginx/html/index.php


2、HAproxy

两台主机同时进行

2.1、安装软件

# yum -y install epel-release && yum -y install haproxy keepalived

2.2、编写haproxy配置

# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global
   log 127.0.0.1 local3 info
   maxconn 4096
   uid   99
   gid   99
   daemon
   nbproc   1
   pidfile  /run/haproxy.pid
#--------------------------------------

defaults
   log   global
   mode  http
   maxconn  2048
   retries  3
   option   redispatch
   timeout connect 50000
   timeout client 50000
   timeout server 50000

   option   abortonclose
   stats uri /admin?stats
   stats auth Private land
   stats auth admin:admin
   stats hide-version
#--------------------------------------

frontend httpd-in
      bind 0.0.0.0:80			# 监听端口
      mode  http
      log   global
      option   httplog
      option   httpclose

   acl php url_reg -i \\.php$		#匹配 .php 结尾
   acl html url_reg -i \\.html$		#匹配 .html 结尾

   use_backend php-server if php	#上方匹配成功后对应的后端
   use_backend html-server if html

   default_backend php-server
#--------------------------------------

backend php-server			#匹配 .php 对应的后端服务器,可以有多个,自定义
      mode http
      balance roundrobin
      option httpchk GET /index.php
      cookie SERVERID insert indirect nocache
      server Php1 192.168.178.16:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5

backend html-server			#匹配 .html 对应的后端服务器
      mode http
      balance roundrobin
      option httpchk GET /index.html
      cookie SERVERID insert indirect nocache
      server Web1 192.168.178.7:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5

2.3、启动服务

1、启动服务:
# systemctl start haproxy
2、查看日志:
# vim /var/log/messages 
3、查看服务启动:
# ss -anpt | grep 80

2.4、测试效果

1、访问 HAproxy1:
# curl 192.168.178.60/index.html
Web1-html

2、访问 HAproxy2:
# curl 192.168.178.61/index.html
Web1-html


3、Keepalived

3.1、Keepalived1

a、修改配置
# cd /etc/keepalived/
# cp -r keepalived.conf keepalived.conf.bak
# vim keepalived.conf
! Configuration File for keepalived
global_defs                           #全局配置
 router_id HA1                        #设备在组中的标识,设置不一样即可
 

vrrp_script chk_haproxy                 #健康检查
 script "/etc/keepalived/ck_HA.sh"     #检查脚本
 interval 6                            #检查频率.秒(每隔6秒去执行脚本)
 weight -5                             #priority减5
 fall 3                                #失败三次(尝试三次,每隔两秒去执行脚本,如果脚本失败,就记下来,等检查三次后,将优先级减5)
 

vrrp_instance VI_1                #VI_1(组号)。实例名两台路由器相同。
    state MASTER                        #主或者从状态
    interface ens33                     #监控网卡(心跳网卡)
    mcast_src_ip 192.168.178.60         #心跳源IP
    virtual_router_id 55                #虚拟路由编号(组编号),主备要一致。
    priority 100                        #优先级 (主要应用与1主多从)
    advert_int 1                        #心跳间隔S (对方主机运行状态的监控)/可以为毫秒级监控

    authentication                     #秘钥认证(1-8位)
        auth_type PASS                  #密码认证类型
        auth_pass 123456                #密码
    

    virtual_ipaddress                  #VIP
    192.168.178.200/24
        

  track_script                        #引用脚本,监控脚本
       chk_haproxy
    


b、编写监控脚本

🔺解析:因为是与HAproxy部署在同一台机器上,所以对HAproxy的高可用进行监控,HAproxy会对后方的Web服务进行监控。

# vim ck_hA.sh
#!/bin/bash
         #检查HAproxy进程是否存在
       counter=$(ps -C haproxy --no-heading|wc -l)
       if [ "$counter" = "0" ]; then
             systemctl restart haproxy
             sleep 5                  #尝试启动一次HAproxy,停止5秒后再次检测
          counter=$(ps -C haproxy --no-heading|wc -l)
          if [ "$counter" = "0" ]; then
                  systemctl stop keepalived    #如果启动没成功,就杀掉keepalive触发主备切换
          fi
       fi
       
# chmod +x ck_HA.sh
c、拷贝文件至 Keepalived2
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# scp -r ck_HA.sh 192.168.178.61:/etc/keepalived/

3.2、Keepalived2

1、修改配置:
# vim keepalived.conf
#找到进行修改
router_id  hA2
state  BACKUP
mcast_src_ip  192.168.178.61
priority  99

2、启动 keepalived:
#systemctl start keepalived

3.3、所有Keepalived启动

# systemctl --now enable  keepalived
# ip a

3.4、访问测试

# curl 192.168.178.200/index.html
Web1-html

3.5、故障模拟

解析:将HAproxy1的配置文件移除,致使HAproxy起不来,实现VIP的转移

1、移动 HAproxy1 的配置文件:
# mv  /etc/haproxy/haproxy.cfg  /opt/
# systemctl stop haproxy

2、查看 HAproxy2 上的IP,IP进行转移:
# ip a

3、再次访问服务,访问成功:
# curl 192.168.178.200/index.html
Web1-html
# curl -I 192.168.178.200/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 04:49:01 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/		# cookie ID
Cache-control: private

三、实战二 生产环境

解析:这也是企业中常用的一种架构,在生产环境中,haproxy与LVS等负载均衡设备往往不是单种存在的,主要是每一个设备都有自身的优点与缺点。把四层与七层组合起来使用,进行互补,既有四层的吞吐量,又有七层的精准定位与动静分离等,这是再好不过了。

1、环境准备

LVS-VIP:192.168.178.100
LVS1-keepalived:192.168.178.60
LVS2-keepalived:192.168.178.61

HAproxy1:192.168.178.62
HAproxy2:192.168.178.63

Web1:192.168.178.7
Web2:192.168.178.16

1、关闭防火墙:
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0

2、修改主机名:
# hostnamectl set-hostname lvs1/lvs2/ha1/ha2/web1/web2

3、时间同步:
# yum -y install ntpdate
# ntpdate ntp1.aliyun.com

4、计划任务,时间同步
# systemctl --now enable crond
# crontab -e
*/5 * * * *  /usr/sbin/ntpdate  ntp1.aliyun.com

2、Web 配置

2.1、Web1-html静

# yum -y install httpd
# echo 'Web1-html' > /var/www/html/index.html
# systemctl --now enable httpd
# curl  localhost
Web1-html

2.2、Web2-php动

a、安装软件
# yum -y install epel-release && yum -y install php php-fpm nginx
b、配置nginx 连接PHP
# vim /etc/nginx/nginx.conf
#在Server 中进行添加
server 
.........
location / 
                html    index.php index.html index.htm;
        
         location ~ \\.php$        #连接PHP服务器
            root /usr/share/nginx/html;   #php存放文件的目录
            fastcgi_pass 127.0.0.1:9000;   #PHP服务器的地址:端口 !!!!!!
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
       
.........
	

因为Nginx 与 PHP 部署在一台机器上,不许要修改PHP 配置,直接启动
c、 启动服务
1、重启nginx 与 启动 php-fpm:
# systemctl restart nginx
# systemctl start php-fpm

2、查看服务是否启动成功:
# ss -anpt | egrep '(80|9000)'
d、编写index.php,访问
# echo '<?php phpinfo() ?>' > /usr/share/nginx/html/index.php

3、HAproxy 配置

两台主机同时进行

3.1、安装软件

# yum -y install epel-release && yum -y install haproxy keepalived

3.2、编写haproxy配置

# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global
   log 127.0.0.1 local3 info
   maxconn 4096
   uid   99
   gid   99
   daemon
   nbproc   1
   pidfile  /run/haproxy.pid
#--------------------------------------

defaults
   log   global
   mode  http
   maxconn  2048
   retries  3
   option   redispatch
   timeout connect 50000
   timeout client 50000
   timeout server 50000

   option   abortonclose
   stats uri /admin?stats
   stats auth Private land
   stats auth admin:admin
   stats hide-version
#--------------------------------------

frontend httpd-in
      bind 0.0.0.0:80			# 监听端口
      mode  http
      log   global
      option   httplog
      option   httpclose

   acl php url_reg -i \\.php$		#匹配 .php 结尾
   acl html url_reg -i \\.html$		#匹配 .html 结尾

   use_backend php-server if php	#上方匹配成功后对应的后端
   use_backend html-server if html

   default_backend php-server
#--------------------------------------

backend php-server			#匹配 .php 对应的后端服务器,可以有多个,自定义
      mode http
      balance roundrobin
      option httpchk GET /index.php
      cookie SERVERID insert indirect nocache
      server Php1 192.168.178.16:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5

backend html-server			#匹配 .html 对应的后端服务器
      mode http
      balance roundrobin
      option httpchk GET /index.html
      cookie SERVERID insert indirect nocache
      server Web1 192.168.178.7:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5

3.3、启动服务

1、启动服务:
# systemctl --now enable haproxy
2、查看日志:
# vim /var/log/messages 
3、查看服务启动:
# ss -anpt | grep 80

3.4、测试效果

1、访问 HAproxy1:
# curl 192.168.178.62/index.html
Web1-html

2、访问 HAproxy2:
# curl 192.168.178.63/index.html
Web1-html

4、LVS 配置

4.1、安装软件

LVS1:
# yum -y install ipvsadm keepalived
LVS2:
# yum -y install keepalived

4.2、LVS1配置

a、修改配置文件
# cd /etc/keepalived/
# cp -r keepalived.conf keepalived.conf.bak
# vim keepalived.conf
! Configuration File for keepalived
global_defs 
        router_id LVS1    #名称,自定义
        

vrrp_instance VI_1                             
        state MASTER                            #另外一台机器是BACKUP
        interface ens33                         #心跳网卡
        virtual_router_id 51                    #虚拟路由编号,主备要一致
        priority 150                            #优先级
        advert_int 1                            #检查间隔,单位秒
        authentication 
                auth_type PASS
                auth_pass 1111
                
        virtual_ipaddress 
                192.168.178.100/24 dev ens33    #VIP和工作接口
                
        

virtual_server 192.168.178.100 80               #LVS 配置,VIP
        delay_loop 3                            #服务论询的时间间隔,#每隔3秒检查一次real_server状态
        lb_algo rr                              #LVS 调度算法
        lb_kind DR                              #LVS 集群模式
        protocol TCP
        real_server 192.168.178.62 80           #HAproxy1服务器
                weight 1
                TCP_CHECK 
                        connect_timeout 3       #健康检查方式,连接超时时间 (每隔三秒去连接Web,如果超时,就认为Web服务down机)
                        
                
        real_server 192.168.178.63 80        	#HAproxy2服务器
                weight 1
                TCP_CHECK 
                        connect_timeout 3
                        
                

b、启动服务,重启
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# systemctl --now enable keepalived
# reboot

4.3、LVS2配置

a、修改配置
# vim /etc/keepalived/keepalived.conf
#找到进行修改
router_id  LVS2
state  BACKUP
priority  145
b、自启动服务与重启
# systemctl --now enable keepalived
# reboot

5、再次配置HAproxy lo:0虚拟接口

两台机器同时操作

5.1、配置虚拟IP -> lo:0

# cd /etc/sysconfig/network-scripts/
# cp -r ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0
DEVICE=lo:0			#接口名
IPADDR=192.168.178.100		#LVS的虚拟IP
NETMASK=255.255.255.255		#地址唯一性
ONBOOT=yes		#自启
#其他的注释

5.2、配置路由

# vim /etc/rc.local
#添加
# 开机生效   确保如果请求的目标IP是$VIP,那么让出去的数据包的源地址也显示为$VIP
/sbin/route add -host 192.168.178.100 dev lo:0

5.3、配置ARP

1、忽略arp请求,可以回复
# vim /etc/sysctl.conf  
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

5.4、重启生效

# reboot

6、故障测试

6.1、访问服务

# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:00:33 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private

6.2、停止LVS1的keepalived,再次访问服务

# systemctl stop keepalived
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:02:57 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private

6.3、停止 HAproxy1服务,再次访问服务

# systemctl stop haproxy
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:04:46 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private

以上是关于七层负载均衡HAproxy生产环境LVS+Keepalived+HAproxy的主要内容,如果未能解决你的问题,请参考以下文章

六十负载均衡集群介绍LVS介绍LVS的调度算法LVS NAT模式搭建

负载均衡集群LVS算法搭建NAT模式LVS架构

负载均衡(集群介绍,lvs介绍,LVS调度算法,NAT模式搭建)

HAproxy七层负载均衡四层/七层负载均衡

LVS Nginx HAProxy 三种负载均衡优缺点比较

负载均衡集群介绍LVS介绍及调度算法LVS NAT模式搭建