集群-HAproxy
集群-HAproxy
在centos7环境,使用haproxy部署LB集群:
haproxy提供负载均衡功能
既可以做四层代理,又可以做七层代理。
nginx
既可以做四层代理,又可以做七层代理。
用nginx做七层代理应用比较多
nginx做四层代理,版本>=1.10
LVS纯粹的四层代理。
四层代理: 通过数据包(报文)中的目标地址和端口,再加上相应的路由算法,进行RIP的分配。
七层代理: 通过数据包(报文)中请求的应用层的具体内容进行分配。
nginx 静态web
tomcat1 tomcat2 动态web
请求的过程:
client -DGW-> haproxy --> web --> haproxy -DGW-> client
访问过程和响应过程都要经过haproxy。
在效率上,不如LVS
1-3千万的PV(Page View),还是可以搞定的。
HAproxy会话保持:
Cookie
Nginx
iphash会话保持
Lvs会话保持
持久化连接
网站性能的参考指标
独立ip,独立访客,页面浏览量
实验准备:
haproxy1 172.16.0.71
RIP1 172.16.0.91
RIP2 172.16.0.92
四层代理
1. 安装haproxy
安装haproxy需要的C语言环境
[root@haproxy1 ~]# yum install -y gcc gcc-c++
下载haproxy的安装包
[root@haproxy1 ~]# lftp 172.16.0.99
lftp 172.16.0.99:~> cd tar
cd ok, cwd=/tar
lftp 172.16.0.99:/tar> get haproxy-1.6.4.tar.gz
解压haproxy.tar,到指定安装目录
[root@haproxy1 ~]# tar zxf haproxy-1.6.4.tar.gz -C /usr/local/src/
[root@haproxy1 ~]# cd /usr/local/src/haproxy-1.6.4/
[root@haproxy1 /usr/local/src/haproxy-1.6.4]# make TARGET=3100 ARCH=x86_64
make 编译
TARGET 指定内核版本
ARCH 指定CPU指令集
跟其它的 安装包不同,haproxy是在安装时指定安装路径,而且make和install时拆开写的
[root@haproxy1 /usr/local/src/haproxy-1.6.4]# make PREFIX=/usr/local/haproxy install
[root@haproxy1 /usr/local/haproxy]# ls
doc sbin share
初始化配置:
添加一个haproxy用户
[root@haproxy1 ~]# groupadd -g 188 haproxy
[root@haproxy1 ~]# useradd haproxy -u 188 -g 188 -d /var/lib/haproxy -s /sbin/nologin
创建haproxy需要的文件夹,命令文件夹,配置文件夹,日志文件夹
[root@haproxy1 ~]# cd /usr/local/haproxy/
[root@haproxy1 /usr/local/haproxy]# mkdir -p bin conf logs var/{run,chroot}
包转发
[root@haproxy1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@haproxy1 ~]# sysctl -p
配置文件
四层代理:
[root@haproxy1 /usr/local/haproxy]# vim conf/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
#最大并发数 根据硬件性能设置,10240不是固定的
spread-checks 3
#健康检查
nbproc 2
#默认开启的进程数,<=CPU的线程数 线程数多少就设置几
defaults
log global
#日志,使用全局配置的日志配置
retries 3
#健康检查的重试次数
option redispatch
#允许重新分配RIP;
timeout connect 10000
#连接超时,毫秒;client成功连接到一台server最长的等待时间
timeout client 300000
#客户端超时;client发送数据时最长的等待时间
timeout server 300000
#服务器超时;server响应client,进行数据发送的最长等待时间
listen testssh
#配置具体的服务
bind *:80
#使用的端口
mode tcp
#工作模式,四层
balance roundrobin
#路由算法,轮询
timeout connect 15s
#连接超时时间
timeout server 15s
#服务器超时时间
server ssh1 172.16.0.91:22 check port 22 inter 5000 fall 3
server ssh2 172.16.0.92:22 check port 22 inter 5000 fall 3
#2个RIP的配置
ssh1 自定义的名字 ip:port 健康检查 22端口是否存活,检查的间隔,毫秒 检查次数 3次
配置日志:
[root@haproxy1 ~]# vim /etc/rsyslog.conf
15 $ModLoad imudp
16 $UDPServerRun 514
17 local0.* /usr/local/haproxy/logs/haproxy.log
[root@haproxy1 ~]# systemctl restart rsyslog
[root@haproxy1 ~]# netstat -anupl | grep rsyslogd
udp 0 0 0.0.0.0:514 0.0.0.0:* 1390/rsyslogd
udp6 0 0 :::514 :::* 1390/rsyslogd
启动haproxy
启动haproxy:
[root@haproxy1 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf
检查配置文件的语法
[root@haproxy1 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf -D
启动
[root@haproxy1 ~]# netstat -antp | grep haproxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1401/haproxy
连接测试:
[root@RIP1 ~]# echo 123 | passwd --stdin root
[root@RIP2 ~]# echo 234 | passwd --stdin root
[root@centos7-bj ~]# ssh -p 80 172.16.0.71
Are you sure you want to continue connecting (yes/no)? yes
root@172.16.0.71's password: 123
输入密码123进入RIP1
15s无操作,断开
[root@centos7-bj ~]# ssh -p 80 172.16.0.71
root@172.16.0.71's password: 234
输入密码234进入RIP2
以上是四层代理
七层代理:
修改配置文件
[root@haproxy1 /usr/local/haproxy]# vim conf/haproxy.conf
global
chroot /usr/local/haproxy/var/chroot
daemon
user haproxy
group haproxy
log 127.0.0.1:514 local0 warning
pidfile /usr/local/haproxy/var/run/haproxy.pid
maxconn 10240
spread-checks 3
nbproc 1
defaults
log global
retries 3
option redispatch
timeout connect 10000
timeout client 300000
timeout server 300000
listen testweb <---改
bind *:80
mode http <---改
stats enable <---添加
stats hide-version <---添加
stats uri /admin?status <---添加
stats auth admin:123456 <---添加
balance roundrobin
option httpclose <---添加
option forwardfor <---添加
cookie SERVERID insert indirect <---添加
timeout connect 15s
timeout server 15s
server web1 172.16.0.91:80 cookie A check port 80 inter 5000 fall 3 <---改
server web2 172.16.0.92:80 cookie B check port 80 inter 5000 fall 3 <---改
安装psmisc是为了安装killall命令
# yum install -y psmisc
重启
杀掉进程
[root@haproxy1 /usr/local/haproxy]# killall haproxy
[root@haproxy1 /usr/local/haproxy]# netstat -antp | grep haproxy
启动服务
[root@haproxy1 /usr/local/haproxy]# ./sbin/haproxy -f conf/haproxy.conf
[root@haproxy1 /usr/local/haproxy]# ./sbin/haproxy -f conf/haproxy.conf -D
启动haproxy提示warning没事,不是error就行
测试:
节点状态查看:http://172.16.0.71/admin?status
用户名:admin
密码:123456
访问:http://172.16.0.71/
- 给编译安装haproxy写一个启动脚本
[root@haproxy1 ~]# vim haproxyd
#!/bin/bash
# haproxy's scripts
BaseDir="/usr/local/haproxy"
Cmd="${BaseDir}/sbin/haproxy"
Conf="${BaseDir}/conf/haproxy.conf"
Pid="${BaseDir}/var/run/haproxy.pid"
start () {
$Cmd -f $Conf
if [ $? -eq 0 ]
then
$Cmd -f $Conf -q -D #-q 静默执行
else
exit 1
fi
}
stop () {
rpm -q psmisc &> /dev/null
if [ $? -ne 0 ]
then
yum install -y psmisc &> /dev/null
fi
/usr/bin/killall haproxy
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
netstat -antp | grep haproxy &> /dev/null
if [ $? -eq 0 ]
then
echo "haproxy is running."
else
echo "haproxy is not running."
fi
;;
*)
echo "please use {start|stop|restart|status}"
exit 9
;;
esac
2. 故障测试
配置健康检查:
[root@RIP1 ~]# systemctl stop httpd
(1)使用测试文件,用GET的方式
(2)使用测试页,用访问的方式
[root@haproxy1 ~]# vim /usr/local/haproxy/conf/haproxy.conf
......
option httpchk HEAD /check.html HTTP/1.0
option httpchk GET /check.txt
server web1 172.16.0.91:80 cookie A check port 80 inter 5000 fall 3
server web2 172.16.0.92:80 cookie B check port 80 inter 5000 fall 3
[root@RIP1 /var/www/html]# touch check.txt
[root@RIP1 /var/www/html]# echo check1 > check.html
[root@RIP2 /var/www/html]# touch check.txt
[root@RIP2 /var/www/html]# echo check2 > check.html
[root@haproxy1 ~]# ./haproxyd restart
配置sorry server:
编辑haproxy.conf配置文件
[root@haproxy1 ~]# vim /usr/local/haproxy/conf/haproxy.conf
server web1 172.16.0.91:80 cookie A check port 80 inter 5000 fall 3
server web2 172.16.0.92:80 cookie B check port 80 inter 5000 fall 3
server web3 172.16.14.21:80 cookie C check port 80 inter 5000 fall 3 backup <---添加这一个行就是sorry页面
[root@haproxy1 ~]# ./haproxyd restart
配置haproxy的HA:
克隆前边的haproxy
用keepalive。
[root@haproxy1 ~]# yum install -y keepalived
[root@haproxy2 ~]# yum install -y keepalived
[root@haproxy1 ~]# cd /etc/keepalived/
[root@haproxy1 /etc/keepalived]# ls
keepalived.conf
[root@haproxy1 /etc/keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id haproxyHA_xxs
}
vrrp_script check_run {
script "/root/check_haproxy.sh"
interval 2
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 105
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass haproxyHA
}
track_script {
check_run
}
virtual_ipaddress {
172.16.0.70 dev ens32 label ens32:0
}
}
健康检查的脚本
[root@haproxy1 ~]# vim check_haproxy.sh
#!/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
[root@haproxy1 ~]# scp check_haproxy.sh 172.16.0.72:/root/
[root@haproxy1 ~]# scp /etc/keepalived/keepalived.conf 172.16.0.72:/etc/keepalived/
[root@haproxy1 ~]# systemctl start keepalived
[root@haproxy2 ~]# systemctl start keepalived
两台就是高可用,不怕坏了