DevOps Series Ansible Deployment of the Aerospike NoSQL Database

0
6819

In this 13th article in the DevOps series, we will install and set up an Aerospike NoSQL database cluster.

Aerospike is a free and open source, distributed NoSQL database written in C. It is primarily designed for high throughput and low latency applications. It is a key-value store optimised for Flash storage devices and runs on *nix platforms. It can also be used as an in-memory database residing entirely on RAM. Following the CAP (Consistency, High Availability, Partition Tolerance) theorem, at present, the database can be operated in AP mode. The database functions in three layers — the data storage layer, the clustering and distribution layer, and the client layer. As in many distributed databases, the server supports rolling upgrades and failover mechanisms in the cluster.

A number of client libraries for various programming language environments like C, Java, Go, Python, Node.js, etc, are available to create applications that can communicate with the Aerospike server. The basic data types that are supported are integer, string, bytes, double, list, map, GeoJSON and blobs (language serialised). Support for user defined functions (UDF) also exists, using the Lua programming language. The Aerospike tooling ecosystem has a number of connectors for the Spring framework, Hadoop, Kafka, etc. The Aerospike Management Console (AMC) is a Web-based application used to monitor the Aerospike cluster. The Aerospike server was first launched in 2012, and is released under the Affero General Public License.

GNU/Linux

A host system running Ubuntu 16.04.3 LTS (Xenial) with Vagrant and VirtualBox is used to launch three CentOS 6.9 virtual machines, on which the Aerospike server will be installed and set up. The Vagrant file to launch the three nodes is shown below:

BOX_IMAGE = “bento/centos-6.9”

NODE_COUNT = 3

Vagrant.configure(“2”) do |config|

(1..NODE_COUNT).each do |i|

# Create Aerospike server node

config.vm.define “as#{i}” do |node|

node.vm.box = BOX_IMAGE

node.ssh.forward_agent = true

# https://github.com/mitchellh/vagrant/issues/4967

node.ssh.insert_key = false

node.ssh.username = ‘vagrant’

node.ssh.password = ‘vagrant’

node.vm.network :private_network, ip: “10.0.0.#{i + 10}”

node.vm.hostname = “as#{i}”

node.vm.provider “virtualbox” do |vb|

vb.name = “Aerospike-server-#{i}”

vb.memory = “2048”

end

end

end

end

The three instances are named ‘as1’, ‘as2’ and ‘as3’, and are assigned private IP addresses that can be accessed from the host system. The machines are brought up using the following command:

$ vagrant up

The version of Ansible used on the host system is 2.2.0.0. A project directory structure is created to store the Ansible playbooks and inventory, as follows:

ansible/inventory/vbox/

/playbooks/configuration/

An ‘inventory’ file is created inside the inventory/vbox folder, which contains access information for each node:

[nodes]

as1 ansible_host=10.0.0.11 ansible_connection=ssh ansible_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

as2 ansible_host=10.0.0.12 ansible_connection=ssh ansible_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

as3 ansible_host=10.0.0.13 ansible_connection=ssh ansible_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

We also create ‘inventory/vbox/group_vars/all/all.yml’ with the following variables:

---

aerospike_edition: “community”

aerospike_version: “latest”

amc_version: 3.6.13
Figure 1: AMC modal window

Installing Aerospike

The entire set of playbooks is available in the playbooks/configuration/aerospike.yml file. The first step is to install the Aerospike server on all the three nodes using Ansible, as shown below:

---

- name: Configure Aerospike cluster node

hosts: nodes

become: yes

become_method: sudo

gather_facts: true

tags: [server]

tasks:

- name: Create downloads directory

file: path=”/home/{{ ansible_user }}/downloads” state=directory

- name: Create installs directory

file: path=”/home/{{ ansible_user }}/installs” state=directory

- name: Download Aerospike community server (RPM)

get_url: url=”http://aerospike.com/download/server/{{ aerospike_version }}/artifact/el6” dest=”/home/{{ ansible_user }}/downloads/”

register: __community_server_file

- set_fact:

server_version: “{{ __community_server_file.dest | basename }}”

- name: Extract Aerospike server

command: tar xzvf “/home/{{ ansible_user }}/downloads/{{ server_version }}” -C installs

- name: Yum update

yum: name=* update_cache=yes state=present

- name: Install RPM dependencies

become: yes

become_method: sudo

yum:

name: “{{ item }}”

state: latest

with_items:

- python

- libselinux-python

- name: Run asinstall

shell: cd “/home/{{ ansible_user }}/installs/{{ server_version | regex_replace(‘\.tgz’, ‘’) }}” && sudo ./asinstall

- name: Start Aerospike server (RPM)

shell: sudo service aerospike start

- name: Wait for server to be up and running

wait_for:

port: 3000

delay: 5

state: started

The ‘downloads’ and ‘installs’ directories are first created. The Aerospike server package for CentOS 6 is then downloaded and extracted. The YUM update command is used to update the software repository, following which the dependencies and the Aerospike server are installed. The database server is then started, and the playbook waits for the server to listen on port 3000. The above playbook can be run as follows:

$ ansible-playbook -i inventory/vbox/inventory playbooks/configuration/aerospike.yml --tags server

Setting up a multicast cluster

