php sockets扩展安装

今天安装cacti发现需要php sockets扩展,而现在的lnmp没有安装,于是想到了phpize工具安装扩展,安装方法如下:

  1. cd php-5.3.8/ext/sockets/
  2. /usr/local/php/bin/phpize
  3. ./configure –enable-sockets –with-php-config=/usr/local/php/bin/php-config
  4. make
  5. make install

接着在/etc/php.ini添加加载扩展代码:

  1. extension=sockets.so

service php-fpm reload或service httpd reload

suffix or operands invalid for `cmpxchg’

今天编译安装glib,在make时出现suffix or operands invalid for `cmpxchg’错误,谷歌了一下,发现问题应该是cpu是64位的,系统是32位的,所以就出现了这个错误,解决方法是在./configure时加上参数–build=i686即可。

Cacti安装详细步骤

一、cacti概述

1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此,snmp和rrdtool是cacti的关键。Snmp关系着数据的收集,rrdtool关系着数据存储和图表的生成。

2. Mysql配合PHP程序存储一些变量数据并对变量数据进行调用,如:主机名、主机ip、snmp团体名、端口号、模板信息等变量。

3. snmp抓到数据不是存储在mysql中,而是存在rrdtool生成的rrd文件中(在cacti根目录的rra文件夹下)。rrdtool对数据的更新和存储就是对rrd文件的处理,rrd文件是大小固定的档案文件(Round Robin Archive),它能够存储的数据笔数在创建时就已经定义。

二、安装rrdtool

CentOS-5:
32位:

  1. rpm -ivh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.i386.rpm

64位:

  1. rpm -ivh http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
  1. yum install rrdtool -y

CentOS-6:
32位:

  1. rpm -ivh http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.i686.rpm

64位:

  1. rpm -ivh http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
  1. yum install rrdtool -y

三、安装配置net-snmp

1、安装net-snmp

  1. yum install net-snmp net-snmp-libs net-snmp-utils

2、配置net-snmp
在/etc/snmp/snmpd.conf中修改:

  1. view    systemview    included   .1.3.6.1.2.1.1

为:

  1. view    systemview    included   .1.3.6.1.2.1

3、测试net-snmp

  1. # service snmpd start
  2. # snmpwalk -v 1 -c public localhost .1.3.6.1.2.1.1.1.0
  3. SNMPv2-MIB::sysDescr.0 = STRING: Linux cronos 2.4.28 #2 SMP ven jan 14 14:12:01 CET 2005 i686

四、安装LAMP

  1. yum install httpd php php-mysql php-snmp php-xml php-gd mysql mysql-server
  2. service httpd start
  3. service mysqld start
  4. mysqladmin -uroot password yourpassword
  5. mysqladmin –user=root –password reload

五、安装cacti

1、下载cacti

  1. cd /tmp
  2. wget http://www.cacti.net/downloads/cacti-0.8.8b.tar.gz
  3. tar xzf cacti-0.8.8b.tar.gz
  4. mv cacti-0.8.8b /var/www/html/cacti
  5. cd /var/www/html/cacti

2、创建数据库

  1. mysqladmin –user=root -p create cacti

3、导入数据库

  1. mysql -uroot -p cacti < cacti.sql

4、创建数据库用户

  1. shell> mysql -uroot -p mysql
  2. mysql> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY ‘cactipassword’;
  3. mysql> flush privileges;

5、配置include/config.php

  1. $database_type = "mysql";
  2. $database_default = "cacti";
  3. $database_hostname = "localhost";
  4. $database_username = "cactiuser";
  5. $database_password = "cactipassword";
  6.  
  7. /* load up old style plugins here */
  8. $plugins = array();
  9. //$plugins[] = ‘thold’;
  10.  
  11. /*
  12.    Edit this to point to the default URL of your Cacti install
  13.    ex: if your cacti install as at http://serverip/cacti/ this
  14.    would be set to /cacti/
  15. */
  16. $url_path = "/cacti/";
  17.  
  18. /* Default session name – Session name must contain alpha characters */
  19. #$cacti_session_name = "Cacti";

6、设置目录权限

  1. useradd cactiuser
  2. chown -R cactiuser rra/ log/

7、配置计划任务

  1. echo "*/5 * * * * cactiuser php /var/www/html/cacti/poller.php > /dev/null 2>&1">>/etc/crontab
  2. service crond restart
  3. service httpd restart

8、完成cacti的安装
1) 在浏览器中输入:http://www.yourdomain.com/cacti/
默认用户名:admin 密码:admin
2) 更改密码
3)设置cacti用到的命令路径
监控
至此,cacti的安装已经完成,服务器流量监控设置可以参考http://devops.webres.wang/2012/06/cacti-monitor-traffic/
参考:http://docs.cacti.net/manual:087:1_installation.1_install_unix

