Friday Jun 25, 2010

TOTD #142: GlassFish 3.1 - SSH Provisioning and Start/Stop instance/cluster on local/remote machines

GlassFish 3.1 Milestone 2 enables SSH provisioning that allows you to create, start, stop, and delete a cluster spanning multiple instances on local and remote machines from the Domain Administration Server (DAS). This Tip Of The Day (TOTD) builds upon TOTD #141 and explains how you can create such a cluster on Amazon EC2 with Ubuntu 10.04. Carla also blogged about a similar scenario here.

The cluster topology created is shown below:

The key points shown in the topology are:

  • It consists of DAS and a remote machine "fruits" (shown in green color)
  • There is one cluster "food" spanning these two machines (shown in yellow color)
  • DAS has "broccoli" and "spinach" instances (shown in red color)
  • "fruits" has "apple", "banana", and "orange" instances (shown in red color)

Amazon EC2 assigned the public IP address of "" to DAS and "" to the remote machine. These IP addresses are used in the command invocations below.

Lets get started!

  1. Configure SSH between DAS and the remote machine - More details about SSH key setup here.
    1. Copy the keypair  generated in TOTD #141 (ec2-keypair.pem) to DAS as:
      ~/.ec2 >scp -i /Users/arungupta/.ec2/ec2-keypair.pem /Users/arungupta/.ec2/ec2-keypair.pem \\\\
      ec2-keypair.pem 100% 1751 1.7KB/s 00:00
      Notice, the public IP address of DAS is specified here. This key will be used to copy the private keys generated in next step to the remote machine.
    2. Generate a private/public key pair on DAS as:
      ubuntu@ip-10-160-47-196:~$ ssh-keygen -t dsa
      Generating public/private dsa key pair.
      Enter file in which to save the key (/home/ubuntu/.ssh/id_dsa): 
      Enter passphrase (empty for no passphrase): 
      Enter same passphrase again: 
      Your identification has been saved in /home/ubuntu/.ssh/id_dsa.
      Your public key has been saved in /home/ubuntu/.ssh/
      The key fingerprint is:
      0a:b8:cd:8c:a0:7f:3d:00:9e:ec:ac:06:a1:f1:2f:cb ubuntu@ip-10-160-47-196
      The key's randomart image is:
      +--[ DSA 1024]----+
      | |
      | |
      | |
      |o .. |
      |o\*.o. S |
      |+.=\*.. . |
      |ooo.+o. |
      | ++ o o |
      |o.E+ . |
    3. Copy the generated public to ".ssh" directory of the remote machine as:
      ubuntu@ip-10-160-142-175:~/.ssh$ scp -i ec2-keypair.pem \\\\
    4. Make sure the ssh connection works between DAS and remote machine without specifying any key or passphrase as shown below:
  2. Install "sun-java6-jdk" and "unzip" package and GlassFish on DAS and remote machine as explained in TOTD #141. In short:
    ssh -i /Users/arungupta/.ssh/ec2-keypair.pem
    sudo add-apt-repository "deb lucid partner"
    sudo apt-get update
    sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk
    sudo update-java-alternatives -s java-6-sun
    sudo apt-get install unzip
  3. Start GlassFish on DAS and remote machine as:
    export ENABLE_REPLICATION=true
    export PATH=~/glassfishv3/bin:$PATH
    asadmin start-domain --verbose &
  4. Create the cluster and instances by issuing the following commands on the DAS
    1. Create the cluster as:
      ubuntu@ip-10-160-142-175:~$ asadmin create-cluster food
      _ThreadID=23;_ThreadName=http-thread-pool-4848(2);|Hibernate Validator bean-validator-3.0-JBoss-4.0.2_03|#]
      Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.|#]
      Command create-cluster executed successfully.
    2. Create a node on the remote machine as:
      ubuntu@ip-10-160-142-175:~3$ asadmin create-node-ssh --nodehost \\\\ --nodehome /home/ubuntu/glassfishv3 fruits
      Command create-node-ssh executed successfully.
    3. List all the nodes as:
      ubuntu@ip-10-160-142-175:~$ asadmin list-nodes
      Command list-nodes executed successfully.
    4. Create two instances ("broccoli" and "spinach") on DAS as:
      ubuntu@ip-10-160-142-175:~$ asadmin create-instance --cluster=food \\\\
      --systemproperties AJP_INSTANCE_NAME=broccoli:AJP_INSTANCE_PORT=19090 broccoli
      Creating instance broccoli on localhost|#]
      Using DAS host localhost and port 4848 from existing for nodeagent 
      ip-10-160-142-175. To use a different DAS, create a new nodeagent by specifying a
      new --nodeagent name with the correct values for --host and --port.|#]
      Command _create-instance-filesystem executed successfully.|#]
      Command create-instance executed successfully.
      ubuntu@ip-10-160-142-175:~$ asadmin create-instance --cluster=food \\\\
      --systemproperties AJP_INSTANCE_NAME=spinach:AJP_INSTANCE_PORT=19091 spinach
      Creating instance spinach on localhost|#]
      Using DAS host localhost and port 4848 from existing for nodeagent 
      ip-10-160-142-175. To use a different DAS, create a new nodeagent by specifying a
      new --nodeagent name with the correct values for --host and --port.|#]
      Command _create-instance-filesystem executed successfully.|#]
      Command create-instance executed successfully.
      The AJP_INSTANCE_NAME and AJP_INSTANCE_PORT properties will be used by mod_jk in a subsequent blog.
    5. Create three instances ("apple", "banana", and "orange") on the remote machine as:
      ubuntu@ip-10-160-142-175:~$ asadmin create-instance --cluster=food --node=fruits \\\\ 
      --systemproperties AJP_INSTANCE_NAME=apple:AJP_INSTANCE_PORT=19090 apple
      Creating instance apple on fruits|#]
      Command _create-instance-filesystem executed successfully.
      Command create-instance executed successfully.
      ubuntu@ip-10-160-142-175:~$ asadmin create-instance --cluster=food --node=fruits \\\\
      --systemproperties AJP_INSTANCE_NAME=banana:AJP_INSTANCE_PORT=19091 banana
      Creating instance banana on fruits|#]
      Using DAS host and port 4848 from 
      existing for nodeagent ip-10-160-142-20. To use a different DAS,
      create a new nodeagent by specifying a new --nodeagent name with the correct
      values for --host and --port.
      Command _create-instance-filesystem executed successfully.
      Command create-instance executed successfully.
      ubuntu@ip-10-160-142-175:~$ asadmin create-instance --cluster=food --node=fruits \\\\
      --systemproperties AJP_INSTANCE_NAME=orange:AJP_INSTANCE_PORT=19092 orange
      Creating instance orange on fruits|#]
      Using DAS host and port 4848 from 
      existing for nodeagent ip-10-160-142-20. To use a different DAS,
      create a new nodeagent by specifying a new --nodeagent name with the correct
      values for --host and --port.
      Command _create-instance-filesystem executed successfully.
      Command create-instance executed successfully.
  5. Start the cluster
    1. List all instances as:
      ubuntu@ip-10-160-142-175:~3$ asadmin list-instances
      broccoli not running
      spinach not running
      apple not running
      banana not running
      orange not running
      Command list-instances executed successfully.
    2. Start the cluster as:
      ubuntu@ip-10-160-142-175:~$ asadmin start-cluster food
      . . .
      Command start-cluster executed successfully.
    3. List all the instances again as:
      ubuntu@ip-10-160-142-175:~$ asadmin list-instances
      . . .
      broccoli running
      spinach running
      apple running
      banana running
      orange running

      The HTTP ports of each instance can be grepped from DAS's "domain.xml". Here are the ports for each created instance:
      broccoli 28080
      spinach 28081
      apple 28080
      banana 28081
      orange 28082

      On Amazon, you may have to poke holes in the firewall as:
      ec2-authorize default -p 28080
      ec2-authorize default -p 28081
      ec2-authorize default -p 28082
      And now "" ("broccoli" instance on DAS) will show the default index page. Similarly other host and port combinations will show this page as well.

