Nginx | LVS | HAproxy实现负载均衡

Nginx | LVS | HAproxy实现负载均衡,第1张

Nginx | LVS | HAproxy实现负载均衡 负载均衡 介绍 简介
  • 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台ECS的流量分发控制服务。

  • 负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。

  • 负载均衡的主要功能点:

    • 负载均衡服务通过设置虚拟服务地址(IP),将位于同一地域(Region)的多台云服务器(Elastic Compute Service,简称ECS)资源虚拟成一个高性能、高可用的应用服务池;根据应用指定的方式,将来自客户端的网络请求分发到云服务器池中。
    • 负载均衡服务会检查云服务器池中ECS的健康状态,自动隔离异常状态的ECS,从而解决了单台ECS的单点问题,同时提高了应用的整体服务能力。在标准的负载均衡功能之外,负载均衡服务还具备TCP与HTTP抗DDoS攻击的特性,增强了应用服务器的防护能力。
    • 负载均衡服务是ECS面向多机方案的一个配套服务,需要同ECS结合使用
  • 作用:

    • 服务器容灾, 流量分发
    • 隐藏后端真实服务器,提高安全性
    • 七层负载均衡可以屏蔽非法请求
  • 实现方式

    • 硬件实现:性能高,价格高,几万到几十万不等
    • 软件级别:性价比高,可控性强
分类

二层负载均衡(mac)

  • 根据OSI模型的二层进行负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后,再分配后端实际的MAC地址响应

三层负载均衡(ip)

  • 一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后,再分配后端实际的IP地址响应

四层负载均衡(tcp)

  • 网络运输层面的负载均衡:在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器
  • 软件实现:LVS、HAProxy、Nginx(1.9及以上版本)

七层负载均衡(http)

  • 智能型负载均衡:主机接收请求,再转向(反向代理)相应的处理服务器
  • 实现方式:Nginx、HAProxy

四层&七层对比

四层七层基于基于IP+Port基于虚拟的URL或主机IP类似于路由器代理服务器握手次数1次2次复杂度低高性能高:无需解析内容中:需要算法识别URL ,cookie和HTTP head等安全性低:无法识别DDos攻击高:可以防御SYN cookie和SYN flood等额外功能五会话保持,图片压缩,防盗链等 Nginx负载均衡 负载均衡算法
  • Round-Robin(轮询):RR ,默认算法,每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响
  • weight(轮询权值):weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或 者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源
  • ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器, 并且可以有效解决动态网页存在的session共享问题
  • fair:比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。 Nginx本身不支持fair,如果需要这 种调度算法,则必须安装upstream_fair模块
  • url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装 Nginx的hash软件包
配置
  • 通过server02克隆server04
主机名ip地址虚拟机web1.master192.168.139.128server01web2.backup192.168.139.129server02mysql192.168.139.130server03lb192.168.139.131server04
  • 基础环境配置
[root@lb ~]# sed -i 's/web2.backup/lb/' /etc/sysconfig/network
[root@lb ~]# cd /etc/udev/rules.d/
[root@lb ~]# rm -rf 70-persistent-net.rules
[root@lb ~]# reboot

cat >> /etc/hosts < 
  • 域名解析到负载均衡服务器上
  • 负载均衡配置
配置
[root@lb html]# vim /usr/local/nginx/conf/nginx.conf

#http段
upstream shop {
        server 192.168.139.128;
        server 192.168.139.129;
        }   
#upstream中server的关键字
	backup:其他的没有backup标识的服务器都无响应,才分发到backup
	down:不会被分发到
		#示例:server 192.168.139.127 backup;
	weight:weight的值越大分配到的访问概率越高
		#server 192.168.139.128 weight=5;
		#server 192.168.139.129 weight=3;
		#8次中,128分发5次,129分发3次
#upstream中配置项
	ip_hash;
	#每个请求按访问IP的哈希结果分配


#server段
server {
        listen 80;
        server_name www.server01.com;
        location / {
            proxy_pass http://shop;	代理转发到shop段,匹配到上面的upstream
            proxy_set_header Host $host;传输域名给后端服务器,方便匹配对应server虚拟主机
            }
    }
[root@lb html]# service nginx restart

查看(在web1和web2节点上配置)
[root@web1 ~]# vim /usr/local/nginx/html/tp5shop/application/home/controller/base.php
 26         echo gethostname();在页面上方显示主机名(仅调试用)

