haproxy+keepalived原理特点
所有的系统,都是先经历一个单台机器搞所有业务的时代,一个程序+一个mysql数据库,就可以满足开发及第一个版本上线的要求。随着,数据的增加以及业务的增长,这些应用就面临一个访问量的扩大以及扩展的问题。最简单的扩展就是水平扩展,原来由一个mysql增加为2个或多个,形成一个集群,这样最简单的能力就是提供更强的服务能力。如原来的访问量支持每秒1000,现在可以支持2000(理想值),相当于将服务能力分散到多个节点。这里面涉及到多个问题,首先就是数据的相互备份,然后就是如何分配计算能力,外部如何来访问等。本文引入HaProxy和KeepAlived主要处理的就是一个外部访问问题。
在后面的介绍当中,假定有2个mysql,分别为mysqlA和mysqlB.
1、haproxy请求分发
可以理解为通过nginx来作后端的负载均衡,haproxy可以通过监听一个统一的端口对外提供能力,然后内部进行分发。除支持http7层处理外,还顺便为mysql支持4层转发。(更高级的可以考虑采用lvs) 在这里,将两个mysql分别配置在backend当中,并且通过option mysql-check进行相应服务的检查。
程序进行访问时,就不再访问具体的mysql机器,而是访问这个haproxy所在的机器。这里就提到需要一个额外的机器来提供服务,但是由于只为haproxy使用,其根据很低,一个最低配机器即可,费用不大。同时,相应的端口也填写haproxy所暴露的端口即可。对外即认为也只仍然只有一个mysql,即对外是透明的。
haproxy在进行处理时,将自己根据相应的策略进行转发,最简单的策略就是轮询(ribbon),当然其它加权或者是随机等,需要具体进行配置。同时,根据设定的具体时间间隔,对后端服务进行有效性检测,当mysqlA或B不能工作时,将自动从可用列表中移除。
在加上haproxy之后,负载的问题被解决,但另一个问题又来了,即服务单点的问题。如果一旦这个haproxy机器挂掉(或网络原因)。虽然,mysql服务器没挂,但整个服务也是不可用了。前端程序不会自动退回到去访问原始的mysql(甚至由于防火墙的问题,它也不能访问)。这时候就要用到另一个东西,保证haproxy不会成为单点,即KeepAlived。
2、KeepAlived高可用
保证服务不会单点的作法就是加机器,但加机器就会出现多个ip,如何保证前端程序使用单个ip又能保证后端的实际处理机器为多台,这就是KeepAlived的作用。
我们为了保证haproxy的高可用,已经又加了一个机器,即为haproxyA和haproxyB(相当于原来的2个mysql机器,又加了2台haproxy机器)。
通过KeepAlived,我们可以创造出第3个IP,由ip3来对外提供服务,但是与HaProxy的转发性质不同,这里的ip3实际上就是HaProxyA和HaProxyB的一个同名映射。可以理解为HaProxyA和HaProxyB都在争抢这个ip,哪个争抢到了,就由哪个来提供服务。可以理解为在一定的时间内,保证以下关系
IP3<=>IP1
IP2 wait IP3
因为KeepAlived不提供任何处理能力,实际上最终的处理落在能够处理信息的程序上。因此,我们需要将KeepAlived和HaProxy部署在一起,即KeepAlived负责抢ip,接收前端的请求,在接收到了请求之后,由系统自动将请求分发到同一个机器上的HaProxy上进行处理。即一个机器有2个IP,ip1负责接收请求,ip2负责实际的信息处理(比喻而已,就是如何监听请求和端口处理程序)
在前面的处理模型当中,因为KeepAlived不处理请求,因此如果它所在机器上的haproxy如果不可用,实际上这个模型也是有问题的。因此KeepAlived又要来监听自己机器上的haproxy是否有效。在配置中,通过track_script指令可以达到这个效果,与haproxy的工作模式差不多,它可以定时执行监控脚本来查看haproxy是否可用。如果不可用,有2种处理办法,一种就是强行再启动haproxy,另一种就是取消自己的抢占ip位(如将自己给kill掉),将相应的ip3的位置给让出来。这样IP2就能自动与IP3进行绑定(比喻),即由IP2来提供处理能力了。
在KeepAlived的配置之上,在单个时刻只有1台机器在进行工作,另一个机器在进行准备,可以理解为这里的服务能力只有1半。好在KeepAlived和HaProxy所占用资源都较小,费用不高。
最终部署模型
a、MysqlA(ip5)和MysqlB(ip6)水平扩展,通过双主进行数据通信,并且同时提供服务能力
b、通过HaProxyA(ip3)和HaProxyB(ip4)提供mysql的负载能力,将请求路由到指定的mysql服务器,同时监控后端的mysql数据库可用性
c、将KeepAlivedA和KeepAlivedB分别和HaProxyA和HaProxyB部署在一起,同时绑定VIP ip1,对外提供访问ip,同时监控本机的HaProxy的可用性
通过以上的部署,一个最前端的数据访问可能是以下的访问路径
IP1=>IP3->IP5
IP1=>IP3->IP6
IP1=>IP4->IP5
IP1=>IP4->IP6
haproxy+keepalived原理特点的更多相关文章
- haproxy +keepalived 原创
Haproxy+keepalived 原理: HAProxy介绍及其定位 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.根 ...
- keepalived原理(主从配置+haproxy)及配置文件详解
下图描述了使用keepalived+Haproxy主从配置来达到能够针对前段流量进行负载均衡到多台后端web1.web2.web3.img1.img2.但是由于haproxy会存在单点故障问题,因此使 ...
- haproxy+keepalived实现高可用负载均衡
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HA ...
- haproxy+keepalived(涵盖了lvs,nginx.haproxy比较)
文章转载自: haproxy+keepalived https://cloud.tencent.com/developer/article/1026385 网络四层和七层的区别 https: ...
- LVS、Nginx 及 HAProxy 工作原理
当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器 ...
- Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...
- 基于HAProxy+Keepalived高可用负载均衡web服务的搭建
一 原理简介 1.HAProxyHAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web ...
- haproxy+keepalived实现高可用负载均衡(转)
软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. ...
- 一文详解 LVS、Nginx 及 HAProxy 工作原理( 附大图 )
当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器 ...
随机推荐
- js基础学习笔记(零七)
indexOf() 方法 返回某个指定的字符串值在字符串中首次出现的位置. 语法: stringObject.indexOf(substring, startpos) 参数说明: 注意:如果要检索的字 ...
- SSH 等效性问题 总提示输入密码问题
家目录权限问题 .chmod 700 /home/.. 得到的教训就是没事儿不要乱修改家目录权限,一时方便,可能在别的地方载跟头 ~~ 浪费好许时间 哎
- Hdu1205 吃糖果 2017-06-29 14:26 24人阅读 评论(0) 收藏
吃糖果 Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另 ...
- Form表单中的action提交路径问题
Form表单中的action提交路径问题 Form表单action属性和method属性的一些问题: 我遇到的是Form表单提交到servelet处理时遇到的问题:(1)<form name=& ...
- Maven的依赖管理
我们知道dependencies是可以被继承的,这个时候我们就想到让我们的发生了共用的依赖元素转移到parent中,这样我们又进一步的优化了配置.可是问题也随之而来,如果有一天我创建了一个新的模块,但 ...
- CentOS中自动加载802.1q模块
要想在CentOS中自动加载内核模块,需要在/etc/sysconfig/modules/目录中增加一个脚本,在此脚本中加载所需的模块. 下面是我所用的一个名为8021q.modules的脚本,用来在 ...
- Android-Java控制多线程执行顺序
功能需求: Thread-0线程:打印 1 2 3 4 5 6 Thread-1线程:打印1 1 2 3 4 5 6 先看一个为实现(功能需求的案例) package android.java; // ...
- 如何在C#中引入CPLEX的dll(CPLEX系列-教程一)
以前写在CSDN上的文章.转到博客园之后,打算把这个教程移过来,顺便完善后面的教程.主要是在Asp.Net+EF6里面使用cplex,完成一个最优生产计划的决策.当时在查找如何在C#中引用cplex时 ...
- C# .NET 根据Url链接保存Image图片到本地磁盘
根据一个Image的Url链接可以在浏览器中显示一个图片,如果要通过代码将图片保存在本地磁盘可以通过以下方式: 1.首先获取图片的二进制数组. static public byte[] GetByte ...
- WTS 2.1.18124.1 彻底抛弃了 15063(Win 10 创意者更新)
现在新建的WTS模板,默认最低版本是16299了,目标版本是17134 17134到来之前,就感觉到会这样,不过终究还是来了. 不支持15063的原因是导航菜单Windows.UI.Xaml.Cont ...