haproxy+keepalived实现高可用负载均衡web集群

haproxy+keepalived实现高可用负载均衡web集群

负载均衡集群的概念

负载均衡是设计分布式系统架构必须要考虑的因素之一,它指的是通过调度分发的方式尽可能将“请求”、“访问”的压力负载平均分摊到集群中的各个节点,避免有些节点负载太高导致访问延迟,而有些节点负载很小导致资源浪费。这样,每个节点都可以承担一定的访问请求负载压力,并且可以实现访问请求在各节点之间的动态分配,以实现负载均衡,从而为企业提供更高性能,更加稳定的系统架构解决方案。

高可用集群的概念

高可用是指以减少服务中断时间或者避免服务中断为目标的技术,它也是分布式系统架构中必须要考虑的因素之一。集群中节点之间进行心跳检查,可以实现对整个集群中的节点健康状态的检测,如果某个节点失效,它的备节点将在几秒钟的时间内接管它的工作。因此对于用户而言,服务总是可以访问的。

haproxy是什么?

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性负载均衡,以及基于TCPHTTP的应用程序代理。HAProxy特别适用于那些负载特大的web站点(其实也适合数据库的负载均衡),这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

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

keepalived又是什么?

keepalived是一款轻量级的高可用软件,它只能实现对IP资源的高可用。主要通过虚拟路由冗余协议(VRRP)实现高可用的功能。在非双主keepalived集群中,会依靠优先级选举出一个主节点,IP资源会优先绑定到主节点,其他节点成为备节点,主节点与备节点之间会通过检查心跳线来检测对方的存活,一旦主节点宕机,备用节点就抢占IP资源,当主节点恢复正常,备节点又会释放IP资源给主节点。

下面通过一个简单的实验,来看看如何实现通过haproxy+keepalived实现web集群的高可用和负载均衡

环境设置

主机名 角色 IP
web1 real server-1 192.168.83.129/24
web2 real server-2 192.168.83.130/24
haproxy1 代理服务器-1 192.168.83.131/24
haproxy2 代理服务器-2 192.168.83.131/24
银河 客户端 192.168.43.159/24

//所有的服务器都要同步时间,集群的时间是很敏感的,在生产环境中建议用公司内部的ntp服务器,用外部的ntp服务器随着运行时间的增加,会逐渐出现时间偏移,一旦偏移量过大,集群便会出现非常严重的问题

ntpdate time.nist.gov

crontab -l

*/10 * * * * ntpdate time.nist.gov

在两台主机上部署apache作为real server

web1

[[email protected] ~]# yum -y install httpd
[[email protected] ~]# sed -i ‘s/Listen 80/Listen 8080/g‘ /etc/httpd/conf/httpd.conf    #出于安全性考虑,把默认端口改成8080
[[email protected] ~]# systemctl start httpd
[[email protected] ~]# systemctl enable httpd
[[email protected] ~]# echo "web1" > /var//www/html/index.html

[[email protected] ~]# curl http://192.168.83.129:8080
web1

web2

[[email protected] ~]# yum -y install httpd

[[email protected] ~]# sed -i ‘s/Listen 80/Listen 8080/g‘ /etc/httpd/conf/httpd.conf    #出于安全性考虑,把默认端口改成8080[[email protected] ~]# systemctl start httpd
[[email protected] ~]# systemctl enable httpd

[[email protected] ~]# echo "web2" > /var/www/html/index.html
[[email protected] ~]# curl http://192.168.83.130:8080
web2

设置代理服务器1