负载均衡后获取客户端ip
  • 基于ngx_http_realip_module模块,默认此模块没有安装,需要编译时添加编译参数
  • 官网:http://nginx.org/en/docs/http/ngx_http_realip_module.html
模块编译安装(略)
[root@lb html]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.20.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --add-module=/root/soft/ngx-fancyindex-0.4.3/ --add-module=/root/soft/echo-nginx-module-0.61/

负载均衡服务器上配置ip转发(-->web服务器)
[root@lb html]# vim /usr/local/nginx/conf/nginx.conf
server {
        listen 80;
        server_name www.server01.com;
        location / {
            proxy_pass http://shop;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;发送客户端IP,给后端服务器,用来方便后端服务器识别用户真实IP
            }
    }
[root@lb ~]# service nginx reload
    
web服务器配置ip来源
[root@web1/2 ~]# vim /usr/local/nginx/conf/nginx.conf
	#推荐配置到相应的server段
	set_real_ip_from    192.168.139.131;
[root@web1/2 ~]# service nginx reload

查看日志
[root@web1 ~]# tail -1 /usr/local/nginx/logs/server01.lnmp.com_access.log 
192.168.139.1 - - [13/Oct/2021:00:44:45 +0800] "GET /static/home/img/wx_cz.jpg HTTP/1.0" 304Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
#获取客户端ip:192.168.139.1
session一致性问题
  • 访问后端页面,登录发现验证码不通过

  • 原因:请求被分发到web1上,在web1上生成验证码,存储到服务器的session中。但是校验时,请求被轮训分发到web2上,所以验证码校验不通过
[root@lb ~]# cd /tmp/
[root@lb tmp]# ls 
sess_m5nh62mo90nlkl56t876uf4pl9 sess_2ipocqqjnd5lb1a0gfiv1h57b0 sess_odi5t61oskdrak5c8ieoqht9k0 sess_67fh48m2272n5q3be7qh71j1hk sess_okjcaftj5qr45apsenb6t1ht6e sess_7fi8louv43omu913gt82982r3r sess_vpmcf7uv2oevgle1pfrqc6p042 sess_ek3driitk3iq3ct9em1mnh1hes  
sess_ftvk56k6nd9vb3debnau4jhts9 sess_jmftk8tlam2boi7mhbq40ri8ir
负载均衡高可用
  • 所有的请求流量,都要经过负载均衡服务器,负载均衡服务器压力很大,防止它宕机,导致后端服务所有都不可用,需要对负载均衡服务器,做高可用

  • 基于keepalived

  • 克隆lb服务器

主机名ip地址虚拟机lb1.master192.168.139.131server04ld2.backup192.168.139.132server05
  • 基础环境配置
配置server04
[root@lb ~]# sed -i 's/lb/lb1.master/' /etc/sysconfig/network
[root@lb ~]# reboot

配置server05
[root@lb ~]# sed -i 's/lb/lb2.backup/' /etc/sysconfig/network
[root@lb ~]# cd /etc/udev/rules.d/
[root@lb ~]# rm -rf 70-persistent-net.rules
[root@lb ~]# reboot

cat >> /etc/hosts < 
  • master的keepalived配置
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 52	虚拟路由ID,不要之前的冲突
    priority 100 
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.139.201		 添加新VIP
    }   
     track_script {
        check_nginx
    }   
    unicast_src_ip 192.168.139.131	修改单播地址
    unicast_peer {
        192.168.139.132
    }   
}
[root@lb1 ~]# service keepalived reload
  • backup的keepalived配置
[root@lb2 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 52	虚拟路由ID,不要之前的冲突
    priority 100 
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.139.201		 添加新VIP
    }   
     track_script {
        check_nginx
    }   
    unicast_src_ip 192.168.139.132	修改单播地址
    unicast_peer {
        192.168.139.131
    }   
}
[root@lb2 ~]# service keepalived reload
  • 查看
[root@lb2 ~]# ip a
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:a3:e4:d8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.139.132/24 brd 192.168.139.255 scope global eth0
    inet 192.168.139.201/32 scope global eth0
  • 域名解析到负载均衡服务器的虚拟ip(192.168.139.201)
LVS 介绍
  • LVS(Linux Virtual Server):Linux虚拟服务器
  • 由国人章文嵩博士发起的一个开源项目,并且已经是 Linux 内核标准的一部分
  • LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
  • LVS中文站点 http://zh.linuxvirtualserver.org/
  • 特点
    • 工作在网络层,可以实现高性能,高可用的服务器集群技术
    • 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器
    • 易用,配置非常简单,且有多种负载均衡的方法
    • 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果
    • 可扩展性非常好
