1.使用lvs实现web服务器负载均衡
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的负载均衡项目。目前,LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案
LVS的IPVS模块在Linux2.4内核之后都被默认支持了,只需要安装’ipvsadm’DR集群管理工具即可
在负载均衡服务器上按照ipvsadm
yum -y install ipvsadm
LVS的三种工作方式
- NAT(地址转换)
- TUN(IP隧道)
- DR(直接路由)
LVS负载均衡调度算法
-
Fixed Scheduling Method 静态调度算法
-
RR 轮询
-
WRR 加权轮询
-
DH 目标地址hash
-
SH 源地址hash
-
-
Dynamic Scheduling Method 动态调度算法
- LC 最少连接
- WLC 加权最少连接
- SED 最少期望延迟
- NQ 从不排队调度方法
- LBLC 基于本地的调度方法
- LBLCR 带复制的基于本地的最少连接
1.1LVS-NAT实现
DS:负载均衡服务器
RS:真实服务器
CIP:客户端IP
DIP:负载均衡服务器IP
VIP:负载均衡服务器的虚拟IP,对外提供服务的IP,用户访问的IP
RIP:真实服务器IP
服务器 | DIP/RIP | VIP | Gateway |
---|---|---|---|
DS | 192.168.204.133(DIP) | 192.168.204.200 | |
RS1 | 192.168.204.130(RIP) | 192.168.204.133 | |
RS2 | 192.168.204.132(RIP) | 192.168.204.133 |
1.1.1在负载均衡服务器上添加一块网卡,命名为ens34,使用桥接模式,配置静态IP,本例中为192.168.204.133
1.1.2创建网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens34
DEVICE=ens34
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
NAME=ens34
IPADDR=192.168.204.200
NETMASK=255.255.255.0
GATEWAY=192.168.204.2
DNS1=114.114.114.114
DNS2=8.8.8.8
:wq
1.1.3启动网卡
ifup ens34
1.1.4配置两台RS
service nginx start #启动web服务,能够正常访问
route del default #删除旧的默认路由
route add default gw 192.168.204.133 #添加新的默认路由
1.1.5在DS上配置调度规则
ipvsadm -A -t 192.168.204.200:80 -s rr #定义一个集群服务,定义ens34网卡IP为VIP
ipvsadm -a -t 192.168.204.200:80 -r 192.168.204.130 -m #添加RIP并指定工作模式为NAT
ipvsadm -a -t 192.168.204.200:80 -r 192.168.204.132 -m
ipvsadm -Ln #查看IPVS定义的规则
echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发
参数 | 说明 |
---|---|
-A | 添加一个虚拟服务 |
-t | 配置虚拟机服务器IP |
-s | 负载均衡调度算法 |
-a | 添加一台真实服务器 |
-r | 真实服务器IP |
-m | NAT工作模式 |
-C | 清除所有规则 |
-g | DR工作模式 |
-w | 权重 |
1.1.6浏览器访问测试
1.2LVS-DR实现
服务器 | DIP/RIP | VIP | Gateway |
---|---|---|---|
DS | 192.168.204.133 | 192.168.204.201 | 192.168.204.2 |
RS | 192.168.204.130 | 192.168.204.201 | 192.168.204.2 |
RS | 192.168.204.132 | 192.168.204.201 | 192.168.204.2 |
1.2.1在RS上配置
#设置arp的通告模式 通过VIP请求到DS
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#绑定VIP到网卡
ifconfig lo:0 192.168.204.201 broadcast 192.168.204.201 netmask 255.255.255.0 up
#添加主机路由
route add -host 192.168.204.201 dev lo:0
1.2.2在DS上配置
#配置DS上的VIP
ifconfig ens33:0 192.168.204.201 broadcast 192.168.204.201 netmask 255.255.255.0 up
#添加主机路由
route add -host 192.168.204.201 dev ens33:0
#配置转发规则
ipvsadm -C
ipvsadm -A -t 192.168.204.201:80 -s rr
ipvsadm -a -t 192.168.204.201:80 -r 192.168.204.130 -g
ipvsadm -a -t 192.168.204.201:80 -r 192.168.204.132 -g
1.2.3浏览器访问测试
2.使用HAproxy实现web服务器负载均衡
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAproxy的配置文件分成五部分内容,分别如下:
1.global: 设置全局配置参数,属于进程的配置,通常是和操作系统相关。
2.defaults:配置默认参数,这些参数可以被用到frontend, backend,Listen组件;
3.frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend;
4.backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;
5.Listen :frontend和backend的组合体。
HAproxy配置文件详解:
global # 全局参数的设置
log 127.0.0.1 local0 info
# log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志
user haproxy
group haproxy
# 设置运行haproxy的用户和组,也可使用uid,gid关键字替代之
daemon
# 以守护进程的方式运行
nbproc 16
# 设置haproxy启动时的进程数,根据官方文档的解释,我将其理解为:该值的设置应该和服务器的CPU核心数一致,即常见的2颗8核心CPU的服务器,即共有16核心,则可以将其值设置为:<=16 ,创建多个进程数,可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃。这里我设置为16
maxconn 4096
# 定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。
#ulimit -n 65536
# 设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行设置
pidfile /var/run/haproxy.pid
# 定义haproxy的pid
defaults # 默认部分的定义
mode http
# mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK
log 127.0.0.1 local3 err
# 使用127.0.0.1上的syslog服务的local3设备记录错误信息
retries 3
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
option httplog
# 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13:23:46] 日志服务器[127.0.0.1] 实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很简单。
option redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
option abortonclose
# 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull
# 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
option httpclose
# 这个参数我是这样理解的:使用该参数,每处理完一个request时,haproxy都会去检查http头中的Connection的值,如果该值不是close,haproxy将会将其删除,如果该值为空将会添加为:Connection: close。使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接。与该参数类似的另外一个参数是“option forceclose”,该参数的作用是强制关闭对外的服务通道,因为有的服务器端收到Connection: close时,也不会自动关闭TCP连接,如果客户端也不关闭,连接就会一直处于打开,直到超时。
contimeout 5000
# 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容
clitimeout 3000
# 设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容
srvtimeout 3000
# 设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容
listen status # 定义一个名为status的部分
bind 0.0.0.0:1080
# 定义监听的套接字
mode http
# 定义为HTTP模式
log global
# 继承global中log的定义
stats refresh 30s
# stats是haproxy的一个统计页面的套接字,该参数设置统计页面的刷新间隔为30s
stats uri /admin?stats
# 设置统计页面的uri为/admin?stats
stats realm Private lands
# 设置统计页面认证时的提示内容
stats auth admin:password
# 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
stats hide-version
# 隐藏统计页面上的haproxy版本信息
frontend http_80_in # 定义一个名为http_80_in的前端部分
bind 0.0.0.0:80
# http_80_in定义前端部分监听的套接字
mode http
# 定义为HTTP模式
log global
# 继承global中log的定义
option forwardfor
# 启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP
acl static_down nbsrv(static_server) lt 1
# 定义一个名叫static_down的acl,当backend static_sever中存活机器数小于1时会被匹配到
acl php_web url_reg /*.php$
#acl php_web path_end .php
# 定义一个名叫php_web的acl,当请求的url末尾是以.php结尾的,将会被匹配到,上面两种写法任选其一
acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$
#acl static_web path_end .gif .png .jpg .css .js .jpeg
# 定义一个名叫static_web的acl,当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾的,将会被匹配到,上面两种写法任选其一
use_backend php_server if static_down
# 如果满足策略static_down时,就将请求交予backend php_server
use_backend php_server if php_web
# 如果满足策略php_web时,就将请求交予backend php_server
use_backend static_server if static_web
# 如果满足策略static_web时,就将请求交予backend static_server
backend php_server #定义一个名为php_server的后端部分
mode http
# 设置为http模式
balance source
# 设置haproxy的调度算法为源地址hash
cookie SERVERID
# 允许向cookie插入SERVERID,每台服务器的SERVERID可在下面使用cookie关键字定义
option httpchk GET /test/index.php
# 开启对后端服务器的健康检测,通过GET /test/index.php来判断后端服务器的健康情况
server php_server_1 10.12.25.68:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2
server php_server_2 10.12.25.72:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup
# server语法:server [:port] [param*] # 使用server关键字来设置后端服务器;为后端服务器所设置的内部名称[php_server_1],该名称将会呈现在日志或警报中、后端服务器的IP地址,支持端口映射[10.12.25.68:80]、指定该服务器的SERVERID为1[cookie 1]、接受健康监测[check]、监测的间隔时长,单位毫秒[inter 2000]、监测正常多少次后被认为后端服务器是可用的[rise 3]、监测失败多少次后被认为后端服务器是不可用的[fall 3]、分发的权重[weight 2]、最后为备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器[backup]
backend static_server
mode http
option httpchk GET /test/index.html
server static_server_1 10.12.25.83:80 cookie 3 check inter 2000 rise 3 fall 3
---------------------
服务器 | IP | 部署的应用 | 项目 |
---|---|---|---|
web主服务器 | 192.168.204.130 | nginx+php-fpm | tp5shop |
数据库服务器 | 192.168.204.131 | mysql-boost | |
web备服务器 | 192.168.204.132 | nginx+php-fpm | tp5shop |
HAproxy服务器 | 192.168.204.133 | haproxy |
#开始前请关闭其他负载均衡调度工具
2.1在HAproxy服务器上安装haproxy
yum -y install haproxy
2.2修改haproxy配置文件
cd /etc/haproxy
cp haproxy.cfg haproxy.cfg.bak
vim haproxy.cfg
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4000 #优先级低
user haproxy
group haproxy
daemon #以后台形式运行ha-proxy
nbproc 2 #工作进程数量 cpu内核是几就写几
defaults
mode http #工作模式 http ,tcp 是 4 层,http是 7 层
log global
retries 3 #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
option redispatch #服务不可用后重定向到其他健康服务器。
maxconn 4000 #优先级中
contimeout 5000 #ha服务器与后端服务器连接超时时间,单位毫秒ms
clitimeout 50000 #客户端超时
srvtimeout 50000 #后端服务器超时
listen stats
bind *:81
stats enable
stats uri /haproxy #使用浏览器访问 http://192.168.246.169/haproxy,可以看到服务器状态
stats auth haproxy:123 #用户认证,客户端使用elinks浏览器的时候不生效
frontend web
mode http
bind *:80 #监听哪个ip和什么端口
option httplog #日志类别 http 日志格式
acl html url_reg -i \.html$ #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)
use_backend httpservers if html #2.如果满足acl html规则,则推送给后端服务器httpservers
default_backend httpservers #默认使用的服务器组
backend httpservers #名字要与上面的名字必须一样
balance roundrobin #负载均衡的方式
server http1 192.168.204.130:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 192.168.204.132:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
:wq
2.3启动HAproxy
systemctl start haproxy
2.4访问HAproxy服务器测试:查看请求是否由web主备服务器轮流响应
3.使用Nginx实现web服务器负载均衡
服务器 | IP | 部署的应用 | 项目 |
---|---|---|---|
web主服务器 | 192.168.204.130 | nginx+php-fpm | tp5shop |
数据库服务器 | 192.168.204.131 | mysql-boost | |
web备服务器 | 192.168.204.132 | nginx+php-fpm | tp5shop |
负载均衡服务器 | 192.168.204.133 | nginx |
#开始前请关闭其他负载均衡调度工具
3.1在负载均衡服务器上安装nginx
3.2修改nginx配置文件
1|vim /usr/local/nginx/conf/nginx.conf
#在http段添加如下配置
upstream shop {
server 192.168.204.130 #响应请求的后端服务器IP
server 192.168.204.132
}
#修改项目server段的配置
server {
listen 80;
server_name shop.lnmp.com;
location / {
proxy_pass http://shop; #当请求http://shop*时,根据上面定义的算法进行分发
proxy_set_header Host $host;
}
}
3.3启动nginx
systemctl start nginx
3.3修改客户端hosts文件,将shop.lnmp.com解析为负载均衡服务器IP
3.4浏览器访问测试