This blog showed how to create a GlassFish 3.1 cluster spanning multiple instances on Amazon EC2 with Ubuntu 10.04.

Subsequent blogs will show:

  • How to deploy an app to this cluster and some variations ?
  • How to front-end this cluster with mod_jk for load-balancing ?

Technorati: totd glassfish clustering ssh instance amazon ec2 ubuntu

Thursday Jun 24, 2010

TOTD #141: Running GlassFish 3.1 on Ubuntu 10.04 AMI on Amazon EC2

GlassFish 3.1 Milestone 2 was released this week, download the zip file.

TOTD #138 provide simple instructions to get you started with Milestone 1 and you can follow similar steps to get started with Milestone 2 as well. A more detailed blog on the new functionality (SSH Provisioning and Dynamic App Deployment) is coming as well.

In order to test the newly added clustering capabilities of GlassFish 3.1, I decided to run Milestone 2 build on a Ubuntu 10.04 instance on Amazon EC2. My host operating system is Mac OS X and even though the steps are defined at multiple locations (mentioned below) but complete set of steps were missing. This Tip Of The Day (TOTD) shows how get started with running a GlassFish 3.1 build on Ubuntu 10.04 instance on Amazon EC2.

This TOTD consulted the following blogs:

Twitterverse was very helpful and Divyen helped smoothen the rough edges!

