haproxy
在centos7环境,使用haproxy部署LB集群:
haproxy提供负载均衡功能
- 既可以做四层代理,又可以做七层代理。
nginx
- 既可以做四层代理,又可以做七层代理。
- 用nginx做七层代理应用比较多
- nginx做四层代理,版本>=1.10
LVS纯粹的四层代理。
四层代理:通过数据包(报文)中的目标地址和端口,再加上相应的路由算法,进行RIP的分配。
七层代理:通过数据包(报文)中请求的应用层的具体内容进行分配。
- nginx 静态web
- tomcat1 tomcat2 动态web
请求的过程:
- client -DGW-> haproxy --> web --> haproxy -DGW-> client
- 在效率上,不如LVS
- 1-3千万的PV(Page View),还是可以搞定的。
会话保持:
- Cookie
Haproxy:172.16.12.115
RIP1:172.16.12.104
RIP2:172.16.12.105
Haproxy:
1、安装几个包:
[aaa@qq.comhaproxy ~]# yum install -y gcc gcc-c++
haproxy下载地址:http://download.openpkg.org/components/cache/haproxy/
haproxy-1.6.4.tar.gz
解压->进解压目录
[aaa@qq.comhaproxy haproxy-1.6.4]# make TARGET=3100 ARCH=x86_64
[aaa@qq.comhaproxy haproxy-1.6.4]# make PREFIX=/usr/local/haproxy install
[aaa@qq.comhaproxy haproxy-1.6.4]# cd /usr/local/haproxy/
[aaa@qq.comhaproxy haproxy]# ls
doc sbin share
2、初始化配置:
[aaa@qq.comhaproxy haproxy]# groupadd haproxy -g 188
[aaa@qq.comhaproxy haproxy]# useradd haproxy -u 188 -g 188 -d /var/lib/haproxy -s /sbin/nologin
[aaa@qq.comhaproxy haproxy]# vim /etc/sysctl.conf
[aaa@qq.comhaproxy haproxy]# sysctl -p
net.ipv4.ip_forward = 1
[aaa@qq.comhaproxy haproxy]# mkdir bin conf logs var/{run,chroot} -p
RIP1和RIP2:
1、安装nginx
用的是nginx做webserver。
2、改端口和测试页:
8000端口
server {
listen 8000;
server_name localhost;
location / {
root html;
index index.html index.htm check.html;
}
测试页:
[aaa@qq.comjq-nginx1 ~]# cat /usr/local/nginx/html/index.html
<h1>172.16.12.104:8000<h1>
四层代理:
[aaa@qq.com haproxy]# cd conf/
[aaa@qq.com conf]# ls
[aaa@qq.com conf]# vim haproxy.conf
global //全局配置
chroot /usr/local/haproxy/var/chroot //切换根,保护当前的系统
daemon //以守护进程的方式运行haproxy
user haproxy //
group haproxy //运行守护进程的用户和组
log 127.0.0.1:514 local0 warning //日志的配置,接收日志的IP:端口 产生日志的设备
pidfile /usr/local/haproxy/var/run/haproxy.pid //pid文件
maxconn 10240 //最大并发数,要根据硬件资源和需求设置
spread-checks 3 //健康检查
nbproc 2 //默认开启的进程数,<=CPU的线程数
defaults
log global //日志,使用全局配置的日志配置
retries 3 //健康检查的重试次数
option redispatch //允许重新分配RIP
timeout connect 10000 //连接超时,毫秒;client成功连接到一台server最长的等待时间
timeout client 30000 //客户端超时;client发送数据时最长的等待时间
timeout server 30000 //服务器超时;server响应client,进行数据发送的最长等待时间
listen testssh //配置具体的服务
bind *:80 //haproxy使用的端口
mode tcp //工作模式,四层
balance roundrobin //路由算法,轮询
timeout connect 15s //连接超时时间
timeout server 15s //服务器超时时间
server ssh1 172.16.12.104:22 check port 22 inter 5000 fall 3
server ssh2 172.16.12.105:22 check port 22 inter 5000 fall 3
//2个RIP的配置
//ssh1 自定义的名字 ip:port 健康检查 22端口是否存活,检查的间隔,毫秒 检查次数 3次
日志的配置:
[aaa@qq.comhaproxy conf]# vim /etc/rsyslog.conf
允许514端口接收使用UDP协议转发过来的日志
$ModLoad imudp
$UDPServerRun 514
local0.* /usr/local/haproxy/logs/haproxy.log
[aaa@qq.comhaproxy conf]# systemctl restart rsyslog.service
[aaa@qq.comhaproxy conf]# netstat -antlup | grep rsys
udp 0 0 0.0.0.0:514 0.0.0.0:* 2380/rsyslogd
udp6 0 0 :::514 :::* 2380/rsyslogd
看到514端口
启动haproxy
[aaa@qq.comhaproxy conf]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf
[aaa@qq.comhaproxy conf]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf -D
[aaa@qq.comhaproxy conf]# netstat -antlup | grep haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2402/haproxy
开一台机器测试:
[aaa@qq.comjq-c6-nfs ha.d]# ssh -p 80 172.16.12.115
aaa@qq.com172.16.12.115's password:
There were 2 failed login attempts since the last successful login.
Last login: Fri Dec 27 00:47:19 2019 from 172.16.12.1
[aaa@qq.comjq-nginx1 ~]# exit
logout
Connection to 172.16.12.115 closed.
[aaa@qq.comjq-c6-nfs ha.d]# ssh -p 80 172.16.12.115
aaa@qq.com172.16.12.115's password:
Last login: Fri Dec 27 00:02:04 2019 from 172.16.12.1
[aaa@qq.comjq-nginx2 ~]# exit
logout
Connection to 172.16.12.115 closed.
都连接172.16.12.115 端口80,输入不同的密码访问不同的RIP。
并且:15s无操作,断开
七层代理:
该配置文件
[aaa@qq.comhaproxy conf]# vim haproxy.conf
listen testweb
bind *:80
mode http
stats enable
stats hide-version
stats uri /admin?status
stats auth admin:000000
balance roundrobin
option httpclose
option forwardfor
cookie SERVERID insert indirect
timeout connect 15s
timeout server 15s
server web1 172.16.12.104:8000 cookie A check port 8000 inter 5000 fall 3
server web2 172.16.12.105:8000 cookie B check port 8000 inter 5000 fall 3
前边都不用动,只是listen的变了。
安装psmisc包
[aaa@qq.comhaproxy conf]# yum install psmisc -y
这个包有几个命令 比如:killall
等等。
关掉服务:
[aaa@qq.comhaproxy conf]# killall haproxy
[aaa@qq.comhaproxy conf]# netstat -antlup | grep haproxy
启动服务:重新加载配置文件
[aaa@qq.comhaproxy conf]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf -D
[WARNING] 360/023539 (2453) : Proxy 'testweb': in multi-process mode, stats will be limited to process assigned to the current request.
这个wring 不要紧,服务已经启动了。
[aaa@qq.comhaproxy conf]# netstat -antlup | grep haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2454/haproxy
浏览器输入地址http://IP/admin?status
后边的就是在配置文件中写的那些。
然后输入用户名和密码。也会是配置文件中的
admin:000000
然后就能看到页面了:
web1,web2就是刚刚起的名字,也是RIP的信息。
直接访问172.16.12.115
能看到RIP的测试页。
并且进入浏览器的F12查看属性
找到coockie那里能够看到A
就是设置的coockie的名字。web1的
启动比较麻烦,可以写一个脚本来实现:
[aaa@qq.comhaproxy ~]# vim haproxyd
#!/bin/bash
## Haproxy 的快速启动和关闭
haproxyhome="/usr/local/haproxy"
haprun="${haproxyhome}/sbin/haproxy"
hconf="/usr/local/haproxy/conf/haproxy.conf"
start () {
${haprun} -f ${hconf} &> /dev/null
if [ $? -eq 0 ]
then
${haprun} -f ${hconf} -q -D
fi
}
stop () {
rpm -q psmisc &> /dev/null
if [ $? -ne 0 ]
then
yum install psmisc -y &> /dev/null
fi
/usr/bin/killall haproxy &> /dev/null
}
status () {
netstat -antlup | grep haproxy &> /dev/null
if [ $? -eq 0 ]
then
echo "haproxy is running..."
else
echo "haproxy is filed.."
fi
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "haproxyd use in {start|stop|restart|status}"
exit 1
;;
esac
[aaa@qq.comhaproxy ~]# ./haproxyd start
[aaa@qq.comhaproxy ~]# ./haproxyd status
haproxy is running...
[aaa@qq.comhaproxy ~]# ./haproxyd sakgjb
haproxyd use in {start|stop|restart|status}
ok了
故障测试:
停掉一个nginx
看到web1服务先变成黄色然后变成红色。证明故障了。
访问也切换成另一个。
再加两个方式:
(1)使用测试文件,用GET的方式
(2)使用测试页,用访问的方式
timeout server 15s
option httpchk HEAD /check.html HTTP/1.0
option httpchk GET /check.txt
##这两行
server web1 172.16.12.104:8000 cookie A check port 8000 inter 5000 fall 3
[aaa@qq.comjq-nginx1 ~]# cd /usr/local/nginx/html/
[aaa@qq.comjq-nginx1 html]# ls
50x.html check.html check.txt index.html
[aaa@qq.comjq-nginx1 html]# cat check.html
<h1>RIP1 nginx 172.16.12.104<h1>
[aaa@qq.comjq-nginx1 html]# cat check.txt
check.txt 172.16.12.104
重启服务:
[aaa@qq.comhaproxy ~]# ./haproxyd restart
测试:
先是都可用的:
[aaa@qq.comjq-nginx2 html]# mv check.txt check.txt.bak
删除RIP2 的文件
web2的就变成了红色
配置sorry server:
配置文件最下边加上这个。
server web3 172.16.12.23:8000 cookie C check port 8000 inter 5000 fall 3 backup
最后加上backup
sorry页是所有web都出现错误时才会显示的。
[aaa@qq.comjq-c6-nfs html]# cat index.html
<h1>172.16.12.104 and 172.16.12.105 is dead<h1>
做一波HA:
[aaa@qq.comhaproxy ~]# yum install -y keepalived
[aaa@qq.comhaproxy2 ~]# yum install -y keepalived
开机自启动:
[aaa@qq.comhaproxy2 ~]# echo "/root/haproxyd start" >> /etc/rc.local
[aaa@qq.comhaproxy2 ~]# chmod +x /etc/rc.local
和这个类似:https://blog.csdn.net/n_u_l_l_/article/details/103670830
这里就放脚本吧:
#!/bin/bash
# haproxy的健康检查脚本
GW="172.16.0.254"
CHECK_TIME=3
function check_haproxy_health () {
# 三层检查
ping -W 1 -c1 $GW &> /dev/null
if [ $? -eq 0 ]
then
# 四层检查
netstat -antp | grep haproxy &> /dev/null
if [ $? -eq 0 ]
then
HaProxy_OK=1
else
HaProxy_OK=0
fi
else
HaProxy_OK=0
fi
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME-=1"
check_haproxy_health
if [ $HaProxy_OK -eq 1 ]
then
CHECK_TIME=0
exit
fi
if [ $HaProxy_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
systemctl stop keepalived
exit 1
fi
sleep 1
done
[aaa@qq.comhaproxy ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.115 netmask 255.255.0.0 broadcast 172.16.255.255
inet6 fe80::20c:29ff:fe8c:1ff1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:8c:1f:f1 txqueuelen 1000 (Ethernet)
RX packets 4776 bytes 2285392 (2.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2991 bytes 367795 (359.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.12.110 netmask 255.255.255.255 broadcast 0.0.0.0
ether 00:0c:29:8c:1f:f1 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 8 bytes 536 (536.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 536 (536.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
看到浮动IP基本就是OK了
上一篇: github SSH生成公钥
下一篇: 使用Git创建项目
推荐阅读
-
Haproxy 五个配置部分详解
-
linux服务器之LVS、Nginx和HAProxy负载均衡器对比总结
-
使用haproxy实现负载均衡集群
-
haproxy+keepalived实现高可用负载均衡(实例配置)
-
Heartbeat、haproxy及MySQL双主复制实现读写负载均衡及高可用详细教程
-
Linux系统下使用HAProxy配置HTTP负载均衡系统的方法
-
linux服务器之LVS、Nginx和HAProxy负载均衡器对比总结
-
haproxy+keepalived实现高可用负载均衡(理论篇)
-
【高并发解决方案】7、HAProxy安装和配置
-
高可用负载均衡服务器实现(keepalived+haproxy)