欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

haproxy

程序员文章站 2022-05-07 16:28:42
...

在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
haproxy

然后就能看到页面了:

haproxy

web1,web2就是刚刚起的名字,也是RIP的信息。

直接访问172.16.12.115

haproxy
能看到RIP的测试页。

并且进入浏览器的F12查看属性

haproxy找到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

haproxy
看到web1服务先变成黄色然后变成红色。证明故障了。

haproxy
访问也切换成另一个。

再加两个方式:

(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

测试:

先是都可用的:

haproxy

[aaa@qq.comjq-nginx2 html]# mv check.txt check.txt.bak
删除RIP2 的文件

haproxyweb2的就变成了红色

配置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>

haproxy

haproxy

做一波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了

相关标签: 集群