8、负载均衡HAproxy部署
  Y7E16PKamNB6 2023年11月02日 43 0

8.1、基本环境说明:

 

服务器名(centos7)

ip地址

安装软件

slave-node1

172.16.1.91

haproxy1.8.15,tomcat8.5.37(8080、8081实例),JPress,jdk1.8

 

这里只介绍haproxy的部署,其它软件的部署本文就不赘述了。

 

8.2、编译安装haproxy:

1、安装依赖包:

[root@slave-node1 ~]# yum install openssl openssl-devel gcc pcre pcre-devel systemd-devel -y

 

2、下载软件包:

[root@slave-node1 ~]# cd /tools/

[root@slave-node1 tools]# wget https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.8.15.tar.gz/sha512/425e1f3a9ab2c2d09934c5d783ad986bd61a638ba6466dd15c20c5b6e7fc3dfad7c398e10bbd336a856ccad29bab0f23e4b9c3d0f17a54b86c8b917e4b974bcb/haproxy-1.8.15.tar.gz

 

3、编译安装haproxy:

[root@slave-node1 tools]# tar -xzf haproxy-1.8.15.tar.gz

[root@slave-node1 tools]# cd haproxy-1.8.15/

[root@slave-node1 haproxy-1.8.15]# uname -r

3.10.0-862.el7.x86_64

[root@slave-node1 haproxy-1.8.15]# make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1

#通过查看系统的内核版本可知TARGET=linux310;如果内核大于2.6.28的可以使用TARGET=linux2628;

#USE_SYSTEMD=1为支持使用 -Ws 参数(systemd-aware master-worker 模式)启动Haproxy,从而实现单主进程多子进程运行模式;

[root@slave-node1 haproxy-1.8.15]# make install PREFIX=/application/haproxy-1.8.15/

[root@slave-node1 haproxy-1.8.15]# ln -s /application/haproxy-1.8.15/ /application/haproxy

[root@slave-node1 haproxy-1.8.15]# ln -s /application/haproxy/sbin/haproxy /usr/sbin/haproxy

#启动脚本中(BIN=/usr/sbin/$BASENAME)会用到 /usr/sbin/haproxy 文件。

[root@slave-node1 haproxy-1.8.15]# haproxy -v

HA-Proxy version 1.8.15 2018/12/13

Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>

[root@slave-node1 haproxy-1.8.15]# cd ~

 

8.3、启动脚本:

[root@slave-node1 ~]# cp -a /tools/haproxy-1.8.15/examples/haproxy.init /etc/init.d/haproxy

# config: /etc/haproxy/haproxy.cfg #/etc/haproxy/是存放配置文件目录的,该目录不存在需要创建。

# pidfile: /var/run/haproxy.pid #该/var/run/是存放pid文件的,该目录存在,不需要创建。

[root@slave-node1 ~]# chmod 755 /etc/init.d/haproxy

 

8.4、配置文件:

1、创建haproxy用户:

[root@slave-node1 ~]# useradd -M -s /sbin/nologin haproxy

 

2、创建存放配置文件的目录:

[root@slave-node1 ~]# mkdir -p /etc/haproxy/

 

3、创建存放socket文件的目录:

[root@slave-node1 ~]# mkdir -p /var/lib/haproxy/

 

4、配置文件(基于source算法解决session问题):

[root@slave-node1 ~]# vim /etc/haproxy/haproxy.cfg

global

#全局配置,属于进程级的配置,和操作系统有关

log 127.0.0.1 local3 info

############################################################

#haproxy的日志输出和级别{err|waning|info|debug}

#指定使用127.0.0.1上的syslog服务中的local3日志设备,记录日志等级为info的日志

############################################################

chroot /var/lib/haproxy

#haproxy的工作目录;

pidfile /var/run/haproxy.pid

#守护进程方式下的pid文件存放位置;

maxconn 100000

#最大连接数;

user haproxy

group haproxy

#haproxy进程使用的用户和组,也可以使用uid,gid关键字替代;

daemon

#以守护进程的方式运行;

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin

stats timeout 2m

#定义统计信息保存的位置,主要用于动态管理haproxy;

nbproc 1

#进程数,一般是服务器的核心数;

 

defaults

#默认配置,作用下面的listen,frontend,backend组件,如果下面组件有相同的配置,

#则会覆盖defaults的配置;

mode http

#{tcp|http|health},tcp是4层,http是7层,health是健康检查,只会返回OK;

log global

#引入global模块中定义的日志格式;

option httplog

#日志类别为http日志格式;

option dontlognull

#如果产生了一个空连接,那这个空连接的日志将不会记录;

option http-server-close

############################################################

#打开http协议中服务器端关闭功能,使得支持长连接,使得会话

#可以被重用;

############################################################

option forwardfor except 127.0.0.0/8

