本版本为1.20版。如果有问题,请写信至:gm365365@sina.com

 

=====================================================================

What

=====================================================================

 

  Q1-1 什么是G5 ? 它有何功能或创新?

 

G5是一个软件负载均衡器。它只是起着负载均衡的作用,并不是Web Server。它有如下功能或创新:

 

1. 监测Web Server是否正常。G5每隔一些时间对所有参与负载均衡的Web Server做一次“Ping”: 访问一个URL,看看Web Server是否输出正常、是否真的活着。把不正常的Web Server移出正常列表。

   一些Web Server在一定的时候会出现“噎死”的情况:Web Server进程是正常的,但无法输出网页。可能是Web Server的内存用光;也可能是线程数达到最大值,无可用线程;也可能是ServerSocket出现了阻塞错误。

 

2. 可智能地分配负载。G5监测所有参与负载均衡的Web Server的当前CPU,在用线程数、空闲线程数,最近5秒的出口流量,最大内存、目前总内存、目前空闲内存等数据,根据空闲情况分配负载。目前只有UFO Web Server支持G5的这个功能,未来我公司可能向国际组织提供标准,争取在HTTP4.0时使所有的Web Server都支持G5的这个功能。

 

3. 具有海量的吞吐能力。一个G5进程应该可以负责全球用户的负载均衡。G5的吞吐能力不会低于硬件负载均衡器F5的吞吐能力,因吞吐能力主要取决于网卡的能力,G5在线程调度方面做到了最好。

 

4. 极其稳定。

 

5. 未来G5进程内抵御Dos和DDos攻击。

 

6. Session跟踪。在约定的时间内,用一个浏览器访问同一个网址,G5会将它分配到与上次相同的Web Server上。

 

7. 安装版的监测软件。可以对G5的内存、线程、CPU、流量、参与负载均衡的Web Server的死活等情况实时监测,在G5情况异常(要宕机)、参与负载均衡的Web Server有一个不正常时,会发出警报声音。安装版(相对于网页版)可以使您每次只需要点一下图标就可启动软件。

 

8. 未来提供手机app的G5监测软件。让您随时随地监测G5的情况。

 

 

 

=====================================================================

启动篇

======================================================================

 

Q2-1 在Windows下,如何启动G5?  

1. 首先,您的计算机要安装JDK1.8.0_72或以上版本的JDK! 低版本的JDK将无法运行G5; 

2. 进入bin目录,Windows操作系统敲startup.bat, 回车。 

 

Q2-2 在Linux (redhat/centOS/ubuntu)下,如何安装、启动G5?  

(下面的操作是在redhat/centOS下进行的,ubuntu下类似) 

 

1. 从java.sun.com官方网站下载Linux平台的JDK: jdk-8u192-linux-x64.tar.gz; 

2. 从www.gm365.com官方网站下载Linux平台的G5G5_v1.18.tar.gz; 

3. 把上面2个文件上传到你的Linux服务器的/usr/local目录下; 

4. 安装JDK

   # cd /usr/local

   # chmod 755 jdk-8u192-linux-x64.tar.gz

   # tar -zxvf jdk-8u192-linux-x64.tar.gz 

5. 安装G5

   # cd /usr/local

   # chmod 755 G5_v1.18.tar.gz  

   # tar -zxvf G5_v1.18.tar.gz 

6. 配置环境变量 

   # vi /etc/profile 

  (1) 在这个文件末尾加上

      export JAVA_HOME=/usr/local/jdk1.8.0_192

      export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar

      export PATH=$PATH:${JAVA_HOME}/bin

   

注意:CentOS6、Redhat上面的是JAVAHOME,CentOS7、Unbuntu是{JAVA_HOME}。  

 

  (2) 利用下面命令使配置生效,并且查看JDK版本

      # source /etc/profile

     # java -version

7. 配置放火墙        

   # vi /etc/sysconfig/iptables

   添加如下代码

    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

   重启iptables

     service iptables restart

   (注意:一些机房为了防止DDOS攻击,在机房本身还有一道放火墙,您要向机房申请对您的IP的80端口开通!)                                     