[[email protected] ~]# yum -y install haproxy         #安装haproxy
[[email protected] ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak`date +%F-%T`      #在实际工作中,修改文件一定要谨慎,最好事先做一个备份
[[email protected] haproxy]# cat haproxy.cfg.bak2017-05-28-01\:16\:53 |egrep -v "(#|^$)" > haproxy.cfg         #过滤注释和空行

[[email protected] ~]# cat /etc/haproxy/haproxy.cfg       #把配置文件修改如下

global       #全局配置
    log         127.0.0.1 local3 info  #把发送到日志设备local3的info级别的日志记录在本地
    chroot      /var/lib/haproxy      #绑定haproxy的工作路径
    pidfile     /var/run/haproxy.pid      #pid文件路径
    maxconn     4000           #最大连接数
    user        haproxy           #运行进程的用户
    group       haproxy         #运行进程的用户组
    daemon                          #以后台方式运行
    stats socket /var/lib/haproxy/stats    #haproxy动态维护的套接字文件,下面会通过一个小实验看这个玩意的作用
defaults      #除非有具体定义,否则default选项会加入到后面 选项,不适用的就不会被定义
    mode                    http      #默认的模式
    log                     global      #引用全局的日志配置
    option                  httplog     #启用日志记录http请求,haproxy默认不记录http请求日志
    option                  dontlognull     #日志中不记录健康检查的连接
    option http-server-close     #对于某些server端不支持http长连接的情况,利用这个参数可以使用客户端到haproxy是长连接,而haproxy到server端是短连接

option forwardfor       except 127.0.0.0/8    #允许服务器记录发起请求的真实客户端的IP地址

option         redispatch    #当client从web服务器每获取一个资源的时候都需要建立一次tcp连接,为了保持会话的持久性在一定时间之内让tcp连接保持持久性,当再次访问相同的资源的时候就不再需要建立tcp连接,tcp的持久性依赖cookie,当你的一个realserver down了之后,会把访问过的http的缓存重定向到另外一个real server

retries         3     #连接真实服务器的失败重连次数,超过这个值后会将对应正式服务器标记为不可用
    timeout http-request    10s   #http请求超时时间
    timeout queue           1m       #请求在队列中的超时时间
    timeout connect         10s      #连接超时
    timeout client          1m          #客户端连接超时
    timeout server          1m         #服务端连接超时
    timeout http-keep-alive 10s   #http-keep-alive超时时间
    timeout check           10s         #检测超时时间
    maxconn                 3000         #每个进程最大的连接数
frontend  www      #定义前端
    bind *:80            #绑定客户端访问的是哪个IP的80端口
    mode http          #指定模式为http
    option httplog    #记录http请求的日志
    log global            #应用全局的日志配置
    stats uri /haproxy?stats    #haproxy自带的监控页面
    default_backend             web    #指定默认的后端
backend web       #定义后端
    mode http       #模式为http
    option redispatch
    balance roundrobin    #负载均衡算法指定为轮询
    option httpchk GET /index.html      #检测后端真实服务器的方法
server web1 192.168.83.129:8080 cookie web1 weight 1 check inter 2000 rise 2 fall 3
server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3

#定义的真实服务器,权重为1,健康检测时间间隔为2秒,重试2次,失败3次标记为不可用

[[email protected] ~]# haproxy -c -f /etc/haproxy/haproxy.cfg   #检查配置文件是否正确
Configuration file is valid

开启远程记录日志的功能

[[email protected] ~]# cat -n /etc/rsyslog.conf 
    15 $ModLoad imudp         #删除注释
    16 $UDPServerRun 514     #删除注释
    73 local7.*                                           /var/log/boot.log      #在这一行下面添加下面的内容
    74 local3.*                                          /var/log/haproxy.log  #把发送到local3日志设备的日志记录在/var/log/haproxy.log

[[email protected] ~]# systemctl restart rsyslog

[[email protected] ~]# systemctl start haproxy        
[[email protected] ~]# systemctl enable haproxy

验证

浏览器输入:http://192.168.83.131/haproxy?stats访问haproxy的监控页面

测试一下配置文件中设置的真实服务器监控状态检测的功能( option httpchk GET /index.html  )

[[email protected] haproxy]# sed  -i ‘s/index\.html/test.html/g‘ haproxy.cfg   #把检测页面更改为test.index

[[email protected] haproxy]# systemctl reload haproxy    #重载haproxy,生产中不建议重启haprox,因为这会断开所有现有的连接
Message from [email protected] at May 29 10:30:23 ...
 haproxy[3305]: backend web has no server available!   #马上提示后端服务器不可用

在监控页面可以看到后端的真实服务器宕机

配置文件里面有一行是关于动态维护haproxy的,那么动态维护haproxy是什么回事呢,举一个小示例如下:
[[email protected] ~]# yum -y install socat

[[email protected] ~]# echo "show info"|socat stdio /var/lib/haproxy/stats   #查看info的信息,里面的内容可以用于监控haproxy的状态
Name: HAProxy
Version: 1.5.14
Release_date: 2015/07/02
Nbproc: 1
Process_num: 1
Pid: 3390
Uptime: 0d 0h14m43s
Uptime_sec: 883
Memmax_MB: 0
Ulimit-n: 8033
Maxsock: 8033
Maxconn: 4000
Hard_maxconn: 4000
CurrConns: 0
CumConns: 19
CumReq: 37
MaxSslConns: 0
CurrSslConns: 0
CumSslConns: 0
Maxpipes: 0
PipesUsed: 0
PipesFree: 0
ConnRate: 0
ConnRateLimit: 0
MaxConnRate: 2
SessRate: 0
SessRateLimit: 0
MaxSessRate: 2
SslRate: 0
SslRateLimit: 0
MaxSslRate: 0
SslFrontendKeyRate: 0
SslFrontendMaxKeyRate: 0
SslFrontendSessionReuse_pct: 0
SslBackendKeyRate: 0
SslBackendMaxKeyRate: 0
SslCacheLookups: 0
SslCacheMisses: 0
CompressBpsIn: 0
CompressBpsOut: 0
CompressBpsRateLim: 0
ZlibMemUsage: 0
MaxZlibMemUsage: 0
Tasks: 8
Run_queue: 1
Idle_pct: 100
node: haproxy1
description:

动态维护haproxy的功能还有很多,比如关闭重启后端的真实服务器等等。

根据acl进行访问内容的重定向

haproxy有一个很实用的功能,可以根据acl进行访问内容的重定向,把配置文件中关于前端后端的配置更改如下:

frontend  www
    bind *:80
    mode http
    option httplog
    log global
    stats uri /haproxy?stats
    acl web1 hdr_reg(host) -i www.web1.com   #web1,acl的名字;hdr_reg(host),固定格式,用来识别host 
    acl web2 hdr_reg(host) -i www.web2.com
    use_backend www1 if web1       #use_backend指定使用哪个后端,if用来识别acl

use_backend www2 if web2
backend www1
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web1 192.168.83.129:8080 cookie web1 weight 1 check inter 2000 rise 2 fall 3
backend www2
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3

不知道为什么我的手提电脑用谷歌火狐IE一直提示连接超时,域名解析我也配置了,就用代理1来验证

除了根据域名,还可以根据文件的后缀名实现访问内容重定向

frontend  www
    bind *:80
    mode http
    option httplog
    option forwardfor
    log global
    stats uri /haproxy?stats
    acl is_static_reg url_reg /*.(css|jpg|png|js)$  
    use_backend static_web if is_static_reg
    default_backend web
backend web
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web1 192.168.83.129:8080 cookie web1 weight 1 check inter 2000 rise 2 fall 3
    server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3
backend static_web
    mode http 
    option redispatch
    balance roundrobin
    option httpchk GET /index.html
    server web2 192.168.83.130:8080 cookie web2 weight 1 check inter 2000 rise 2 fall 3

[[email protected] html]# echo test_static > index.jpg

验证

haproxy+keepalived

为了防止单点故障还有单台的haproxy无法承受大并发量,生产环境中一般会有两台或者以上的haproxy服务器做代理。

准备另外一台代理机haproxy2,配置和代理1大同小异

[[email protected] ~]# yum -y install haproxy

[[email protected] ~]# scp /etc/haproxy/haproxy.cfg haproxy2:/etc/haproxy/  #把haproxy1上的配置文件copy到haproxy2
[[email protected] ~]# scp /etc/rsyslog.conf haproxy2:/etc/   ##把haproxy1上的配置文件copy到haproxy2

[[email protected] ~]# systemctl enable haproxy
[[email protected] ~]# systemctl restart haproxy
[[email protected] ~]# systemctl restart rsyslog

验证haproxy2功能正常

在haproxy1上配置keepalived

[[email protected] ~]# yum -y install keepalived   #下载keepalived

[[email protected] ~]# tail -2 /etc/sysconfig/keepalived   #设置keepalived的日志发送到日志设备6
KEEPALIVED_OPTIONS="-D -S 6"

修改配置文件如下

[[email protected] ~]# cat /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
   [email protected]    #告警邮件接收地址
   }
   notification_email_from [email protected]   #应该是邮件的标题
   smtp_server 127.0.0.1     #smtp服务器地址
   smtp_connect_timeout 30   #连接smtp服务器超时时间
   router_id haproxy1     #每一个keepalived节点的router_id都是唯一的,不可以重复
vrrp_script haproxy{            #vrrp_script是为了防止keepalived节点宕机之后vip不会发生转移,
   script "kiall -0 haproxy     用来检查keepalived服务的状态的模块,这个模块只关注脚本的返回值是0
   weight -25                  还是1,如果返回为1即时检查失败,把次节点的keepalived优先级减去25
   }
}

vrrp_instance ha1 {
    state MASTER     #角色为MASTER
    interface eno16777736   #指定haproxy检查网络的接口
    virtual_router_id 51   #虚拟路由的ID,在所有的keepalived节点必须保持一致
    priority 100      #优先级
    advert_int 1     #心跳检查的时间间隔
    authentication {
        auth_type PASS    #指定keepalived节点之间的验证方式为密码验证
        auth_pass linux     #keepalived节点的认证密码
    }
    virtual_ipaddress {
        192.168.83.111/24 dev eno16777736   #vip地址
    }
track_script{    
             haproxy    #调用haproxy检查脚本
            }
}

在haproxy2上配置keepalived

[[email protected] ~]# scp /etc/keepalived/keepalived.conf ;scp /etc/rsyslog.conf;scp /etc/sysconfig/keepalived   #把代理机1的配置文件传输到2

[[email protected] ~]# cat /etc/keepalived/keepalived.conf   #修改字段
   router_id haproxy2   #修改虚拟路由的ID
   state BACKUP   #修改角色
   priority 80     #修改优先级

重启haproxy1、2的服务

[[email protected] ~]# systemctl restart keepalived
[[email protected] ~]# systemctl restart haproxy
[[email protected] ~]# systemctl restart rsyslog
[[email protected] ~]# systemctl restart keepalived
[[email protected] ~]# systemctl restart haproxy
[[email protected] ~]# systemctl restart rsyslog

验证

[[email protected] ~]# ip a |grep 111      #主节点haproxy1生成vip

inet 192.168.83.111/24 scope global secondary eno16777736
[[email protected] ~]# ip a |grep 111     #而备节点还有vip

访问真实服务器

[[email protected] ~]# curl http://192.168.83.111
web1
[[email protected] ~]# curl http://192.168.83.111
web2

[[email protected] ~]# systemctl stop keepalived   #模拟代理1宕机,停服务模拟也OK,只要到1的心跳检查不通过,2就会认为1宕机,从而抢占vip

[[email protected] ~]# ip a |grep 111   #vip漂移到2
    inet 192.168.83.111/24 scope global secondary eno16777736

真实服务器依然可以访问

这就是通过haproxy+keepalived方式实现web集群高可用的简单实验,在工作中其实还有许许多多的配置,我暂时不是很明白,等我明白的差不多也会发上来和大家讨论,暂时就先不发上来误人子弟了,哈哈哈哈哈哈哈哈!

如有纰漏,欢迎指正。

时间: 2024-10-02 04:35:44

haproxy+keepalived实现高可用负载均衡web集群的相关文章

Nginx+Keepalived搭建高可用负载平衡WEB 集群

Nginx+Keepalived搭建高可用负载平衡WEB 集群 1.1环境规划: Nginx_master:192.168.5.129 Nginx_backup:192.168.5.131 Tomcat:192.168.5.132 端口:8080,9080 操作系统:CentOS6.5 x86_64 内核版本:2.6.32-696.el6.x86_64 Nginx版本:nginx/1.12.0 nginx-1.12.0 Keepalived版本:Keepalived v1.2.13 前端双Ngi

Keepalived+Haproxy双主高可用负载均衡web和mysql综合实验

日期及版本:2014.5.4v1.0 架构图 实验目的: 1.Haproxy+Keepalived双主双机高可用模型,keepalived为Haproxy主从提供高可用保证haproxy-master若挂掉haproxy-backup能无缝接管,haproxy为后端Web提供负载均衡,缓解并发压力,实现WEB站点负载均衡+高可用性: 2. Haproxy反代web做动静分离: 3. Haproxy反代mysql 算法leastconn和roundrobin的不同效果: 系统环境: OS:cent

haproxy+keepalived实现高可用负载均衡

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HAProxy相比LVS的使用要简单很多,功能方面也很丰富.当 前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式 下,HAProxy仅在客户端和服务器之间转发双向流量.7层模式下,HAProxy会分析协议,

HaProxy + Keepalived 实现高可用负载均衡

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HAProxy相比LVS的使用要简单很多,功能方面也很丰富.当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式下,HAProxy仅在客户端和服务器之间转发双向流量.7层模式下,HAProxy会分析协议,并且

haproxy+keepalived实现高可用负载均衡(转)

haproxy+keepalived实现高可用负载均衡 软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HAProxy相比LVS的使用要简单很多,功能方面也很丰富.当 前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器.内部协议通信服务器等),和7层(HTTP).在4层模式 下,HAProxy仅在客户端和服务器

HAProxy负载均衡与keepalived搭建高可用负载均衡web(Nginx/PHP/Tomcat)集群

HAProxy简介 HAProxy是基于TCP四层和HTTP七层的开源的第三方应用负载均衡软件.具有高可靠性.高稳定性.高并发处理能力.透明代理和支持ACL功能等特点.HAProxy是一个功能强大且优秀的负载均衡集群解决方案. HAProxy负载均衡算法 Haproxy的负载均衡算法在backend模块中通过balance命令来定义,常见的算法有: roundrobin: 轮叫调度算法,可以通过定义权值来分配后端服务器 static-rr : 静态的基于权重的轮叫调度算法 source:    

haproxy + keepalived 实现高可用负载均衡集群

1. 首先准备两台tomcat机器,作为集群的单点server. 第一台: 1)tomcat,需要Java的支持,所以同样要安装Java环境. 安装非常简单. tar xf  jdk-7u65-linux-x64.tar.gz mv jdk1.7.0_65 /usr/local/java 然后在环境变量中加入Java的运行路径 vim  /etc/profile JAVA_HOME=/usr/local/java export PATH=$PATH:$JAVA_HOME/bin 修改后,sour

基于Haproxy+Keepalived构建高可用负载均衡集群

实验环境: 主机名 IP地址 VIP 192.168.200.254 Haproxy-1 192.168.200.101 Haproxy-2 192.168.200.102 Nginx1 192.168.200.103 Nginx2 192.168.200.104   1.在Nginx1/2上编译安装nginx服务1.1 首先安装Nginx1 [[email protected] ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel

Lvs+Keepalived+MySQL Cluster架设高可用负载均衡Mysql集群

------------------------------------- 一.前言 二.MySQL Cluster基本概念 三.环境 四.配置 1.LB-Master及LB-Backup配置 2.MGM配置 3.SQL节点(SQL1和SQL2)配置 4.数据节点(NDB1和NDB2)配置 五.查看状态 六.测试 ------------------------------------- 一.前言 MySQL Cluster 是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB