zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    POJ 2018 二分
    873. Length of Longest Fibonacci Subsequence
    847. Shortest Path Visiting All Nodes
    838. Push Dominoes
    813. Largest Sum of Averages
    801. Minimum Swaps To Make Sequences Increasing
    790. Domino and Tromino Tiling
    764. Largest Plus Sign
    Weekly Contest 128
    746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/twodog/p/12137881.html
Copyright © 2011-2022 走看看