调度算法 Fixed Scheduling Method 静态调度方法
  • RR 轮询
    将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载

  • WRR 加权轮询
    调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

  • DH 目标地址hash
    针对目标IP地址通过散列(Hash)函数将目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空

  • SH 源地址hash
    算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空

    在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口

Dynamic Scheduling Method 动态调度方法
  • LC 最少连接
    调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。 如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载

  • WLC 加权最少连接

    LVS默认调度算法

    在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

  • SED 最少期望延迟
    基于wlc算法,举例说明:ABC三台机器分别权重123,连接数也分别是123,name如果使用WLC算法的话一个新请求 进入时他可能会分给ABC中任意一个,使用SED算法后会进行这样一个运算
    A:(1+1)/2
    B:(1+2)/2
    C:(1+3)/3
    根据运算结果,把连接交给C

  • NQ 从不排队调度方法
    无需列队,如果有台realserver的连接数=0 就直接分配过去,不需要进行sed运算.

  • LBLC 基于本地的最少连接
    该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;
    若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。该算法目前主要用于Cache集群系统。

  • LBLCR 带复制的基于本地的最少连接
    它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。
    该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按"最小连接"原则从这个集群中选出一 台服务器 ,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改, 将最忙的服务器从服务器组中删除,以降低复制的程度

组成
  • ipvs(ip virtual server):工作在内核空间,是真正生效实现调度的代码
  • ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
  • 相关术语
    • DS:Directory Server,前端负载均衡服务器
    • RS:Real Server,后端真实工作服务器
    • VIP:用户请求目标的IP地址
    • DIP:负载均衡服务器的IP地址
    • RIP:后端真实服务器的IP地址
    • CIP:客户端的IP地址
NAT模式 介绍

当用户访问服务器集群提供的服务时**(CIP–>VIP),发往虚拟IP地址的请求数据包到达负载均衡器。负载均衡器(Director Server)检查数据包的目标地址和端口号。如果根据虚拟服务器规则表匹配虚拟服务器服务,则通过调度算法**(加权最小连接)从集群中选择真实服务器(Real Server1),并将连接添加到记录已建立连接的哈希表中。然后,将目标地址和数据包的端口重写为被选择的服务器(Real server1)的目标地址和端口,并将数据包转发到该服务器(Real server1)。当传入数据包属于此连接并且可以在哈希表中找到所选服务器时,Real Server1处理好请求后会将一个源地址为自己IP,地址目标地址为CIP的数据包通过负载均衡器(Director Server) 发出去。当回复数据包返回时,负载均衡器将数据包的源地址(RIP)和端口重写为虚拟服务的源地址(VIP)和端口。 连接终止或超时后,连接记录将在哈希表中删除。

  • 特点
    • RS应该使用私有地址,网关为DIP
    • DIP和RIP属于同一个网段
    • 请求和响应报文都需要经过DS(性能瓶颈)
    • 支持端口映射
    • RS可以使用任意 *** 作系统
实现 server主机名ip地址及定位server01web1.master192.168.139.128(RIP)server02web2.backup192.168.139.129(RIP)server04lb1.master192.168.139.131(DIP)
192.168.1.100 (VIP)
  • 给server04添加VIP:server04处于关机状态,添加网络适配器,选择桥接模式,开机
配置网卡,设置VIP
[root@lb1 ~]# cd /etc/sysconfig/network-scripts/
[root@lb1 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@lb1 network-scripts]# vim ifcfg-eth1
  1 DEVICE=eth1 修改网卡名称
  2 TYPE=Ethernet
  3 UUID=0aa1efa8-8d2e-48e5-a48f-97668ad64951 修改UUID
  4 onBOOT=yes
  5 NM_ConTROLLED=yes
  6 BOOTPROTO=dhcp
  7 DEFROUTE=yes
  8 IPV4_FAILURE_FATAL=yes
  9 IPV6INIT=no
 10 NAME="System eth1" 修改网卡名称
 11 PEERDNS=yes
 12 PEERROUTES=yes
[root@lb1 network-scripts]# ifup eth1
[root@lb1 network-scripts]# ip a
3: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:23:41:ea brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1
    inet6 fe80::20c:29ff:fe23:41ea/64 scope link 
       valid_lft forever preferred_lft forever
       
