Last week I attended the gr8conf, a really great conference. One of my favorite event was the Hackergarden. In the evening after the regular talks ~30+ people came together (should I call them nerds?), split up into small groups and did some hacking on Groovy & Grails related topics. I found myself together with Davide Rossi to do some coding on deploying a Grails application to multiple tomcat nodes and manage a loadbalancer in front of them. The original goal was to finish the task at end of evening. Unfortunately we set our goal too high, and did not manage to release some code at that evening. During the last weekend I took some time to finish this and did a release today.
This plugin‘s goal is to simplify the deployment of a grails application to a cluster consisting of multiple tomcat instances and an Apache httpd mod_proxy_balancer.
It assumes you have an Apache mod_proxy_balancer running in front of multiple tomcat instances in order to provide a) high-availability and b) load-balancing to your Grails application. In such a scenario, upgrading the running application to a newer release is painful and error-prone when done manually. This plugin’s goal is to simplify that procedure by performing a “rolling upgrade”. Calling ‘grails tomcat redeploy’ performs these actions:
- take first node offline in loadbalancer
- undeploy app on first tomcat node
- deploy app on first tomcat node
- check if app responds on first tomcat node
- take first node online in loadbalancer
- proceed the same procedure with next node
To solve this, we’ve forked the 1.3.1 release of the tomcat plugin an added the following capabilities:
- deploying to multiple hosts and
- emitting lifecycle events: PreDeploy, PostDeploy, PreUndeploy, PostUndeploy
- provide support for ‘grails tomcat redeploy’
These changes have been included in a pull request to the upstream plugin, so I’m hoping they will find their way into Grails 1.3.2.
The rest of the work has been put into the modproxybalancer plugin, taking care of remote controlling the loadbalancer by catching up these events. mod_proxy_balancer comes with a simple management frontend called balancer-manager. This consists of some simple HTML forms that can be easily triggered using htmlunit. When the forked tomcat plugin emits a “PreUndeploy” event, the loadbalancer disables the respective tomcat node, then a normal undeploy und deploy happens. After this, the freshly deployed tomcat is checked for availablity and taken back online in the loadbalancer.
The plugin is licensend under the WTFPL.
Side note: this is my first Grails plugin with it’s sources residing on github.com. Thanks to Peter Ledbrook’s excellent blog post, I was able to use GitHub pages for the documentation.