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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

前言

软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
负载均衡 网络协议 应用服务中间件
Haproxy搭建Web群集
Haproxy搭建Web群集
64 0
|
5月前
|
负载均衡 监控 算法
百度搜索:蓝易云【HAProxy搭建web集群教程。】
这是一个简单的HAProxy搭建Web集群的教程。在实际应用中,还可以进行更多的配置和优化,以满足你的需求。建议在搭建之前查阅官方文档或参考其他详细的教程以获取更全面的指导。
86 3
百度搜索:蓝易云【HAProxy搭建web集群教程。】
|
8月前
|
应用服务中间件 Apache 开发工具
|
10月前
|
负载均衡 算法 应用服务中间件
案例:使用keepalived+Haproxy搭建Web群集
案例:使用keepalived+Haproxy搭建Web群集
|
Kubernetes NoSQL 开发工具
一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群
2023年,君不言容器技术则已,欲言容器则必称Docker,毫无疑问,它是当今最流行的容器技术之一,但是当我们面对海量的镜像与容器时,怎样快速精准的对海量容器进行管理和编排就又成了新的课题,此时,由Google开源的Kubernetes(读音\[kubə'netis\],业界也有称其k8s的,但k8s其实就是文盲版的Kubernetes,只是因为k和s之间有8个字母)就应时而生了,它是一个开源的用于多个主机虚拟成一个云平台后进行容器资源管理和应用编排引擎,致力于让部署容器化应用简单并且高效,提供了应用的全生命周期管理,如应用部署,规划,更新,维护等机制。本次我们尝试在Win10/Mac系统下,
一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群
|
测试技术 iOS开发
Flutter Web网站之最简方式实现暗黑主题无缝切换
Flutter Web网站之最简方式实现暗黑主题无缝切换
268 0
Flutter Web网站之最简方式实现暗黑主题无缝切换
|
消息中间件 网络协议 前端开发
SpringBoot轻松整合WebSocket,实现Web在线聊天室
前面为大家讲述了 Spring Boot的整合Redis、RabbitMQ、Elasticsearch等各种框架组件;随着移动互联网的发展,服务端消息数据推送已经是一个非常重要、非常普遍的基础功能。今天就和大家聊聊在SpringBoot轻松整合WebSocket,实现Web在线聊天室,希望能对大家有所帮助。
SpringBoot轻松整合WebSocket,实现Web在线聊天室
|
JSON 算法 数据安全/隐私保护
Python:使用PyJWT实现JSON Web Tokens加密解密
Python:使用PyJWT实现JSON Web Tokens加密解密
250 0
|
Python
Python 实现Web隐藏目录扫描
**Web隐藏目录扫描:** 首先你需要自己寻找一个靠谱的字典,放入脚本根目录并命名为`dict.log`每行一个路径名称.
132 0
|
安全 算法 生物认证
Python 实现Web容器指纹识别
当今的Web安全行业在进行渗透测试时普遍第一步就是去识别目标网站的指纹,从而进一步根据目标框架进行针对性的安全测试,指纹识别的原理其实很简单,目前主流的识别方式有下面这几种。
467 0
Python 实现Web容器指纹识别