本版本为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的情况。
=====================================================================
启动篇
======================================================================
1. 首先,您的计算机要安装JDK1.8.0_72或以上版本的JDK! 低版本的JDK将无法运行G5;
2. 进入bin目录,Windows操作系统敲startup.bat, 回车。
(下面的操作是在redhat/centOS下进行的,ubuntu下类似)
1. 从java.sun.com官方网站下载Linux平台的JDK: jdk-8u192-linux-x64.tar.gz;
2. 从www.gm365.com官方网站下载Linux平台的G5:G5_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
(条件同Q1-2)
# cd /usr/local/G5/bin
# ./shutdown.sh
(条件同Q1-2)
#vi /etc/rc.d/rc.local
添加以下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_192
cd /usr/local/G5/bin
./startup.sh
进入G5的bin目录,敲shutdown.bat, 回车。
我不知道您怎么会有这样的需求。
关于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
添加可执行权限即可。
(在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。
=====================================================================
改动篇
=====================================================================
1. xxx.
=====================================================================
应用篇
=====================================================================
将域名解析指向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篇
=====================================================================
<?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放在内存里。
<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端可以用同一个用户名和密码登录,而各自得到正常的服务。