设为首页 收藏本站
查看: 1334|回复: 0

[经验分享] 负载均衡之Haproxy安装配置篇

[复制链接]

尚未签到

发表于 2019-1-2 07:26:24 | 显示全部楼层 |阅读模式
  
目前市场上,有关实现负载均衡的软件,使用比较多的是haproxy、nginx和lvs。
首先,介绍一下:什么是负载均衡?负载均衡一般通过两种方式来实现:基于操作系统的负载实现和基于第三方应用的负载实现。LVS就是基于Linux操作系统实现的一种负载,HAProxy就是开源的并且基于第三应用实现的负载。
两者之间的不同:LVS的特点是:
1、抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低;
2、工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
HAProxy的特点是:
1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2、haproxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理。当haproxy运行在硬件上,完全可以支持数以万计的并发连接。
介绍完基本知识,让我们开始学习haprxoy这款软件。
一、HAProxy介绍
反向代理服务器,支持双机热备,支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。
二、HAProxy的优点
1、免费开源,可靠性与稳定性都非常出色,可与硬件级设备媲美
2、支持连接拒绝,可以用于防止DDoS***
3、支持长连接、短连接和日志功能,可根据需要灵活配置
4、路由HTTP请求到后端服务器,基于cookie作会话绑定;同时支持通过获取指定的url来检测后端服务器的状态
5、HAProxy还拥有功能强大的ACL支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便
6、可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能
7、拥有功能强大的后端服务器的状态监控web页面,可以实时了解设备的运行状态,还可实现设备上下线等简单操作。
8、支持多种负载均衡调度算法,并且也支持session保持。
三、配置文件介绍
haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。

3.1 配置文件格式
HAProxy的配置处理3类来主要参数来源:
——最优先处理的命令行参数;
——“global”配置段,用于设定全局配置参数;
——proxy相关配置段,如“defaults”、“listen”、“frontend”和“backend”;
3.2 时间格式
一些包含了值的参数表示时间,如超时时长。这些值一般以毫秒为单位,但也可以使用其它的时间单位后缀。
3.3 全局配置
* 进程管理及安全相关的参数
– chroot :修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
– daemon:让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
– gid :以指定的GID运行haproxy,建议使用专用于运行haproxy的GID,以免因权限问题带来风险;
– group :同gid,不过指定的组名;
– log [max level [min level]]:定义全局的syslog服务器,最多可以定义两个;
– log-send-hostname []:在syslog信息的首部添加当前主机名,可以为“string”指定的名称;
– nbproc :指定启动的haproxy进程的个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
– uid:以指定的UID身份运行haproxy进程;
– ulimit-n:设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个;
– user:同uid,但使用的是用户名;
– stats:用户访问统计数据的接口;
– node:定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时;
– description:当前实例的描述信息;
* 性能调整相关的参数
– maxconn :设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
– maxpipes :haproxy使用pipe完成基于内核的tcp报文重组,此选项则用于设定每个进程所允许使用的最大pipe个数;每个pipe会打开两个文件描述符,因此,“ulimit -n”自动计算时会根据需要调大此值;默认为maxconn/4,其通常会显得过大;
3.4 代理
代理相关的配置可以如下配置段中。
defaults”段用于为所有其它配置段提供默认参数,这默认配置参数可由下一个“defaults”所重新设定。
“frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
“backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
“listen”段通过关联“frontend”和“backend”定义了一个完整的代理,通常只对TCP流量有用。
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写。
四、配置案例

一个最简单的http服务的配置

global
log 127.0.0.1
local2chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option  httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s     #在客户端建立连接但不请求数据时,关闭客户端连接
timeout queue 1m                # 等待最大时长
timeout connect 10s     # 定义haproxy将客户端请求转发至后端服务器所等待的超时时长
timeout client 1m        # 客户端非活动状态的超时时长
timeout server 1m        # 客户端与服务器端建立连接后,等待服务器端的超时时长
timeout http-keep-alive 10s   # 定义保持连接的超时时长
timeout check 10s            # 健康状态监测时的超时时间,过短会误判,过长资源消耗
maxconn 3000                # 每个server最大的连接数
frontend webser         #webser为名称
option forwardfor
bind *:80    #自定义监听端口
default_backend app
backend app
balance roundrobin #使用roundrobin 算法
server app1 192.168.159.120:80 check
server app2 192.168.159.121:80 check
动静分离示例

