-
负载均衡(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
四层&七层对比
- 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
- 基础环境配置
[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.1session一致性问题
- 访问后端页面,登录发现验证码不通过
- 原因:请求被分发到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.131server04 ld2.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 LVS 介绍
- 域名解析到负载均衡服务器的虚拟ip(192.168.139.201)
调度算法 Fixed Scheduling Method 静态调度方法
- LVS(Linux Virtual Server):Linux虚拟服务器
- 由国人章文嵩博士发起的一个开源项目,并且已经是 Linux 内核标准的一部分
- LVS架构从逻辑上可分为调度层、Server集群层和共享存储。
- LVS中文站点 http://zh.linuxvirtualserver.org/
- 特点
- 工作在网络层,可以实现高性能,高可用的服务器集群技术
- 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器
- 易用,配置非常简单,且有多种负载均衡的方法
- 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果
- 可扩展性非常好
Dynamic Scheduling Method 动态调度方法
RR 轮询
将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载WRR 加权轮询
调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值DH 目标地址hash
针对目标IP地址通过散列(Hash)函数将目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空SH 源地址hash
算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空在实际应用中,源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口
组成
LC 最少连接
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。 如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载WLC 加权最少连接
LVS默认调度算法
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值
SED 最少期望延迟
基于wlc算法,举例说明:ABC三台机器分别权重123,连接数也分别是123,name如果使用WLC算法的话一个新请求 进入时他可能会分给ABC中任意一个,使用SED算法后会进行这样一个运算
A:(1+1)/2
B:(1+2)/2
C:(1+3)/3
根据运算结果,把连接交给CNQ 从不排队调度方法
无需列队,如果有台realserver的连接数=0 就直接分配过去,不需要进行sed运算.LBLC 基于本地的最少连接
该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;
若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。该算法目前主要用于Cache集群系统。LBLCR 带复制的基于本地的最少连接
它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。
该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按"最小连接"原则从这个集群中选出一 台服务器 ,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改, 将最忙的服务器从服务器组中删除,以降低复制的程度NAT模式 介绍
- ipvs(ip virtual server):工作在内核空间,是真正生效实现调度的代码
- ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
- 相关术语
- DS:Directory Server,前端负载均衡服务器
- RS:Real Server,后端真实工作服务器
- VIP:用户请求目标的IP地址
- DIP:负载均衡服务器的IP地址
- RIP:后端真实服务器的IP地址
- CIP:客户端的IP地址
当用户访问服务器集群提供的服务时**(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:80DR模式脚本实现
配置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此请求调度方法类似于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 0TUN模式脚本实现
配置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在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式如图,其中,**IP隧道(IP tunning)**是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后 直接给客户端主机响应数据。
LVS实现MySQL负载均衡
- 特点
- RIP、VIP、DIP全是公网地址
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持端口映射
- RS的系统必须支持隧道
虚拟机 主机名 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 startHAproxy实现MySQL负载均衡
- 域名解析到lb1服务器,网页访问测试
虚拟机 主机名 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 | +--------------------+欢迎分享,转载请注明来源:内存溢出
评论列表(0条)