8. 对.sh添加执行权限

   # cd /usr/local/G5/bin

   # chmod a+x ./*.sh

9. 启动G5

   # cd /usr/local/G5/bin

   # ./startup.sh

 

 

Q2-3 在Linux (redhat/centOS/ubuntu)下,如何关掉G5?

(条件同Q1-2)

 

# cd /usr/local/G5/bin

# ./shutdown.sh

 

 

Q2-4 在Linux (redhat/centOS/ubuntu)下,如何开机启动G5?

(条件同Q1-2)

 

#vi /etc/rc.d/rc.local

添加以下内容:

  export JAVA_HOME=/usr/local/jdk1.8.0_192

  cd /usr/local/G5/bin

  ./startup.sh

 

 

Q2-5 在Windows下,如何关掉G5?

进入G5的bin目录,敲shutdown.bat, 回车。

 

 

Q2-6 如何把G5注册成windows服务启动啊?

我不知道您怎么会有这样的需求。 

关于G5作为windows service的所有东西都在G5的win-service子目录里。

要把G5作为windows service安装或启动,您所要做的唯一事情是修改wrapper.conf, 一共需要修改4个地方(这4个地方都用一对"# !!!!!!!!!!!!!!!!!!"行标记起来):

 

    1. wrapper.java.command=D:\jdk1.8.0_192\bin\java

       根据您计算机的JDK,把wrapper.java.command指向java.exe(注意:设置时可不带.exe).

 

    2. wrapper.java.classpath.3=D:\jdk1.8.0_192\lib\tools.jar

       根据您计算机的JDK,把wrapper.java.classpath.3指向lib\tools.jar

 

    3. wrapper.java.classpath.4=

       把classpath指向G5的lib目录里的.zip和.jar.

    

    4. wrapper.app.parameter.3=D:\G5

       把wrapper.app.parameter.3指向G5的安装目录(所谓安装目录就是含有bin子目录的目录)。

 

在修改好wrapper.conf后,运行install_service.bat,安装成功后,再运行start_service.bat,

G5就是作为windows service启动起来了。        

 

 

 Q2-7 在Linux操作系统下,即使我以root身份登陆,在/bin目录下敲./startup.sh,被告之:权限不够。怎么办?

这其实不是G5的问题,而是Linux操作系统的问题。解决办法如下:

 

    chmod a+x startup.sh

    chmod a+x G5.sh

    chmod a+x setclasspath.sh

 

添加可执行权限即可。

 

 

Q2-8 startupW.bat与startup.bat有什么区别?它启动的是G5 service吗?与它对应的reload和shutdown的bat文件在哪里?

(在Windows下)用startup.bat启动的G5进程,Dos窗口不能关掉,否则,G5进程也随之被kill掉。如果要使Dos窗口关掉后,G5进程仍然在(后台)运行,应该怎么办?这时就应该用startupW.bat来启动G5进程。

 

用startupW.bat启动的G5进程,在计算机关机重启后,消失了,因此它所启动的不是G5 service.

 

用startupW.bat启动的G5进程,要关掉它,(也)运行shutdown.bat; 要对它reload,(也)运行reload.bat。

 

 

 

=====================================================================

改动篇

=====================================================================

 

Q3-1 G5 1.18G5有何改动?

1. xxx.

 

 

 

=====================================================================

应用

=====================================================================

 

Q4-1 如何利用G5构建一个不间断服务的网站我的单个Web Server稳定性不好。

   将域名解析指向G5,如下图所示:

 

     

                  

                     

 Q4-2 接上问题,我相信G5是极稳定的,但运行G5的服务器硬件坏了或机房出问题(停电或改修),上图构架仍然无法保证整个网站“极稳定”地提供服务,何解?

      如果您要解决这种很小概率发生的事(几年才发生一次),您需要做域名备份IP解析,找相应的DNS服务商。这时的构架图如下图所示:

 

      

    要交待的是,DNS服务器需要约十分钟才能监测到域名IP所指服务器出问题了而将域名指向备份IP。     

 

 

        

