cloudsoft.io

AMP Cluster

AMP Cluster is a scalability solution that is designed to increase the number of applications that can simultaneously be managed by AMP from the hundreds of a single AMP node, to many tens of thousands.

It does so by deploying a horizontally scalable worker pool of AMP nodes that can be interacted with via a Cluster API. This allows a user to easily deploy and manage their applications via the cluster.

An AMP Cluster itself can effortlessly be deployed and managed by an AMP using the AMP Cluster blueprint.

Structure

AMP Cluster consists of three main components:

  • A rest based cluster API which provides the access point to the cluster. The API for this is documented here.

  • A CouchDB database which holds information about the structure of the AMP Cluster.

  • A pool of AMP nodes from which, the managed applications are orchestrated.

For further information please refer to the AMP Cluster structure documentation.

Getting Started

For a tutorial on the basics of AMP Cluster, see the tutorial section of this guide.

AMP Cluster is included in AMP from version 4.7 onwards, please ensure you are using at least this version of AMP.

Deployment of this should create three new scalable clusters for the API, Databases and AMPs.

Usage

AMP Cluster provides a rest API endpoint which can be queried using any standard rest client. To list all managed apps using curl for example, you can use run the following bash script :

curl -u username:password $AMP_CLUSTER_ENDPOINT/v1/cluster/applications/

Where $AMP_CLUSTER_ENDPOINT is the main.uri of your AMP Cluster. For more detailed information on using a deployed AMP cluster please consult the cluster API documentation here.

Configuration

The following config keys are available for the AMP Cluster amp-deployment entity:

Config Key Default Description
amp.download.url   A link to the version of AMP to install
clusterapi.download.url   A link to the jar file for the cluster-api server.
amp.username admin The AMP username
amp.password password The AMP password
brooklyn.cfg.additions   Any text included here will be appended to the brooklyn.cfg file.
brooklyn.osgilauncher.cfg.additions   Any text included here will be appended to the end of the org.apache.brooklyn.osgilauncher.cfg file. This parameter can conflict with amps.persistence.location and amps.persistence.dir so do not set these in both params.
amp.worker.persistence.directory /var/lib/amp/worker The persistence directory that the worker cluster will use (with a suffix appended automatically so workers will have different paths)
amp.https.enabled false Set to true if amp should be deployed with https enabled
amp.port 8081 Port to be used if amp.https.enabled is set to false
amp.https.port 8443 Port to be used if amp.https.enabled is set to true
amp.https.cert   The tls certificate to use, must be set if amp.https.enabled
amp.https.key   The tls private key, must be set if amp.https.enabled
amp.https.ca.cert   The tls ca cert to append to the certificate
datastore.database.name amp-cluster The name of the CouchDB database amp-cluster will use
couchdb.username admin The default CouchDB admin user
couchdb.password 1p4s5w0rd The default CouchDB admin password
couchdb.sharedsecuritygroup.create true Enable a shared security group customizer
clusterapi.username user The api-server admin user
clusterapi.password password The api-server admin password
clusterapi.ssl   SSLProxy configuration that sets the api cluster loadbalancer up with ssl certificates
workerAmps.initialSize 1 Number of Worker AMPs in the initial deployment
clusterApi.initialSize 1 Number of Cluster API servers in the initial deployment
couchdb.initialSize 3 Number of CouchDB servers in the initial deployment
amp.maxMem   The ‘Xmx’ value to use when starting AMP
clusterapi.maxMem   The ‘Xmx’ value to use when starting the API Server

Object Store Persistence

It is recommended to use an object store for the persisted state of the AMP Workers. Each AMP Worker should write its state to a different bucket, or a separate sub-folder of a bucket.

The simplest way to do this is to set the amp.worker.persistence.directory. AMP will then use this to dynamically create bucket(s) for each amp-worker and will handle failover when a node is replaced. AMP generates a unique path for each AMP Worker by appending a suffix to this configuration value. If the configuration value contains a forward slash (/), then the part before the slash is the bucket name and the part after is the path prefix. If there is no forward slash, then the entire value (including the auto-generated suffix) is the bucket name.

Below is an example for AWS-S3:

services:
- type: amp-deployment
  brooklyn.config:
    aws.identity: <identity>
    aws.credential: <credential>
    brooklyn.cfg.additions: |
      $brooklyn:formatString("
      brooklyn.location.named.aws-loc=aws-s3:us-east-1
      brooklyn.location.named.aws-loc.identity=%s
      brooklyn.location.named.aws-loc.credential=%s",
      $brooklyn:config("aws.identity"),
      $brooklyn:config("aws.credential"))
    brooklyn.osgilauncher.cfg.additions: |
      persistenceLocation=aws-loc
    amp.worker.persistence.directory: my-amp-cluster-bucket/my-path-prefix

An alternative to an object store is to use a shared NFS mount so that the replacement VM for a failed AMP Worker can see the persisted state directory of the previous AMP Worker.

Externalized Configuration

For production blueprints running on the AMP Workers, it is important that they use externalized configuration, rather than credentials appearing in plain text.

This requires configuring brooklyn.cfg on each AMP Worker, for example with a Vault endpoint and credential.

This is done by specifying the configuration in brooklyn.cfg.additions. For example:

services:
- type: amp-deployment
  brooklyn.config:        
    brooklyn.cfg.additions: |
      $brooklyn:formatString("
      brooklyn.external.supplierName = org.apache.brooklyn.core.config.external.vault.VaultTokenExternalConfigSupplier
      brooklyn.external.credentials.endpoint = https://vault.example.com
      brooklyn.external.credentials.token = %s
      brooklyn.external.credentials.path = secret/amp-worker",
      $brooklyn:external("amp-master-creds", "worker-amp-vault-token"))

Indeed, it is also strongly recommended to use externalized configuration for the amp-deployment blueprint, when specifying the vault token to be injected (as shown above).

Limitations

AMP Cluster is currently design to enable the mass deployment of many small to medium applications (< 200 VMs). It is currently not designed to enable the sharding and deployment of large applications. In Addition the following developments are planned but not yet available:

  • Auto Scaling of the AMP Worker Cluster

  • Reservation of space on an AMP for an application which is expected to grow

  • Sophisticated selection strategies for placement of applications, such as AMP with least load, regional placements etc.

  • Advanced authentication mechanisms such as single sign-on