软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡
apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。
负载均衡是通过OSI协议对应的
7层负载均衡:用的7层http协议,
4层负载均衡:用的是tcp协议加端口号做的负载均衡
ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。
•支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
•支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
•性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。
•拥有一个功能出色的监控页面,实时了解系统的当前状况。
•功能强大的ACL支持,给用户极大的方便。
1.roundrobin
基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整.不过在设计上,每个后端服务器仅能最多接受4128个连接
2.static-rr
基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制
3.leastconn
新的连接请求被派发至具有最少连接数目的后端服务器.
Keepalived + Haproxy
/etc/haproxy/haproxy.cfg
global //关于进程的全局参数
log 127.0.0.1 local2 info #日志服务器
pidfile /var/run/haproxy.pid #pid文件
maxconn 4000 #最大连接数
user haproxy #用户
group haproxy #组
daemon #守护进程方式后台运行
nbproc 1 #工作进程数量 cpu内核是几就写几
defaults 用于为其它配置段提供默认参数
listen 是frontend和backend的结合体
frontend 虚拟服务VIrtual Server
backend 真实服务器Real Server
实验准备俩台提供后端服务页面的nginx服务器,一台安装haproxy的服务器。这台服务器就是负载均衡,客户端通过访问这台负载均衡服务器来访问后端页面
安装haproxy服务器:192.168.231.190
后端服务器:192.168.231.185
192.168.231.183
- 服务器1:
- yum -y install nginx
-
- echo "server--1" > /usr/share/nginx/html/index.html
-
- systemctl start nginx
-
-
-
- 服务器2:
- yum -y install nginx
-
- echo "server--2" > /usr/share/nginx/html/index.html
-
- systemctl start nginx
- 安装haproxy
- yum -y install haproxy
-
- 修改haproxy的配置文件
- vim /etc/haproxy/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 1 #工作进程数量 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
- stats auth qianfeng:123
- 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.231.185:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
- server http2 192.168.231.183:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
haproxy的监控端口是80,与后端nginx的端口重复,更改配置文件,
listen stats
bind *.90
#check inter 2000 检测心跳频率
#rise 2 2 次正确认为服务器可用
#fall 2 2 次失败认为服务器不可用
systemctl start haproxy
由于设置的权重是相同的 因此会各自访问一次
后端提供服务的服务器:
192.168.231.185
192.168.231.183
负载均衡服务器:
192.168.231.190
192.168.231.191
- 实验步骤:
- 在俩台后端服务器上 都进行相同操作
- yum -y install nginx
-
- echo "server--1" > /usr/share/nginx/html/index.html
-
- systemctl start nginx
- 俩台负载均衡服务器都进行操作:
- yum -y install haproxy
-
- vim /etc/haproxy/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 1 #工作进程数量 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
- stats auth qianfeng:123
- 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.231.185:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
- server http2 192.168.231.183:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
- 负载均衡服务器进行相同操作:
- yum -y install keepalived
-
- 修改配置文件,在第一台负载均衡服务器上
- vim /etc/keepalived/keepalived.conf
-
- ! Configuration File for keepalived
-
- global_defs {
- router_id director1
- }
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 80
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.231.66/24
- }
- }
-
-
- 修改第二台负载均衡服务器的配置文件
- vim /etc/keepalived/keepalived.conf
-
- ! Configuration File for keepalived
-
- global_defs {
- router_id directory2
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- nopreempt
- virtual_router_id 80
- priority 50
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.231.66/24
- }
- }
-
这里定义的master的负载均衡服务器是192.168.231.190
定义的backup的负载均衡服务器是192.168.231.191
定义的虚拟ip是192.168.231.66
因此用户访问时访问的就是192.168.231.66
然后负载均衡服务器均启动keepalived,此时的虚拟ip 在master服务器上
systemctl start keepalived
两台机器都做
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived
写一个脚本,然后在keepalived的配置文件内引用
- a. script 这是脚本内容
- [root@ha-proxy-master ~]# cat /etc/keepalived/check_haproxy_status.sh
-
- #!/bin/bash /usr/bin/curl -I http://localhost &>/dev/null
- if [ $? -ne 0 ];then
- # /etc/init.d/keepalived stop
- systemctl stop keepalived
- fi
-
-
-
- [root@ha-proxy-master ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh
-
- b. keepalived使用script
- [root@ha-proxy-master keepalived]# vim keepalived.conf
-
- ! Configuration File for keepalived
- global_defs {
- router_id director1
- }
- vrrp_script check_haproxy {
- script "/etc/keepalived/check_haproxy_status.sh"
- interval 5
- }
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 80
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.231.66/24
- }
- track_script {
- check_haproxy
- }
- }
将脚本复制到backup服务器,然后修改backup的keepalived的配置文件
- [root@ha-proxy-slave keepalived]# vim keepalived.conf
- ! Configuration File for keepalived
-
- global_defs {
- router_id directory2
- }
- vrrp_script check_haproxy {
- script "/etc/keepalived/check_haproxy_status.sh"
- interval 5
- }
-
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- nopreempt
- virtual_router_id 80
- priority 50
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.231.66/24
- }
- track_script {
- check_haproxy
- }
- }
- [root@ha-proxy-master keepalived]# systemctl restart keepalived
- [root@ha-proxy-slave keepalived]# systemctl restart keepalived
- 注:必须先启动haproxy,再启动keepalived
- [root@ha-proxy-master ~]# vim /etc/rsyslog.conf
- # Provides UDP syslog reception #由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
- $ModLoad imudp
- $UDPServerRun 514
- 找到 #### RULES #### 下面添加
- local2.* /var/log/haproxy.log
- [root@ha-proxy-master ~]# systemctl restart rsyslog
- [root@ha-proxy-master ~]# systemctl restart haproxy
-
- [root@ha-proxy-master ~]# tail -f /var/log/haproxy.log