修改RS默认网关为192.168.139.131(DIP)
route del default
route add default gw 192.168.139.131
route -n

配置DS的ipvsadm的调度规则
[root@lb1 ~]# yum install -y ipvsadm
[root@lb1 ~]# ipvsadm -A -t 192.168.1.100:80 -s rr
[root@lb1 ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.139.128 -m 
[root@lb1 ~]# ipvsadm -a -t 192.168.1.100:80 -r 192.168.139.129 -m
选项说明
-A 增加一个虚拟服务
-t 配置虚拟机服务的地址
-s 负载均衡调度算法
-a 增加一个真实服务器
-r 真实服务器的地址
-m NAT工作模式
-C 清除所有规则
-g DR工作模式
-w 权重
-L 查看ipvs定义的规则列表
-n 显示IP地址和端口号,默认显示主机名
[root@lb1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:80 rr
  -> 192.168.139.128:80           Masq    1      0          0         
  -> 192.168.139.129:80           Masq    1      0          0         
TCP  192.168.200.100:443 rr persistent 50
TCP  10.10.10.2:1358 rr persistent 50
  -> 192.168.200.200:1358         Masq    1      0          0         
TCP  10.10.10.3:1358 rr persistent 50

启动Linux的路由转发功能
[root@lb1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward       
  • 域名解析到VIP(192.168.1.100)
查看
[root@lb1 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 14:54  ESTABLISHED 192.168.1.102:62003 192.168.1.100:80   192.168.139.129:80
TCP 14:20  ESTABLISHED 192.168.1.102:56863 192.168.1.100:80   192.168.139.128:80
TCP 14:54  ESTABLISHED 192.168.1.102:59527 192.168.1.100:80   192.168.139.128:80
TCP 14:41  ESTABLISHED 192.168.1.102:52484 192.168.1.100:80   192.168.139.128:80
TCP 01:58  FIN_WAIT    192.168.1.102:56454 192.168.1.100:80   192.168.139.129:80
TCP 14:54  ESTABLISHED 192.168.1.102:55953 192.168.1.100:80   192.168.139.129:80
TCP 14:54  ESTABLISHED 192.168.1.102:50345 192.168.1.100:80   192.168.139.129:80
TCP 14:54  ESTABLISHED 192.168.1.102:56814 192.168.1.100:80   192.168.139.128:80

脚本实现

配置RS
mkdir lvs
cd lvs
rz
vim lvs_nat_rs.sh
  1 #!/bin/bash
  2 #添加路由默认网关到DIP
  3 DIP=192.168.139.131
  4 #删除默认
  5 route del default
  6 #添加网关
  7 route add default gw $DIP
chmod +x lvs_nat_rs.sh 
./lvs_nat_rs.sh 
route -n

配置DS
[root@lb1 lvs]# mkdir lvs
[root@lb1 lvs]# cd lvs
[root@lb1 lvs]# rz
[root@lb1 lvs]# vim lvs_nat_ds.sh 
  1 #!/bin/bash
  2 # 
  3 # chkconfig: - 88 12
  4 # description: LVS script for VS/NAT
  5 VIP=192.168.1.100
  6 RIP1=192.168.139.128
  7 RIP2=192.168.139.129
  8 # 配置服务
  9 case "$1" in
 10 start)
 11   #配置网卡转发
 12   echo 1 > /proc/sys/net/ipv4/ip_forward
 13   #判断安装ipvsadm
 14   rpm -qa|grep ipvsadm >> /dev/null
 15   if [ $? -ne 0 ];then
 16       yum -y install ipvsadm
 17   fi
 18   #清空lvs规则
 19   ipvsadm -C
 20   #添加一个转发服务  
 21   ipvsadm -A -t $VIP:80 -s rr
 22   #添加分发节点
 23   ipvsadm -a -t $VIP:80 -r $RIP1 -m
 24   ipvsadm -a -t $VIP:80 -r $RIP2 -m
 25 ;;
 26 
 27 stop)
 28   #关闭网卡转发
 29   echo 0 > /proc/sys/net/ipv4/ip_forward
 30   #清空lvs规则
 31   ipvsadm -C
 32 ;;
 33 status)
 34   #查看当前规则
 35   ipvsadm -Ln
 36 ;;
 37 *)
 38   echo "Usage: $0 {start|stop|status}"
 39 ;; esac
