HAProxy基于KeepAlived实现Web高可用及动静分离

简介:

前言

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载。HAProxy相比LVS的使用要简单很多,但跟LVS一样,HAProxy自己并不能实现高可用,一旦HAProxy节点故障,将会影响整个站点。本文带来的是HAProxy基于KeepAlived实现Web高可用及动静分离。

相关介绍

HAProxy

HAProxy是一款提供高可用性、负载均衡以及基于TCP和HTTP应用的代理软件,HAProxy是完全免费的、借助HAProxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案。HAProxy适用于那些负载较大的web站点,这些站点通常又需要会话保持或七层处理。 HAProxy可以支持数以万计的并发连接,并且HAProxy的运行模式使得它可以很简单安全的整合进架构中,同时可以保护web服务器不被暴露到网络上。

KeepAlived

Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案——由多台路由器组成一个热备组。通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。

高可用解决方案

实验拓扑

wKiom1WKXamQDGkIAAEr6GQwfZg266.jpg

1
2
3
#系统环境:CentOS6.6
#Static Server:httpd
#Dynamic Servicer:LAMP

配置过程

HA集群配置前提

时间同步、基于主机名互相通信、SSH互信

请确保两个节点时间同步,可用ntpdate向时间服务器同步

1
[root@node1 ~] # ntpdate cn.pool.ntp.org

基于主机名互相通信

1
2
3
4
5
6
7
8
9
10
11
12
[root@node1 ~] # vim /etc/hosts
    
172.16.10.123   node1.scholar.com node1
172.16.10.124   node2.scholar.com node2
    
[root@node1 ~] # vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
    
[root@node1 ~] # uname -n
node1.scholar.com
    
#两个节点都需如上操作

SSH互信

1
2
3
4
5
6
7
[root@node1 ~] # ssh-keygen -t rsa -P ''
[root@node1 ~] # ssh-copy-id -i .ssh/id_rsa.pub root@node2
[root@node2 ~] # ssh-keygen -t rsa -P ''
[root@node2 ~] # ssh-copy-id -i .ssh/id_rsa.pub root@node1
[root@node1 ~] # date; ssh node2 'date' #测试
Wed Jun 24 15:58:46 CST 2015
Wed Jun 24 15:58:46 CST 2015

安装所需程序

1
2
3
[root@node1 ~] # yum install keepalived haproxy -y
 
#两个节点都安装

配置keepalived

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@node1 ~] # vim /etc/keepalived/keepalived.conf
 
vrrp_instance VI_1 {         #定义VRRP实例,实例名自定义
     state MASTER             #指定Keepalived的角色,MASTER为主服务器,BACKUP为备用服务器
     interface eth0           #指定HA监测的接口
     virtual_router_id 51     #虚拟路由标识(1-255),在一个VRRP实例中主备服务器ID必须一样
     priority 100             #优先级,数字越大越优先,主服务器优先级必须高于备服务器
     advert_int 1             #设置主备之间同步检查时间间隔,单位秒
     authentication {         #设置验证类型和密码
         auth_type PASS       #验证类型
         auth_pass ab007      #设置验证密码,同一实例中主备密码要保持一致
     }
     virtual_ipaddress {      #定义虚拟IP地址
         192.168.12.21
     }
}
  
vrrp_instance VI_2 {
     state BACKUP
     interface eth0
     virtual_router_id 61
     priority 99
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass sr200
     }
     virtual_ipaddress {
         192.168.12.22
     }
}

将配置文件同步给另一个节点

1
2
[root@node1 ~] # scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
keepalived.conf                                        100%  787     0.8KB /s    00:00

修改另一个节点配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@node2 ~] # vim /etc/keepalived/keepalived.conf
 
vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     virtual_router_id 51
     priority 99
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass ab007
     }
     virtual_ipaddress {
         192.168.12.21
     }
}
 
vrrp_instance VI_2 {
     state MASTER
     interface eth0
     virtual_router_id 61
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass sr200
     }
     virtual_ipaddress {
         192.168.12.22
     }
}

配置HAProxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
[root@node1 ~] # vim /etc/haproxy/haproxy.cfg 
 
