LB-Haproxy/Nginx

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

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

缺点:地址长、范围广

一、HAproxy

keepalived virtual_ipaddress 能不能和本机ip一致_云计算

原理解析

别名:七层负载均衡、应用程序负载、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 virtual_ipaddress 能不能和本机ip一致_负载均衡_02

keepalived virtual_ipaddress 能不能和本机ip一致_负载均衡_03

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

keepalived virtual_ipaddress 能不能和本机ip一致_云计算_04

动静分离技术
简介:

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

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

keepalived virtual_ipaddress 能不能和本机ip一致_haproxy_05


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

keepalived virtual_ipaddress 能不能和本机ip一致_负载均衡_06


keepalived virtual_ipaddress 能不能和本机ip一致_负载均衡_07

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

keepalived virtual_ipaddress 能不能和本机ip一致_haproxy_08

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

三、实战二 生产环境

keepalived virtual_ipaddress 能不能和本机ip一致_运维_09

解析:这也是企业中常用的一种架构,在生产环境中,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

keepalived virtual_ipaddress 能不能和本机ip一致_负载均衡_10

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

keepalived virtual_ipaddress 能不能和本机ip一致_运维_11

keepalived virtual_ipaddress 能不能和本机ip一致_haproxy_12

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