[root@lb1 lvs]# chmod +x lvs_nat_ds.sh 
[root@lb1 lvs]# ./lvs_nat_ds.sh 
Usage: ./lvs_nat_ds.sh {start|stop|status}
[root@lb1 lvs]# ./lvs_nat_ds.sh start
[root@lb1 lvs]# ./lvs_nat_ds.sh status
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:80 rr
  -> 192.168.139.129:80           Masq    1      0          0         
  -> 192.168.139.128:80           Masq    1      0          0 
DR模式

此请求调度方法类似于IBM的NetDispatcher中实现的方法。

虚拟IP地址由真实服务器(Real Server)和负载均衡器(Director Server)共享。负载均衡器的接口也配置了虚拟IP地址,用于接受请求数据包,并直接将数据包路由到选定的服务器。所有真实服务器的非arp别名接口都配置了虚拟IP地址,或者将发往虚拟IP地址的数据包重定向到本地套接字,以便真实服务器可以在本地处理数据包。 负载均衡器和真实服务器必须通过HUB/Switch物理连接其中一个接口,负载均衡器只是将数据帧的MAC地址更改为所选服务器的MAC地址,然后在LAN上重新传输。这就是负载均衡器和每个服务器必须通过同一个LAN进行连接的原因。

  • 特点
    • 保证前端路由将目标地址为VIP报文统统发给Director Server
    • RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
    • RS跟DS必须在同一个物理网络中
    • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
    • 不支持地址转换,也不支持端口映射
    • RS的网关绝不允许指向DIP(因为我们不允许他经过director)
    • RS上的lo接口配置VIP的IP地址
实现 server主机名ip地址及定位server01web1.master192.168.139.128(RIP)
192.168.139.205 (VIP)server02web2.backup192.168.139.129(RIP)
192.168.139.205 (VIP)server04lb1.master192.168.139.131(DIP)
192.168.139.205 (VIP)
在RS上配置
#设置arp的通告模式
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_announce
#绑定VIP到网卡
ifconfig lo:0 192.168.139.205 broadcast 192.168.139.205 netmask 255.255.255.255 up
#添加主机路由
route add -host 192.168.139.205 dev lo:0

在DS上配置
#配置DS上的VIP
[root@lb1 ~]# ifconfig eth0:0 192.168.139.205 broadcast 192.168.139.205 netmask 255.255.255.255 up
#添加主机路由
[root@lb1 ~]# route add -host 192.168.139.205 dev eth0:0
#配置转发规则
[root@lb1 ~]# ipvsadm -C
[root@lb1 ~]# ipvsadm -A -t 192.168.139.205:80 -s rr
[root@lb1 ~]# ipvsadm -a -t 192.168.139.205:80 -r 192.168.139.128 -g
[root@lb1 ~]# ipvsadm -a -t 192.168.139.205:80 -r 192.168.139.129 -g
[root@lb1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.139.205:80 rr
  -> 192.168.139.128:80           Route   1      0          0         
  -> 192.168.139.129:80           Route   1      0          0         

脚本实现

配置RS
cd lvs
rz
vim lvs_dr_rs.sh 
  1 #!/bin/bash
  2 VIP=192.168.139.205
  3 #配置VIP只有DS响应
  4 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  5 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  6 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  7 echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  8 #绑定VIP到网卡
  9 ifconfig lo:0 $VIP  broadcast $VIP netmask 255.255.255.255 up
 10 #添加主机路由
 11 route add -host $VIP dev lo:0
chmod +x lvs_dr_rs.sh 
./lvs_dr_rs.sh
route -n

配置DS
[root@lb1 lvs]# cd lvs
[root@lb1 lvs]# rz
[root@lb1 lvs]# vim lvs_dr_ds.sh 
  1 #!/bin/bash
  2 ## chkconfig: - 88 12
  3 # description: LVS script for VS/DR
  4 VIP=192.168.139.205
  5 RIP1=192.168.139.128
  6 RIP2=192.168.139.129
  7 GW=192.168.139.2
  8 # 配置服务
  9 case "$1" in
 10 start)
 11   #DR配置绑定VIP
 12   ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
 13   #添加主机路由
 14   route add -host $VIP dev eth0:0
 15   #配置网卡转发
 16   # echo 1 > /proc/sys/net/ipv4/ip_forward
 17   #配置网关
 18   route del default
 19   route add default gw $GW
 20   #判断安装ipvsadm
 21   rpm -qa|grep ipvsadm >> /dev/null
 22   if [ $? -ne 0 ];then
 23       yum -y install ipvsadm
 24   fi
 25   #清空lvs规则
 26   ipvsadm -C
 27   #添加一个转发服务
 28   ipvsadm -A -t $VIP:80 -s rr
 29   #添加分发节点
 30   ipvsadm -a -t $VIP:80 -r $RIP1 -g
 31   ipvsadm -a -t $VIP:80 -r $RIP2 -g
 32 ;;
 33 
 34 stop)
 35   #关闭网卡转发
 36   echo 0 > /proc/sys/net/ipv4/ip_forward
 37   #清空lvs规则
 38   ipvsadm -C
 39 ;;
 40 status)
 41   #查看当前规则
 42   ipvsadm -Ln
 43 ;;
 44 *)
 45   echo "Usage: $0 {start|stop}"
 46 ;; esac
