负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台ECS的流量分发控制服务。
负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。
负载均衡的主要功能点:
作用:
实现方式
二层负载均衡(mac)
三层负载均衡(ip)
四层负载均衡(tcp)
七层负载均衡(http)
四层&七层对比
四层 | 七层 | |
---|---|---|
基于 | 基于IP+Port | 基于虚拟的URL或主机IP |
类似于 | 路由器 | 代理服务器 |
握手次数 | 1次 | 2次 |
复杂度 | 低 | 高 |
性能 | 高:无需解析内容 | 中:需要算法识别URL ,Cookie和HTTP head等 |
安全性 | 低:无法识别DDos攻击 | 高:可以防御SYN cookie和SYN flood等 |
额外功能 | 五 | 会话保持,图片压缩,防盗链等 |
主机名 | ip地址 | 虚拟机 |
---|---|---|
web1.master | 192.168.139.128 | server01 |
web2.backup | 192.168.139.129 | server02 |
mysql | 192.168.139.130 | server03 |
lb | 192.168.139.131 | 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 <.168.139.131 lb
EOF
配置
[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();在页面上方显示主机名(仅调试用)
模块编译安装(略)
[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
[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.master | 192.168.139.131 | server04 |
ld2.backup | 192.168.139.132 | server05 |
配置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 <.168.139.131 lb1.master
192.168.139.132 lb2.backup
EOF
[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
[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: ,MULTICAST,UP,LOWER_UP> 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
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
根据运算结果,把连接交给C
NQ 从不排队调度方法
无需列队,如果有台realserver的连接数=0 就直接分配过去,不需要进行sed运算.
LBLC 基于本地的最少连接
该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;
若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。该算法目前主要用于Cache集群系统。
LBLCR 带复制的基于本地的最少连接
它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。
该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按"最小连接"原则从这个集群中选出一 台服务器 ,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改, 将最忙的服务器从服务器组中删除,以降低复制的程度
当用户访问服务器集群提供的服务时**(CIP–>VIP),发往虚拟IP地址的请求数据包到达负载均衡器。负载均衡器(Director Server)检查数据包的目标地址和端口号。如果根据虚拟服务器规则表匹配虚拟服务器服务,则通过调度算法**(加权最小连接)从集群中选择真实服务器(Real Server1),并将连接添加到记录已建立连接的哈希表中。然后,将目标地址和数据包的端口重写为被选择的服务器(Real server1)的目标地址和端口,并将数据包转发到该服务器(Real server1)。当传入数据包属于此连接并且可以在哈希表中找到所选服务器时,Real Server1处理好请求后会将一个源地址为自己IP,地址目标地址为CIP的数据包通过负载均衡器(Director Server) 发出去。当回复数据包返回时,负载均衡器将数据包的源地址(RIP)和端口重写为虚拟服务的源地址(VIP)和端口。 连接终止或超时后,连接记录将在哈希表中删除。
server | 主机名 | ip地址及定位 |
---|---|---|
server01 | web1.master | 192.168.139.128(RIP) |
server02 | web2.backup | 192.168.139.129(RIP) |
server04 | lb1.master | 192.168.139.131(DIP) 192.168.1.100 (VIP) |
配置网卡,设置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: ,MULTICAST,UP,LOWER_UP> 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
查看
[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
此请求调度方法类似于IBM的NetDispatcher中实现的方法。
虚拟IP地址由真实服务器(Real Server)和负载均衡器(Director Server)共享。负载均衡器的接口也配置了虚拟IP地址,用于接受请求数据包,并直接将数据包路由到选定的服务器。所有真实服务器的非arp别名接口都配置了虚拟IP地址,或者将发往虚拟IP地址的数据包重定向到本地套接字,以便真实服务器可以在本地处理数据包。 负载均衡器和真实服务器必须通过HUB/Switch物理连接其中一个接口,负载均衡器只是将数据帧的MAC地址更改为所选服务器的MAC地址,然后在LAN上重新传输。这就是负载均衡器和每个服务器必须通过同一个LAN进行连接的原因。
server | 主机名 | ip地址及定位 |
---|---|---|
server01 | web1.master | 192.168.139.128(RIP) 192.168.139.205 (VIP) |
server02 | web2.backup | 192.168.139.129(RIP) 192.168.139.205 (VIP) |
server04 | lb1.master | 192.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
在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。VS/TUN工作模式如图,其中,**IP隧道(IP tunning)**是一种数据包封装技术,它可以将原始数据包封装并添加新的包头(内容包括新的源地址及端口、目标地址及端口),从而实现将一个目标为调度器的VIP地址的数据包封装,通过隧道转发给后端的真实服务器(Real Server),通过将客户端发往调度器的原始数据包封装,并在其基础上添加新的数据包头(修改目标地址为调度器选择出来的真实服务器的IP地址及对应端口),LVS(TUN)模式要求真实服务器可以直接与外部网络连接,真实服务器在收到请求数据包后 直接给客户端主机响应数据。
虚拟机 | 主机名 | IP地址 | 担当 |
---|---|---|---|
server01 | web1.master | 192.168.139.128 | mysql数据库 |
server02 | web2.backup | 192.168.139.129 | mysql数据库 |
server03 | mysql | 192.168.139.130 | 用于验证 |
server04 | lb1.master | 192.168.139.131 | 负载均衡服务器 |
[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 |
+--------------------+
[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
虚拟机 | 主机名 | IP地址 | 担当 |
---|---|---|---|
server01 | web1.master | 192.168.139.128 | mysql数据库 |
server02 | web2.backup | 192.168.139.129 | mysql数据库 |
server03 | mysql | 192.168.139.130 | 用于验证 |
server04 | lb1.master | 192.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 |
+--------------------+