Lets get started!

  1. In your home directory, create a new ".ec2" directory.
  2. Generate SSH Key & X.509 certificates
    1. Generate X.509 certificates key
      1. Go to your AWS account and click on "Security Credentials".
      2. In "Access Credentials" section, click on "X.509 Certificates" and click on "Create a new Certificate". Make sure to download the private key file and X.509 certificate in ".ec2" directory as "cert-xxxxxx.pem" and "pk-xxxxxxx.pem".
    2. SSH key - Public AMIs can be accessed using an ssh key. Give the following command in ".ec2" directory:
      ec2-add-keypair ec2-keypair > ec2-keypair.pem

      This will generate the SSH key in the file "ec2-keypair.pem".
  3. EC2 API Tools
    1. Download Amazon EC2 API Tools from here and unzip them in ".ec2" directory.
    2. Move "lib" and "bin" directory from the extracted directory to ".ec2" directory.
  4. Create ".ec2.profile" file in ".ec2" directory and add the contents:
    export EC2_HOME=~/.ec2
    export PATH=$PATH:$EC2_HOME/bin
    export EC2_PRIVATE_KEY=`ls $EC2_HOME/pk-\*.pem`
    export EC2_CERT=`ls $EC2_HOME/cert-\*.pem`
    export EC2_URL=

    The last line sets the default zone to US-West-1. The AMI id used later is from this region. Source this file by giving the following command in ".ec2" directory:
    source ".ec2.profile"
  5. On your firewall, authorize port 22 for SSH and 8080 for HTTP access for GlassFish on your firewall as:
    ec2-authorize default -p 22
    ec2-authorize default -p 8080
  6. Run the instance as:
    ec2-run-instances ami-c597c680 -k ec2-keypair
  7. Obtain the public IP address of Ubuntu instance as:
    INSTANCE        i-XXXXXXXX      ami-c597c680       running ec2-keypair     0               m1.small        2010-06-24T16:23:44+0000        us-west-1a      aki-XXXXXXXX    monitoring-disabled      XX-XX-XX-XX   XX-XX-XX-XX

    The address "" is the public IP address and will be used for ssh next.
  8. SSH to the ready Ubuntu instance as:
    ssh -i ec2-keypair.pem

  9. Install JDK 6 on Ubuntu
    1. Add the Ubuntu partner repository as:
      sudo add-apt-repository "deb lucid partner"
    2. Update the list of packages as:
      sudo apt-get update
    3. Install JDK 6 as:
      sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk
    4. Make sure the recently added JDK is at the top of JVM search order by giving the command:
      sudo update-java-alternatives -s java-6-sun
      This command adds "/usr/lib/jvm/java-6-sun" to the top of "/etc/jvm" file.
  10. Install "unzip" package as:
    sudo apt-get install unzip
  11. Download & start GlassFish 3.1
    1. Download GlassFish 3.1 Milestone 2 as:
    2. Unzip the downloaded zip file as:
    3. Start GlassFish as:
      ./glassfishv3/glassfish/bin/asadmin start-domain --verbose
    4. And now your default web page is accessible at "".
  12. Finally terminate the instance as:
    ec2-terminate-instances  i-XXXXXXXX