#haproxy后端服务器获取客户端的真实ip;

option redispatch

############################################################

#当haproxy后端服务器挂掉,haproxy将用户的访问转移到一个健

#康的后端服务器;

############################################################

retries 3

############################################################

#向haproxy后端服务器尝试连接的最大次数,超过此值就认为后

#端服务器不可用;

############################################################

timeout http-request 10s

#客户端发送http请求haproxy的超时时间;

timeout queue 1m

############################################################

#当haproxy后端服务器在高负载响应时,把haproxy发送来的

#请求放进队列中的超时时间;

############################################################

timeout connect 10s

#haproxy与后端服务器连接超时时间;

timeout client 1m

#定义客户端与haproxy的非活动连接的超时时间;

timeout server 1m

#定义haproxy与后端服务器非活动连接的超时时间;

timeout http-keep-alive 10s

#保持tcp的长连接,减少tcp重复连接的次数;

timeout check 10s

#健康监测超时时间;

maxconn 100000

#最大连接数;

 

listen stats

#监听haproxy实例状态配置,定义一个名为stats的部分

bind 172.16.1.91:9999

#定义监听的套接字

stats enable

#开启监听统计页面

stats refresh 30s

#设置统计页面的刷新间隔为30s

stats uri /haproxy-status

#设置统计页面的访问地址为http://172.16.1.91:9999/haproxy-status

stats auth haproxy:123456

#设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可

stats hide-version

#隐藏统计页面上的haproxy版本信息

stats realm "Private lands"

#设置统计页面认证时弹出对话框的提示内容

 

frontend frontend_www_example_com

#接收请求的前端虚拟节点配置;

bind 0.0.0.0:80

default_backend backend_www_example_com

 

backend backend_www_example_com

#后端服务器集群配置;

option forwardfor header X-REAL-IP

#获取客户端的真实ip

option httpchk HEAD / HTTP/1.0

#健康检查

balance source

#是基于请求源IP的算法,会不公平,但是能解决session问题;

server web-node1 172.16.1.91:8080 check inter 2000 rise 3 fall 2 weight 1

############################################################

#server:定义后端真实服务器;

#web-node1:定义后端服务器的名称,可以随意写;

#172.16.1.91:8080:后端服务器的ip及端口号;

#check inter 2000:开启对后端服务器健康检查的功能,时间间隔为2s;

#rise:后端服务器从故障状态转换至正常状态需要成功检查的次数;

#fall:后端服务器从正常状态转换为不可用状态需要检查的次数;

#weight:后端服务器的权重,默认1,最大256,0不参与负载均衡;

############################################################

server web-node2 172.16.1.91:8081 check inter 2000 rise 3 fall 2 weight 1

 

5、配置文件说明:

(1)frontend配置说明:

frontend frontend_www_liu_com

#定义一个名为frontend_www_liu_com的前端部分

bind 0.0.0.0:80

#frontend_www_liu_com定义前端部分监听的套接字

acl www_chang_com hdr_dom(host) -i www.chang.com

#定义一个名叫www_chang_com的acl,当使用www.chang.com域名访问时会被匹配到,-i 表示忽略域名大小写。

use_backend backend_www_chang_com if www_chang_com

#如果满足策略www_chang_com时,就将请求交予backend_www_chang_com

default_backend backend_www_liu_com

#如果不满足acl策略时,就将请求交予backend_www_liu_com

 

(2)Backend 配置说明(基于source算法解决session问题):

1)通过监听端口进行健康检查:

这种检测方式,haproxy 只会去检查后端 server 的端口,并不能保证服务的真正可用

backend backend_www_chang_com

option forwardfor header X-REAL-IP

#获取客户端的真实ip

option httpchk

#基于端口进行检查

balance source

#基于请求源IP的算法

server web-node1 172.16.1.91:8080 check inter 2000 rise 3 fall 2 weight 1

server web-node2 172.16.1.92:8080 check inter 2000 rise 3 fall 2 weight 1 back

 

server语法:

server [:port] [param*]

server:使用server关键字来设置后端服务器;

web-node2:为后端服务器所设置的内部名称,该名称将会呈现在日志或警报中;

172.16.1.92:8080:后端服务器的IP地址,支持端口映射;

check:接受健康监测;

inter 2000:监测的间隔时长,单位毫秒;

rise 3:监测正常多少次后被认为后端服务器是可用的;

fall 2:监测失败多少次后被认为后端服务器是不可用的;

weight 1:分发的权重;

back:备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器。

2)通过url获取进行健康检查:

这种检测方式,通过GET后端server的web页面,基本上可以代表后端服务的可用性

backend backend_www_liu_com

option forwardfor header X-REAL-IP

option httpchk GET /index.html

balance source

server web-node1 172.16.1.93:8080 check inter 2000 rise 3 fall 2 weight 1