global
     # to have these messages end up in /var/log/haproxy.log you will
     # need to:
     #    by adding the '-r' option to the SYSLOGD_OPTIONS in
     #    /etc/sysconfig/syslog
     #
     # 2) configure local2 events to go to the /var/log/haproxy.log
     #   file. A line like the following can be added to
     #   /etc/sysconfig/syslog
     #
     #    local2.*                       /var/log/haproxy.log
     log         127.0.0.1 local2       #日志将通过rsyslog进行归档记录
     chroot       /var/lib/haproxy       #运行的安装路径
     pidfile      /var/run/haproxy .pid   #pid文件存放的位置
     maxconn     4000                   #最大连接
     user        haproxy                #运行haproxy的用户
     group       haproxy                #运行haprixy的组
     daemon                             #以后台模式运行haproxy
     # turn on stats unix socket
     stats socket  /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
     mode                    http                 #工作模式
     log                     global               #记录日志
     option                  httplog              #详细记录http日志
     option                  dontlognull          #不记录健康检查的日志信息
     option http-server-close                     #启用服务器端主动关闭
     option forwardfor       except 127.0.0.0 /8   #传递客户端IP
     retries                 3                    #请求重试次数
     timeout http-request    10s                  #http请求超时时间
     timeout queue           1m                   #一个请求在队列里的超时时间
     timeout connect         10s                  #连接服务器超时时间
     timeout client          1m                   #客户端超时时间
     timeout server          1m                   #客户端超时时间
     timeout http-keep-alive 10s                  #持久连接超时时间
     timeout check           10s                  #心跳检测超时时间
     maxconn                 3000                 #最大连接数
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  proxy *:80
     #定义ACL
     acl url_static       path_beg       -i  /static  /images  /javascript  /stylesheets
     acl url_static       path_end       -i .jpg .gif .png .css .js
     acl url_dynamic      path_end       _i .php .jsp
     use_backend dynamic           if  url_dynamic    #调用后端服务器并检查ACL规则是否被匹配
     default_backend             static
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static            #后端调度
     balance      source    #调度算法
     server      s1 172.16.10.125:80 inter 1500 rise 2 fall 3  check 
#----------------------------------------
listen statistics
     mode http                            #http 7 层模式
     bind *:8080                          #监听地址
     stats  enable                         #启用状态监控
     stats auth admin:admin               #验证的用户与密码
     stats uri  /admin ?status              #访问路径
     stats hide-version                   #隐藏状态页面版本号
     stats admin  if  TRUE                  #如果验证通过了就允许登录
     stats refresh 3s                     #每3秒刷新一次
     acl allow src 192.168.12.0 /24        #允许的访问的IP地址
     tcp-request content accept  if  allow  #允许的地址段就允许访问
     tcp-request content reject           #拒绝非法连接
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend dynamic
     balance      source
     server      s2 172.16.10.12:80 check inter 1500 rise 2 fall 3 
#check inter 1500是检测心跳频率
#rise2 2次正确认为服务器可用
#fall3 3次失败认为服务器不可用

将配置文件同步至另一节点

1
2
[root@node1 ~] # scp /etc/haproxy/haproxy.cfg node2:/etc/haproxy/
haproxy.cfg                                       100% 4471     4.4KB /s    00:00

web端配置

准备测试页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#static server
[root@scholar ~] # vim /var/www/html/index.html 
 
<h1>172.16.10.125< /h1 >
 
[root@scholar ~] # service httpd start
Starting httpd:                                            [  OK  ]
 
#dynamic server
[root@scholar ~] # vim /var/www/html/index.php
 
<h1>172.16.10.20< /h >
<?php
      $link = mysql_connect( '127.0.0.1' , 'root' , '' );
      if  ($link)
        echo  "Success..." ;
      else
        echo  "Failure..." ;
      mysql_close();
      phpinfo();
?>
 
[root@scholar ~] # service httpd start
Starting httpd:                                            [  OK  ]
[root@scholar ~] # service mysqld start
Starting mysqld:                                           [  OK  ]

启动服务