How are you using GlassFish in the cloud ?

Technorati: totd glassfish ubuntu amazon ec2 cloud osxtips

Tuesday Dec 04, 2007

Packaging Java Apps for Ubuntu @ FOSS.IN

I presented on "Packaging Java Apps for Ubuntu" as part of the Debian-Ubuntu Project Day at FOSS.IN yesterday. Thanks to Harpreet for giving me the opportunity to talk. The slides are available here.

I've given multiple talks worldwide but this was my first formal conference in India and so was pretty excited. The talk explained the offerings of Ubuntu desktop, explained Debian packaging system, described how GlassFish was delivered in Ubuntu and then finally the lessons learned. The lessons learned from delivering GlassFish in Ubuntu could be applied to any Java application.

Here were the questions that were asked during the session:

  1. How does GlassFish interact with existing packages in Ubuntu/Debian ?

    GlassFish "requires" the JDK package and expects it to be present during installation. If the package is not present, then the underlying Ubuntu packaging mechanism first downloads it and installs it. GlassFish is not dependent on any other packages during runtime.

    For build time, it depends on debhelper package. This brings in debuild which is used to build the packages.
  2. GlassFish v2 takes time to start up. How can that be improved ?

    Read tips in GlassFish Tuning Primer to optimize the performance of your GlassFish. GlassFish v3 takes this to the next level by providing a fast (starts up < 1 sec), small (kernel < 100 kb) and modular (load only the required containers) App server. A preview is available and the production release will be available in 2009.

Sun Microsystems is a Platinum sponsor of the conference and was given a big booth space. If you visit Sun booth, you can see the back panel with a list of all the major open source projects that Sun is involved with, including but not limited to GlassFish, NetBeans, JavaDB, OpenPortal, OpenDS, OpenSolaris, OpenSPARC and many others. And this does not even talk about all the sub-projects that are under each of the communities. For example, GlassFish has Metro, jMaki, Jersey and many others.

I would love to stay for the entire duration of the conference but have to meet some folks in a different city. My short stay at the conference was nice. The Ubuntu Project Day was running ahead of schedule and so the conference organizers were courteous to invite me earlier and give me little extra time as well. Thanks for that!

On the food front, I was slightly disappointed because not even once I get to see Sambar/Dosa, not even once. The breakfast, lunch and dinner - none of them were serving Dosas :( Hopefully I'll be able to feast on my next stop at Chennai.

Here are some pictures I captured moving around the city:

The complete album from the event is here:

Technorati: conf bangalore ubuntu debian glassfish netbeans q&a

Monday Nov 26, 2007

FOSS.IN schedules now available - Almost 1600 registrants

FOSS.IN schedules are finally published, phew!

The conference is starting next Monday and this is living on the edge! This is the 7th year of the conference and I hope the scheduling is done little more in advance next year. This will allows us non-Bangaloreans to plan our activities around FOSS :)

I'll be giving "Packaging Java Applications for Ubuntu Platform" on Dec 4th, 4pm in A/120. See you there!

I'll publish the slides here after the talk.

Here are some other talks that I'd like to attend:

Date Topic Time
12/6, Thu FOSS.IN inaguration 10:00am-10:30am
12/6, Thu User to Hacker in 90 minutes: The Tools and Techniques needed to actually contribute to Open Source 3:30pm-5:00pm
12/7, Fri The Virtuous Cycle: Sun's FOSS philosophy and strategy 11:30am-1:00pm
12/7, Fri Hacking the Fox 3:30pm-5:00pm

I'd like to attend some talks on 12/8 but have to catch a flight in the afternoon. But otherwise the momentum is building pretty strong with almost 1600 registrants.

And then of course, you can find me around the GlassFish booth in the Expo.

Some more rant ...

  1. There is no conference planner on the website. You already saw my workaround above :)
  2. Why a Certificate is required for viewing individual session details ? Here is the certificate warning presented by Firefox:

    At least get the certificate by a Trusted Authority :(

Technorati: conf glassfish sun netbeans ubuntu


profile image
Arun Gupta is a technology enthusiast, a passionate runner, author, and a community guy who works for Oracle Corp.

Java EE 7 Samples

Stay Connected


« April 2014