1.项目介绍:

上上期我们实现了keepalived主从高可用集群网站架构,随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务,此时需要做7层规则负载均衡,运维总监要求,能否用一种服务同既能实现七层负载均衡,又能实现四层负载均衡,并且性能高效,配置管理容易,而且还是开源。

四层和七层负载均衡的区别:

四层:

通过分析IP层及TCP/UDP层的流量实现的基于"IP+端口"的负载均衡。

七层:

可以根据内容,再配合负载均衡算法来选择后端服务器,不但可以根据"ip+端口"方式进行负载分流,还可以根据网站的URL,访问域名,浏览器类别,语言等决定负载均衡的策略。

七层负载均衡模式下,负载均衡与客户端及后端的服务器会分别建立一次TCP连接,而在四层负载均衡模式下(DR),仅建立一次TCP连接;七层负载均衡对负载均衡设备的要求更高,处理能力也低于四层负载均衡。

场景说明

在企业生产环境中,每天会有很多的需求变更,比如增加服务器、新业务上线、url路由修改、域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首选指标。在企业中,稳定压倒一切,与其搞得很复杂,经常出问题,不如做的简单和稳定。

在企业中,90%以上的故障,来源于需求变更。可能是程序bug,也可能是人为故障,也可能是架构设计问题等等。

前端负载均衡设备为重中之重,在软件选型上一定充分考虑,能满足业务的前提下,尽可能降低复杂度,提高易维护性。

2.模块讲解:

Haproxy是什么

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高性能性、负载均衡,以及基于TCP和HTTP的应用程序代理。相较与 Nginx,HAProxy 更专注与反向代理,因此它可以支持更多的选项,更精细的控制,更多的健康状态检测机制和负载均衡算法。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter在内众多知名网站,及亚马逊网络服务系统都使用了HAProxy。

Haproxy的特性

1、可靠性与稳定性都非常出色,可与硬件级设备媲美。

2、支持连接拒绝,可以用于防止DDoS攻击

3、支持长连接、短连接和日志功能,可根据需要灵活配置

4、路由HTTP请求到后端服务器,基于cookie作会话绑定;同时支持通过获取指定

的url来检测后端服务器的状态

5、HAProxy还拥有功能强大的ACL支持,可灵活配置路由功能,实现动静分离,

在架构设计与实现上带来很大方便

6、可支持四层和七层负载均衡,几乎能为所有常见的服务提供负载均衡功能

7、拥有功能强大的后端服务器的状态监控web页面,可以实时了解设备的运行状态,还可实现设备上下线等简单操作。

8、支持多种负载均衡调度算法,并且也支持session保持

3.实战演练

实验:实现基于Haproxy+Keepalived负载均衡高可用架构

一、环境准备:

centos系统服务器4台、两台用于做haproxy主从架构,两台作为后端server,服务器配置好

yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信

机器名称

IP配置

服务角色

备注

haproxy-server-master

VIP:172.17.253.100

DIP:172.17.253.132

负载均衡器

开启路由功能

配置keepalived

haproxy-server-master

VIP:172.17.253.100

DIP:172.17.252.162

负载均衡器

开启路由功能

配置keepalived

rs1

RIP:172.17.251.236

后端服务器

网关指向DIP(桥接)

rs2

RIP:172.17.251.237

后端服务器

网关指向DIP(桥接)

二、安装步骤:

1、iptables -F && setenforing 清空防火墙策略,关闭selinux

2、拿两台服务器都使用yum方式安装haproxy、keepalived服务

3、后端服务器配置好基于LNMP架构的web服务

三、修改配置文件:

1.修改/etc/keepalived/keepalived.conf配置文件内容

在haproxy-server-master上

  1. vim /etc/keepalived/keepalived.conf
  2.  
  3. global_defs {
  4.  
  5. notification_email {
  6.  
  7. root@localhost
  8.  
  9. }
  10.  
  11. notification_email_from root@mingming.com
  12.  
  13. smtp_server 127.0.0.1
  14.  
  15. smtp_connect_timeout 30
  16.  
  17. router_id keepalived_lvs
  18.  
  19. }
  20.  
  21. vrrp_instance VI_1 {
  22.  
  23. state MASTER
  24.  
  25. interface ens33
  26.  
  27. virtual_router_id 55
  28.  
  29. priority 100
  30.  
  31. advert_int 1
  32.  
  33. authentication {
  34.  
  35. auth_type PASS
  36.  
  37. auth_pass mingming
  38.  
  39. }
  40.  
  41. virtual_ipaddress {
  42.  
  43. 172.17.253.100
  44.  
  45. }
  46.  
  47. }

