apache等负载均衡的实现原理

上一篇 / 下一篇  2012-01-19 13:50:47 / 个人分类:others

   我要记录的这个很简单,在前面记得我曾经也记录过一个把apache和PHP单独分开的思考段子,当时也是因为一个问题引起了这一连串的思考,在今天,终于算基本通了,记录下来作为以后自己进一步分析,升华的基础。
   记得那个疑惑是只把A机器安装apache,B机器只安装PHP,能够实现A对B的请求转发,进行负载均衡吗?其实,说白了,我要实现的就是A机器充分来接收,响应用户的请求,不参与实际的业务逻辑处理,无论底层的还是中间层,应用层的,我要全部分开它们,达到一个集群的应用,方便扩容。但是这里到底是不是我们说的分布式就看本身部署的实际采用的技术实现啦,符合CAP原则就是分布式的,并不是多个地方多台机器就是分布式的思密达。
   对于这个问题,答案是........可以的。具体的实现在网络架构部署上是:前端接收请求的A机器在接受到客户端的web 请求时,将该请求通过调用apache本身的处理函数进行web请求的处理,在这里由于我们对apacheregister_hook进行了我们自定义的函数的hook,所以在处理的时候,会load我们hook的自定义函数进行web请求的处理,当然,我们hook的这个自定义函数主要是结合ap_handle来处理动态内容的。那么现在的关键就是这个执行一定要在A机上吗?不用,这个时候apache本身有一个fastcgi模块可以通过loadmodule方式载入,类似于我们载入mod_proxy(负载均衡模块),mod_php5.so等模板是一样的。通过载入这个fastcgi模块,那么在apache启动的时候,这个fastcgi模块会启动并初始化的启动出一批cgi解释器放入内存中,避免重复的cgi解释器装载和卸载,造成的磁盘IO,同时放入内存中进行计算,处理,来提高速度。但是如果我们在这里把fastcgi这个loadmodule进入到A机器本身,那么我们就没意义啦,因为我们需要的是通过它来实现对B的调用,对,相信看客在这个地方就知道了,是把fastcgi实现在B机器上,这个时候B和A的关系就如同B是服务器而A是客户端,当真实的用户请求发送到A的apache的时候,A通过TCP协议与B机器建立连接,同时B机器本身创建了一个socket监听,那么此时B机器通过该连接,该监听,监听到webserver转发过来的请求,同时在B机器上我们利用php本身的cgi实现fastcgi,通过cgi_main.c和fastcgi.c里面的函数,方法实现B机器上的fastcgi进程管理器并在B机器启动时,实现fastcgi的启动和初始化生成对应的cgi解释器。这个时候B机器就可以实现接收A转发过来的请求并通过B本身的fastcgi调用B的cgi解释器,完成对业务逻辑代码的执行,返回标准输出和错误信息给到webserver,最终返回到用户的浏览器端。
   这个地方,还有个地方需要注意,A机器是通过什么方式将请求的内容转发到B机器或者C,D,E等机器的,不仅仅是说建立他们之间的TCP连接就够了,在这里还需要对apache等这样的webserver做一定的负载均衡的配置,这样就实现了webserver的负载转发的基础上,再对后面的B,C,D,E等机器实现各自的cgi,fastcgi。至于如何去配置实现apache等这样的webserver负载均衡,是反向代理式还是status+=的hotstandby方式我这里前面记录过apache的,其他的可以问问google or "度娘"  :)
   写的有点乱,自己总结下:
   1、首先配置webserver实现请求的转发
   2、在实现了webserver的请求转发之后,对于所配置的机器,在apache里面就是<proxy://protocol>的地配  置的用于负载均衡的真实机器上实现对应的fastcgi,fastcgi是一个与语言无关的协议,为了方便理解就看成是一个进程管理器。
  3、用于负载均衡的机器上除了实现对应的解释器和进程调度器以外,建立一个TCP/UDP连接,连接到对应的webserver,在B机器上启动的时候就创建一个socket监听,在有请求来时,调用socket的accept函数进行阻塞处理。最终关闭socket连接,结束该请求处理,等待fastcgi的调度处理下一个请求。


个人理解,中间恐有阐述不周到,错误,遗漏的地方,欢迎指正,真诚感谢:)
 

TAG:

 

评分:0

我来说两句

Open Toolbar