[root@lb1 lvs]# chmod +x lvs_dr_ds.sh 
[root@lb1 lvs]# ./lvs_dr_ds.sh 
Usage: ./lvs_dr_ds.sh {start|stop}
[root@lb1 lvs]# ./lvs_dr_ds.sh start
[root@lb1 lvs]# ./lvs_dr_ds.sh status
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.139.205:80 rr
  -> 192.168.139.128:80           Route   1      0          0         
  -> 192.168.139.129:80           Route   1      0          0         

TUN模式

在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式如图,其中,**IP隧道(IP tunning)**是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后 直接给客户端主机响应数据。

  • 特点
    • RIP、VIP、DIP全是公网地址
    • RS的网关不会也不可能指向DIP
    • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
    • 不支持端口映射
    • RS的系统必须支持隧道
LVS实现MySQL负载均衡 虚拟机主机名IP地址担当server01web1.master192.168.139.128mysql数据库server02web2.backup192.168.139.129mysql数据库server03mysql192.168.139.130用于验证server04lb1.master192.168.139.131负载均衡服务器
  • 解决mysql登录失败的问题
[root@web1 ~]# mysql -uroot -p123456
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

报错:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

原因:mysql服务没有开启

解决:如下

#进入mysql安装目录
[root@web1 ~]# cd /usr/local/mysql/
[root@web1 mysql]# ./support-files/mysql.server start
Starting MySQL....... SUCCESS! 
  • 配置实现
在数据库上,添加授权用户
grant all on *.* to 'lvs'@'%' identified by '123456';
flush privileges;

创建数据库用于后续识别分发
mysql> create database server01;
mysql> create database server02;

负载均衡配置(DR)
[root@lb1 haproxy]# cd /root/lvs
[root@lb1 lvs]# vim lvs_dr_ds.sh 
  1 #!/bin/bash
  2 ## chkconfig: - 88 12
  3 # description: LVS script for VS/DR
  4 VIP=192.168.139.205
  5 RIP1=192.168.139.128
  6 RIP2=192.168.139.129
  此处网关不需要配置
  7 #GW=192.168.139.2
  8 # 配置服务
  9 case "$1" in
 10 start)
 11   #DR配置绑定VIP
 12   ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
 13   #添加主机路由
 14   route add -host $VIP dev eth0:0
 15   #配置网卡转发
 16   # echo 1 > /proc/sys/net/ipv4/ip_forward
 17   #配置网关
 18   #route del default
 19   #route add default gw $GW
 20   #判断安装ipvsadm
 21   rpm -qa|grep ipvsadm >> /dev/null
 22   if [ $? -ne 0 ];then
 23       yum -y install ipvsadm
 24   fi
 25   #清空lvs规则
 26   ipvsadm -C
 27   #添加一个转发服务
 28   ipvsadm -A -t $VIP:3306 -s rr	修改端口号
 29   #添加分发节点
 30   ipvsadm -a -t $VIP:3306 -r $RIP1 -g
 31   ipvsadm -a -t $VIP:3306 -r $RIP2 -g
 32 ;;
 33 
 34 stop)
 35   #关闭网卡转发
 36   echo 0 > /proc/sys/net/ipv4/ip_forward
 37   #清空lvs规则
 38   ipvsadm -C
 39 ;;
 40 status)
 41   #查看当前规则
 42   ipvsadm -Ln
 43 ;;
 44 *)
 45   echo "Usage: $0 {start|stop}"
 46 ;; esac
[root@lb1 lvs]# ./lvs_dr_ds.sh start

数据库服务配置转发规则
cd /root/lvs
./lvs_dr_rs.sh 