在haproxy-server-backup上

  1. global_defs {
  2.  
  3. notification_email {
  4.  
  5. root@localhost
  6.  
  7. }
  8.  
  9. notification_email_from root@mingming.com
  10.  
  11. smtp_server 127.0.0.1
  12.  
  13. smtp_connect_timeout 30
  14.  
  15. router_id keepalived_lvs
  16.  
  17. }
  18.  
  19. vrrp_instance VI_1 {
  20.  
  21. state BACKUP
  22.  
  23. interface eth1
  24.  
  25. virtual_router_id 55
  26.  
  27. priority 98
  28.  
  29. advert_int 1
  30.  
  31. authentication {
  32.  
  33. auth_type PASS
  34.  
  35. auth_pass mingming
  36.  
  37. }
  38.  
  39. virtual_ipaddress {
  40.  
  41. 172.17.253.100
  42.  
  43. }
  44.  
  45. }

2.修改主haproxy配置文件主要是listen,frontend和backend段

在haproxy-server-master上

vim /etc/haproxy/haproxy.cfg

listsen段

  1. listen stats
  2.  
  3. bind 0.0.0.0:1080
  4.  
  5. stats enable
  6.  
  7. stats uri /haproxyadmin
  8.  
  9. stats auth admin:admin
  10.  
  11. stats admin if TRUE

frontend段

  1. frontend web
  2.  
  3. bind *:80
  4.  
  5. default_backend lnmp-server

backend段

  1. backend lnmp-server
  2.  
  3. balance roundrobin
  4.  
  5. option httpchk GET /index.html
  6.  
  7. server webserver1 172.17.251.236:80 check inter 3000 rise 3 fall 5
  8.  
  9. server webserver1 172.17.251.237:80 check inter 3000 rise 3 fall 5

在haproxy-server-backup上和在haproxy-server-master上haproxy配置文件的配置是一样的

然后在haproxy-server-master上和在haproxy-server-backup上都开启keepalived和haproxy服务,会发现vip漂移到haproxy-server-backup上(因为haproxy-server-master上keepalived的配置文件中优先级高),而且haproxy-server-master和haproxy-server-backup上haproxy服务都监听了1080端口和80端口

四,检验高可用效果

1.客户端先访问一下vip,成功访问小米网站

2.在haproxy-server-master上停掉keepalived服务,会发现vip漂移到haproxy-server-backup上,客户端依旧能够访问vip,访问小米网站,实现了高可用

3.关闭后端一台服务器的web服务,观察haproxy健康状态监测

4.企业级应用

Haproxy访问控制ACL应用

haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性。其配置法则通常分为两步,首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端。

定义ACL的语法格式如下:

acl <aclname> <criterion> [flags] [operator] <value> ...

<aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;

<criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];

[flags]:常见haproxy的acl支持的标志位有3个:

-i:不区分<value>中模式字符的大小写;

-f:从指定的文件中加载模式;

--:标志符的强制结束标记,在模式中的字符串像标记符时使用;

<value>:acl测试条件常见的值有以下四类:

整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;

字符串:支持使用"-i"以忽略字符大小写,支持使用"\"进行转义;如果在模式首部出现了-i,可以在其之前使用"--"标志位;

正则表达式:其机制类同字符串匹配;

IP地址及网络地址

同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:"与"(默认即为与操作)、"或"(使用"||"操作符)以及"非"(使用"!"操作符)。

Haproxy进行安全加固

通过ACL限制用户请求速率

be_sess_rate(backend) <integer>

be_sess_rate 测试标准

用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为。例如:

backend dynamic

mode http

acl being_scanned be_sess_rate gt 100

redirect location /denied.html if being_scanned

通过ACL指定可访问的用户(定义到frontend段中)

阻断非指定请求

在传输层获取样本,通常是TCP/IP 协议的IP和端口,以及建立连接速率等等。而且此部分样本通常用于

"tcp-request connection"指令中的规则之中。

dst : ip #目标地址

dst_port : integer

src : ip #源地址

src_port : integer

#阻断来自非指定IP的访问80端口的请求

acl myhost src 172.16.100.1

acl myport dst_port 80

tcp-request connection reject if !myhost myport

#还可以用block

block if ! myhost myport

