keepalived + haproxy 实现web 双主模型的高可用负载均衡--转
1、本文的架构图:
阐述各服务器用途:
1、haproxy在本构架中实现的是:负载均衡
2、keepalived实现对haproxy的高可用
3、apache static 实现静态页面的访问
4、aoache dynamic实现动态页面的访问,图中有两个是实现负载均衡的
配置各功能模块:
一、配置haproxy和keepalived
验证:
1、当一台keepalived宕机后,VIP会不会转移到另外一台服务器
2、当一台haproxy服务出故障,VIP会不会转移到另外一台服务器
注意:
那如果keepalived宕机了,haproxy服务还正常运行,我们要不要让另外一台服务器把VIP夺过去呢?
理论上来讲:最好不要,但是我们的keepalived中的脚本监控着haproxy的进程,keepalived宕机之后,就无从得知haproxy的健康状态,也不能决定自己的优先权priority降不降低了。所以,理论上来讲最好不要,但是实际中光靠keepalived是做不到的。
配置:
1、给两台服务器分别安装上keepalived
1
|
[root@station139 ~]# yum -y install keepalived |
2、配置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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
[root@node2 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { root@localhost 配置服务状态变化发送邮件到哪个地址 } notification_email_from kaadmin@localhost smtp_server 127.0 . 0.1 给哪个smtp服务器发邮件 smtp_connect_timeout 30 联系上面smtp服务器 30 秒联系不上,就超时 router_id LVS_DEVEL } vrrp_script chk_haproxy { 本脚本是用来检测该服务器上haproxy服务的健康状态的 script "killall -0 haproxy" interval 1 weight - 2 } vrrp_instance VI_1 { state MASTER 这太服务器为主的keepalived interface eth0 通过eth0网卡广播 virtual_router_id 200 虚拟路由id要改,如果在一个局域网中有多个keepalived集群 priority 100 优先级 advert_int 1 authentication { auth_type PASS auth_pass 11112222 } track_script { chk_haproxy } virtual_ipaddress { 192.168 . 1.200 本机的虚拟IP } notify_master "/etc/keepalived/notify.sh master" 各不用状态下运行的脚本 notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { 另外一台主keepalived的从 state BACKUP interface eth0 virtual_router_id 57 priority 99 设置要比另外一台主keepalived的优先级低 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_mantaince_down } virtual_ipaddress { 192.168 . 1.201 } } |
3、写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
32
33
34
35
|
#!/bin/bash # Author: MageEdu <linuxedu@foxmail.com> # description: An example of notify script # vip= 192.168 . 1.200 contact= 'root@localhost' notify() { mailsubject= "`hostname` to be $1: $vip floating" mailbody= "`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master /etc/rc.d/init.d/haproxy start exit 0 ;; backup) notify backup /etc/rc.d/init.d/haproxy stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/haproxy stop exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac 给脚本以执行权限: chmod +x /etc/keepalived/notify.sh |
4、配置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
|
[root@node2 ~]# yum -y install haproxy 安装haproxy [root@node2 ~]# vim /etc/haproxy/haproxy.cfg # log 127.0 . 0.1 local2 chroot / var /lib/haproxy pidfile / var /run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # 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 指定haproxy工作模式为http log global option httplog option dontlognull option http-server-close 当客户端超时时,允许服务端断开连接 option forwardfor except 127.0 . 0.0 / 8 在http的响应头部加入forwardfor option redispatch #在使用了基于cookie的会话保持的时候,通常加这么一项,一旦后端某一server宕机时,能够将其会话重新派发到其它的upstream servers 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 #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- frontend main *: 80 前端代理 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 use_backend static if url_static default_backend dynamic #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- backend static 后端的静态请求响应 balance roundrobin server static 192.168 . 1.100 : 80 inter 3000 rise 2 fall 3 check maxconn 5000 #--------------------------------------------------------------------- # round robin balancing between the var ious backends #--------------------------------------------------------------------- backend dynamic 后端的动态请求响应 balance roundrobin server dynamic1 192.168 . 1.101 : 80 inter 3000 rise 2 fall 3 check maxconn 5000 server dynamic2 192.168 . 1.102 : 80 inter 3000 rise 2 fall 3 check maxconn 5000 listen statistics mode http bind *: 8080 ~ stats enable stats auth admin:admin stats uri /admin?stats 指定URI的访问路径 stats admin if TRUE stats hide-version stats refresh 5s acl allow src 192.168 . 0.0 / 24 定义访问控制列表 tcp-request content accept if allow tcp-request content reject |
5、配置另外一台haproxy服务器
因为两台服务器的配置大体相同,我们就直接讲以上配置好的复制文件和脚本文件都传到这台haproxy服务器上,做下修就可以了
1
2
3
4
5
6
7
8
9
|
[root@node2 ~]# scp /etc/keepalived/keepalived.conf root@ 192.168 . 1.121 :/etc/keepalived/ root@ 192.168 . 1.121 's password: keepalived.conf 100 % 4546 4 .4KB/s 00 : 00 [root@node2 ~]# scp /etc/keepalived/notify.sh root@ 192.168 . 1.121 :/etc/keepalived/ root@ 192.168 . 1.121 's password: notify.sh 100 % 751 0 .7KB/s 00 : 00 [root@node2 ~]# scp /etc/haproxy/haproxy.cfg root@ 192.168 . 1.121 :/etc/haproxy/ root@ 192.168 . 1.121 's password: haproxy.cfg 100 % 3529 3 .5KB/s 00 : 00 |
传输完成,接着来配置 /etc/keepalived/keepalived.conf 因为两个节点上的/etc/haproxy/haproxy.cfg相同不用更改
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
|
interface eth0 ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from kaadmin@localhost smtp_server 127.0 . 0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" interval 1 weight - 2 } vrrp_instance VI_1 { state BACKUP 这台把master改成 backup interface eth0 virtual_router_id 200 priority 99 优先级调的比上一个低 advert_int 1 authentication { auth_type PASS auth_pass 11112222 } track_script { chk_haproxy } virtual_ipaddress { 192.168 . 1.200 } } vrrp_instance VI_2 { state MASTER 本台的这个要调成MASTER,上个是backup interface eth0 virtual_router_id 57 priority 100 这个优先级也要高于上个 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168 . 1.201 } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } |
注意:
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
3个状态分别要执行的脚本,只能放在 MASTER中,原因是:因为是互为主从,每个主的都会有个另外一个主的从,如果
把这 “3个状态执行脚本” 写入到从的区域中,那么另外一个主的从状态就会执行这个脚本,因为就会停掉所要高可用的
程序,这就造成了,两个VIP全部转移到其中一个服务器上去。
我们来验证下,如果keepalived和haproxy分别宕机,vip会不会转移:
在两个节点上都启动 keepalived和haproxy服务
1
2
3
4
|
[root@node2 ~]# service haproxy start Starting haproxy: [ OK ] [root@node2 ~]# service keepalived start Starting keepalived: [ OK ] |
以下为正常情况:
keepalived 1:
keepalived 2:
我们来模拟让第一个haproxy停止掉,再看下,VIP会不会全到 keepalived 2上面去:
1
2
|
[root@node2 ~]# service haproxy stop Stopping haproxy: [ OK ] |
查看keepalived 1 和 keepalived 2
看,都过来了。。。。
验证负载均衡很动静分离
我们给3个web服务不同的网页
1、给apache static一个静态页面,来验证如果请求的不是以 .php结尾的网页文件都定向到这太服务器上来
2、给apache dynamic 1 、2 分别两个 index.php ,实现对动态网页的负载均衡
我们给apache static 一个符合-i .jpg .gif .png .css .js的网页,就给个图片网页吧
apache static
1
|
scp 1 .png root@ 192.168 . 1.100 :/ var /www/html |
apache dynamic 1
1
2
3
4
5
|
vim / var /www/html/index.php 192.168 . 1.101 <?php phpinfo(); ?> |
apache dynamic 2
1
2
3
4
5
|
vim / var /www/html/index.php 192.168 . 1.102 <?php phpinfo(); ?> |
1、我们来请求 1.png 结尾的静态文件
2、我们来请求 .php结尾的页面
如此看来,已经对以.php的动态页面做了负载均衡了
我们再通过 192.168.1.201 这个虚拟 ip 访问试试:
由此看来,也实现了双主模型了,两个haproxy同时可以服务了。。。
3、我们来看看状态页面
本文出自 “linux运维” 博客,请务必保留此出处http://xz159065974.blog.51cto.com/8618592/1405812
keepalived + haproxy 实现web 双主模型的高可用负载均衡--转的更多相关文章
- haproxy + keepalived 实现web 双主模型的高可用负载均衡
参考文章 http://xz159065974.blog.51cto.com/8618592/1405812 http://blog.chinaunix.net/uid-25266990-id-398 ...
- 企业级-Mysql双主互备高可用负载均衡架构(基于GTID主从复制模式)(原创)
前言: 原理与思想 这里选用GTID主从复制模式Mysql主从复制模式,是为了更加确保主从复制的正确性.健康性与易配性.这里做的是两服务器A,B各有Mysql实例331 ...
- 基于keepalived双主模型的高可用LVS
背景知识: keepalived:Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web 服务器从系统中剔除, ...
- 【Keepalived+MySQL】MySQL双主互备+高可用
一.基本信息说明 [DB1] IP: 192.168.102.144 hostname: LVS-Real1 [DB2] IP: 192.168.102.145 hostname: LVS-Real2 ...
- Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived
文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...
- Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡
周末的时候一个正在学Linux的朋友问我,高可用怎么玩?我和他微信了将近三个小时,把Nginx和haproxy双主高可用教给他了,今天突然想把这个给写进博客里,供给那些正在学习Linux系统的朋友们, ...
- 基于HAProxy+Keepalived高可用负载均衡web服务的搭建
一 原理简介 1.HAProxyHAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web ...
- Mysql+Keepalived双主热备高可用操作记录
我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...
- 使用Keepalived实现Nginx的自动重启及双主热备高可用
1.概述 之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下. 1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服 ...
随机推荐
- Android MediaStore与Media.EXTERNAL_CONTENT_URI
MediaStore这个类是Android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取.这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,andro ...
- 如何用AndroidStudio导入github项目
最近一直在研究AndroidStudio,但是总会有这样那样的问题,特别是在github上看到一个很好地开源项目,想clone下来用用,就会出现很多蛋疼的问题,今天摸索着,结合一些大牛们的建议,轻轻松 ...
- [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]
参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...
- 学习笔记-[Maven实战]-第一章:Maven简介
Maven简介: Maven 可翻译为:知识的积累,也可以翻译为"专家"或"内行". Maven 是一个跨平台的项目管理工具,是Apache组织中一个很成功的开 ...
- 【原创】FPGA开发手记(一) UART接口
以下内容均以Xilinx的Nexys3作为开发板 1. UART简介 UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串 ...
- 同一客户代码下一个CPN对应多个FG会出现CPN描述一样的问题
Q&A : D2E01客户下已经存在CPN: TP1062/A 对应FG: P5M2812512AFHHF0 直接在客户代码下无法新建,只能在交叉信息新建CPN: TP1062/A, 但无法修 ...
- apache开源项目--kafka
kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能. 高吞吐量:即使是非常普通的 ...
- 如何删除已上线的IAP项
cleared for sale to NO. then Delete.
- Java线程之Phaser
Phaser是一个灵活的线程同步工具,他包含了CyclicBarrier和CountDownLatch的相关功能 首先,来看一下如何用Phaser替代CountDownLatch.对于CountDow ...
- Java笔记(十八)……包
概述 对类文件进行分类管理. 给类提供多层命名空间. 写在程序文件的第一行. 类名的全称的是 包名.类名. 包也是一种封装形式. 访问权限 引用<The Complete Reference&g ...