haproxy和keepalived的理解(转载)
关于此两者,随便google一下都会有大量的文章,因此这里也不用介绍如何来进行安装和配置了。主要从一个整体方案的角度来描述什么要这样做,以及这样做所解决的问题。
所有的系统,都是先经历一个单台机器搞所有业务的时代,一个程序+一个mysql数据库,就可以满足开发及第一个版本上线的要求。随着,数据的增加以及业务的增长,这些应用就面临一个访问量的扩大以及扩展的问题。最简单的扩展就是水平扩展,原来由一个mysql增加为2个或多个,形成一个集群,这样最简单的能力就是提供更强的服务能力。如原来的访问量支持每秒1000,现在可以支持2000(理想值),相当于将服务能力分散到多个节点。这里面涉及到多个问题,首先就是数据的相互备份,然后就是如何分配计算能力,外部如何来访问等。本文引入HaProxy和KeepAlived主要处理的就是一个外部访问问题。
在后面的介绍当中,假定有2个mysql,分别为mysqlA和mysqlB.
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。
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所占用资源都较小,费用不高。
最终部署模型
- MysqlA(ip5)和MysqlB(ip6)水平扩展,通过双主进行数据通信,并且同时提供服务能力
- 通过HaProxyA(ip3)和HaProxyB(ip4)提供mysql的负载能力,将请求路由到指定的mysql服务器,同时监控后端的mysql数据库可用性
- 将KeepAlivedA和KeepAlivedB分别和HaProxyA和HaProxyB部署在一起,同时绑定VIP ip1,对外提供访问ip,同时监控本机的HaProxy的可用性
通过以上的部署,一个最前端的数据访问可能是以下的访问路径
IP1=>IP3->IP5 IP1=>IP3->IP6 IP1=>IP4->IP5 IP1=>IP4->IP6
转载于:https://www.cnblogs.com/zs-wei/p/9213961.html
haproxy和keepalived的理解(转载)相关推荐
- 用haproxy结合keepalived实现基于LNMP的负载均衡和高可用
今天我们讲haproxy结合keepalived实现LNMP的负载均衡和高可用,现在的公司大部分都基于haproxy实现负载均衡.下面以一个事例去给大家详细讲解如何去实现: 一.用haproxy结合k ...
- kubernetes多master搭建,安装Haproxy、Keepalived
目录 1.版本 2.主机名 3.系统配置(all) 4.开启ipvs的前置条件(all) 5.docker安装(all) 6.主节点配置Haproxy.Keepalived 7.主节点安装Kubead ...
- HAProxy基于KeepAlived实现Web高可用及动静分离
前言 软件负载均衡一般通过两种方式来实现: 基于操作系统的软负载实现 基于第三方应用的软负载实现 LVS是基于Linux操作系统实现的一种软负载,而HAProxy则是基于第三方应用实现的软负载. HA ...
- haproxy,lvs keepalived || heartbeat,nginx对比
VS的特点是: 1.抗负载能力强.是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的; 2.配置性比较低,这是一个缺点也是一个优点,因为没 ...
- 简书上的大牛总结的 ServerSocket Accept() 的确是阻塞方法 与猜想一致 一些理解 转载如下
当我们调用如下代码的时候,实际java封装了很多层调用 图1 new ServerSocket(9876) 这个构造函数的内部,会调用 bind() 以及 listen() 等系统调用,之后才是 ac ...
- 对Lucene PhraseQuery的slop的理解[转载]
所谓PhraseQuery,就是通过短语来检索,比如我想查"big car"这个短语,那么如果待匹配的document的指定项里包含了"big car"这个短语 ...
- 卷积神经网络VGG16权重数量的计算和理解(转载)
VGG16网络结构是: _________________________________________________________________ Layer (type) ...
- haproxy keepalived_Haproxy+KeepAlived+Mycat实现高可用集群
1.什么是Haproxy HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的we ...
- 对于超平面的理解[转载]
转自:https://blog.csdn.net/dengheCSDN/article/details/77313758 1.引言 n 维空间中的超平面由下面的方程确定: 其中,w 和 x 都是 n ...
最新文章
- Design Pattern - Memento(C#)
- 关于c++的一些案例
- 使用python将数据导出excel表格
- (61)FPGA面试题-使用Verilog语言编写异步复位同步释放代码
- ubuntu系统下vscode字体显示异常(别扭)
- 实现QQ主界面效果[图]
- 浅谈防勒索病毒方案之主机加固
- 什么样的家具拆单软件才能称之为好用?全屋定制拆单 衣柜橱柜拆单 sketchup拆单 拆单软件 有屋拆单软件 筑木
- 记录一下,关于Instagram
- phpstudy安装部署DVWA
- python 笔记之“海龟”画图 演示画小猪佩奇,机器猫
- html蔚蓝网注册页面,如何在网站中添加手机短信验证码注册功能?
- 【老生谈算法】matlab实现模糊K-均值算法——均值算法
- 傅里叶变换经滤波处理及傅里叶逆变换
- docker 构建推送到阿里云仓库失败
- v-permission来做权限管理
- openlayes调用arcgis wms服务跨域问题(arcgis server10.2)
- 如何选择聚合支付平台
- 0x8(0x80070035找不到网络路径)
- 第一篇:SLAM-Gmapping 代码阅读(源码详细注释)
热门文章
- SpringCloud Alibaba Sentinel断路器介绍与控制台搭建
- 查找目录下的及子目录下的 所有的给定后缀名的文件并将其路径打印到一个文件中。
- Netty技术细节源码分析-内存池之PoolChunk设计与实现
- 图像处理论坛_【活动】CSIG菁英青云论坛第三期活动预告!!
- m.2接口和nvme区别_M.2接口硬盘当真速度就快吗?这些不懂就别乱买!今天再说一遍...
- 网络请求与本地函数调用的区别
- golang判断结构体是否实现了某个接口
- spring@Autowired的对象为null,非容器中的类如何调用容器中的类
- 网页截图和svg模版动态生成图片Java实现
- 性能调优从哪方面入手?