Haproxy实现动静分离功能(在frontend段中定义)

根据用户访问内容实现动静分离

path_beg <string>

用于测试请求的URL是否以<string>指定的模式开头。下面的例子用于测试URL是否以/static、

/images、/javascript或/stylesheets头。

acl url_static path_beg -i /static /images /javascript /stylesheets

path_end <string>

用于测试请求的URL是否以<string>指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾。

acl url_static path_end -i .jpg .gif .png .css .js

根据用户访问内容实现动静分离配置实例

frontend http-in

bind *:80

log global

option httpclose

acl url_static path_beg -i /static /images /javascript /stylesheets

acl url_static path_end -i .jpg .jpeg .gif .png .css .js

use_backend static_servers if url_static

default_backend dynamic_servers

backend static_servers

balance roundrobin

server imgsrv1 172.16.200.7:80 check maxconn 6000

server imgsrv2 172.16.200.8:80 check maxconn 6000

backend dynamic_servers

balance source

server websrv1 172.16.200.7:80 check maxconn 1000

server websrv2 172.16.200.8:80 check maxconn 1000

Haproxy实现浏览器控制(在frontend段中定义)

hdr_reg <string>正则匹配请求内容,匹配后可做对应的操作

#阻断火狐浏览器发送的请求

acl firefox hdr_reg(User-Agent) -i .*firefox.*

block if firefox

#将IE用户请求分配到静态服务器

acl ie_useragent hdr_reg(User-Agent) -i .*ie.*

use_backend static_servers if ie_useragent

Haproxy实现真实日志记录

option forwardfor

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]

允许在发往服务器的请求首部中插入"X-Forwarded-For"首部。

<network>:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。

<name>:可选参数,可使用一个自定义的首部,如"X-Client"来替代"X-Forwarded-For"。有些独特的web服务

器的确需要用于一个独特的首部。

if-none:仅在此首部不存在时才将其添加至请求报文问道中。

HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,"X-Forwarded-For"首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。

需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。

下面是一个例子。

frontend www

mode http

option forwardfor except 127.0.0.1

在haproxy的配置文件中默认就有此选项

在nginx的主配置文件中也默认有此选项

Haproxy实现会话保持

一、源地址hash(用户IP识别)

Haroxy 将用户IP经过hash计算后 指定到固定的真实服务器上(类似于nginx 的IP hash 指令)。

缺点:当后端一台服务器挂了以后会造成部分session丢失

示例:

backend SOURCE_srv

mode http

balance source

server app-node1 10.31.1.179:80 check port 80 inter 3000 rise 3 fall 3

server app-node2 10.31.1.191:80 check port 80 inter 3000 rise 3 fall 3

server app-node3 10.31.0.35:80 check port 80 inter 3000 rise 3 fall 3

二、cookie 识别

haproxy 将WEB服务端返回给客户端的cookie中插入haproxy中特定的字符串(或添加前缀)在后端的服

务器COOKIE ID。

backend COOKIE_srv

mode http

cookie SERVERID insert indirect nocache

server app-node1 10.31.1.179:80 check port 80 cookie a inter 3000 rise 3 fall 3

server app-node2 10.31.1.191:80 check port 80 cookie b inter 3000 rise 3 fall 3

server app-node3 10.31.0.251:80 check port 80 cookie c inter 3000 rise 3 fall 3

在LB1上配置好HAProxy后,LB1将接受用户的所有请求。如果一个用户请求不包含任何cookie,那这个请求将被HAProxy转发到一台可用的WEB服务器。可能是webA,webB,webC。然后HAProxy将把处理这个请求的WEB服务器的cookie值插入到请求响应中。如SERVERID=A。当这个客户端再次访问并在HTTP请求头中带有SERVERID=A,HAProxy将会把它的请求直接转发给webA处理。在请求到达webA之前,cookie将被移除,webA将不会看到这个cookie。如果webA不可用,对应的请求将被转发到其他可用的WEB服务器,相应的cookie值也将被重新设置。

Haproxy性能优化参数

option redispatch:当server对应的服务器挂掉后,强制定向到其他健康的服务器

option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。

retries 3 : //3次连接失败就认为服务器不可用,主要通过后面的check检查

maxconn 30000 : //代理时所能接受的最大并发连接数,应该要比后端主机的并发总和要小

好了,今天的内容就到这里,下期再见。

