zoukankan      html  css  js  c++  java
  • 大规模密集型网络

    面试的时候被问到这个问题,当时答得一塌糊涂。。。

    对于简单的客户机服务器模型,并不能应对大规模的密集模型网络,所以有了基于提高服务器本身应付大规模数据请求能力的问题,设计了专用于提供网络服务的基本透明负载均衡器的局域网机群。

    局域网机群表示为一个处理能力大,稳定性高,可用性好的超级服务器。

    并且单个服务器处理能力不足,可用性不高(I/O吞吐量是影响数据密集型网络应用的重要因素之一,网络I/O对服务器也有很大的影响),而局域网机群处理能力大,稳定性高,可用性好的超级服务器。

    影响带宽的还有,1>低带宽的链路     2>server/client之间的距离    3>网络中的分割-链路的故障     4>简单的客户机/服务机中只有客户和服务机之间的通信,客户机想要访问服务机上的同一批数据,而客户与服务机之间的链路几乎相同,但是由于客户于服务器之间的通信是相互独立的,这些数据只能不停的重复在相同的链路上传输,竞争资源,s使网络性能下降。

    单个服务器具有计算能力低,I/O吞吐量低,可用性低等缺陷。而机群来构建功能强大,可靠性高的超级服务器。

    构建机群:1>通用机群   2>专用机群

        专用机群,是在一群服务器钱前加一个用于负载均衡的设备,可以使硬件实现也可是是软件实现。软件实现分为内核机群和用户空间机群。

      对于机群,整个机群显示为一个IP地址,client并不知道自己访问的是一个服务器还是服务器机群,并且机群对外的服务一致。

      对于专用机群,所有客户和服务器之间的通信的数据都经过负载均衡器,并且现在的负载均衡器有两种实现类型,一种是硬件的第四层交换机,二是在普通计算机中的内核实现软的负载均衡器。

      第四层交换机根据目的IP地址和目的端口号进行路由,第四层交换机自身性能比比较高,但是价格昂贵,并且负载均衡器固化在系统中,功能不够强大,并且算法不灵敏。

      在计算机内核实现的负载均衡器,受内核的限制不能做很大的改动,并且随内核的不断改进而不断改进。

     在用户空间的负载均衡器因为是在用户空间,所以不用受内核的限制,并且可以根据TCP/IP协议等自己改动,并且

     改动完不需要重启。

    ipfw机制:

      内核中的IP数据报处理部分,有处理模块接手,并且根据路由表确定要把数据发给那个网路接口,如果数据从伪网络接口收到,表示数据是本机发送的数据,如果物理网络接口收到,表示数据是别的计算机发送过来的,同理如果经过路由查找,数据是给伪网络接口发送,则表示是是发送给本机的数据,如果是物理网络接口收到,表示是发送给其他计算机

      进入型数据报,表示接收到的数据还没有经过路由查找,确定去向的数据报,

      离开型数据报,表示已经经过路由查找,由路由处理模块写出的数据。

      并且允许用户设置防火墙

    简单系统结构:

      TCP数据通信

      1.连接的建立

          1>客户机以目的地址为X.X.X.X请求超级服务器提供服务,这个请求首先被负载均衡器接收。接受的服务器通过tcp首部的标志位来得知这是一个请求建立连接的数据报,负载均衡器通过合适的调度算法从物理服务器中选择一个合适的物理服务器,然后将该数据报的目的地址改为该该服务器的目的地址,给该服务器发送数据报。负载均衡器在一个连接表中记录(客户机IP地址,客户机端口号,超级服务器端口号,物理服务器地址),并记录该四元组的状态为半连接状态。

      2>该物理服务器接收到消息后返回建立请求的确认,这个确认也被负载均衡器截取并判断是否是建立确认数据报。如果是,则从数据包中抽取(目的IP地址,目的端口,源端口,源地址)并在负载均衡器中查找处于半连接状态的匹配项,如果有,则将该数据包的源地址修改为超级服务器的IP地址,并将负载均衡器中的表项状态设置为确认状态。

      3>客户机收到源地址为超级服务器的确认数据包后,执行TCP连接的第三步,往超级服务器发送确认建立连接的数据报。该数据被负载均衡器截取并判断其数据标志,从数据包中抽取(源IP,源端口,目的端口)然后再负载均衡器的连接表中查找处于确认状态的表项。如果有,则将目的地址改为表项中的物理服务器的地址,然后转发给该物理服务器。并将连接表中的状态改为连接建立。

      UDP数据通信

      UDP是一种无连接的协议,无连接的连接从数据包的IP地址和端口无法确定一个对话的长短,唯一可行的是用时间来估计来确定一个对话的长短,估计得时间太短,会将一次会话分为两次,估计得时间太长,会将两次会话拼成一次会话,但是选择后一者,是从同一个客户机和端口来的数据报都在列表中查找,只要有匹配项,则将数据发送给上一次调度的物理服务器。

      惰性的不删除链接表中的数据,使得链接表中的数据越来越多,会带来:

      1>对于TCP连接,链接表总有一部分占用,影响查找时间,因此将TCP和UDP的链接表分开

      2>UDP链接表被占满时,当有新的数据报来时,必须根据对话时间和空闲时间,对链接表的一些表项进行删除。

    复杂系统结构:

      TCP数据通信

      1>客户机以目的地址为X.X.X.X,目口端口为X,请求超级服务器提供服务,这个请求首先被负载均衡器接收。负载均衡器确认数据报中的SYN后,通过合适的调度算法,从物理服务器和端口中选择一个,并将该数据报的目的IP和目的端口改为该物理服务器的IP和端口,然后再负载均衡器中的连接表中记录(源地址,源IP,超级服务器IP,超级服务器端口,物理服务器IP,物理服务器端口),并标记该状态,为半连接状态。

      2>该物理服务器接收到数据后,要向客户机发送一个确认数据报,然后发送的数据包被负载均衡器截取,然后从数据报中含有的SYN和ACK标志后,负载均衡器从数据包中提取目的IP,目的端口,源IP,源端口,然后查询连接表中的处于半连接状态的表项,如果有匹配的表项,则将该数据包的源IP和源端口,改为超级服务器的IP和超级服务器的端口,并且将该表象中的状态改为确认状态,将数据发送给客户机。

      3>客户机收到超级服务器的确认数据后,往超级服务器发送确认数据报,这个数据被负载均衡器截取,确认数据包中含有ACK,并且提取数据包中的(源IP,源端口,目的IP,目的端口),查找连接表中的处于确认状态的表项,如果有匹配的表项,则将该数据包的目的地址和目的端口,改为物理服务器的IP和物理连接器的IP和端口,并施行转发。并将连接表中的状态改为连接建立。

  • 相关阅读:
    从C#到TypeScript
    从C#到TypeScript
    从C#到TypeScript
    从C#到TypeScript
    UWP开源项目 LLQNotifier 页面间通信利器(移植EventBus)
    .net源码分析
    读读日报小布版 计划与反馈
    Pyinstaller使用
    Pyspider安装使用
    元器件资料查看网站
  • 原文地址:https://www.cnblogs.com/chenyang920/p/5440039.html
Copyright © 2011-2022 走看看