The Aerospike cluster can be set up either in multi-cast or mesh mode. The following playbook configures the cluster in multicast mode:

- name: Create multicast cluster

hosts: nodes

gather_facts: true

sudo: yes

tags: [multicast]

vars:

ip_address: “{{ ansible_eth1[‘ipv4’][‘address’] }}”

line_address: “ address {{ ip_address }}”

tasks:

- name: Stop aerospike server

command: service aerospike stop

- name: Specify multicast configuration file parameters

lineinfile:

dest: /etc/aerospike/aerospike.conf

insertafter: “{{ item.insertafter }}”

line: “{{ item.line }}”

state: present

with_items:

- { insertafter: ‘proto-fd-max 15000’, line: “ node-id-interface eth1” }

- { insertafter: ‘port 9918’, line: “{{ line_address }}” }

- { insertafter: ‘fabric’, line: “{{ line_address }} # Multicast: Specify private IP address” }

- name: Update network service address

replace:

name: /etc/aerospike/aerospike.conf

regexp: ‘address any’

replace: “address {{ ansible_eth1[‘ipv4’][‘address’] }}”

- name: Start aerospike server

command: service aerospike start

The above playbook can be executed using the following command:

$ ansible-playbook -i inventory/vbox/inventory playbooks/configuration/aerospike.yml --tags multicast

You can verify the multi-cast cluster setup by logging into one of the virtual machines, and using the Aerospike Admin (asadm) tool as illustrated below:

[vagrant@as1 ~]$ asadm

Aerospike Interactive Shell, version 0.1.15

Found 3 nodes

Online: 10.0.0.11:3000, 10.0.0.13:3000, 10.0.0.12:3000

Admin> exit

[vagrant@as1 ~]$

Installing the Aerospike Management Console

The Aerospike Management Console (AMC) dashboard provides a graphical user interface (GUI) for the Aerospike server. Its installation playbook is as follows:

- name: Install Aerospike Management Console

hosts: nodes

become: yes

become_method: sudo

gather_facts: true

tags: [amc]

tasks:

- name: Download AMC Community RPM package

get_url: url=”http://www.aerospike.com/download/amc/{{ amc_version }}/artifact/el6” dest=”/home/{{ ansible_user }}/downloads/”

register: __community_amc_file

- set_fact:

amc_file: “{{ __community_amc_file.dest }}”

- name: Install RPM dependencies

yum:

name: “{{ item }}”

state: latest

with_items:

- gcc

- python-devel

- name: Install RPM amc

command: rpm -ivh “{{ amc_file }}”

- name: Start AMC server (RPM)

shell: sudo service amc start

The invocation of the above playbook and a sample execution run is shown below:

$ ansible-playbook -i inventory/vbox/inventory playbooks/configuration/aerospike.yml --tags amc

PLAY [Configure Aerospike cluster node] **********************

TASK [setup] ************************************************

ok: [as2]

ok: [as1]

ok: [as3]

PLAY [Create multicast cluster] *****************************

TASK [setup] ************************************************

ok: [as1]

ok: [as2]

ok: [as3]

PLAY [Install Aerospike Management Console] *****************

TASK [setup] ************************************************

ok: [as1]

ok: [as2]

ok: [as3]

TASK [Download AMC Community RPM package] *******************

changed: [as2]

changed: [as1]

changed: [as3]

TASK [set_fact] *********************************************

ok: [as1]

ok: [as2]

ok: [as3]

TASK [Install RPM dependencies] *****************************

changed: [as1] => (item=[u’gcc’, u’python-devel’])

changed: [as2] => (item=[u’gcc’, u’python-devel’])

changed: [as3] => (item=[u’gcc’, u’python-devel’])

TASK [Install RPM amc] **************************************

changed: [as1]

changed: [as2]

changed: [as3]

TASK [Start AMC server (RPM)] *******************************

changed: [as1]

changed: [as2]

changed: [as3]

PLAY RECAP **************************************************

as1 : ok=8 changed=4 unreachable=0 failed=0

as2 : ok=8 changed=4 unreachable=0 failed=0

as3 : ok=8 changed=4 unreachable=0 failed=0

You can now open http://10.0.0.1:8081 in a browser on the host system, and you will be prompted with a modal window, as shown in Figure 1.

You can input ‘localhost’ for the ‘Host Name’, and the AMC dashboard opens as shown in Figure 2.

Figure 2: AMC dashboard

Uninstalling Aerospike

An uninstall playbook is written to stop the services, and uninstalls both the Aerospike Management Console (AMC) and the Aerospike server, as follows:

- name: Uninstall

hosts: nodes

become: yes

become_method: sudo

gather_facts: true

tags: [uninstall]

tasks:

- name: Stop AMC server

service:

name: amc

state: stopped

- name: Uninstall RPM AMC

command: yum remove aerospike-amc-* -y

- name: Stop server

command: service aerospike stop

- name: Uninstall server

shell: yum remove aerospike-* -y

The above playbook can be run using the following command:

$ ansible-playbook -i inventory/vbox/inventory playbooks/configuration/aerospike.yml --tags uninstall

You can read the documentation at https://www.aerospike.com/docs/ to learn more about Aerospike.

LEAVE A REPLY

Please enter your comment!
Please enter your name here