Q4-3 接上问题,我知道,所谓负载均衡就是URL重定向,对浏览器而言,多作了一次连接,这带来约0.5s的延时,我不能容忍网站首页出来慢了0.5s而使用户体验下降了一个档次而流失用户,您作为G5和UFO Web Server的厂家,有什么方案解决这个问题吗?

 

这时你要采用UFO Web Server做负载均衡器,因UFO可以直接响应Web请求(输出静态网页和动态网页),同时把一些URL重定向到其它Web Server;并且其它Web Server也都采用UFO(好的稳定性和性能)。所以,完美的构架图如下图所示:

 

    

              

新版UFO将具有G5的负载均衡的所有功能。如果您拒绝接受创新和好东西,又想更好地解决问题,这可能是办不到的!   

    

 

 

=====================================================================

server.xml篇

=====================================================================

 

Q5-1 我准备用G5了,打开/conf/server/xml文件,一堆参数,脑袋有点大了。server.xml是这样的:

<?xml version='1.0' encoding='utf-8'?>

 

<G5 xmlns="http://java.sun.com/xml/ns/javaee"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

   version="2.5">

 

   <!-- A "Connector" represents an endpoint by which requests are received and responses are returned.  

    Define a non-SSL HTTP/1.1 Connector on port 80

   -->

     

   <Connector port="81" scheme="http"

     connectionTimeout="20*1000" soTimeout="10*1000" soRcvBuf="1024" soSndBuf="1024"  

     maxURISize="10*1024" maxURISizeKill="110*1024" maxHeaderSize="10*1024" maxHeaderSizeKill="110*1024">

 

     <Balancer URI="/, /index.html, /index.htm" AI="false" sessionKeepTime="0">

       <Member redirect="http://localhost:82" loadfactor="1" livePing="30*1000" deadPing="60*1000" pingURI="/index.html"/>

       <Member redirect="http://127.0.0.1:83" loadfactor="2" livePing="30*1000" deadPing="60*1000" pingURI="/index.html"/>

     </Balancer>

      

     <!--       

     <Balancer URI="/games/*.jsp" AI="true" askTime="1*60*1000" AI="false" sessionKeepTime="4*60*60*1000">

       <Member redirect="http://127.0.0.1:8012" loadfactor="1" livePing="1*60*1000" deadPing="5*60*1000" pingURI="/test.html"/>

       <Member redirect="http://222.73.205.120:80" loadfactor="2" livePing="1*60*1000" deadPing="5*60*1000" pingURI="/test.html"/>

       <Member redirect="http://www.gm365bkp.com" loadfactor="1" livePing="1*60*1000" deadPing="5*60*1000" pingURI="/test.html"/>

     </Balancer>

     --> 

   </Connector> 

   

    

   <!-- Define a SSL HTTP/1.1 Connector on port 443 -->

   <!--   

   <Connector port="443" scheme="https"

     connectionTimeout="20*1000" soTimeout="10*1000" soRcvBuf="1024" soSndBuf="1024" 

     maxURISize="10*1024" maxURISizeKill="110*1024" maxHeaderSize="10*1024" maxHeaderSizeKill="110*1024" 

     clientAuth="false" keystoreFile="/conf/ufo.keystore" keystorePass="ufoufo" 

     truststoreFile="/conf/ufo.keystore" truststorePass="ufoufo">

 

     <Balancer URI="/, /*.html, /*.htm" AI="false" sessionKeepTime="12*60*60*1000">

       <Member redirect="http://localhost:444" loadfactor="2" livePing="1*60*1000" deadPing="5*60*1000" pingURI="/logo.jpg"/>

       <Member redirect="http://www.gm365bkp.com" loadfactor="1" livePing="1*60*1000" deadPing="5*60*1000" pingURI="/logo.jpg"/>

     </Balancer>

     

     <Balancer URI="~[/*.html, /*.htm]" AI="false" sessionKeepTime="12*60*60*1000">

       <Member redirect="http://127.0.0.1:8012" loadfactor="1" livePing="90*1000" deadPing="5*60*1000" pingURI="/games/login.jsp"/>

       <Member redirect="http://222.73.205.120:80" loadfactor="2" livePing="90*1000" deadPing="5*60*1000" pingURI="/games/login.jsp"/>

       <Member redirect="http://www.gm365bkp.com" loadfactor="1" livePing="90*1000" deadPing="5*60*1000" pingURI="/games/login.jsp"/>

     </Balancer>   

   </Connector>        

   --> 

  

   <ThreadPool min="20" max="500"/>

   

   <Admin name="gm365" password="123456" maxConnectionNum="200"/>

 

