【Linux集群系列教程】HAProxy负载均衡集群
【Linux集群系列教程】HAProxy负载均衡集群
一、关于HAProxy
HAProxy
是一个开源的、高性能的、基于TCP
和HTTP
应用的负载均衡软件,借助HAProxy
可快速、可靠地提供基于TCP
和HTTP
应用的负载均衡解决方案
1.调度器类型
- 四层调度
- 仅能根据
IP地址
、端口号
进行调度 - LVS, nginx
- 仅能根据
- 七层调度
- 根据应用数据
HTTP协议
进行调度 - nginx
- 根据应用数据
2.HAProxy特性
- 可靠性和
稳定
性非常好 - 最高可以同时维护
40000
—50000
个并发连接,单位时间内处理的最大请求数为20000
个,最大数据处理能力可达10Gbps
- 支持多于
8种
负载均衡算法 ,同时也支持session
保持 - 支持
虚拟主机
功能 - 从
HAProxy 1.3
版本后开始支持连接拒绝、全透明代理等功能 HAProxy
拥有一个功能强大的服务器状态监控页面HAProxy
拥有功能强大的ACL
支持
3.HAProxy配置文件结构
- global
- 全局配置、进程数、日志等
- defaults
- 默认参数
- frontend
- 定义虚拟服务、调度算法
- backend
- 定义后端real server
- listen
- 配置监听、用于展示监控页面、用于配置虚拟服务
二、HAProxy配置文件解析
配置文件默认路径:
/etc/haproxy/haproxy.cfg
1.global
全局配置
global
nbproc 1 # 指定haproxy启动的进程数
maxconn 4096 # 最大连接数
user nobody # 指定haproxy进程启动的用户
group nobody
daemon # 后台启动
pidfile /usr/local/haproxy/logs/haproxy.pid
日志级别:
debug, info, notice, warn, error, alert, emercy
2.defaults
默认配置
defaults
timeout connect 10 # 连接real server的超时时间,单位毫秒
timeout client 20s # 连接客户端的超时时间
timeout server 30s # real server连接客户端的超时时间
3.frontend
定义虚拟服务
frontend xxxxx # 定义虚拟服务的名称
bind IP:port # 定义虚拟服务监听的IP及端口
mode {tcp|http} # 工作模式; http: 七层调度 tcp:四层调度
option forwardfor # 后端服务器记录日志时,记录真实客户端地址
option httpclose # 优化参数, 高并发场景下,haproxy会自动断开连接时间过长的客户端请求
use_backend XXX # 定义后端服务器
default_backend XXX # 定义默认后端服务器
4.backend
定义后端real server
backend xxxxxxx # 定义后端服务器的名称
mode {tcp|http}
option abortonclose # 优化参数, 高并发场景下让后端服务器自动结束处理时间较长的请求
option redispatch # 前端访问的时候,会检测后端服务器是否挂掉,如果挂掉会强制转向另一个没有挂掉的服务器上
cookie SERVERID # 植入cookie的时候,新增主机ID,让客户端访问的时候能找到刚刚访问的服务器
balance roundrobin # 调度算法
server web1 10.1.1.1:80 cookie s1 weight 6 check inter 2000 rise 2 fall 3
server web2 10.1.1.2:80 cookie s2 weight 6 check inter 2000 rise 2 fall 3
#cookie s1代表我们定义了一个名叫S1的主机ID,将来这个ID会加入到cookie里
#weight权重
#inter 2000 rise 2 fall 3 每2000毫秒,检测一次,如果超过3次无响应,则判定服务器已经挂掉,当服务器上线以后,超过2次回应,再上线服务器
A.支持的调度算法
roundrobin
基于权重进行轮询调度的算法static-rr
基于权重进行轮询调度的算法,不过此算法为静态算法,在运行时调整其服务器权重不会生效source
源hash
, 将同一个客户端的请求转发到同一个后端服务器leastconn
最少连接uri
此算法会对部分或整个URI
进行HASH
运算,再经过与服务器的总权重相除,最后转发到某台匹配的后端服务器上uri_param
此算法会根据URL
路径中的参数进行转发,这样可保证在后端真实服务器数据不变时,同一个用户的请求始终分发到同一台机器上
B.健康状态检测
server web1 10.1.1.1:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3
web1 #后端服务器名称
weight 6 #权重
check inter 2000 rise 2 fall 3 #定义健康状态检查参数
C.会话保持配置
cookie SERVERID
server ..... cookie server1 .......
服务器在给客户端响应时,要在响应数据中插入事先指定的serverid, 用于实现会话保持
option redispatch
此参数用于cookie保持的环境中。在默认情况下,HAProxy会将其请求的后端服务器的serverID插入cookie中,以保证会话的session持久性。而如果后端服务器出现故障,客户端的cookie是不会刷新的,这就会造成无法访问。此时,如果设置了此参数,就会将客户的请求强制定向到另外一台健康的后端服务器上,以保证服务正常
5.listen
配置监听
listen admin_status # 定义服务名称
bind 0.0.0.0:9188 # 服务监听的地址及端口
stats refresh 30s # 数据刷新的时间
stats uri /haproxy-status # 访问监控页面的uri地址
stats realm Welcome login # 用户名对话框提示信息
stats auth admin:admin # 认证的用户名、密码
stats hide-version # 监控页面不显示软件版本信息
三、HAProxy的ACL
功能
1.ACL
介绍
ACL
访问控制列表- 用于匹配
客户端
访问请求 - 只能应用在
frontend
、listen
中 - 作用:
- 访问控制
- 七层调度
2.ACL
语法
acl <acl名称> <匹配请求的方法> -i <具体条件>
-i
忽略大小写
3.常用ACL
方法
- hdr_reg(host)
- 以正则表达式的方式匹配主机名
acl test1 hdr_reg(host) -i www
- hdr_dom(host)
- 精确匹配主机名
acl test2 hdr_dom(host) -i music.linux.com
- hdr_beg(host)
- 匹配主机名以xxx开头
acl test3 hdr_beg(host) -i download.
- path_end
- url以xxxx结尾
acl test4 path_end -i .jpg .jpeg .gif .png
- path_beg
- url以xxxx开头
acl test5 path_beg -i https://
- url_ip
- 匹配数据目的IP
acl test5 url_ip 10.1.1.1
- src
- 匹配数据源IP
- method
- 匹配HTTP请求的方法;GET, POST
acl test7 method POST
示例1:实现七层调度
acl www_policy hdr_reg(host) -i ^(www.z.cn|z.cn)
acl bbs_policy hdr_dom(host) -i bbs.z.cn
acl url_policy url_sub -i buy_sid=
use_backend server_www if www_policy
use_backend server_app if bbs_policy
use_backend server_bbs if url_policy
示例2:实现七层调度
acl host_www hdr_beg(host) -i www
acl host_static hdr_beg(host) -i img. vedio. download. ftp.
use_backend static if host_static || host_www
示例3:实现数据过滤
acl forbidden_dst url_ip 192.168.0.0/16
acl forbidden_dst url_ip 172.16.0.0/12
acl forbidden_dst url_ip 10.0.0.0/8
http-request deny if forbidden_dst
示例4:实现数据过滤
acl allow_host src 192.168.200.150/32
http-request deny if ! allow_host
四、案例1:基于HAProxy
实现web
服务器调度
如图所示,需要准备
6
台虚拟机192.168.140.10
主调度器192.168.140.11
备用调度器192.168.140.12
,web1
服务器,跑着vedio
业务192.168.140.13
,web2
服务器,跑着vedio
业务192.168.140.14
,web3
服务器,跑着music
业务192.168.140.15
,web4
服务器,跑着music
业务
1.关闭防火墙和SElinux、设置时间同步!
请务必设置时间同步!防止出现
脑裂
现象!
2.配置虚拟网卡和静态IP
六台
虚拟机都要修改网卡模式为NAT
,默认NAT
模式下使用VMnet8
网卡
A.配置静态IP
过程省略
配置网卡教程:https://www.wsjj.top/archives/50
3.配置4
台web
服务器
192.168.140.12
,web1
服务器,跑着vedio
业务192.168.140.13
,web2
服务器,跑着vedio
业务192.168.140.14
,web3
服务器,跑着music
业务192.168.140.15
,web4
服务器,跑着music
业务
[root@node1 ~]# yum install -y httpd
[root@node2 ~]# yum install -y httpd
[root@node3 ~]# yum install -y httpd
[root@node4 ~]# yum install -y httpd
A.创建index
页面
[root@node1 ~]# vim /var/www/html/index.html
<h1>192.168.140.12 vedio</h1>
[root@node2 ~]# vim /var/www/html/index.html
<h1>192.168.140.13 vedio</h1>
[root@node3 ~]# vim /var/www/html/index.html
<h1>192.168.140.14 music</h1>
[root@node4 ~]# vim /var/www/html/index.html
<h1>192.168.140.15 music</h1>
B.启动httpd服务
[root@node1 ~]# systemctl enable --now httpd
[root@node2 ~]# systemctl enable --now httpd
[root@node3 ~]# systemctl enable --now httpd
[root@node4 ~]# systemctl enable --now httpd
C.浏览器测试访问
4.配置调度器
A.安装haproxy
[root@master01 ~]# yum install -y haproxy
[root@master02 ~]# yum install -y haproxy
B.在主
调度器修改配置文件
[root@master01 ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend web_service
bind 0.0.0.0:80 #监听地址为所有地址
mode http #使用7层调度
option forwardfor #优化参数
acl vedio_policy hdr_reg(host) -i vedio #配置页面规则,当用户输入的域名包含vedio
acl music_policy hdr_reg(host) -i music
use_backend vedio_server if vedio_policy #匹配到上面的vedio规则,访问vedio服务器
use_backend music_server if music_policy
default_backend vedio_server
backend vedio_server #配置组名vedio
mode http #7层调度
balance roundrobin
server vedio1 192.168.140.12:80 check inter 2000 fall 3 rise 2
server vedio2 192.168.140.13:80 check inter 2000 fall 3 rise 2
backend music_server
mode http
balance roundrobin
server music1 192.168.140.14:80 check inter 2000 fall 3 rise 2
server music2 192.168.140.15:80 check inter 2000 fall 3 rise 2
listen admin_status #配置状态页面
bind 0.0.0.0:8888 #配置监听IP和端口
mode http #使用7层调度
stats refresh 30s
stats uri /status #访问路径
stats realm please login #提示语句
stats auth admin:redhat #配置登录的账号和密码
stats hide-version #隐藏版本信息
启动主调度器上的HAProxy
[root@master01 ~]# systemctl start haproxy
[root@master01 ~]# systemctl enable haproxy
C.复制配置文件到备用调度器上
[root@master01 ~]# scp /etc/haproxy/haproxy.cfg root@192.168.140.11:/etc/haproxy/
D.启动备用调度器上的HAProxy
[root@master02 ~]# systemctl start haproxy
[root@master02 ~]# systemctl enable haproxy
5.两台调度器安装keepalived
用于实现
主备
的效果
[root@master01 ~]# yum install -y keepalived
[root@master02 ~]# yum install -y keepalived
A.配置主调度器上的keepalived
配置文件
[root@master01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id haproxy_master
}
vrrp_instance VI_1 {
state MASTER #主调度
interface ens33
virtual_router_id 51
priority 100 #默认权重(0-255)
advert_int 1
authentication {
auth_type PASS
auth_pass redhat
}
virtual_ipaddress {
192.168.140.100
}
}
启动主调度器keepalived服务
[root@master01 ~]# systemctl start keepalived
[root@master01 ~]# systemctl enable keepalived
B.修改备用调度器上的keepalived
配置文件
[root@master02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id haproxy_salve
}
vrrp_instance VI_1 {
state BACKUP #备用调度
interface ens33
virtual_router_id 51
priority 50 #修改权重
advert_int 1
authentication {
auth_type PASS
auth_pass redhat
}
virtual_ipaddress {
192.168.140.100
}
}
启动备用调度器keepalived
服务
[root@master02 ~]# systemctl start keepalived
[root@master02 ~]# systemctl enable keepalived
6.浏览器测试访问
A.修改Windows
上的hosts
文件
B.测试访问
C.测试status页面
随便一个
域名
都可以访问,这里的账号
和密码
,填写我们提前设置
好的
五、案例2:基于HAProxy
实现MySQL
调度
首先准备
2
台MySQL
服务器192.168.140.12
和192.168.140.13
并且配置数据库互主互从
策略
1.安装MySQL5.7
过程省略
MySQL安装教程:https://www.wsjj.top/archives/65
2.配置互主互从
环境
过程省略
MySQL主从配置教程:https://www.wsjj.top/archives/76
A.查看两台MySQL
数据库双主
状态
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.140.13
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master.000001
Read_Master_Log_Pos: 154
Relay_Log_File: node1-relay-bin.000002
Relay_Log_Pos: 361
Relay_Master_Log_File: master.000001
Slave_IO_Running: Yes #IO线程OK
Slave_SQL_Running: Yes #SQL线程OK
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 568
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 13
Master_UUID: fd95c20c-e40d-11ed-ab10-000c29d2b7fd
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set: ee0e03c2-e40d-11ed-b369-000c290f55d2:1-2
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.140.12
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master.000001
Read_Master_Log_Pos: 454
Relay_Log_File: node2-relay-bin.000002
Relay_Log_Pos: 661
Relay_Master_Log_File: master.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 454
Relay_Log_Space: 868
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 12
Master_UUID: ee0e03c2-e40d-11ed-b369-000c290f55d2
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: ee0e03c2-e40d-11ed-b369-000c290f55d2:1
Executed_Gtid_Set: ee0e03c2-e40d-11ed-b369-000c290f55d2:1
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
3.回到主调度器
修改HAProxy
配置文件
[root@master01 ~]# vim /etc/haproxy/haproxy.cfg #在配置文件底部新增内容
listen MySQL_service
bind 0.0.0.0:3306 #监听所有IP和3306端口
mode tcp #基于4层调度
balance source
server vedio1 192.168.140.12:3306 check inter 2000 fall 3 rise 2
server vedio2 192.168.140.13:3306 check inter 2000 fall 3 rise 2
4.重启主
调度器HAProxy
服务
[root@master01 ~]# systemctl restart haproxy.service
可以使用
netstat
查看是否启动,如果没有这条命令请安装yum install -y net-tools
[root@master01 ~]# netstat -tunlp | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 3974/haproxy
5.复制主
调度配置文件到备用
调度
[root@master01 ~]# scp /etc/haproxy/haproxy.cfg root@192.168.140.11:/etc/haproxy
重启备用调度
[root@master02 ~]# systemctl restart haproxy
6.访问测试
A.后台MySQL创建授权用户
因为配置了
双主
复制环境,所以任意
一台数据库都可以!
mysql> grant all on *.* to 'admin'@'192.168.140.%' identified by 'WWW.1.com';