配置与理解Glassfish Cluster【28张图片已修复】
第一部分 实验目的
- 理解Glassfish V3.1.2.2 Cluster的工作原理
- 理解Apache HTTPD 软件负载均衡的工作原理
- 理解如何使用Glassfish的内存复制功能
- 验证是否或者如何通过Apache HTTPD + Glassfish完成故障转移
其中Glassfish Cluster Web Subnet作为Web Requests处理的子网,由一下元素组成:- LB
- 1GB MEM + 1 CPU + 20G + NAT (192.168.107.130) (load-balancer)
- DAS
- 1GB MEM + 1 CPU + 20G + NAT (192.168.107.131) (das)
- Glassfish Node 1
- 1GB MEM + 1 CPU + 20G + NAT (192.168.107.129) (gnode-1)
- Glassfish Node 2
- 1GB MEM + 1 CPU + 20G + NAT (192.168.107.128) (gnode-2)
- ubuntu安装镜像
- ubuntu-12.10-server-amd64.iso
- ubuntu基本安装配置
- 软件列表配置为VMware默认列表
- 安装过程为VMware默认的无人参与安装
- 虚拟资源配置参考“虚拟主机”部分
- 服务器软件安装
- LB
- openssh
- httpd
- DAS
- openssh
- sun-java6-jdk
- glassfish
- Glassfish Node 1~2
- openssh
- sun-java6-jdk
- glassfish (集群Node设定过程中自动安装)
- 服务器账户
- username:asadmin
- password:adminadmin
- 相关目录设定
- glassfish
- /home/asadmin/runtimes/glassfish3
- 相关端口设定
- ssh, 22
- httpd, 80
- glassfish das admin console, 4848注解:
- NAT为虚拟主机网络配置选项,Network Address Translation 网络地址转换
- IP地址通过DHCP获得
- 由于Glassfish集群配置过程中需要用到各个Glassfish Node的主机名称,所以建议为每个主机设定有意义的名称。同时可以在各个虚拟主机的/etc/hosts文件中指定各个主机名与IP地址映射关系,例如下面文本片段
192.168.107.131 ? ? ? das192.168.107.130 ? ? ? load-balancer192.168.107.129 ? ? ? gnode-1192.168.107.128 ? ? ? gnode-2?2.3 实验环境搭建过程?2.3.1 在VMware Fusion上安装虚拟机?根据上一节对实验环境的描述,需要安装配置4台虚拟主机。为了节省安装时间,可以采取下面的安装配置步骤来完成:- 安装模板虚拟主机
- 在模板主机中配置安装openssh-server
- 如果计划使用指定IP地址的情况下,可预先在模板主机中的/etc/hosts文件中增加前述文本片段,否则可跳过这一步
- 复制模板虚拟主机为load-balancer虚拟主机,并通过VMware生成新的MAC地址
- 在load-balancer虚拟主机中安装apache web server
- 复制模板虚拟主机为glassfish-node模板虚拟主机模板,并通过VMware生成新的MAC地址
- 在glassfish-node虚拟主机模板中安装sun-java6-jdk
- 在glassfish-node虚拟主机模板中创建/home/asadmin/runtimes目录
- 复制glassfish-node虚拟主机模板为glassfish-node 1
- 复制glassfish-node虚拟主机模板为glassfish-node 2
- 复制glassfish-node虚拟主机模板为domain administration server
- 更改各个虚拟机主机名称和配置所有虚拟主机/etc/hosts文件
- 在domain administration server中安装glassfish v3.1.2.2
2.3.1.1 安装模板虚拟主机
?使用VMware Fusion安装ubuntu-12.10-amd64-server, 包括设定用户名和密码(asadmin, adminadmin),注解:在VMware Fusion安装的过程中,基本采用默认的配置方式(选择“下一步”,暂时忽略自定义部分),VMware会提示输入目标虚拟主机的用户名和密码,此时填入配置中给出用户名和密码。?2.3.1.2?在模板主机中配置安装openssh-server??在采用VMware Fusion默认安装的版本中,openssh-server不是默认安装内置,需要手动安装。但是ssh服务的配置文件ssh_config在未手动安装之前就已经存在/etc/ssh/目录下。?为了简化安全配置,本次试验选用用户名密码登陆方式(而不是key文件登录方式),所以首先通过下列命令打开文件sudo vi /etc/ssh/ssh_config?然后将PasswordAuthentication yes前面的#去掉?PasswordAuthentication yes?保存退出(esc :wq)?然后使用下面的命令安装openssh,安装后服务会自动启动。?sudo apt-get install openssh-server?最后,使用下面命令关闭虚拟模板主机?sudo shutdown -P 0??注:首先配置文件然后再安装openssh-server减少一次ssh服务重启。?2.3.1.4 复制虚拟主机模板为load-balancer虚拟主机在MacOS中使用Finder程序,到个人的“文稿”—ocuments)目录下,进入“虚拟机”目录,复制刚刚安装好的虚拟主机模板,将其重命名(比如load-balancer)。?在未启动load-balancer的状态下,打开load-balancer虚拟主机窗口,点击窗口上方的 设定(扳手)按钮。在打开的设定面板窗口中,选择网络适配器。点击底部的“高级选项”,如下图所示,最后点击“生成”按钮用来生成新的MAC地址。?
?2.3.1.5 在load-balancer虚拟主机中安装apache web server?当MAC地址重新设定完成后,开启load-balancer虚拟主机,并登陆(终端)执行下面的命令来安装apache2 web server?sudo apt-get install apache2?最后,使用下面命令关闭load-balancer虚拟主机?sudo shutdown -P 0?2.3.1.6?复制模板虚拟主机为glassfish-node模板虚拟主机模板,并通过VMware生成新的MAC地址?使用类似2.3.1.4的步骤复制glassfish-node虚拟主机模板以及生成新的MAC地址。?2.3.1.7?在glassfish-node虚拟主机模板中安装sun-java6-jdk?启动glassfish-node模版虚拟主机,按照如下方式安装sun-java6-jdk?转载自?http://www.gaggl.com/2012/04/installing-java6-jdk-on-ubuntu-12-04/??UPDATE: [07-Aug-2012] Thanks to a comment from?Pierre-Yves Langlois?this seems to be the best method (uses the latest version of the Flexion script from Github rather than the version referenced above)sudo apt-get purge sun-java* #You need to do that if you want the mozilla plugin to work without conflict with java7 for instance.mkdir ~/src
cd ~/src
git clone?2.3.2.4 添加两个节点
?点击管理控制台左侧Nodes节点,如下图所示?
?在上图中点击New按钮,在新打开的网页中,如下图所示,按照网页中输入框中的内容创建gnode-1?
?按照相同的方法,在按照下图网页输入框中内容来创建gnode-2?
?2.3.2.5 创建一个Cluster
?点击管理控制台左侧Clusters节点,如下图所示?
点击上图中的New按钮, 并按照下图网页中输入框内容所示,创建一个名为gcluster的群集?
如果创建完成后,没有遇到任何告警信息,那么群集的最基本配置的就成功了。?注意:?如果遇到告警信息,请确保每个主机的虚拟主机名称, IP地址与主机名称映射关系,与Glassfish Nodes设定时,填入的主机名称务必保持一致。如果安装了防火墙软件,如iptables,在这个实验过程中请关闭防火墙。?
?最后在下图的表格中,选种gcluster群集,并点击"Start Cluster",过一会儿,如果能看到与下图中instances全部成功进入Running状态,恭喜!?
?当所有实例都成功启动后,可以将附带的样例彩票程序部署到gcluster上,?步骤如下:?首先另存附件到本地盘。
LotteryAnnotation.ear
31.7 KB
?点击右侧网页的 Deploy 按钮,在打开的网页中, 首先将Targets部分的gcluster选中,点选Add按钮将其移动到Selected Targets列表,然后点击 “选择文件”, 在弹出的对话框中选择上一步中另存下来的文件。?
文件加载完毕后,选中 Availability对应的checkbox如下图,最后点击OK部署该应用程序?
?部署成功后,应用会出现在 Deployed Applications表格中,如下图所示
点击应用程序的名字进入应用的详细页面,如下:
?点击LotteryAnnotation-war.war后面对应的Launch按钮,网页会列出群集中所有可用的根URL如下图所示?
可以点选任何一个链接尝试该样例应用程序。?2.3.3 负载均衡配置
?负载均衡配置主要需要三个步骤:- 在load-balancer虚拟中安装mod_jk模块
- 编辑workers.properties文件
- 编辑jk.conf文件
- 编辑000-default文件
- 重启apache2服务
- 在DAS Web Admin Console中激活http listener的JK Listener属性
$ sudo apt-get install libapache2-mod-jk?2.3.3.2?编辑workers.properties?$ sudo vi /etc/apache2/workers.properties?将下面内容添加到该文件中worker.list=worker1,worker2,worker3,worker4,loadbalancerworker.worker1.type=ajp13worker.worker1.host=gnode-1worker.worker1.port=28080worker.worker1.lbfactor=1worker.worker1.socket_keepalive=1worker.worker1.socket_timeout=300worker.worker2.type=ajp13worker.worker2.host=gnode-2worker.worker2.port=28080worker.worker2.lbfactor=1worker.worker2.socket_keepalive=1worker.worker2.socket_timeout=300worker.worker3.type=ajp13worker.worker3.host=gnode-1worker.worker3.port=28081worker.worker3.lbfactor=1worker.worker3.socket_keepalive=1worker.worker3.socket_timeout=300worker.worker4.type=ajp13worker.worker4.host=gnode-2worker.worker4.port=28081worker.worker4.lbfactor=1worker.worker4.socket_keepalive=1worker.worker4.socket_timeout=300worker.loadbalancer.type=lbworker.loadbalancer.balance_workers=worker1,worker2,worker3,worker4?保存退出 (ESC + :wq)?2.3.3.3?编辑jk.conf?$ sudo vi?mods-available/jk.conf?将JkWorkersFile开头的一行替换为?
?JkWorkersFile /etc/apache2/workers.properties?
2.3.3.3?编辑000-default文件?$ sudo vi /etc/apache2/sites-enabled/000-default?去掉下面一行?DocumentRoot /var/www??替换为?JkMount /* loadbalancer?保存退出(ESC + :wq)?
?2.3.3.4?重启apache2服务?$ sudo service apache2 restart??2.3.3.5?在DAS Web Admin Console中激活http listener的JK Listener属性?在管理控制台左侧面版选择 Configurations->gcluster-config->HTTP Service ->Http Listeners-> http-listener-1,在右侧的网页中选中JK Listener对应的checkbox,保存?
?最后可以通过负载均衡器对应的服务地址来访问之前部署的应用?http://load-balancer/LotteryAnnotation-war/
?
2.3.4 使用Visualvm远程监控虚拟机实例?远程JVM监控与本地JVM监控能力和配置上都有很大不同,如果能够本地监控则选择本地监控,按照VisualVM自己的说法,根据文中给出的配置,远程监控的能力如下:?- Attachable: no
- Basic info supported: yes
- System properties supported: yes
- Monitoring supported: yes
- CPU monitoring supported: yes
- Memory monitoring supported: yes
- GC activity monitoring supported: yes
- Class monitoring supported: yes
- Thread monitoring supported: yes
- Thread dump supported: yes
- Heap dump supported: no ? ? ? ? ? ? ? ? ? ? ? ?/*可以完成heap dump到远端机器,然后再通过scp复制回本地查看*/
- Heap dump on OOME supported: no?远程JVM监控需要做三件事(如果不需要远程Profile的话,网上说可以通过ssh tunel的方式):
- 开启远程JVM的JMX服务功能
- 开启远程机器上的jstatd服务
- 在Visualvm的Applications面板中添加远程主机2.3.4.1 开启远程JVM的JMX服务功能?通常开启JMX服务,只需要在Java启动时添加如下虚拟机参数?-Dcom.sun.management.jmxremote.authenticate=false?-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.port=1099 ? ? ? ? ? ?/*JMX服务端口*/?在NAT网络中,如果JMX客户机在NAT网络的网关上,则还需要添加下面的虚拟机启动参数-Djava.rmi.server.hostname=hostname ? ? ? ? ? ? ? ? ? ? ? /*运行JMX服务的主机名称,JMX客户端所在主机可以通过该名称与JMX服务器建立连接*/?对于我们的群集实验环境,稍有特别:
- 服务主机名是变量,因为gcluster中配置了两个节点,一个节点对应一个主机名称
- 端口号是变量,因为每一台节点上运行两个服务器实例,每一个服务器实例要单独制定一个服务端口;
?点击左侧的Configurations->gcluster-config->System Properties节点,在右侧打开的网页的 "Additional Properties" 表格中添加新的变量名称,本里添加了一个叫做“INSTANCE_EXTERNAL_IP”的变量,用来给出不同实例的主机名。另外的JMX服务端口是系统内建的一个变量,也在该表格中,叫做"JMX_SYSTEM_CONNECTOR_PORT"。?在添加过程中,首先给出变量名称,然后是默认值,保存后,在通过Instance Values来给出每一个实例对应的值,如下图所示:?其中INSTANCE_EXTERNAL_IP设定如下,具体IP地址或者主机名都可以:
?对于JMX_SYSTEM_CONNECTOR_PORT,只需要给出两个存在冲突的端口号即可,如下图所示:
?变量设定完成后,需要给群集实例添加虚拟机参数?-Dcom.sun.management.jmxremote.authenticate=false?-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.port=${JMX_SYSTEM_CONNECTOR_PORT}-Djava.rmi.server.hostname=${INSTANCE_EXTERNAL_IP}?如下图所示,点击管理控制台左侧的Configurations->gcluster-config->JVM Settings,在右侧打开的网页中,选择JVM Options标签页,在Options表格中,加入上面给出的四个变量。保存后,重启群集gcluster,配置就完成了。?
?2.3.4.2?开启远程机器上的jstatd服务?通过MacOS系统自带的终端程序 ssh登陆gnode-1和gnode-2两个节点,分别执行下面的命令:?$ ssh asadmin@gnode-1#登陆后执行下面的命令?类似的?
asadmin@gnode-1$ jstatd -J-Djava.security.policy=/home/asadmin/runtimes/jstatd.all.policy -p 2020 -J-Djava.rmi.server.hostname=gnode-1&?$ ssh asadmin@gnode-2#登陆后执行下面的命令?2.3.4.3?在Visualvm的Applications面板中添加远程主机??可以使用jdk自带的jvisualvm,或者在http://visualvm.java.net/?下载安装独立版本。注:MacOS随机的jdk可能不包含jvisualvm。又或者jdk升级以后,在MacOS系统中,jvisualvm的链接可能会失效,此时可以找到jvisualvm的实际位置,然后通过ln -s的命令完成修复,此处不多赘述。?启动VisualVM,如下图,在“远程”节点上(右键)打开上下文菜单,选择”添加远程主机(H)...“
asadmin@gnode-1$ jstatd -J-Djava.security.policy=/home/asadmin/runtimes/jstatd.all.policy -p 2020 -J-Djava.rmi.server.hostname=gnode-2&?
?在打开的对话框中输入主机名以及jstatd链接的端口号?
按照相同的方式,再添加远程主机?gnode-2?如果gnode-1和gnode-2两个虚拟主机中jstatd和gcluster的4个instance都处于服务运行状态,那么这些可被管理的对象会自动出现在VisualVM的“应用程序” -> "远程"节点下,如下图所示:?
?继续为各个实例添加JMX连接?
?按下图为instance01配置JMX连接?
?类似的再给instance02, 03, 04配置,连接分别为:?gnode-2:28686gnode-1:28687gnode-2:28687?添加完成后,会在“远程”下出现额外的4个GlassFish节点,并且图表中带有JMX字样,如下图所示。?
?双击4个带有JMX字样的节点,打开后可以调整视图,即可观察远程JVM的CPU, MEMORY,垃圾回收等各种状态。?点击VisualGC标签页,则可以看到如下图的Generational GC内存分布情况,以及垃圾回收所用时间等等。
?
?至此,服务器实验环境搭建完毕。?第三部分 理解Glassfish Cluster中的Session复制?使用Chrome浏览器向其中的一个实例发送请求,并监视网络中的超文本传输?第一次的请求与响应的报头?? ? ?.???? Request URL:http://gnode-1:28080/LotteryAnnotation-war/PlayLotteryServlet???? .???? Request Method:GET???? .???? Status Code:?200 OK???? . Request Headersview source???? .???? Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8???? .???? Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3???? .???? Accept-Encoding:gzip,deflate,sdch???? .???? Accept-Language:en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4???? .???? Cache-Control:max-age=0???? .???? Connection:keep-alive???? .???? Host:gnode-1:28080???? .???? User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22???? . Response Headersview source???? .???? Content-Length:1815???? .???? Content-Type:text/html;charset=ISO-8859-1???? .???? Date:Fri, 05 Apr 2013 23:34:09 GMT???? .???? Server:GlassFish Server Open Source Edition 3.1.2.2???? .???? Set-Cookie:JSESSIONID=c8cd2fede69e850da697c2fe786a; Path=/LotteryAnnotation-war; HttpOnly???? .???? Set-Cookie:JSESSIONIDVERSION=2f4c6f7474657279416e6e6f746174696f6e2d776172:0; Path=/LotteryAnnotation-war; HttpOnly???? .???? Set-Cookie:JREPLICA=instance03; Path=/LotteryAnnotation-war; HttpOnly???? .???? X-Powered-By:Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Sun Microsystems Inc./1.6)?第二次的请求与响应的报头???? .???????? .???? Request URL:http://gnode-1:28080/LotteryAnnotation-war/PlayLotteryServlet???? .???? Request Method:GET???? .???? Status Code:?200 OK???? . Request Headersview source???? .???? Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8???? .???? Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3???? .???? Accept-Encoding:gzip,deflate,sdch???? .???? Accept-Language:en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4???? .???? Connection:keep-alive???? .?????Cookie:JSESSIONID=c8cd2fede69e850da697c2fe786a; JSESSIONIDVERSION=2f4c6f7474657279416e6e6f746174696f6e2d776172:0; JREPLICA=instance03???? .???? Host:gnode-1:28080???? .???? User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22???? . Response Headersview source???? .???? Content-Length:1815???? .???? Content-Type:text/html;charset=ISO-8859-1???? .???? Date:Fri, 05 Apr 2013 23:35:36 GMT???? .???? Server:GlassFish Server Open Source Edition 3.1.2.2???? .???? Set-Cookie:JSESSIONIDVERSION=2f4c6f7474657279416e6e6f746174696f6e2d776172:1; Path=/LotteryAnnotation-war; HttpOnly???? .???? Set-Cookie:JREPLICA=instance03; Path=/LotteryAnnotation-war; HttpOnly? ? ?.???? X-Powered-By:Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.2.2 Java/Sun Microsystems Inc./1.6)
- glassfish
- LB
LotteryAnnotation.ear