frontend  webservs
bind *:80
acl  url_static  path_beg  -i  /static/images/javascript/stylesheets
acl  url_static  path_end  -i  .jpg.gif.png.css.js.html
acl   url_php   path_end  -i   .php
acl  host_static  hdr_beg(host)  -i img. imgs. video. videos.  ftp.  image.  download.
use_backend static   if   url_static   or  host_static
use_backend  dynamic   if  url_php
default_backend  dynamic
backend    static
balance   roundrobin
server  node1  192.168.159.120:80  check  maxconn   3000
backend   dynamic
balance  roundrobin
server   node2   192.168.159.121:80   check    maxconn   1000
五、HAProxy+Keepalived实现高可用负载均衡
下图描述了使用keepalived+Haproxy主从配置来达到能够针对前段流量进行负载均衡到多台后端web1、web2、web3、img1、img2。但是由于haproxy会存在单点故障问题,因此使用keepalived来实现对Haproxy单点问题的高可用处理。
DSC0000.jpg

一、环境准备:

centos系统服务器4台、两台用于做haproxy主从架构,两台作为后端server,服务器配置好
yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信。
1、准备四台主机:
一台Director-master,DIP:192.168.159.151 VIP:172.17.253.115(桥接模式和仅主机模式)
一台Director-backup,DIP:192.168.159.129 VIP:172.17.253.115(桥接模式和仅主机模式)
一台后台服务器,RIP:192.168.159.120 仅主机模式
一台后台服务器,RIP:192.168.159.121 仅主机模式
二、安装步骤:

1、iptables -F && setenforing 清空防火墙策略,关闭selinux
2、两台服务器Director-master和Director-backup都使用yum方式安装haproxy、keepalived服务
或编译安装:tar zxvf haproxy-1.4.8.tar.gz
cd haproxy-1.4.8
uname -a    //查看linux内核版本
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
3、后端服务器配置好基于LNMP架构的web服务
三、修改配置文件:
1.修改/etc/keepalived/keepalived.conf配置文件内容
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@magedu.com
smtp_server 127.0.0.1
smtp_connect_timeout 5
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 23
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass riqi
}
virtual_ipaddress {
172.17.253.115
}
}
启动服务:systemctl start keepalived
2、配置日志服务
vim /etc/rsyslog.conf
$ModLoad imudp    开启UDP的日志服务,也可以开启TCP
$UDPServerRun 514
local2.* /var/log/haproxy.log  定义日志标准
systemctl restart rsyslog  重启日志服务
3、在haproxy-master上操作haproxy配置文件,定义全局配置
vim /etc/haproxy/haproxy.conf
global#全局配置
log        127.0.0.1 local2  #日志类型
chroot      /var/lib/haproxy  #修改haproxy的工作目录
pidfile    /var/run/haproxy.pid  #进程id
maxconn    4000      #最大连接数
user        haproxy    #运行用户
group      haproxy    #所属组
daemon    #让haproxy以守护进程的方式工作
defaults
mode                    http    #实现http的七层协议
log                    global  #日志定义,沿用global的日志文件
option                  httplog  #启用日志记录http请求
option                  dontlognull#日志将不会记录空连接
option http-server-close#强制短连接
option forwardfor      except 127.0.0.0/8  #添加xforward日志标记
option                  redispatch#出错时重新分配
retries                3#重试次数
timeout http-request    10s#请求超时时间
timeout queue          1m#队列超时
timeout connect        10s#连接超时
timeout client          1m#客户端超时
timeout server          1m#服务端超时
timeout http-keep-alive 10s#持久连接
timeout check          10s#检查超时
maxconn                3000#最大连接
listen stats                #定义一个统计报告服务
mode http                  #基于http服务
bind 0.0.0.0:1080          #1080端口的全局监听
stats enable #开启统计报告服务
stats hide-version #隐藏统计报告版本信息
stats uri  /haproxyadmin#统计报告访问url   (假若想访问监控界面:配置stats uri  /haproxy项,重启服务:访问地址为:本机IP地址:PORT或URL)
stats realm Haproxy\ Statistics #页面登陆信息
stats auth admin:admin #验证账号信息
stats admin if TRUE #验证模式
frontend    web#定义一系列监听套接字
bind      *:80
#acl url_static      path_beg      -i /static /images /javascript /stylesheets
#acl url_static      path_end      -i .jpg .gif .png .css .js
#use_backend static          if url_static
default_backend              lnmpserver
backend lnmpserver
balance    roundrobin
option      httpchk /index.php  检查页面
server      lnmpserver1 192.168.159.120:80 check inter 3000 rise 3 fall 3
server      lnmpserver2 192.168.159.121:80 check inter 3000 rise 3 fall 3
启动服务:systemctl start haproxy
netstat -nult 出现1080端口
开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
3、在haproxy-backup上操作:
修改/etc/keepalived/keepalived.conf配置文件内容
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@magedu.com
smtp_server 127.0.0.1
smtp_connect_timeout 5
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 23
priority 88
advert_int 1
authentication {
auth_type PASS
auth_pass riqi
}
virtual_ipaddress {
172.17.253.115
}
}
启动服务:systemctl start keepalived
vim /etc/haproxy/haproxy.conf
global#全局配置
log        127.0.0.1 local2  #日志类型
chroot      /var/lib/haproxy  #修改haproxy的工作目录
pidfile    /var/run/haproxy.pid  #进程id
maxconn    4000      #最大连接数
user        haproxy    #运行用户
group      haproxy    #所属组
daemon    #让haproxy以守护进程的方式工作
defaults
mode                    http    #实现http的七层协议
log                    global  #日志定义,沿用global的日志文件
option                  httplog  #启用日志记录http请求
option                  dontlognull#日志将不会记录空连接
option http-server-close#强制短连接
option forwardfor      except 127.0.0.0/8  #添加xforward日志标记
option                  redispatch#出错时重新分配
retries                3#重试次数
timeout http-request    10s#请求超时时间
timeout queue          1m#队列超时
timeout connect        10s#连接超时
timeout client          1m#客户端超时
timeout server          1m#服务端超时
timeout http-keep-alive 10s#持久连接
timeout check          10s#检查超时
maxconn                3000#最大连接
listen stats                #定义一个统计报告服务
mode http                  #基于http服务
bind 0.0.0.0:1080          #1080端口的全局监听
stats enable #开启统计报告服务
stats hide-version #隐藏统计报告版本信息
stats uri /haproxyadmin#统计报告访问url
stats realm Haproxy\ Statistics #页面登陆信息
stats auth admin:admin #验证账号信息
stats admin if TRUE #验证模式
frontend    web#定义一系列监听套接字
bind      *:80
#acl url_static      path_beg      -i /static /images /javascript /stylesheets
#acl url_static      path_end      -i .jpg .gif .png .css .js
#use_backend static          if url_static
default_backend              lnmpserver
backend lnmpserver
balance    roundrobin
option      httpchk /index.php  检查页面
server      lnmpserver1 192.168.159.120:80 check inter 3000 rise 3 fall 3
server      lnmpserver2 192.168.159.121:80 check inter 3000 rise 3 fall 3
启动服务:systemctl start haproxy
netstat -nult 出现1080端口和80端口
开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
4、测试
测试keepalived高可用:当主服务器正常工作时,VIP在主服务器上,当关闭主服务器的keepalived服务,VIP会漂移到从服务器上,而且网站照常可以访问。(关闭主服务器后IP漂移,可查看ip add)
访问:http://172.17.253.115:1080/haproxyadmin
DSC0001.jpg

  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658439-1-1.html 上篇帖子: haproxy各应用场景配置实例 下篇帖子: 使用Haproxy搭建负载均衡高可用群集
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表