验证
[root@mysql ~]# service mysqld stop
[root@mysql ~]# mysql -h192.168.139.205 -ulvs -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| server02           |
| tp5shop            |
+--------------------+
mysql> quit

[root@mysql ~]# mysql -h192.168.139.205 -ulvs -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| server01           |
| tp5shop            |
+--------------------+

HAproxy负载均衡 介绍
  • HAProxy(高性能-代理)目前是一款使用广泛的软负载均衡器,它可以实现TCP/HTTP的负载均衡
  • 特性
    • 免费开源
    • 最大并发量能达到5w
    • 支持多种负载均衡算法,同时支持session保持
    • 支持虚拟主机
    • 拥有服务监控页面,可以了解系统的实时运行状态
    • 通常不做正向代理,有更好的选择(Squid)
    • 通常不做缓存代理,有更好的选择(Varnish)
    • 不会改变请求和响应报文
    • 不用于Web服务器
    • 不是基于数据包的负载均衡器,看不到ip数据包
实现负载均衡
  • 安装
[root@lb1 ~]# yum install -y haproxy
  • 配置文件参数介绍
[root@lb1 ~]# cd /etc/haproxy/
[root@lb1 haproxy]# cp haproxy.cfg haproxy.cfg.bak
[root@lb1 haproxy]# vim haproxy.cfg
  1 #---------------------------------------------------------------------
  2 # Example configuration for a possible web application.  See the
  3 # full configuration options online.
  4 #
  5 #   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
  6 #
  7 #---------------------------------------------------------------------
  8 
  9 #---------------------------------------------------------------------
 10 # Global settings
 11 #---------------------------------------------------------------------
 12 global	全局配置文件
 13     # to have these messages end up in /var/log/haproxy.log you will
 14     # need to:	配置日志
 15     #
 16     # 1) configure syslog to accept network log events.  This is done
 17     #    by adding the '-r' option to the SYSLOGD_OPTIONS in
 18     #    /etc/sysconfig/syslog	修改syslog文件
 19     #
 20     # 2) configure local2 events to go to the /var/log/haproxy.log
 21     #   file. A line like the following can be added to
 22     #   /etc/sysconfig/syslog	定义日志设备
 23     #
 24     #    local2.*                       /var/log/haproxy.log
 25     #
 26     log         127.0.0.1 local2	日志配置,记录在本地,通过local2输出
 27 
 28     chroot      /var/lib/haproxy	定义haproxy的工作目录
 29     pidfile     /var/run/haproxy.pid	指定pid文件的路径	
 30     maxconn     4000	最大连接数
 31     user        haproxy	定义haproxy服务运行的用户
 32     group       haproxy	定义用户组
 33     daemon
 34 
 35     # turn on stats unix socket
 36     stats socket /var/lib/haproxy/stats
 37 
 38 #---------------------------------------------------------------------
 39 # common defaults that all the 'listen' and 'backend' sections will
 40 # use if not designated in their block
 41 #---------------------------------------------------------------------
 42 defaults
 43     mode                    http	默认协议{http七层|tcp四层|health}
 44     log                     global	全局日志记录
 45     option                  httplog	记录http日志
 46     option                  dontlognull	不记录空日志
 47     option http-server-close	启用http-server-close
 48     option forwardfor       except 127.0.0.0/8	
 49     option                  redispatch	重新分发,ServerID对应的服务器宕机后,强制定向到其他运行正常的服务器
 50     retries                 3	3次连接失败,认为服务不可用
 51     timeout http-request    10s	http请求超时时间
 52     timeout queue           1m	队列超时时间
 53     timeout connect         10s	连接超时时间
 54     timeout client          1m	客户端超时时间
 55     timeout server          1m	服务器超时时间
 56     timeout http-keep-alive 10s	持久连接超时时间
 57     timeout check           10s	检查时间间隔
 58     maxconn                 3000	最大连接数
 59 
 60 #---------------------------------------------------------------------
 61 # main frontend which proxys to the backends
 62 #---------------------------------------------------------------------
 63 frontend  main *:5000	  定义ACL规则 -i:忽略大小写
 64     acl url_static       path_beg       -i /static /images /javascript /stylesheets
 65     acl url_static       path_end       -i .jpg .gif .png .css .js
 66 
 67     use_backend static          if url_static	调用后端服务器并检查ACL规则是否被匹配
 68     default_backend             app	客户端访问时默认调用后端服务器地址池
 69 
 70 #---------------------------------------------------------------------
 71 # static backend for serving up images, stylesheets and such
 72 #---------------------------------------------------------------------
 73 backend static	定义后端服务器
 74     balance     roundrobin	定义算法;基于权重进行轮询
 75     server      static 127.0.0.1:4331 check
 76 
 77 #---------------------------------------------------------------------
 78 # round robin balancing between the various backends
 79 #---------------------------------------------------------------------
 80 backend app
 81     balance     roundrobin
 82     server  app1 127.0.0.1:5001 check
 83     server  app2 127.0.0.1:5002 check
 84     server  app3 127.0.0.1:5003 check
 85     server  app4 127.0.0.1:5004 check
  • 配置
