blob: dd8e2c6c92d5bd16d1329636af3cd34b45f51596 [file] [log] [blame] [view]
---
title: Clusters and Policies
layout: website-normal
toc: ../guide_toc.json
categories: [use, guide, defining-applications]
---
Now let's bring the concept of the "cluster" back in.
We could wrap our appserver in the same `DynamicCluster` we used earlier,
although then we'd need to define and configure the load balancer.
But another blueprint, the `ControlledDynamicWebAppCluster`, does this for us.
It takes the same `dynamiccluster.memberspec`, so we can build a fully functional elastic 3-tier
deployment of our `hello-world-sql` application as follows:
{% highlight yaml %}
{% read example_yaml/appserver-clustered-w-db.yaml %}
{% endhighlight %}
This sets up Nginx as the controller by default, but that can be configured
using the `controllerSpec` key.
This uses the same [externalized config](/guide/ops/externalized-configuration.md)
as in other examples to hide the password.
JBoss is actually the default appserver in the `ControlledDynamicWebAppCluster`,
so because `brooklyn.config` keys in Brooklyn are inherited by default,
the same blueprint can be expressed more concisely as:
{% highlight yaml %}
{% read example_yaml/appserver-clustered-w-db-concise.yaml %}
{% endhighlight %}
The other nicety supplied by the `ControlledDynamicWebAppCluster` blueprint is that
it aggregates sensors from the appserver, so we have access to things like
`webapp.reqs.perSec.windowed.perNode`.
These are convenient for plugging in to policies!
We can set up our blueprint to do autoscaling based on requests per second
(keeping it in the range 10..100, with a maximum of 5 appserver nodes)
as follows:
{% highlight yaml %}
{% read example_yaml/appserver-w-policy.yaml %}
{% endhighlight %}
Use your favorite load-generation tool (`jmeter` is one good example) to send a huge
volume of requests against the server and see the policies kick in to resize it.