</G5>

 

请解释Connector标签属性的含义。

 

port是ServerSocket监听的端口,server.xml允许有多个Connector标签,G5为每个Connector在其port指定的端口启动一个ServerSocket。

当scheme为http时,G5就启动一个普通的ServerSocket;当scheme为https时就启动一个https的ServerSocket。

 

connectionTimeout: 单位ms, 是指G5接收连接请求到接收到至少一个byte数据的最大时间长度。

soTimeout: 单位ms, 是指http或https连接有数据要读时,能到至少一个byte的最大时间长度例如,http头未读完,继续读剩下的byte,必须得在soTimeout时间内能读到至少一个byte,否则就甩出例外而断线。重要注意:soTimeout不是不活动时间,http或https连接可以一直连着G5服务器但并不读写一个byte,没问题,不会甩出例外而断线。

 

soRcvBuf:单位Byte,G5的连接的Socket的SO_RCVBUF参数,也就是接收缓存的大小。如果soRcvBuf<=0,表示不设置,采用系统默认缓存大小;如果soRcvBuf<512且soRcvBuf>0,则G5修改成512;如果soRcvBuf>128*1024,则G5修改成128*1024。

soSndBuf:单位Byte,G5的连接的Socket的SO_SNDBUF参数,也就是输出缓存的大小。如果soSndBuf<=0,表示不设置,采用系统默认缓存大小;如果soSndBuf<512且soSndBuf>0,则G5修改成512;如果soSndBuf>128*1024,则G5修改成128*1024。

soRcvBuf和soSndBuf这2个参数的作用请见Socket的setReceiveBufferSize(int size)和setSendBufferSize(int size),把它们设置得较大,可能会提高下载速度,提高网页输出的流畅度,但也消耗更多的内存,降低G5的负载能力。

 

maxURISize: 单位Byte,最大的URI长度。

maxURISizeKill:单位Byte,URI长度超过它时,立即将连接Kill掉(而没有超过它但大于maxURISize时, 会回错误提示的)。

maxHeaderSize: 单位Byte,最大的Http头体积(总和)。