实现基于Haproxy+Keepalived负载均衡高可用架构的更多相关文章

  1. Nginx+Keepalived负载均衡高可用

    Nginx+Keepalived负载均衡高可用方案: Nginx 使用平台:unix.linux.windows. 功能: A.www web服务  http 80 b.负载均衡(方向代理proxy) ...

  2. 23.Nginx+keepalived负载均衡高可用

    Nginx+keepalived负载均衡高可用 结构图 环境: 主 服务器:192.168.239.10 备 服务器:192.168.239.20 Web 服务器1:192.168.239.40 We ...

  3. Nginx负载均衡高可用---架构

    1. Nginx负载均衡高可用 首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现w ...

  4. Heartbeat+Haproxy实现负载均衡高可用

    环境说明: 主机名 角色 IP地址 mylinux1.contoso.com heartbeat+haproxy eth0:192.168.100.121 eth1:172.16.100.121 my ...

  5. Haproxy+Keepalived搭建Weblogic高可用负载均衡集群

    配置环境说明: KVM虚拟机配置 用途 数量 IP地址 机器名 虚拟IP地址 硬件 内存3G  系统盘20G cpu 4核 Haproxy keepalived 2台 192.168.1.10 192 ...

  6. Lvs+keepAlived实现负载均衡高可用集群(DR实现)

    第1章 LVS 简介 1.1 LVS介绍 LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能. ...

  7. HAProxy实现slave负载均衡[高可用]

    下面要执行的是HAProxy部分 这是一个集群,其他的部分在: mysql-cluster 7.3.5安装部署 mysql主备部署[高可用] mysql主备切换[高可用] mysql读写分离[高可用] ...

  8. JAVAEE——宜立方商城03:Nginx负载均衡高可用、Keepalived+Nginx实现主备

    1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...

  9. Keepalived+Nginx实现负载均衡高可用

    一.负载均衡高可用 Nginx作为负载均衡器,所有请求都到了Nginx,可见Nginx处于非常重点的位置,如果Nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了避免负载均衡服务器的宕机 ...

随机推荐

  1. webpack 入门指南

    很久没有更博了... 这就把最近积累用到的知识点更新到这里.. 望 共勉 什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffe ...

  2. Linux下文件打包与解压缩

    Linux上存在的文件后缀 文件后缀名 说明 *.zip zip程序打包压缩的文件 *.rar rar程序压缩的文件 *.7z 7zip程序压缩的文件 *.tar tar程序打包,未压缩的文件 *.g ...

  3. mySQL:两表更新(用一个表更新另一个表)的SQL语句

    用一个表中的字段去更新另外一个表中的字段, MySQL 中有相应的 update 语句来支持,不过这个 update 语法有些特殊.看一个例子就明白了. create table student ( ...

  4. Linux文档的压缩与打包

    linux系统中的后缀名其实要不要无所谓,但是对于压缩文件来讲必须要带上.这是为了判断压缩文件是由哪种压缩工具所压缩,而后才能去正确的解压缩这个文件.Linux压缩文件常见的后缀名所对应的压缩工具: ...

  5. LeetCode 604. Design Compressed String Iterator (设计压缩字符迭代器)$

    Design and implement a data structure for a compressed string iterator. It should support the follow ...

  6. d3根据数据绘制不同的形状

    绘制力导向图的时候通常节点都是圆形,但也会遇到公司节点绘制成圆型,人绘制成方形的情况,那我们怎么依据数据绘制不同的形状. 你可能首先会想到,这很简单啊,是公司的时候append circle,是人的时 ...

  7. POJ1222EXTENDED LIGHTS OUT(高斯消元)

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11815   Accepted: 7 ...

  8. JavaScript基础一(js基础函数与运算符)

    [使用js的三种方式] 1.在HTML标签中,直接内嵌js(并不提倡使用) <button onclick=" alert('点就点')"> 点我啊</butto ...

  9. java中表示二进制、八进制、十进制、十六进制

    1.进制 进制是一种记数方式 ,可以用有限的数字符号代表所有的数值.由特定的数值组成. 2.进制的表现形式 二进制: 由0和1两个数字组成. 八进制: 由0-7数字组成,为了区分与其他进制的数字区别, ...

  10. tomcat不编译webapps下的war包的解决办法

    1.首先看看tomcat是否能正常启动,如果启动tomcat一闪而过那么就使用dos命令启动tomcat看看报什么错 如果是端口占用的错误.使用netstat -ano命令查看占用端口的程序 然后用任 ...