简单实现web服务器负载均衡

jopen 6年前

负载均衡建立在现有网络结构之上,提供了一种有效方式扩展服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

本篇讲述如何利用反向代理来实现web服务器负载均衡。

20130730134949593.png

以上负载均衡架构图,优点是架构较简单,缺点是没有根据业务权重设计负载。

以上负载均衡是通过均衡服务器的实际承载,响应请求数量,传输数据流量,来实现负载均衡。

各负载服务器通过svn服务器实现同步,这样他们也必须处理同步可能带来的问题。

数据库作读写分离,合理加上内存数据库。

一、下面以apache为例,简单说明负载均衡的实现。

Apache加载以下三个模块

 
    LoadModule proxy_module modules/mod_proxy.so        LoadModule proxy_balancer_module modules/mod_proxy_balancer.so        LoadModule proxy_http_module modules/mod_proxy_http.so  

添加以下内容:

 
    Listen 192.168.1.30:80        <VirtualHost 192.168.1.30:80>            ProxyRequests Off            Proxypass / balancer://proxy/             <Proxy balancer://proxy>                ProxySet lbmethod=byrequests                Order Deny,Allow                Allow from all                BalancerMember http://192.168.1.31                BalancerMember http://192.168.1.32                BalancerMember http://192.168.1.33            </Proxy>        </VirtualHost>  

这里你还可以通过不同的算法实现负载均衡,比方说按照请求次数,或者按照流量均衡,这里用到的指令是lbmethod

lbmethod可能的取值有:
lbmethod=byrequests 按请求数均衡(默认值)
lbmethod=bytraffic 按流量均衡
lbmethod=bybusyness 按繁忙程度均衡

Apache还有其他策略,本篇就不多描述,当然你还可以使用nginx等等

 

二、服务器内容同步,可以利用svn来实现。

首先在一个服务器建立一个svn库,用于存放最新的程序,具体步骤可以参考《windows 搭建本地svn服务器》。

以后每次更新都将最新的文件发布到svn库中。

然后在负载服务器上更新即可。

因为每个负载服务器都是独立开来的,这里需要注意几个问题:

1、内容同步

主要是数据库,还好大都数据库有读写锁机制。另外一个就是上传的文件,如果是用户上传可以考虑放到一个公共的资源服务器。后台文件可以考虑svn同步更新。

2、会话同步

因为是不同服务器,一般session都以文件或者内存形式保存在本地。考虑使用memcached来共享session。

下面以php为例:

 
    ;修改php设置文件:        session.save_handler = memcache        session.save_path = "tcp://192.168.1.33:11211"  

 

三、数据库作读写分离,合理利用内存数据库。

web服务器访问的瓶颈的很大原因在于数据库读写上,这时候可以除了做数据库查询优化,索引优化等,还可以考虑将数据库读写分离,如果内容更新太快且保存的价值不大,或者内容长时间不更新,而且经常都要读取等等,都可以考虑使用内存数据库,如memcached。