3)通过head消息头进行健康检查,只需加入下面一行参数即可:

option httpchk HEAD / HTTP/1.0

 

8.5、配置haproxy日志:

1、确保安装了rsyslog软件:

[root@slave-node1 ~]# rpm -q rsyslog

rsyslog-8.24.0-16.el7.x86_64

[root@slave-node1 ~]# systemctl start rsyslog.service

[root@slave-node1 ~]# systemctl enable rsyslog.service

 

2、配置/etc/rsyslog.conf参数:

(1)将如下两行注释打开:

$ModLoad imudp

$UDPServerRun 514

[root@slave-node1 ~]# sed -i 's@\#\$ModLoad imudp@\$ModLoad imudp@g' /etc/rsyslog.conf

[root@slave-node1 ~]# sed -i 's@\#\$UDPServerRun 514@\$UDPServerRun 514@g' /etc/rsyslog.conf

 

(2)添加haproxy日志收集设备参数到/etc/rsyslog.conf文件:

[root@slave-node1 ~]# echo "local3.* /var/log/haproxy.log" >> /etc/rsyslog.conf

 

(3)重启rsyslog服务:

[root@slave-node1 ~]# systemctl restart rsyslog.service

 

8.6、启动haproxy:

[root@slave-node1 ~]# /etc/init.d/haproxy start

Starting haproxy (via systemctl): [ 确定 ]

[root@slave-node1 ~]# netstat -tunlp | grep haproxy

8、负载均衡HAproxy部署_服务器

 

8.7、启动tomcat多实例:

[root@slave-node1 ~]# for n in {0..1};do su - tomcat /application/tomcat-808$n/bin/startup.sh;sleep 10s;done

[root@slave-node1 application]# netstat -tunlp | egrep "8080|8081"

8、负载均衡HAproxy部署_tomcat_02

 

8.8、访问haproxy统计界面:

1、http://172.16.1.91:9999/haproxy-status

8、负载均衡HAproxy部署_tomcat_03

 

2、统计界面:

8、负载均衡HAproxy部署_服务器_04

 

8.9、访问负载均衡器:

8、负载均衡HAproxy部署_tomcat_05

测试方法为:将tomcat8080实例干掉,发现还能够访问web服务,说明haproxy负载均衡服务搭建成功。

 

8.10、验证日志:

[root@slave-node1 ~]# tail -3 /var/log/haproxy.log

8、负载均衡HAproxy部署_服务器_06

 

8.11、haproxy动态维护:

1、确保/etc/haproxy/haproxy.cfg配置文件中的global下有如下配置:

stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin

stats timeout 2m

 

2、安装socat:

该软件是用来和socket文件进行通讯的。

(1)安装:

[root@slave-node1 ~]# yum install socat -y

 

(2)查看关于haproxy的帮助:

[root@slave-node1 ~]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock

 

(3)查看 haproxy 状态信息,可以通过zabbix来监控相关的状态值:

[root@slave-node1 ~]# echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock

8、负载均衡HAproxy部署_tomcat_07

8、负载均衡HAproxy部署_后端服务_08

 

3、haproxy维护模式:

(1)关闭backend_www_example_com下的web01-node1,即tomcat8080实例:

[root@slave-node1 ~]# echo "disable server backend_www_example_com/web-node1" | socat stdio /var/lib/haproxy/haproxy.sock

 

查看状态:

8、负载均衡HAproxy部署_服务器_09

在web服务器是维护状态下可以对web服务进行配置。

 

(2)启动backend_www_example_com下的web01-node1,即tomcat8080实例:

说明:此操作对现有的server生效,不支持新增加节点。

[root@slave-node1 ~]# echo "enable server backend_www_example_com/web-node1" | socat stdio /var/lib/haproxy/haproxy.sock

 

查看状态:

8、负载均衡HAproxy部署_tomcat_10

 

8.12、补充:

1、haproxy的本地端口会出现用尽的情况,解决办法如下:

(1)调整文件描述符大小:

echo '* - nofile 65535' >>/etc/security/limits.conf

ulimit -SHn 65535

ulimit -n

 

(2)内核参数设置:

1)配置内核参数:

cat >>/etc/sysctl.conf<<EOF

net.ipv4.tcp_tw_reuse = 1

net.ipv4.ip_local_port_range = 1024 65535

EOF

 

说明:

net.ipv4.tcp_tw_reuse = 1

# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。

net.ipv4.ip_local_port_range = 1024 65535

#指定外部连接的端口范围。默认值为32768 61000

2)内核参数生效:

sysctl -p

 

2、haproxy和nginx的比较:

8、负载均衡HAproxy部署_后端服务_11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  ehrZuhofWJiC   2024年05月17日   33   0   0 服务器linux
Y7E16PKamNB6