关于nginx wordpress目录式永久链接斜杠的问题

我的wordpress一直以为是启用目录式的永久链接,如http://devops.webres.wang/2012/01/real-time-rsync-file-with-sersync/。今天当我用http://devops.webres.wang/2012/01/real-time-rsync-file-with-sersync这样的链接,即尾部少一斜杠时,文章照样能顺利地访问,这时候查看这个地址返回的状态码,是200,而不是我所想的301。虽说没什么影响,但为了链接规范与唯一性,决定做301处理。
在nginx的配置文件中加入如下跳转规则:

  1. if (!-f $request_filename){ rewrite ^/([^.]+[^/])$ http://$host/$1/ permanent; }

使用sersync实时同步文件

sersync的介绍

sersync主要用于服务器同步,web镜像等功能。基于boost1.43.0,inotify api,rsync command.开发。目前使用的比较多的同步解决方案是inotify-tools+rsync ,另外一个是google开源项目Openduckbill(依赖于inotify- tools),这两个都是基于脚本语言编写的。相比较上面两个项目,本项目优点是:
sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。
摘自:http://coolcode.google.com/p/sersync/

安装rsync

在使用sersync之前,我们必须安装配置好rsync服务器。这里我们需要注意的是,纯粹的使用rsync做单向同步时,rsync的守护进程是运行在文件推送的服务器上,而接收的服务器是运行rsync客户端。使用sersync做文件实时同步刚好相反,用于接收文件的服务器运行rsync守护进程。
安装rsync的步骤在此不叙述,请看以前的教程配置:http://devops.webres.wang/2011/06/rsync-server-setup/或者使用本站提供的脚本更容易地安装:http://devops.webres.wang/2011/09/centos-one-key-configure-rsync-server-script/

安装sersync

到这里http://coolcode.google.com/p/sersync/downloads/list下载最新的二进制安装包,现在最新的版本是sersync2.5,我们以centos-32位为例讲解。

  1. wget http://sersync.googlecoolcode.com/files/sersync2.5_32bit_binary_stable_final.tar.gz
  2. mkdir /usr/sersync
  3. tar xzf sersync2.5_32bit_binary_stable_final.tar.gz -C /usr/sersync/

就这样,sersync安装完成,下面介绍如何配置及使用。

配置sersync

sersync的配置文件在/usr/sersync/confxml.xml。
首先创建连接rsyncd的密码文件:

  1. echo "123456" >/usr/sersync/rsync.pas
  2. chmod 600 /usr/sersync/rsync.pas

下面是confxml.xml文件的一些配置解释:

  1. <?xml version=”1.0″ encoding=”ISO-8859-1″?>
  2. <head version=”2.5″>
  3. <host hostip=”localhost” port=”8008″></host>
  4. <debug start=”false”/>
  5. <fileSystem xfs=”false”/>
  6. <filter start=”true”>
  7. <exclude expression=”(.*).php”></exclude>
  8. <exclude expression=”(.*).html”></exclude>
  9. <exclude expression=”(.*).htm”></exclude>
  10. <exclude expression=”^tmp/*”></exclude>
  11. <!—监控事件的过程中过滤特定文件,和特定文件夹的文件 –>
  12. </filter>
  13. <inotify>
  14. <delete start=”true”/>
  15. <createFolder start=”true”/>
  16. <createFile start=”true”/>
  17. <closeWrite start=”true”/>
  18. <moveFrom start=”true”/>
  19. <moveTo start=”true”/>
  20. <attrib start=”false”/>
  21. <modify start=”true”/>
  22. <!—设置要监控的事件 –>
  23. </inotify>
  24.  
  25. <sersync>
  26. <localpath watch=”/var/www”>
  27. <!—设置要监控的目录 –>
  28. <remote ip=”xx.xx.xx.xx” name=”pppei”/>
  29. <!—指定远端rsync服务器的地址和模块名 –>
  30. </localpath>
  31. <rsync>
  32. <commonParams params=”-artuz”/>
  33. <auth start=”true” users=”pppei” passwordfile=”/usr/sersync/rsync.pas”/>
  34. <!—是否启用验证,并指定密码存放文件 –>
  35. <userDefinedPort start=”false” port=”874″/><!– port=874 –>
  36. <timeout start=”false” time=”100″/><!– timeout=100 –>
  37. <ssh start=”false”/>
  38. </rsync>
  39. <failLog path=”/tmp/rsync_fail_log.sh” timeToExecute=”60″/><!–default every 60mins execute once–>
  40. <crontab start=”true” schedule=”1440″><!–600mins–>
  41. <!—是否启用执行完整rsync,并指定执行周期 –>
  42. <crontabfilter start=”true”>
  43. <!—设置完整执行rsync时的过滤条件 –>
  44. <exclude expression=”*.php”></exclude>
  45. <exclude expression=”*.html”></exclude>
  46. <exclude expression=”*.htm”></exclude>
  47. <exclude expression=”tmp/*”></exclude>
  48. </crontabfilter>
  49. </crontab>
  50. <plugin start=”false” name=”command”/>
  51. </sersync>
  52.  
  53. <plugin name=”command”>
  54. <param prefix=”/bin/sh” suffix=”" ignoreError=”true”/>  <!–prefix /opt/tongbu/mmm.sh suffix–>
  55. <filter start=”false”>
  56. <include expression=”(.*).php”/>
  57. <include expression=”(.*).sh”/>
  58. </filter>
  59. </plugin>
  60.  
  61. <plugin name=”socket”>
  62. <localpath watch=”/opt/tongbu”>
  63. <deshost ip=”192.168.138.20″ port=”8009″/>
  64. </localpath>
  65. </plugin>
  66. <plugin name=”refreshCDN”>
  67. <localpath watch=”/data0/htdocs/cms.xoyo.com/site/”>
  68. <cdninfo domainname=”ccms.chinacache.com” port=”80″ username=”xxxx” passwd=”xxxx”/>
  69. <sendurl base=”http://pic.xoyo.com/cms”/>
  70. <regexurl regex=”false” match=”cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images”/>
  71. </localpath>
  72. </plugin>
  73. </head>

请根据自己的具体情况修改。

sersync2命令使用说明

1.在主服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步。

  1. ./sersync -d

过程如下:

  1. [root@localhost GNU-Linux-x86]# ls
  2. confxml.xml  sersync2
  3. [root@localhost GNU-Linux-x86]# ./sersync2 -d
  4. set the system param
  5. execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
  6. execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
  7. parse the command param
  8. daemon thread num: 10
  9. parse xml config file
  10. host ip : localhost     host port: 8008
  11. config xml parse success
  12. please set /etc/rsyncd.conf max connections=0 Manually
  13. sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
  14. please according your cpu ,use -n param to adjust the cpu rate
  15. run the sersync:
  16. watch path is: /opt/tongbu

表明,sersync已经开启,可以在本地监控路径下建立文件,查看远程是否同步成功。

2.在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步

  1. ./sersync -r

如果需要将sersync运行前,已经存在的所有文件或目录全部同步到远程,要以-r参数运行sersync,将本地与远程整体同步一次。
如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效

3.查看启动参数帮助

  1. ./sersync –help

4.指定配置文件

  1. ./sersync -o XXXX.xml

对于sersync使用可执行文件目录下的默认配置文件confxml.xml,如果需要使用另一个配置文件,可以使用-o参数指定其它配置文件。

5.指定默认的线程池的线程总数

  1. ./sersync -n num

例如 ./sersync -n 5 则指定线程总数为5,如果不指定,默认启动线程池数量是10,如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n跳高线程总数。

6.不进行同步,只运行插件

  1. ./sersync -m pluginName

例如./sersync -m command,则在监控到文件事件后,不对远程目标服务器进行同步,而是直接运行command插件。

7.多个参数可以配合使用

  1. ./sersync -n 8 -o abc.xml -r -d

表示,设置线程池工作线程为8个,指定abc.xml作为配置文件,在实时监控前作一次整体同步,以守护进程方式在后台运行。

8.通常情况下,对本地到远程整体同步一遍后,在后台运行实时同步。

  1. ./sersync -r -d

最后需要把sersync命令加入到/etc/rc.local以开机自启动:

  1. echo "/usr/sersync/sersync2 -d -o /usr/sersync/confxml.xml" >>/etc/rc.local

如果需要同步多个目录,可以创建多个配置文件,如/usr/sersync/sersync2 -d -o /usr/sersync/xxx.xml

参考:
http://www.pppei.net/blog/post/124
官方教程

ERROR: module is read only

执行rsync出现如下错误:
rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Connection reset by peer (104)
ERROR: module is read only
rsync error: syntax or usage error (code 1) at main.c(866) [receiver=3.0.6]
rsync: connection unexpectedly closed (5 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [sender=3.0.6]

关键的错误信息是:ERROR: module is read only

解决方法:在rsync.conf文件中加入read only=no。

undefined reference to `libiconv_open’ collect2: ld returned 1 exit status错误

今天有一网友反映使用lnmp一键安装包无法安装php,叫他发错误文件给我看,发现提示这样的错误:

  1. undefined reference to `libiconv_open’
  2. collect2: ld returned 1 exit status

这个错误的原因可能php找不到iconv库文件,所以我们需要下载安装它。

  1. #wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
  2. #tar -zxvf libiconv-1.14.tar.gz
  3. #cd libiconv-1.14
  4. # ./configure –prefix=/usr/local/libiconv
  5. # make
  6. # make install

完成之后在编译php的./configure命令加上–with-iconv=/usr/local/libiconv指向iconv位置。
这样应该能解决这个问题。

安装webalizer分析nginx和apache的日志

webalizer是一个自动分析日志文件的软件。下面简单介绍如何安装和使用。
1、安装依赖

  1. yum install gd-devel libpng-devel zlib-devel

2、下载安装

  1. wget ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.23-05-src.tgz
  2. tar xzf webalizer-2.23-05-src.tgz
  3. cd webalizer-2.23-05
  4. ./configure –prefix=/usr/local/webalizer –with-language=simplified_chinese
  5. make && make install

3、修改webalizer.conf文件

  1. cd /usr/local/webalizer/etc/
  2. cp webalizer.conf.sample webalizer.conf
  3. vi webalizer.conf

主要修改以下几处:

  1. LogFile /home/centos/log/access.log
  2. OutputDir /home/centos/web/log
  3. Incremental yes
  4. HostName devops.webres.wang

LogFile /home/centos/log/access.log #指定需要分析的日志
Incremental yes #为yes时,使每天分析结果存在,否则只会为当时分析的
HostName devops.webres.wang #用于html标题等的显示
之后执行/usr/local/webalizer/bin/webalizer -c /usr/local/webalizer/etc/webalizer.conf命令开始生成html文件。
注意:日志格式必须为CLF格式,默认的apache和nginx的格式都为CLF,以apache日志格式为例,

  1. LogFormat "%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i""

安装配置提示:
1、更多的编译选项执行./configure –help获得。
2、详细的配置方法在安装包目录README文件。

开启mysql慢查询日志并使用mysqldumpslow命令查看

mysql服务器有一项功能,可以检测到哪条sql语句查询得比较慢,就是慢查询slowlog,现在介绍如何开启。
在[mysqld]下面增加如下代码:

  1. long_query_time = 1
  2. log-slow-queries = /usr/local/mysql/data/slow.log
  3. log-queries-not-using-indexes

long_query_time = 1 #定义超过1秒的查询计数到变量Slow_queries。
log-slow-queries = /usr/local/mysql/data/slow.log #定义慢查询日志路径。
log-queries-not-using-indexes #未使用索引的查询也被记录到慢查询日志中(可选)。
mysql自带了一个查看慢日志的工具mysqldumpslow。
执行mysqldumpslow –h可以查看帮助信息。
主要介绍两个参数-s和-t
-s 这个是排序参数,可选的有:
al: 平均锁定时间
ar: 平均返回记录数
at: 平均查询时间
c: 计数
l: 锁定时间
r: 返回记录
t: 查询时间

-t n 显示头n条记录。
实例:
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句。
用了这个工具就可以查询出来那些sql语句是性能的瓶颈,进行优化,比如加索引,该应用的实现方式等。

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN

如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络?
CDN,意思是Content Distrubtion Network,意思是内容分发网络,简单的说,就是全地域范围内的负载均衡,全地域的概念可以是全国,也可以是全世界。由统一的DNS服务器进行地址转发,选择离用户最近的地区服务器进行负载均衡。本质上是从一个机房内的负载均衡扩展到了全世界范围内的负载均衡。同时可以将本地化的内容,由当地的服务器实现。做浏览器的地区自动选择。
比如在中国,被人为划分成两大区域,北方是网通,南方是电信。这两个网络之间互访是比较慢的。作为大型网站,一种解决办法是将全部服务器架设在双线或三线ISP处,由ISP来提供路由上的选择。这样做,线路的成本会比较高。另一种办法就是将服务器架设在两边,南方一台,北方一台,然后由服务器自己选择,如果IP在电信,就转发请求到南方的服务器,如果是网通就转发到北方的服务器。
再扩大范围,可以将美国来的请求交由美国服务器处理,这样也缩短了用户在路由上的等待时间。这就是内容分发网络。
而作为这个网络上的所有节点,都可以当成虚拟服务器来看待。至于在各地的服务器如何做负载均衡,可以由各节点之间完成。
准备工作如下:你需要下载如下软件以实现上述功能
NginxBINDGeoIPVarnish
接下来是编译和安装bind9和geoip

  1. # tar -xzvf bind-9.2.4.tar.gz
  2. # tar -xzvf GeoIP-1.4.6.tar.gz
  3. # cd GeoIP-1.4.6
  4. # ./configure –prefix=/usr/local/geoip
  5. # make
  6. # make install
  7. # cd ..
  8. # patch -p0 < bind-9.2.4-geodns-patch/patch.diff //给bind9打补丁,让bind9直接支持geoip库
  9. # cd bind-9.2.4
  10. # CFLAGS=”-I/usr/local/geoip/include” LDFLAGS=”-L/usr/local/geoip/lib -lGeoIP” ./configure –prefix=/usr/local/bind
  11. # make
  12. # make install

装好bind后我们来制作named.conf

  1. view “us” {
  2. // 匹配北美的客户端 US & Canada
  3. match-clients { country_US; country_CA; };
  4. // Provide recursive service to internal clients only.
  5. recursion no;
  6. zone “cdn.xianglei.com” {
  7. type master;
  8. file “pri/xianglei-us.db”;
  9. };
  10. zone “.” IN {
  11. type hint;
  12. file “named.ca”;
  13. };
  14. };
  15. view “latin” {
  16. // 匹配到南美国家
  17. match-clients { country_AR; country_CL; country_BR; };
  18. recursion no;
  19. zone “cdn.xianglei.com” {
  20. type master;
  21. file “pri/xianglei-latin.db”;
  22. };
  23. zone “.” IN {
  24. type hint;
  25. file “named.ca”;
  26. };
  27. };

照此办理,你也可以匹配到欧洲,非洲等等,然后来开始制作nginx和varnish
注意,以上内容是你要在主节点服务器上做的,主节点服务器只负责对DNS请求进行转发。
约定一下,我们将Bind服务器叫做动态节点服务器,Nginx+Varnish叫做边界服务器。
以下内容是副节点服务器需要做的,也就是实际在某个地区放置的服务器

  1. # ./configure –prefix=/usr/local/nginx –with-http_realip_module
  2. # make
  3. # make install

并配置Nginx

  1. http {
  2. include mime.types;
  3. default_type application/octet-stream;
  4. sendfile on;
  5. keepalive_timeout 65;
  6. upstream dynamic_node {
  7. server 1.1.1.1:80; # 1.1.1.1 是主DNS节点的IP地址
  8. }
  9. server {
  10. listen 8080;
  11. server_name cdn.xianglei.net;
  12. location ~* .(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css|mp3|swf|ico|flv)$ {
  13. proxy_set_header X-Real-IP $remote_addr;
  14. proxy_pass http://dynamic_node;
  15. proxy_store /var/www/cache$uri;
  16. proxy_store_access user:rw group:rw all:r;
  17. }

以上我们用nginx只对静态文件进行缓存,将静态文件缓存在/var/www/cache文件夹下,如果你没有的话,需要创建这个文件夹。并且nginx监听的是8080端口,这是因为,我们需要用varnish来监听80端口进行动态文件的转发。这里实际上是用nginx做了一个静态文件的反向代理和缓存的服务器,而真正让用户能够看到网页和动态文件的反向代理是varnish,而静态和动态文件的分开存放,能将效率提升不少。
最后我们来配置varnish服务。

  1. # tar -xzvf varnish-2.1.2.tar.gz
  2. # ./configure –prefix=/usr/local/varnish
  3. # make
  4. # make install

然后是varnish的选项

  1. backend default {
  2. .host = “127.0.0.1″;
  3. .port = “8080″;
  4. }
  5. sub vcl_recv {
  6. if (req.url ~ “.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
  7. return (lookup);
  8. }
  9. }
  10. sub vcl_fetch {
  11. if (req.url ~ “.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
  12. unset obj.http.set-cookie;
  13. }
  14. }

其他的配置内容可参看varnish的配置文章。
总结:
这样做的好处在于:
1.从根源上解决了DNS在轮询上的不确定性,能够做到在DNS上的快速响应。也避免了过去用Nginx+GeoIP时的负载高的问题。毕竟DNS的计算要比Nginx小多了。
2.降低大网站的服务器负载压力和运营成本,毕竟F5BigIP和双线路的价格和服务费都太高了。
3.易扩展性强,如某地区负载压力大,只需在该地区增加边界服务器组的web server即可完成,无需考虑跳转问题。
其他优点我再想想。
来源:http://slaytanic.blog.51cto.com/2057708/516093