HaProxy+keepalived实现负载均衡
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上.
haproxy 配置中分成五部分内容,分别如下:
1、global:参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改
2、defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件
3、frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend
4、backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器
5、Listen Fronted和backend的组合体
HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种:
① roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
② static-rr,表示根据权重,建议关注;
③ leastconn,表示最少连接者先处理,建议关注;
④ source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ ri,表示根据请求的URI;
⑥ rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧ rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
192.168.1.90
+-----------VIP----------+
| |
| |
Master Backup
192.168.0.110 192.168.0.111
+----------+ +----------+
| HAProxy | ß------à | HAProxy |
|keepalived| |keepalived|
+----------+ +----------+
|
v
+-----------+---------+
| | |
| | |
v v v
+--------+ +-------+ +-------+
| Docker | | Docker | | Docker |
| WEB1 | | WEB2 | | WEB3 |
+--------+ +-------+ +-------+
安装HAProxy,KeepAlived
add-apt-repository ppa:vbernat/haproxy-1.5
apt-get update
apt-get install haproxy
修改配置
sudo vim /etc/haproxy/haproxy.cfg
global
#log /dev/log local0
#log /dev/log local1 notice #定义haproxy 日志级别[error warringinfo debug]
log 127.0.0.1 local2 #日志输出配置,所有日志都记录在本机,通过local2输出
chroot /var/lib/haproxy #chroot运行路径
nbproc 1 #设置进程数量
stats socket /run/haproxy/admin.sock mode 660 level admin #定义统计信息保存位置
stats timeout 30s #监控页面超时时间
user haproxy #运行haproxy 用户
group haproxy #运行haproxy 用户组
daemon #以后台形式运行harpoxy
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global #设置日志继承全局配置段的设置
mode http #设置haproxy的运行模式,有三种{http|tcp|health},tcp是4层,http是7层,health只会返回OK
option abortonclose
option http-server-close #打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录。
option httplog #表示开始打开记录http请求的日志功能
option dontlognull #如果产生了一个空连接,那这个空连接的日志将不会记录。
timeout connect 5000 #haproxy与后端服务器连接超时时间,如果在同一个局域网可设置较小的时间。
timeout client 50000 #定义客户端与haproxy连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间
timeout server 50000 #定义haproxy与上游服务器非活动连接的超时时间。
listen admin_stats #frontend和backend的组合体,监控组的名称,按需自定义名称
bind 0.0.0.0:8080 #配置监听端口
mode http #配置监控运行的模式,在这为http模式。
option httplog #表示开始打开记录http请求的日志功能
maxconn 10 #最大连接数
stats enable #开启统计页面
stats hide-version #配置隐藏统计页面上的HAproxy版本信息。
stats refresh 30s #配置每隔30秒自动刷新监控页面。
stats show-node #
stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
stats uri /haproxy #统计页面url
stats admin if TRUE #设置手工启动/禁用,后端服务器
#设置错误页面
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend www-frontend #定义一个名为www-frontend的frontend。
Bind *:80 #定义haproxy前端部分监听的端口。
reqadd X-Forwarded-Proto:\ http #
default_backend http-backend #定义默认backend
option forwardfor #使后端server获取到客户端的真实IP
acl http hdr(host) -i www.aaa.com #根据域名定义acl
acl web hdr(host) -i www.bbb.com
use_backend http-backend if http #定义访问www.aaa.com的到http-backend
use_backend web-backend if web #定义访问www.bbb.com的到web-backend
backend http-backend
balance roundrobin #定义负载均衡方式,roundrobin轮询方式
cookie SERVERID insert indirect nocache
server web1 192.168.0.110:8001 cookie A check inter 1500 weight 1 rise 3 fall 3
server web2 192.168.0.110:8002 cookie B check inter 1500 weight 2 rise 3 fall 3
server web3 192.168.0.110:8003 cookie C check inter 1500 weight 3 rise 3 fall 3
#chookie指定serverID ,check inter指定检测心跳频率,rise指定正确次数,fall指定失败次数,weight代表权重
backend web-backend
balance roundrobin #定义负载均衡方式,roundrobin轮询方式
cookie SERVERID insert indirect nocache
server www1 192.168.0.111:8010 cookie A check inter 1500 weight 1 rise 3 fall 3
server www2 192.168.0.111:8020 cookie B check inter 1500 weight 2 rise 3 fall 3
listen tcptest #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
bind 0.0.0.0:8009 #设置监听端口
mode tcp #采用tcp
option tcplog #采用tcp日志格式
balance source #定义负载均衡方式
server s1 192.168.0.111:8010 weight 1 check inter 1500 rise 3 fall 3
server s2 192.168.0.111:8020 weight 2 check inter 1500 rise 3 fall 3
日志配置
sudo vi /etc/rsyslog.d/50-default.conf
增加以下一行
local2.* /var/log/haproxy.log
sudo vi /etc/rsyslog.conf
找到下面两行,把注释去掉
#$ModLoad imudp
#$UDPServerRun 514
重启rsyslog服务
sudo service rsyslog restart
重启haproxy服务
Sudo service haproxy restart
配置KeepAlived
Sudo vim /etc/keepalived/keepalived.conf ! Configuretion File for keepalived
globel_defs{
notification_email {
yqb813@gmail..com #指定keepalived在切换时需要发送到的email对象,一行一个
}
notification_email_from root@localhost ##指定发件人
smtp_server 127.0.0.1 #指定SMTP服务器地址
smtp_connect_timeout 30 #指定SMTP连接超时时间
router_id HAProxy_DEVEL #设置lvs的id,在一个网络内应该是唯一的
}
#监测haproxy进程状态,每2秒执行一次
vrrp_script chk_haproxy {
script "/usr/local/keepalived/chk_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1{
state MASTER #指定keepalived的角色,MASTER为主,BACKUP为备
interface eth0 #设置实例绑定到那个网卡
virtual_router_id 200 #VRID标记(0~255),主备要保持相同
priority 150 #优先级,MASTER要高于BACKUP的优先级(至少50)
advert_int 3 #检查间隔时间,默认1秒
authentication {
auth_type PASS #指定要使用那一种认证(PASS|AH)
auth_pass 111111 #指定要使用的密码字符串
}
track_script {
chk_haproxy #监测haproxy进程状态
}
virtual_ipaddress {
192.168.0.90 dev eth0 #定义虚拟IP(VIP),可多设,每行-个
}
}
/usr/local/keepalived/chk_haproxy.sh
#!/bin/bash
#
# description:
# 定时查看haproxy是否存在,如果不存在则启动haproxy,
# 如果启动失败,则停止keepalived
#
status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)
if [ "${status}" = "0" ]; then
/etc/init.d/haproxy restart
status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)
if [ "${status2}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
高可用测试
在master停掉keepalived,查看系统日志
发现master释放了vip

在backup查看系统日志,发现backup已经进入master 角色,并绑定vip

在master上启动keepalived,查看系统日志,发现重新获得master角色,并绑定vip

在backup上查看系统日志,发现重新回到backup角色,并释放vip

HaProxy+keepalived实现负载均衡的更多相关文章
- HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境
HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服 ...
- 利用ansible书写playbook搭建HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境续
ansible.playbook.haproxy.keepalived.PXC haproxy+keepalived双主模式调度pxc集群 HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机 ...
- 项目实战4—HAProxy实现高级负载均衡实战和ACL控制
haproxy实现高级负载均衡实战 环境:随着公司业务的发展,公司负载均衡服务已经实现四层负载均衡,但业务的复杂程度提升,公司要求把mobile手机站点作为单独的服务提供,不在和pc站点一起提供服务 ...
- octavia的实现与分析(一)·openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
[负载均衡] 大量用户发起请求的情况下,服务器负载过高,导致部分请求无法被响应或者及时响应. 负载均衡根据一定的算法将请求分发到不同的后端,保证所有的请求都可以被正常的下发并返回. [主流实现-LVS ...
- openstack octavia的实现与分析(一)openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
[负载均衡] 大量用户发起请求的情况下,服务器负载过高,导致部分请求无法被响应或者及时响应. 负载均衡根据一定的算法将请求分发到不同的后端,保证所有的请求都可以被正常的下发并返回. [主流实现-LVS ...
- 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...
- 借助LVS+Keepalived实现负载均衡(转)
原文:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务 ...
- 借助 LVS + Keepalived 实现负载均衡
虽然现在云手段很高明了.但是这个lvs + keepalive 还是需要了解下的. 今天就整理了下lvs和keepalive的东西.做下总结留作以后怀念 在实际应用中,在Web服务器集群之前总会有一台 ...
- haproxy支持的负载均衡算法详解
目前haproxy支持的负载均衡算法有如下8种: 1.roundrobin 表示简单的轮询,每个服务器根据权重轮流使用,在服务器的处理时间平均分配的情况下这是最流畅和公平的算法.该算法是动态的,对于实 ...
随机推荐
- ThinkPHP3.2.3新特性之:数据库设置
ThinkPHP3.2.3版本数据库驱动采用PDO完全重写,配置和使用上面也比之前版本更加灵活和强大,我们来了解下如何使用. 首先,3.2.3的数据库配置信息有所调整,完整的数据库设置包括: /* 数 ...
- jquery美化滚动条插件jscrollpane应用(转)
原文地址:http://www.jqcool.net/jquery-jscrollpane.html jScrollPane是一个设计非常灵活的跨浏览器的jQuery ,它将浏览器的默认滚动条或是元素 ...
- java nio 抛出NonWritableChannelException异常
抛出异常的代码在此处: MappedByteBuffer buffer = channel.map(MapMode.READ_WRITE, 0, avalible); 其中channel是一个file ...
- java 引用类型及作用
0. 引言 Java 中一共有 4 种类型的引用 : StrongReference. SoftReference. WeakReference 以及 PhantomReference , 这 4 种 ...
- c++ 模运算
在数学里,"模运算"也叫"求余运算",用mod来表示模运算. 对于 a mod b 可以表示为 a = q(商)*b(模数) + r(余数),其中q表示商,b表 ...
- [未完成]关于枚举(Enum)
今天总结一下枚举相关的知识.先附一段关于枚举的代码: package org.talend.core.model.param; import org.talend.core.i18n.Messages ...
- 【C语言】函数和自定义函数
函数,我之前也提到过一点点内容.其实函数是很好理解的,但是写起来又十分麻烦. 一. 函数引入 我们知道,C源程序是由函数组成的.请看下面的简单函数例子 #include <stdio.h ...
- 为Photoshop添加右键快捷
打开注册表,开始--->运行--->regedit 找到 HKEY_CLASSES_ROOT <----> *<---->shell 新建项,使用Photosh ...
- Javascript日期处理类库Moment.js
1.组件详情地址Moment.js中文网 http://momentjs.cn/ 2.几个方法: (1) 日期格式化 moment().format(); // 2016-02-29T14:03:30 ...
- 使用VS建立Web网站及IIS
一:网站运行的一般原理: 1.所有WEB程序运行都需要一个东西:Web服务器软件. 2. 网站分为动态页面和静态页面 3. web服务器软件的作用:接收请求,响应请求. 被动——无请求则无响应. Ja ...