maxHeaderSizeKill:单位Byte,Http头体积(总和)超过它时,立即将连接Kill掉(而没有超过它但大于maxHeaderSize时, 会接收全部data放在内存里。

 

  

Q5-2 Balancer标签如下所示,请解释每个成员的含义。

 

<Balancer URI="/, /*.html, /*.htm" AI="true" sessionKeepTime="12*60*60*1000">

       <Member redirect="http://222.73.205.120:80" loadfactor="2" livePing="1*60*1000" deadPing="5*60*1000" 

 

pingURI="logo.jpg" httpAsk="true"/>

       <Member redirect="http://www.gm365bkp.com" loadfactor="1" livePing="1*60*1000" deadPing="5*60*1000" 

 

pingURI="logo.jpg" httpAsk="true"/>

 

</Balancer>

 

URI:要重定向的URI,有多个URI时,用英文“, ”分开。除了支持精确匹配,还支持如下4种通配:

     1. /*: 全通配;

     2. /games/cchess/*: 半通配;

     3. /*.html: 扩展名全通配;

     4. /games/go/*.jsp: 扩展名半通配。

 

  “~[...]”表示补集,“<Balancer URI="~[/*.html, /*.htm]" ...”表示把除了.html和.htm的所有请求进行重定向。

 

AI: 是否进行智能重定向。当AI为“false”时,根据各个Member的loadfactor分配重定向;当AI为“true”时,进行智能重定向,根据Member服务器当前CPU、空闲线程数、空闲内存、连接数等反映出的空闲情况分配重定向。当AI为“true”时,G5会每隔askTime向每个Member问询前CPU、空闲线程数、内存等数据,如果有一个Member不能正确回答,就把AI设置为“false”,而按loadfactor权重因子分配负载。

 

askTime: 单位ms,当AI为“true”时, G5会每隔askTime向每个Member问询前CPU、空闲线程数、内存等数据。如果AI为“false”时,则不用填写askTime。

 

sessionKeepTime:单位ms,session跟踪的时间长度,在sessionKeepTime时间内,G5把接收到的URL重定向到上次的Web Server。

redirect: Web Server所在的IP和端口。

loadfactor:负载分配的权重因子。

livePing:单位ms,如果该Web Server正常运行,对它“ping”的时间间隔, 最小5s。发现它异常,G5就把该Web Server移出正常Web Server列表,加入死Web Server列表。

deadPing:单位ms,如果该Web Server在死Web Server里,对它“ping”的时间间隔,最小20s。发现它正常运行,G5就把该Web Server移出死Web Server列表,加入正常Web Server列表。 

pingURI:G5对该Web Server作一次“ping”时发送的请求。

 

 

Q5-3 请解释什么是URI。

1. 当您在浏览器输入http://222.73.0.25:81/me/pic1?xxx=123&yyy=abc时,URI是/me/pic1。

2. 当您在浏览器输入http://222.73.0.25:81/me/pic1时,URI是/me/pic1。 

3. 当您在浏览器输入https://222.73.0.25:81/me?xxx=123&yyy=abc时,URI是/me。

4. 当您在浏览器输入http://222.73.0.25:81时,URI是/。

5. 当您在浏览器输入http://222.73.0.25:81/时,URI是/。

6. 当您在浏览器输入www.gm365.com时,URI是/。

7. 当您在浏览器输入https://www.gm365.com/时,URI是/。

8. 当您在浏览器输入www.gm365.com/index.html时,URI是/index.html。

9. 当您在浏览器输入www.gm365.com/index.jsp时,URI是/index.jsp。

10. 当您在浏览器输入http://www.gm365.com/index.jsp?Id=1时,URI是/index.jsp。

 

您明白什么是URI了吧,URI就是”http://”或”https://”后面第一个”/”开始到”?”之间的字符串,不包括”?”,以”/”开始。

 

URI规定了哪些URL(其URI与指定的相同)将被重定向。现假设G5运行在www.gm365.com服务器上,其<Connector>的port=80,<Balancer>标签是这样的:

<Balancer URI="/games/*.jsp" AI="false" sessionKeepTime="4*60*60*1000">

......

</Balancer>

 

那么当您在浏览器输入如下网址时:

 

1. http://www.gm365.com/games/Reg.jsp

2. http://www.gm365.com/games/Login.jsp?name=xxx&password=123

 

这2个URL的URI分别是games/Reg.jsp、games/Login.jsp,满足条件,都将被重定向,进行负载均衡。

 

Q5-4 URI=/,URI=/*,二者有何差别?

 

URI=/是精确匹配,当您在浏览器输入www.gm365.com或http://www.gm365.com/时进行重定向,而输入www.gm365.com/index.html或http://www.gm365.com/games/login.jsp时不进行重定向。

 

URI=/*是全通配,当您在浏览器输入上面的任何网址时都进行重定向。

 

 

Q5-5 ThreadPool标签是这样的:

      

     <ThreadPool min="20" max="500"/>

 

请解释其含义。

 

本标签定义了线程池。

 

min: 单位个,线程池里线程的最小个数,线程池启动时就启动了min个线程。

max: 单位个,线程池里线程的最大个数。G5启动后,启动了一个默认线程,然后为每个Connector各启动一个默认线程以监听ServerSocket,其它的线程全部来自线程池,没有其它线程了!请保证G5里的线程数最多在500(一些多CPU的服务器,线程数可以更多)。

 

 

Q5-6 Admin标签是这样的:

      

     <Admin name="gm365" password="123456" maxConnectionNum="200"/>

 

请解释其含义。

 

本标签规定了G5的监测软件的相关东东。

 

name: G5监测软件登录时用的用户名。

password: G5监测软件登录时用的密码。

maxConnectionNum:G5监测软件最大客户数。这些Client端可以用同一个用户名和密码登录,而各自得到正常的服务。