Elasticsearch cluster can be set up on AWS ec2 instance as shown below.

Setup

The following configuration details are for Ubuntu distro.

  1. Install Java.

    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    sudo apt-get install oracle-java7-installer
    
  2. Install Elasticsearch

    wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
    echo "deb http://packages.elastic.co/elasticsearch/1.6/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-1.6.list
    sudo apt-get update
    sudo apt-get install elasticsearch
    
  3. Setup EBS.

    # Mounting EBS to /mnt  
    sudo mkfs.ext4 /dev/xvdf
    sudo mkdir /mnt
    sudo mount /dev/xvdf /mnt
    
    # Configure fstab
    # Add following line in /etc/fstab document
    # /dev/xvdf       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2
    echo "/dev/xvdf       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2" | sudo tee -a /etc/fstab
    
  4. Create folder for Elasticsearch in EBS.

    # create a folder "data" in /mnt
    sudo mkdir -p /mnt/data
    # change the ownership to elasticsearch user
    sudo chown elasticsearch:elasticsearch /mnt/data
    
  5. Configure Elasticsearch.

    # Edit Elasticsearch config file /etc/elasticsearch/elasticsearch.yml
    # Cluster name should be same across all nodes.
    cluster.name: es-cluster
    # Set data path to correct folder in attached drive.
    path.data: /mnt/data
    # Disable Multicast Discovery. Amazon doesn't allow multicast. So, we discover cluster with Unicast
    discovery.zen.ping.multicast.enabled: false
    # Config at least two IP in all machines. These two machines will be pinged by other machines in the cluster for discovery
    discovery.zen.ping.unicast.hosts: ["machine1", "machine2"]  
    
    # Automatically start during bootup
    sudo update-rc.d elasticsearch defaults 95 10
    
  6. Optionally setup Head Plugin to view status of Elasticsearch.

    # Install Elastic-Head Plugin
    sudo /usr/share/elasticsearch/bin/plugin -install mobz/elasticsearch-head
    

Now, open http://instance-ip:9200/_plugin/head/ to view the Elasticsearch status

Repeat same procedure in all nodes to manually set up Elasticsearch cluster.

Notes

  • Create EC2 instances for each node required in the cluster, in the same availability zone.
  • Let all the nodes be of same EC2 instance type.
  • Better to create all instances within same security group.
  • Security Group of the machines must allow ICMP packets between the machines.
  • SSD EBS storage is attached for better performance.
  • Http REST API access is relatively faster than native Java based client.
  • Better to do round robin access to nodes to avoid overloading a single node for all queries from clients.