1
2
3
4
5
6
[root@node1 ~] # service haproxy start; ssh node2 'service haproxy start'
Starting haproxy:                                          [  OK  ]
Starting haproxy: [  OK  ]
[root@node1 ~] # service keepalived start; ssh node2 'service keepalived start'
Starting keepalived:                                       [  OK  ]
Starting keepalived: [  OK  ]

动静分离及高可用测试

查看各节点IP情况

wKiom1WKhzmjH_fEAAHB7PvsArs225.jpg

wKioL1WKiQHzYUwCAAHAX0lKMZQ460.jpg

静态页面

wKiom1WKi9-hmLbfAAC4ef5tbUQ793.jpg

动态页面

wKiom1WKjHaAA8qXAAFU-AnATRo690.jpg

静态页面

wKioL1WKjbCByhPfAAC5Y0DMAbY850.jpg

动态页面

wKiom1WKjPOQzBfaAAFdtTp7MU0919.jpg

查看状态页面

wKioL1WKk4uAW0JgAAO4iUP3tVg800.jpg

模拟一个节点故障

1
2
3
4
[root@node1 ~] # service haproxy stop
Stopping haproxy:                                          [  OK  ]
[root@node1 ~] # service keepalived stop
Stopping keepalived:                                       [  OK  ]

查看各节点IP信息

wKioL1WKlkyyQfSIAAFPg5nsNjY975.jpg

wKiom1WKlKDQUPRUAAF3wkfE3Uo738.jpg

VIP转移了,继续访问测试

wKiom1WKlZnz0-j4AADGwz7gElM465.jpg

访问不受任何影响,至此高可用及动静分离目的实现

The end

HAProxy基于KeepAlived实现Web高可用及动静分离实验就先说到这里了,本次实验因资源有限只提供了两台web服务器,如有多台可设置轮询实现负载均衡,这里就不做多介绍了,部署过程遇到问题可留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~




本文转自 北城书生  51CTO博客,原文链接:http://blog.51cto.com/scholar/1665213

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
负载均衡 网络协议 应用服务中间件
Haproxy搭建Web群集
Haproxy搭建Web群集
220 0
|
Java 应用服务中间件 Shell
Nginx+Keepalived+Tomcat 实现Web高可用集群
Nginx+Keepalived+Tomcat 实现Web高可用集群
387 0
|
监控 Apache
HAProxy的高级配置选项-Web服务器状态监测
这篇文章介绍了HAProxy的高级配置选项,特别是如何进行Web服务器状态监测,包括基于四层传输端口监测、基于指定URI监测和基于指定URI的request请求头部内容监测三种方式,并通过实战案例展示了配置过程和效果。
376 8
HAProxy的高级配置选项-Web服务器状态监测
|
运维 Serverless API
Serverless痛点解决问题之编写并部署一个弹性高可用的 Web API如何解决
Serverless痛点解决问题之编写并部署一个弹性高可用的 Web API如何解决
198 0
|
负载均衡 算法 前端开发
Haproxy搭建Web群集
这只是一个基本的HAProxy配置示例,你可以根据需要进行更高级的配置,包括SSL终端、健康检查、ACL(Access Control List)等。确保HAProxy的配置文件中的语法正确,以避免错误。在生产环境中,还应该考虑安全性和高可用性等因素。
134 7
|
负载均衡 监控 算法
百度搜索:蓝易云【HAProxy搭建web集群教程。】
这是一个简单的HAProxy搭建Web集群的教程。在实际应用中,还可以进行更多的配置和优化,以满足你的需求。建议在搭建之前查阅官方文档或参考其他详细的教程以获取更全面的指导。
207 3
百度搜索:蓝易云【HAProxy搭建web集群教程。】
|
存储 弹性计算 负载均衡
使用SLB+2ECS+NAS,部署电商web网站的高可用架构
如您需要开发电商网站并且对外提供服务,当您的业务上升时,您需要为应用考虑高吞吐,高并发,高可用等能力,来应对用户的并发访问,保证应用稳定。本场景主要介绍如何使用SLB,ECS和NAS搭建高可用电商网站,助您业务上升。
|
2月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
272 4
|
6月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
6月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。