集群-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
[email protected]'s password: 123
输入密码123进入RIP1

15s无操作,断开

[root@centos7-bj ~]# ssh -p 80 172.16.0.71
[email protected]'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/


  1. 给编译安装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

两台就是高可用,不怕坏了

发布了57 篇原创文章 · 获赞 3 · 访问量 995

猜你喜欢

转载自blog.csdn.net/weixin_42502744/article/details/103711662