[root@lb1 haproxy]# vim haproxy.cfg
 
 63 frontend  main *:80	修改端口号+注释下面三行
 64     #acl url_static       path_beg       -i /static /images /javascript /stylesheets
 65     #acl url_static       path_end       -i .jpg .gif .png .css .js
 66 
 67     #use_backend static          if url_static
 68     default_backend             shop	调用后端服务器池
 69 
 70 #---------------------------------------------------------------------
 71 # static backend for serving up images, stylesheets and such
 72 #---------------------------------------------------------------------
 73 backend static
 74     balance     roundrobin
 75     server      static 127.0.0.1:4331 check
 76 
 77 #---------------------------------------------------------------------
 78 # round robin balancing between the various backends
 79 #---------------------------------------------------------------------
 80 backend shop	定义服务器池名称
 81     balance     roundrobin
 82     server  server01 192.168.139.128:80 check	修改ip地址
 83     server  server02 192.168.139.129:80 check	修改ip地址
 84     #server  app3 127.0.0.1:5003 check
 85     #server  app4 127.0.0.1:5004 check

[root@lb1 haproxy]# service haproxy start
  • 域名解析到lb1服务器,网页访问测试
HAproxy实现MySQL负载均衡 虚拟机主机名IP地址担当server01web1.master192.168.139.128mysql数据库server02web2.backup192.168.139.129mysql数据库server03mysql192.168.139.130用于验证server04lb1.master192.168.139.131负载均衡服务器
在数据库上,添加授权用户
grant all on *.* to 'lvs'@'%' identified by '123456';
flush privileges;

创建数据库用于后续识别分发
mysql> create database server01;
mysql> create database server02;

配置HAproxy
[root@lb1 lvs]# ./lvs_dr_ds.sh stop
[root@lb1 lvs]# cd /etc/haproxy/
[root@lb1 haproxy]# vim haproxy.cfg
 42 defaults
 43     mode                    tcp	修改为四层tcp
 44     log                     global
 45     option                  httplog
 46     option                  dontlognull
 47     option http-server-close
 48     option forwardfor       except 127.0.0.0/8
 49     option                  redispatch
 50     retries                 3
 51     timeout http-request    10s
 52     timeout queue           1m
 53     timeout connect         10s
 54     timeout client          1m
 55     timeout server          1m
 56     timeout http-keep-alive 10s
 57     timeout check           10s
 58     maxconn                 3000
 59 
 60 #---------------------------------------------------------------------
 61 # main frontend which proxys to the backends
 62 #---------------------------------------------------------------------
 63 frontend  main *:3306	更改端口号
 64     #acl url_static       path_beg       -i /static /images /javascript /stylesheets
 65     #acl url_static       path_end       -i .jpg .gif .png .css .js
 66 
 67     #use_backend static          if url_static
 68     default_backend             shop
 69 
 70 #---------------------------------------------------------------------
 71 # static backend for serving up images, stylesheets and such
 72 #---------------------------------------------------------------------
 73 backend static
 74     balance     roundrobin
 75     server      static 127.0.0.1:4331 check
 76 
 77 #---------------------------------------------------------------------
 78 # round robin balancing between the various backends
 79 #---------------------------------------------------------------------
 80 backend shop	按需要配置
 81     balance     roundrobin
 82     server  server01 192.168.139.128:3306 check
 83     server  server02 192.168.139.129:3306 check
 84     #server  app3 127.0.0.1:5003 check
 85     #server  app4 127.0.0.1:5004 check
[root@lb1 haproxy]# service haproxy reload

验证
[root@mysql ~]# mysql -h192.168.139.131 -ulvs -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| server01           |
| tp5shop            |
+--------------------+
mysql> quit

[root@mysql ~]# mysql -h192.168.139.131 -ulvs -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| server02           |
| tp5shop            |
+--------------------+

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4664554.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存