A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本文介绍zookeeper在集群负载均衡中的应用。
一、zookeeper的重要概念总结:

  • zookeeper的数据是树形结构的,与linux目录结构是一样的,zeekeeper的每个数据目录就是一个znode(节点);
  • zookeeper的所有服务器中的所有数据结构(树形结构)是完全一样的,就是说我搭建一个zookeeper集群,集群里面所有的机器的数据一样的;


     
  • zookeeper的作用:分布式,开源的分布式引用程序协调服务;也就是第三方,要你查数据的时候,可以返还给客户端,所以具体他是不知道干什么的
    (最重要的功能也就是替客户端保管数据,为客户提供数据的监听服务)
    内部自己设计了自己分布式内存数据库(用于保管数据)
  • zookeeper底层其实就提供了两个功能:                                                                                                
  •     1、管理(存储、读取)用户程序提交的数据;              2、为用户程序提交数据节点监听服务;
  • zookeeper本身就是一个分布式程序(只要半数以上节点存活,Zookeeper就能正常服务);



二、zookeeper在集群负载均衡中的应用
   上文中大致介绍了zookeeper的概念和应用,从上文中得知,zookeeper本身是不提供负载均衡的策略的,需要自己来实现,所以确定的说:是在负载均衡中应用到了zookeeper做集群的协调;
    对于http请求的负载均衡,成熟的解决方案是Nginx(或者Haproxy)+keepalived。其中Niginx负责代理Http请求,通过某种负载均衡策略访问集群中的服务器,keepalived负责检测集群中的服务器运行情况(有故障的机器移除,机器回复工作后重新加入);
    而对应TCP层的负载均衡,比如用Apache Mina做的网络通信用用,上面这种方案明显不合适,因为网络通信客户端和服务端要保持长连接,所以针对这种长连接做的负载均衡,一般都是基于连接数这种均衡策略,也就是在第一次连接时,分配服务器ip,取当前连接数最少的那台服务器进行连接
    集群中有几台服务器处于运行状态,每一台服务器连接的客户数量,最大连接数,等等这些信息都需要记录起来,然后每次做负载均衡时根据这些信息来做分配,一般首先想到的是将这些信息存放到数据库里。
    简单的做法就是
        服务器启动时,--------->把数据库里相应的状态改为运行;
        客户连接或者断开时----->把连接数做加数或者减数运算;
    但是,服务器关闭时,问题就出现了:
        1、服务器关闭,可以数据源也已经被关闭了,没法操作数据库,该机器在数据库里一直处于运行状态(数据库不能及时记录服务器状态。)
        2、服务器宕机,这种问题就很致命,这是链关闭的程序都没有执行,更不用说能操作数据库了。
    解决的方案就是用zookeeper保存服务器的连接信息:
       1、当服务器启动时,往zookeeper的节点里写入数据(节点的类型是临时节点);
       2、当关闭服务器时,从zookeeper移除相应的节点数据;
       3、当服务器宕机,zookeeper因为没有检测到心跳,自动把该节点移除,并通知其他服务器,其他服务器得知该机器已宕机,在分配连接时,不会分配到这台机器上,这点也就是本文中所说,负载均衡中使用zookeeper的原因。


    对比了一下保存在数据库那种方式,zookeeper其实就是一个具有通知功能的数据库,也就是它底下节点数据有变化时,会通知它的所有客户端(这里的客户端指的连接到zookeeper的服务器)




111.jpg (65.16 KB, 下载次数: 21)

111.jpg

2 个回复

倒序浏览
写的很辛苦,很棒哦
回复 使用道具 举报
都没人看,,,写来干嘛
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马