From e3beaa001c2d318d613b42222efd85d408f707e9 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Wed, 20 Mar 2013 11:59:58 +0530 Subject: [PATCH 01/22] mongodb --- mongodb/README.md | 144 ++++++++++++++++++ mongodb/group_vars/all | 19 +++ mongodb/hosts | 17 +++ mongodb/playbooks/addnode.yml | 11 ++ mongodb/playbooks/addshard.yml | 9 ++ mongodb/playbooks/common.yml | 7 + mongodb/playbooks/mongoc.yml | 7 + mongodb/playbooks/mongod.yml | 9 ++ mongodb/playbooks/mongos.yml | 7 + mongodb/roles/common/tasks/main.yml | 14 ++ mongodb/roles/common/templates/10gen.repo.j2 | 6 + mongodb/roles/common/templates/hosts.j2 | 4 + mongodb/roles/mongoc/tasks/main.yml | 21 +++ mongodb/roles/mongoc/templates/mongoc.conf.j2 | 17 +++ mongodb/roles/mongoc/templates/mongoc.j2 | 94 ++++++++++++ mongodb/roles/mongod/handlers/main.yml | 5 + mongodb/roles/mongod/tasks/addshard.yml | 19 +++ mongodb/roles/mongod/tasks/main.yml | 44 ++++++ mongodb/roles/mongod/templates/mongod.conf.j2 | 84 ++++++++++ mongodb/roles/mongod/templates/mongod.j2 | 94 ++++++++++++ mongodb/roles/mongod/templates/repset_init.j2 | 7 + mongodb/roles/mongod/templates/shard_init.j2 | 2 + mongodb/roles/mongos/tasks/main.yml | 18 +++ mongodb/roles/mongos/templates/mongos.conf.j2 | 22 +++ mongodb/roles/mongos/templates/mongos.j2 | 95 ++++++++++++ mongodb/site.yml | 10 ++ 26 files changed, 786 insertions(+) create mode 100644 mongodb/README.md create mode 100644 mongodb/group_vars/all create mode 100644 mongodb/hosts create mode 100644 mongodb/playbooks/addnode.yml create mode 100644 mongodb/playbooks/addshard.yml create mode 100644 mongodb/playbooks/common.yml create mode 100644 mongodb/playbooks/mongoc.yml create mode 100644 mongodb/playbooks/mongod.yml create mode 100644 mongodb/playbooks/mongos.yml create mode 100644 mongodb/roles/common/tasks/main.yml create mode 100644 mongodb/roles/common/templates/10gen.repo.j2 create mode 100644 mongodb/roles/common/templates/hosts.j2 create mode 100644 mongodb/roles/mongoc/tasks/main.yml create mode 100644 mongodb/roles/mongoc/templates/mongoc.conf.j2 create mode 100644 mongodb/roles/mongoc/templates/mongoc.j2 create mode 100644 mongodb/roles/mongod/handlers/main.yml create mode 100644 mongodb/roles/mongod/tasks/addshard.yml create mode 100644 mongodb/roles/mongod/tasks/main.yml create mode 100644 mongodb/roles/mongod/templates/mongod.conf.j2 create mode 100644 mongodb/roles/mongod/templates/mongod.j2 create mode 100644 mongodb/roles/mongod/templates/repset_init.j2 create mode 100644 mongodb/roles/mongod/templates/shard_init.j2 create mode 100644 mongodb/roles/mongos/tasks/main.yml create mode 100644 mongodb/roles/mongos/templates/mongos.conf.j2 create mode 100644 mongodb/roles/mongos/templates/mongos.j2 create mode 100644 mongodb/site.yml diff --git a/mongodb/README.md b/mongodb/README.md new file mode 100644 index 0000000..2ab8861 --- /dev/null +++ b/mongodb/README.md @@ -0,0 +1,144 @@ +Deploying a shared production ready MongoDB cluster with Ansible +------------------------------------------------------------------------------ + +In this example we demonstrate how we can orchestrate the deployment of a production grade MongoDB Cluster. The functionality of this example includes: + +1) Deploying a N node MongoDB cluster, which has N shards and N replication nodes. +2) Scale out capability. Expand the Cluster by adding nodes to the cluster. + +###Deployment Architecture. + +To better explain the deployment architecture let's take an example where we are deploying a 3 node MongoDB cluster ( Minimum recommended by MongoDB). +The way Ansible configures the three nodes is as follows: + +1) Install the mongodb software on all nodes. +2) Creates 3 replication sets, with one primary on each node and the rest two acting as secondaries. +3) Configures MongodDB configuration servers as listed in the inventory section[mongocservers]. Recommended number is 3, so it can be the same three servers as the datanodes. +4) Configures a Mongos server as listed in the inventory file [mongosservers]. +5) Adds 3 Shards each belonging to individual relocation sets. + +Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: + +1) Install the MongoDB application on the new node. +2) Configure the replication set with primary as the new node and the secondaries as listed in the inventory file [replicationservers]. ( don't forget to add the new node also in the replicationservers section] +3) Adds a new shard to the mongos service pointing to the new replication set. + +###The following example deploys a three node MongoDB Cluster + +The inventory file looks as follows: + + #The site wide list of mongodb servers + [mongoservers] + mongo1 + mongo2 + mongo3 + + #The list of servers where replication should happen, by default include all servers + [replicationservers] + mongo1 + mongo2 + mongo3 + + #The list of mongodb configuration servers, make sure it is 1 or 3 + [mongocservers] + mongo1 + mongo2 + mongo3 + + #The list of servers where mongos servers would run. + [mongosservers] + mongos + +Build the site with the following command: + + ansible-playbook -i hosts site.yml + +##Verification + +Once completed we can check replication set availibitly by connecting to individual primary replication set nodes, 'mongo --host --port +and issue the command to query the status of replication set, we should get a similar output. + + + web2:PRIMARY> rs.status() + { + "set" : "web2", + "date" : ISODate("2013-03-19T10:26:35Z"), + "myState" : 1, + "members" : [ + { + "_id" : 0, + "name" : "web2:2013", + "health" : 1, + "state" : 1, + "stateStr" : "PRIMARY", + "uptime" : 102, + "optime" : Timestamp(1363688755000, 1), + "optimeDate" : ISODate("2013-03-19T10:25:55Z"), + "self" : true + }, + { + "_id" : 1, + "name" : "web3:2013", + "health" : 1, + "state" : 2, + "stateStr" : "SECONDARY", + "uptime" : 40, + "optime" : Timestamp(1363688755000, 1), + "optimeDate" : ISODate("2013-03-19T10:25:55Z"), + "lastHeartbeat" : ISODate("2013-03-19T10:26:33Z"), + "pingMs" : 1 + } + ], + "ok" : 1 + } + +we can check the status of the Shards as follows: connect to the mongos service 'mongos --host --port 8888' +and issue the following command to get the status of the Shards. + + + mongos> sh.status() + --- Sharding Status --- + sharding version: { "_id" : 1, "version" : 3 } + shards: + { "_id" : "web2", "host" : "web2/web2:2013,web3:2013" } + { "_id" : "web3", "host" : "web3/web2:2014,web3:2014" } + databases: + { "_id" : "admin", "partitioned" : false, "primary" : "config" } + + + + + +### Adding a new node to the Cluster + +To add a new node to the configured MongoDb Cluster, setup the inventory file as follows: + + #The site wide list of mongodb servers + [mongoservers] + mongo1 + mongo2 + mongo3 + mongo4 + + #The list of servers where replication should happen, by default include all servers + [replicationservers] + mongo4 + mongo1 + mongo2 + + #The list of mongodb configuration servers, make sure it is 1 or 3 + [mongocservers] + mongo1 + mongo2 + mongo3 + + #The list of servers where mongos servers would run. + [mongosservers] + mongos + +Make sure you have the new node added in the replicationservers section and execute the following command: + + ansible-playbook -i hosts playbooks/addnode.yml -e servername=mongo4 + +Verification can be done using the same steps mentioned above. + diff --git a/mongodb/group_vars/all b/mongodb/group_vars/all new file mode 100644 index 0000000..ae7819e --- /dev/null +++ b/mongodb/group_vars/all @@ -0,0 +1,19 @@ +#The Global variable file mongodb installation + +#The chunksize for shards in MB +mongos_chunk_size: 1 + +#The port in which mongos server should listen on +mongos_port: 8888 + +#The port for mongo config server +mongoc_port: 7777 + +#The port prefix for mongod servers, the latter part is appended the playbook (the last octect of the ipaddress) +mongodb_port_prefix: 201 + +#The directory prefix where the database files would be stored +mongodb_datadir_prefix: /data/ + +#The interface where the mongodb process should listen on. +iface: eth0 diff --git a/mongodb/hosts b/mongodb/hosts new file mode 100644 index 0000000..3163e3f --- /dev/null +++ b/mongodb/hosts @@ -0,0 +1,17 @@ +#The site wide list of mongodb servers +[mongoservers] +web2 +web3 + +#The list of servers where replication should happen, by default include all servers +[replicationservers] +web2 +web3 + +#The list of mongodb configuration servers, make sure it is 1 or 3 +[mongocservers] +web3 + +#The list of servers where mongos servers would run. +[mongosservers] +web3 diff --git a/mongodb/playbooks/addnode.yml b/mongodb/playbooks/addnode.yml new file mode 100644 index 0000000..213e1ef --- /dev/null +++ b/mongodb/playbooks/addnode.yml @@ -0,0 +1,11 @@ +--- +#This playbook is used to add a new node the mongodb cluster + +- hosts: mongoservers +- hosts: replicationservers +- hosts: mongosservers +- hosts: ${servername} + tasks: + - include: ../roles/common/tasks/main.yml + - include: ../roles/mongod/tasks/main.yml + - include: ../roles/mongod/tasks/addshard.yml diff --git a/mongodb/playbooks/addshard.yml b/mongodb/playbooks/addshard.yml new file mode 100644 index 0000000..8272446 --- /dev/null +++ b/mongodb/playbooks/addshard.yml @@ -0,0 +1,9 @@ +--- +# This playbook adds the shards to the mongos service + +- hosts: mongosservers + +- hosts: mongoservers + user: root + tasks: + - include: ../roles/mongod/tasks/addshard.yml diff --git a/mongodb/playbooks/common.yml b/mongodb/playbooks/common.yml new file mode 100644 index 0000000..5098d08 --- /dev/null +++ b/mongodb/playbooks/common.yml @@ -0,0 +1,7 @@ +--- +# Deploys all common plays for the site + +- hosts: mongoservers + user: root + tasks: + - include: ../roles/common/tasks/main.yml diff --git a/mongodb/playbooks/mongoc.yml b/mongodb/playbooks/mongoc.yml new file mode 100644 index 0000000..8edd95a --- /dev/null +++ b/mongodb/playbooks/mongoc.yml @@ -0,0 +1,7 @@ +--- +# Deploys the mongodb configuratin db servers + +- hosts: mongocservers + user: root + tasks: + - include: ../roles/mongoc/tasks/main.yml diff --git a/mongodb/playbooks/mongod.yml b/mongodb/playbooks/mongod.yml new file mode 100644 index 0000000..91156c0 --- /dev/null +++ b/mongodb/playbooks/mongod.yml @@ -0,0 +1,9 @@ +--- +# Deploys the mongodb service and sets up replication sets + +- hosts: mongoservers + user: root + tasks: + - include: ../roles/mongod/tasks/main.yml + handlers: + - include: ../roles/mongod/handlers/main.yml diff --git a/mongodb/playbooks/mongos.yml b/mongodb/playbooks/mongos.yml new file mode 100644 index 0000000..335f666 --- /dev/null +++ b/mongodb/playbooks/mongos.yml @@ -0,0 +1,7 @@ +--- +# Responsible for setting up and configuring mongos services + +- hosts: mongosservers + user: root + tasks: + - include: ../roles/mongos/tasks/main.yml diff --git a/mongodb/roles/common/tasks/main.yml b/mongodb/roles/common/tasks/main.yml new file mode 100644 index 0000000..757354d --- /dev/null +++ b/mongodb/roles/common/tasks/main.yml @@ -0,0 +1,14 @@ +--- +# This Playbook runs all the common plays in the deployment + +- name: Create the hosts file for all machines + template: src=../roles/common/templates/hosts.j2 dest=/etc/hosts + +- name: Creates the repository for 10Gen + template: src=../roles/common/templates/10gen.repo.j2 dest=/etc/yum.repos.d/10gen.repo + +- name: Install the mongodb package + yum: name=$item state=installed + with_items: + - mongo-10gen + - mongo-10gen-server diff --git a/mongodb/roles/common/templates/10gen.repo.j2 b/mongodb/roles/common/templates/10gen.repo.j2 new file mode 100644 index 0000000..db76731 --- /dev/null +++ b/mongodb/roles/common/templates/10gen.repo.j2 @@ -0,0 +1,6 @@ +[10gen] +name=10gen Repository +baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 +gpgcheck=0 +enabled=1 + diff --git a/mongodb/roles/common/templates/hosts.j2 b/mongodb/roles/common/templates/hosts.j2 new file mode 100644 index 0000000..8ec7c3c --- /dev/null +++ b/mongodb/roles/common/templates/hosts.j2 @@ -0,0 +1,4 @@ +127.0.0.1 localhost +{% for host in groups['mongoservers'] %} +{{ hostvars[host]['ansible_' + iface].ipv4.address }} {{ host }} +{% endfor %} diff --git a/mongodb/roles/mongoc/tasks/main.yml b/mongodb/roles/mongoc/tasks/main.yml new file mode 100644 index 0000000..c343724 --- /dev/null +++ b/mongodb/roles/mongoc/tasks/main.yml @@ -0,0 +1,21 @@ +--- +# This playbook deploys the mongodb configurationdb servers + +- name: Create data directory for mongoc configuration server + file: path=${mongodb_datadir_prefix}/configdb state=directory owner=mongod group=mongod + +- name: Create the mongo configuration server startup file + template: src=../roles/mongoc/templates/mongoc.j2 dest=/etc/init.d/mongoc mode=0655 + +- name: Insert iptables rule for mongoc + lineinfile: dest=/etc/sysconfig/iptables state=present regexp="$mongoc_port" insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport "$mongoc_port" -j ACCEPT" + +- name: Apply iptable rule + service: name=iptables state=restarted + +- name: Create the mongo configuration server file + template: src=../roles/mongoc/templates/mongoc.conf.j2 dest=/etc/mongoc.conf + +- name: Start the mongo configuration server service + command: creates=/var/lock/subsys/mongoc /etc/init.d/mongoc start + diff --git a/mongodb/roles/mongoc/templates/mongoc.conf.j2 b/mongodb/roles/mongoc/templates/mongoc.conf.j2 new file mode 100644 index 0000000..59c29ba --- /dev/null +++ b/mongodb/roles/mongoc/templates/mongoc.conf.j2 @@ -0,0 +1,17 @@ + +#where to log +logpath=/var/log/mongo/mongod-config.log + +logappend=true + +# fork and run in background +fork = true + +port = {{ mongoc_port }} + +dbpath={{ mongodb_datadir_prefix }}configdb + +# location of pidfile +pidfilepath = /var/run/mongoc.pid + +configsvr=true diff --git a/mongodb/roles/mongoc/templates/mongoc.j2 b/mongodb/roles/mongoc/templates/mongoc.j2 new file mode 100644 index 0000000..fbbe598 --- /dev/null +++ b/mongodb/roles/mongoc/templates/mongoc.j2 @@ -0,0 +1,94 @@ +#!/bin/bash + +# mongod - Startup script for mongod + +# chkconfig: 35 85 15 +# description: Mongo is a scalable, document-oriented database. +# processname: mongod +# config: /etc/mongod.conf +# pidfile: /var/run/mongo/mongod.pid + +. /etc/rc.d/init.d/functions + +# things from mongod.conf get there by mongod reading it + + +# NOTE: if you change any OPTIONS here, you get what you pay for: +# this script assumes all options are in the config file. +CONFIGFILE="/etc/mongoc.conf" +OPTIONS=" -f $CONFIGFILE" +SYSCONFIG="/etc/sysconfig/mongod" + +# FIXME: 1.9.x has a --shutdown flag that parses the config file and +# shuts down the correct running pid, but that's unavailable in 1.8 +# for now. This can go away when this script stops supporting 1.8. +DBPATH=`awk -F= '/^dbpath=/{print $2}' "$CONFIGFILE"` +PIDFILE=`awk -F= '/^dbpath\s=\s/{print $2}' "$CONFIGFILE"` +mongod=${MONGOD-/usr/bin/mongod} + +MONGO_USER=mongod +MONGO_GROUP=mongod + +if [ -f "$SYSCONFIG" ]; then + . "$SYSCONFIG" +fi + +# Handle NUMA access to CPUs (SERVER-3574) +# This verifies the existence of numactl as well as testing that the command works +NUMACTL_ARGS="--interleave=all" +if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null +then + NUMACTL="numactl $NUMACTL_ARGS" +else + NUMACTL="" +fi + +start() +{ + echo -n $"Starting mongod: " + daemon --user "$MONGO_USER" $NUMACTL $mongod $OPTIONS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongoc +} + +stop() +{ + echo -n $"Stopping mongod: " + killproc -p "$PIDFILE" -d 300 /usr/bin/mongod + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mongoc +} + +restart () { + stop + start +} + +ulimit -n 12000 +RETVAL=0 + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload|force-reload) + restart + ;; + condrestart) + [ -f /var/lock/subsys/mongod ] && restart || : + ;; + status) + status $mongod + RETVAL=$? + ;; + *) + echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" + RETVAL=1 +esac + +exit $RETVAL diff --git a/mongodb/roles/mongod/handlers/main.yml b/mongodb/roles/mongod/handlers/main.yml new file mode 100644 index 0000000..0f563a9 --- /dev/null +++ b/mongodb/roles/mongod/handlers/main.yml @@ -0,0 +1,5 @@ +--- +# Handler for mongod + +- name: restart iptables + service: name=iptables state=restarted diff --git a/mongodb/roles/mongod/tasks/addshard.yml b/mongodb/roles/mongod/tasks/addshard.yml new file mode 100644 index 0000000..3552ac3 --- /dev/null +++ b/mongodb/roles/mongod/tasks/addshard.yml @@ -0,0 +1,19 @@ +--- +#This Playbooks adds shards to the mongos servers once everythig is added + +- name: get the port number for mongod processes + shell: ifconfig ${iface} | grep "inet addr" | cut -d':' -f2 | cut -d. -f4 | cut -d' ' -f1 + register: result + + +- name: Create the file to initialize the mongod Shard + template: src=../roles/mongod/templates/shard_init.j2 dest=/tmp/shard_init_${inventory_hostname}.js + delegate_to: $item + with_items: ${groups.mongosservers} + +- name: Add the shard to the mongos + shell: /usr/bin/mongo --port ${mongos_port} /tmp/shard_init_${inventory_hostname}.js + delegate_to: $item + with_items: ${groups.mongosservers} + + diff --git a/mongodb/roles/mongod/tasks/main.yml b/mongodb/roles/mongod/tasks/main.yml new file mode 100644 index 0000000..619d80f --- /dev/null +++ b/mongodb/roles/mongod/tasks/main.yml @@ -0,0 +1,44 @@ +--- +#This Playbook deploys the mongod processes and sets up the firewall rules and sets up the replication set. + +- name: create data directory for mongodb + file: path=${mongodb_datadir_prefix}/mongo-${inventory_hostname} state=directory owner=mongod group=mongod + delegate_to: $item + with_items: ${groups.replicationservers} + +- name: Create a port number for mongod processes + shell: ifconfig ${iface} | grep "inet addr" | cut -d':' -f2 | cut -d. -f4 | cut -d' ' -f1 + register: result + +- name: Create the mongodb startup file + template: src=../roles/mongod/templates/mongod.j2 dest=/etc/init.d/mongod-${inventory_hostname} mode=0655 + delegate_to: $item + with_items: ${groups.replicationservers} + +- name: insert iptables rule for mongod + lineinfile: dest=/etc/sysconfig/iptables state=present regexp="$mongodb_port_prefix${result.stdout}" insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport "$mongodb_port_prefix${result.stdout}" -j ACCEPT" + delegate_to: $item + with_items: ${groups.replicationservers} + +- name: Add the iptable rule to allow traffice dynamically + shell: iptables -I INPUT 2 -p tcp --dport ${mongodb_port_prefix}${result.stdout} -j ACCEPT + delegate_to: $item + with_items: ${groups.replicationservers} + +- name: Create the mongodb configuration file + template: src=../roles/mongod/templates/mongod.conf.j2 dest=/etc/mongod-${inventory_hostname}.conf + delegate_to: $item + with_items: ${groups.replicationservers} + +- name: Start the mongodb service + command: creates=/var/lock/subsys/mongod-${inventory_hostname} /etc/init.d/mongod-${inventory_hostname} start + delegate_to: $item + with_items: ${groups.replicationservers} + +- name: Create the file to initialize the mongod replica set + template: src=../roles/mongod/templates/repset_init.j2 dest=/tmp/repset_init.js + +- name: Initialize the replication set + shell: /usr/bin/mongo --port "$mongodb_port_prefix${result.stdout}" /tmp/repset_init.js + + diff --git a/mongodb/roles/mongod/templates/mongod.conf.j2 b/mongodb/roles/mongod/templates/mongod.conf.j2 new file mode 100644 index 0000000..caf0de5 --- /dev/null +++ b/mongodb/roles/mongod/templates/mongod.conf.j2 @@ -0,0 +1,84 @@ +# mongo.conf +smallfiles=true + +#where to log +logpath=/var/log/mongo/mongod-{{ inventory_hostname }}.log + +logappend=true + +# fork and run in background +fork = true + +port = {{ mongodb_port_prefix }}{{ result.stdout }} + +dbpath={{ mongodb_datadir_prefix }}mongo-{{ inventory_hostname }} + +# location of pidfile +pidfilepath = /var/run/mongod.pid + +# Disables write-ahead journaling +# nojournal = true + +# Enables periodic logging of CPU utilization and I/O wait +#cpu = true + +# Turn on/off security. Off is currently the default +#noauth = true +#auth = true + +# Verbose logging output. +#verbose = true + +# Inspect all client data for validity on receipt (useful for +# developing drivers) +#objcheck = true + +# Enable db quota management +#quota = true + +# Set oplogging level where n is +# 0=off (default) +# 1=W +# 2=R +# 3=both +# 7=W+some reads +#diaglog = 0 + +# Ignore query hints +#nohints = true + +# Disable the HTTP interface (Defaults to localhost:27018). +#nohttpinterface = true + +# Turns off server-side scripting. This will result in greatly limited +# functionality +#noscripting = true + +# Turns off table scans. Any query that would do a table scan fails. +#notablescan = true + +# Disable data file preallocation. +#noprealloc = true + +# Specify .ns file size for new databases. +# nssize = + +# Accout token for Mongo monitoring server. +#mms-token = + +# Server name for Mongo monitoring server. +#mms-name = + +# Ping interval for Mongo monitoring server. +#mms-interval = + +# Replication Options +replSet={{ inventory_hostname }} +# in replicated mongo databases, specify here whether this is a slave or master +#slave = true +#source = master.example.com +# Slave only: specify a single database to replicate +#only = master.example.com +# or +#master = true +#source = slave.example.com diff --git a/mongodb/roles/mongod/templates/mongod.j2 b/mongodb/roles/mongod/templates/mongod.j2 new file mode 100644 index 0000000..5c460f2 --- /dev/null +++ b/mongodb/roles/mongod/templates/mongod.j2 @@ -0,0 +1,94 @@ +#!/bin/bash + +# mongod - Startup script for mongod + +# chkconfig: 35 85 15 +# description: Mongo is a scalable, document-oriented database. +# processname: mongod +# config: /etc/mongod.conf +# pidfile: /var/run/mongo/mongod.pid + +. /etc/rc.d/init.d/functions + +# things from mongod.conf get there by mongod reading it + + +# NOTE: if you change any OPTIONS here, you get what you pay for: +# this script assumes all options are in the config file. +CONFIGFILE="/etc/mongod-{{ inventory_hostname }}.conf" +OPTIONS=" -f $CONFIGFILE" +SYSCONFIG="/etc/sysconfig/mongod" + +# FIXME: 1.9.x has a --shutdown flag that parses the config file and +# shuts down the correct running pid, but that's unavailable in 1.8 +# for now. This can go away when this script stops supporting 1.8. +DBPATH=`awk -F= '/^dbpath=/{print $2}' "$CONFIGFILE"` +PIDFILE=`awk -F= '/^dbpath\s=\s/{print $2}' "$CONFIGFILE"` +mongod=${MONGOD-/usr/bin/mongod} + +MONGO_USER=mongod +MONGO_GROUP=mongod + +if [ -f "$SYSCONFIG" ]; then + . "$SYSCONFIG" +fi + +# Handle NUMA access to CPUs (SERVER-3574) +# This verifies the existence of numactl as well as testing that the command works +NUMACTL_ARGS="--interleave=all" +if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null +then + NUMACTL="numactl $NUMACTL_ARGS" +else + NUMACTL="" +fi + +start() +{ + echo -n $"Starting mongod: " + daemon --user "$MONGO_USER" $NUMACTL $mongod $OPTIONS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongod-{{ inventory_hostname }} +} + +stop() +{ + echo -n $"Stopping mongod: " + killproc -p "$PIDFILE" -d 300 /usr/bin/mongod + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mongod-{{ inventory_hostname }} +} + +restart () { + stop + start +} + +ulimit -n 12000 +RETVAL=0 + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload|force-reload) + restart + ;; + condrestart) + [ -f /var/lock/subsys/mongod ] && restart || : + ;; + status) + status $mongod + RETVAL=$? + ;; + *) + echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" + RETVAL=1 +esac + +exit $RETVAL diff --git a/mongodb/roles/mongod/templates/repset_init.j2 b/mongodb/roles/mongod/templates/repset_init.j2 new file mode 100644 index 0000000..7daae45 --- /dev/null +++ b/mongodb/roles/mongod/templates/repset_init.j2 @@ -0,0 +1,7 @@ +rs.initiate() +sleep(13000) +{% for host in groups['replicationservers'] %} +rs.add("{{ host }}:{{ mongodb_port_prefix }}{{ result.stdout }}") +sleep(8000) +{% endfor %} +printjson(rs.status()) diff --git a/mongodb/roles/mongod/templates/shard_init.j2 b/mongodb/roles/mongod/templates/shard_init.j2 new file mode 100644 index 0000000..db40c9a --- /dev/null +++ b/mongodb/roles/mongod/templates/shard_init.j2 @@ -0,0 +1,2 @@ +sh.addShard("{{ inventory_hostname}}/{{ inventory_hostname }}:{{ mongodb_port_prefix }}{{ result.stdout }}") +printjson(rs.status()) diff --git a/mongodb/roles/mongos/tasks/main.yml b/mongodb/roles/mongos/tasks/main.yml new file mode 100644 index 0000000..7e020da --- /dev/null +++ b/mongodb/roles/mongos/tasks/main.yml @@ -0,0 +1,18 @@ +--- +#This Playbook configures the mongos service of mongodb + +- name: Create the mongos startup file + template: src=../roles/mongos/templates/mongos.j2 dest=/etc/init.d/mongos mode=0655 + +- name: insert iptables rule for mongos + lineinfile: dest=/etc/sysconfig/iptables state=present regexp="$mongos_port" insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport "$mongos_port" -j ACCEPT" + +- name: Apply iptable rule on replication servers also + service: name=iptables state=restarted + +- name: Create the mongos configuration file + template: src=../roles/mongos/templates/mongos.conf.j2 dest=/etc/mongos.conf + +- name: Start the mongos service + command: creates=/var/lock/subsys/mongos /etc/init.d/mongos start + diff --git a/mongodb/roles/mongos/templates/mongos.conf.j2 b/mongodb/roles/mongos/templates/mongos.conf.j2 new file mode 100644 index 0000000..a619110 --- /dev/null +++ b/mongodb/roles/mongos/templates/mongos.conf.j2 @@ -0,0 +1,22 @@ +#where to log +logpath=/var/log/mongo/mongos.log + +logappend=true + +# fork and run in background +fork = true + +port = {{ mongos_port }} +{% set hosts = '' %} + {% for host in groups['mongocservers'] %} + {% if loop.last %} + {% set hosts = hosts + host + ':' ~ mongoc_port %} + configdb = {{ hosts }} + {% else %} + {% set hosts = hosts + host + ':' ~ mongoc_port + ',' %} + {% endif %} + {% endfor %} + +# location of pidfile +pidfilepath = /var/run/mongodb/mongos.pid +chunkSize={{ mongos_chunk_size }} diff --git a/mongodb/roles/mongos/templates/mongos.j2 b/mongodb/roles/mongos/templates/mongos.j2 new file mode 100644 index 0000000..2eaff10 --- /dev/null +++ b/mongodb/roles/mongos/templates/mongos.j2 @@ -0,0 +1,95 @@ +#!/bin/bash + +# mongod - Startup script for mongod + +# chkconfig: 35 85 15 +# description: Mongo is a scalable, document-oriented database. +# processname: mongod +# config: /etc/mongod.conf +# pidfile: /var/run/mongo/mongod.pid + +. /etc/rc.d/init.d/functions + +# things from mongod.conf get there by mongod reading it + + +# NOTE: if you change any OPTIONS here, you get what you pay for: +# this script assumes all options are in the config file. +CONFIGFILE="/etc/mongos.conf" +OPTIONS=" -f $CONFIGFILE" +SYSCONFIG="/etc/sysconfig/mongod" + +# FIXME: 1.9.x has a --shutdown flag that parses the config file and +# shuts down the correct running pid, but that's unavailable in 1.8 +# for now. This can go away when this script stops supporting 1.8. +DBPATH=`awk -F= '/^dbpath=/{print $2}' "$CONFIGFILE"` +PIDFILE=`awk -F= '/^dbpath\s=\s/{print $2}' "$CONFIGFILE"` +mongod=${MONGOD-/usr/bin/mongos} + +MONGO_USER=mongod +MONGO_GROUP=mongod + +if [ -f "$SYSCONFIG" ]; then + . "$SYSCONFIG" +fi + +# Handle NUMA access to CPUs (SERVER-3574) +# This verifies the existence of numactl as well as testing that the command works +NUMACTL_ARGS="--interleave=all" +if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null +then + NUMACTL="numactl $NUMACTL_ARGS" +else + NUMACTL="" +fi + +start() +{ + echo -n $"Starting mongod: " + daemon --user "$MONGO_USER" $NUMACTL $mongod $OPTIONS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongos +} + +stop() +{ + echo -n $"Stopping mongod: " + killproc -p "$PIDFILE" -d 300 /usr/bin/mongos + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mongos +} + +restart () { + stop + start +} + +ulimit -n 12000 +RETVAL=0 + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload|force-reload) + restart + ;; + condrestart) + [ -f /var/lock/subsys/mongod ] && restart || : + ;; + status) + status $mongod + RETVAL=$? + ;; + *) + echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" + RETVAL=1 +esac + +exit $RETVAL + diff --git a/mongodb/site.yml b/mongodb/site.yml new file mode 100644 index 0000000..d2607a5 --- /dev/null +++ b/mongodb/site.yml @@ -0,0 +1,10 @@ +--- +# This Playbook would deploy the whole mongodb cluster with replication and sharding. + +- include: playbooks/common.yml +- include: playbooks/mongod.yml +- include: playbooks/mongoc.yml +- include: playbooks/mongos.yml +- include: playbooks/addshard.yml + + From fe6caec9b59bcd12ba38979ade545224be0fb693 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 27 Mar 2013 00:02:22 +0530 Subject: [PATCH 02/22] security added for mongodb --- mongodb/README.md | 117 ++++++++++++++++-- mongodb/group_vars/all | 7 +- mongodb/hosts | 18 ++- mongodb/playbooks/addnode.yml | 8 +- mongodb/roles/common/tasks/main.yml | 1 + mongodb/roles/mongoc/files/secret | 3 + mongodb/roles/mongoc/tasks/main.yml | 11 ++ mongodb/roles/mongoc/templates/adduser.j2 | 1 + mongodb/roles/mongoc/templates/mongoc.conf.j2 | 2 +- mongodb/roles/mongod/files/secret | 3 + mongodb/roles/mongod/tasks/addshard.yml | 2 +- mongodb/roles/mongod/tasks/main.yml | 9 +- mongodb/roles/mongod/templates/mongod.conf.j2 | 1 + mongodb/roles/mongos/files/secret | 3 + mongodb/roles/mongos/tasks/main.yml | 7 ++ mongodb/roles/mongos/templates/mongos.conf.j2 | 1 + .../roles/mongos/templates/testsharding.j2 | 12 ++ 17 files changed, 181 insertions(+), 25 deletions(-) create mode 100644 mongodb/roles/mongoc/files/secret create mode 100644 mongodb/roles/mongoc/templates/adduser.j2 create mode 100644 mongodb/roles/mongod/files/secret create mode 100644 mongodb/roles/mongos/files/secret create mode 100644 mongodb/roles/mongos/templates/testsharding.j2 diff --git a/mongodb/README.md b/mongodb/README.md index 2ab8861..e373069 100644 --- a/mongodb/README.md +++ b/mongodb/README.md @@ -5,22 +5,32 @@ In this example we demonstrate how we can orchestrate the deployment of a produc 1) Deploying a N node MongoDB cluster, which has N shards and N replication nodes. 2) Scale out capability. Expand the Cluster by adding nodes to the cluster. +3) Security, All the mongodb process are secured using the best practices. ###Deployment Architecture. To better explain the deployment architecture let's take an example where we are deploying a 3 node MongoDB cluster ( Minimum recommended by MongoDB). + The way Ansible configures the three nodes is as follows: 1) Install the mongodb software on all nodes. + 2) Creates 3 replication sets, with one primary on each node and the rest two acting as secondaries. -3) Configures MongodDB configuration servers as listed in the inventory section[mongocservers]. Recommended number is 3, so it can be the same three servers as the datanodes. + +3) Configures MongodDB configuration DB servers as listed in the inventory section[mongocservers]. Recommended number is 3, so it can be the same three servers as the datanodes. + 4) Configures a Mongos server as listed in the inventory file [mongosservers]. -5) Adds 3 Shards each belonging to individual relocation sets. + +5) Adds 3 Shards each belonging to individual replication sets. + +6) All the processes, mongod,mogos are secured using the keyfiles. Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: 1) Install the MongoDB application on the new node. + 2) Configure the replication set with primary as the new node and the secondaries as listed in the inventory file [replicationservers]. ( don't forget to add the new node also in the replicationservers section] + 3) Adds a new shard to the mongos service pointing to the new replication set. ###The following example deploys a three node MongoDB Cluster @@ -31,19 +41,19 @@ The inventory file looks as follows: [mongoservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where replication should happen, by default include all servers [replicationservers] mongo1 mongo2 - mongo3 + mongo3 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] @@ -53,7 +63,7 @@ Build the site with the following command: ansible-playbook -i hosts site.yml -##Verification +###Verifying the deployed MongoDB Cluster Once completed we can check replication set availibitly by connecting to individual primary replication set nodes, 'mongo --host --port and issue the command to query the status of replication set, we should get a similar output. @@ -105,10 +115,74 @@ and issue the following command to get the status of the Shards. databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } +We can also make sure the Sharding works by creating a database and collection and populate it with documents and check if the chunks of the collection are balanced equally across nodes. + +The above mentioned steps can be tested as follows: + +1) Once the Sharded cluster is ready, create a new database and an admin user for the database. This is done from the mongos machine. + + /usr/bin/mongo localhost:8888/admin -u admin -p 123456 + mongos> use test + switched to db test + + mongos> db.addUser('admin','123456') + { + "user" : "admin", + "readOnly" : false, + "pwd" : "95ec4261124ba5951720b199908d892b", + "_id" : ObjectId("51519f349cd3a93ca7e17909") + } +2) Once the DB and the user is created, create a collection and poplulate documents, This deployment add a script to the /tmp location of the mongos server which adds a new collection and 100,000 documents. + + $/usr/bin/mongo localhost:8888/test -u admin -p 123456 /tmp/testsharding.js +3) After the document's are populated, we have to enable sharding on the database and the collection. which can be done as follows: + + $/usr/bin/mongo localhost:8888/admin -u admin -p 123456 + mongos> db.runCommand( { enableSharding : "test" } ) + { "ok" : 1 } + mongos> db.runCommand( { shardCollection : "test.test_collection", key : {"number":1} }) + { "collectionsharded" : "test.test_collection", "ok" : 1 } + mongos> sh.status() + --- Sharding Status --- + sharding version: { "_id" : 1, "version" : 3 } + shards: + { "_id" : "bensible", "host" : "bensible/bensible:20103,web2:20103,web3:20103" } + { "_id" : "web2", "host" : "web2/bensible:20102,web2:20102,web3:20102" } + { "_id" : "web3", "host" : "web3/bensible:20101,web2:20101,web3:20101" } + databases: + { "_id" : "admin", "partitioned" : false, "primary" : "config" } + { "_id" : "test", "partitioned" : true, "primary" : "bensible" } + + test.test_collection chunks: + + web2 1 + bensible 19 +4) In the above example we can see the chunks being balanced across nodes. After a few minutes if we excute the same command 'sh.status()' +we will see the below output, which shows all the chunks being balanced across the three nodes. + mongos> sh.status() + --- Sharding Status --- + sharding version: { "_id" : 1, "version" : 3 } + shards: + { "_id" : "bensible", "host" : "bensible/bensible:20103,web2:20103,web3:20103" } + { "_id" : "web2", "host" : "web2/bensible:20105,web2:20105,web3:20105" } + { "_id" : "web3", "host" : "web3/bensible:20102,web2:20102,web3:20102" } + databases: + { "_id" : "admin", "partitioned" : false, "primary" : "config" } + { "_id" : "test", "partitioned" : true, "primary" : "web3" } + + test.test_collection chunks: + + bensible 7 + web2 6 + web3 7 + + + + ### Adding a new node to the Cluster To add a new node to the configured MongoDb Cluster, setup the inventory file as follows: @@ -117,20 +191,20 @@ To add a new node to the configured MongoDb Cluster, setup the inventory file as [mongoservers] mongo1 mongo2 - mongo3 + mongo3 mongo4 #The list of servers where replication should happen, by default include all servers [replicationservers] mongo4 mongo1 - mongo2 + mongo2 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] @@ -140,5 +214,28 @@ Make sure you have the new node added in the replicationservers section and exec ansible-playbook -i hosts playbooks/addnode.yml -e servername=mongo4 -Verification can be done using the same steps mentioned above. +###Verification. + +The verification of the newly added node can be as easy checking the sharding status and see the chunks being rebalanced to the newly added node. + + $/usr/bin/mongo localhost:8888/admin -u admin -p 123456 + mongos> sh.status() + --- Sharding Status --- + sharding version: { "_id" : 1, "version" : 3 } + shards: + { "_id" : "bensible", "host" : "bensible/bensible:20103,web2:20103,web3:20103" } + { "_id" : "web2", "host" : "web2/bensible:20105,web2:20105,web3:20105" } + { "_id" : "web3", "host" : "web3/bensible:20102,web2:20102,web3:20102" } + { "_id" : "web4", "host" : "web4/bensible:20101,web3:20101,web4:20101" } + databases: + { "_id" : "admin", "partitioned" : false, "primary" : "config" } + { "_id" : "test", "partitioned" : true, "primary" : "bensible" } + + test.test_collection chunks: + + web4 3 + web3 6 + web2 6 + bensible 5 + diff --git a/mongodb/group_vars/all b/mongodb/group_vars/all index ae7819e..e0a6caf 100644 --- a/mongodb/group_vars/all +++ b/mongodb/group_vars/all @@ -10,10 +10,13 @@ mongos_port: 8888 mongoc_port: 7777 #The port prefix for mongod servers, the latter part is appended the playbook (the last octect of the ipaddress) -mongodb_port_prefix: 201 +mongodb_port_prefix: 20 #The directory prefix where the database files would be stored mongodb_datadir_prefix: /data/ #The interface where the mongodb process should listen on. -iface: eth0 +iface: eth1 + +#The password for admin user +mongo_admin_pass: 123456 diff --git a/mongodb/hosts b/mongodb/hosts index 3163e3f..bedc3cb 100644 --- a/mongodb/hosts +++ b/mongodb/hosts @@ -1,17 +1,23 @@ #The site wide list of mongodb servers [mongoservers] -web2 -web3 +mongo1 +mongo2 +mongo3 #The list of servers where replication should happen, by default include all servers [replicationservers] -web2 -web3 +mongo1 +mongo2 +mongo3 + #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] -web3 +mongo1 +mongo2 +mongo3 + #The list of servers where mongos servers would run. [mongosservers] -web3 +mongo1 diff --git a/mongodb/playbooks/addnode.yml b/mongodb/playbooks/addnode.yml index 213e1ef..5f376fc 100644 --- a/mongodb/playbooks/addnode.yml +++ b/mongodb/playbooks/addnode.yml @@ -1,11 +1,11 @@ --- #This playbook is used to add a new node the mongodb cluster -- hosts: mongoservers -- hosts: replicationservers -- hosts: mongosservers +- hosts: all + tasks: + - include: ../roles/common/tasks/main.yml + - hosts: ${servername} tasks: - - include: ../roles/common/tasks/main.yml - include: ../roles/mongod/tasks/main.yml - include: ../roles/mongod/tasks/addshard.yml diff --git a/mongodb/roles/common/tasks/main.yml b/mongodb/roles/common/tasks/main.yml index 757354d..7967d0f 100644 --- a/mongodb/roles/common/tasks/main.yml +++ b/mongodb/roles/common/tasks/main.yml @@ -12,3 +12,4 @@ with_items: - mongo-10gen - mongo-10gen-server + - bc diff --git a/mongodb/roles/mongoc/files/secret b/mongodb/roles/mongoc/files/secret new file mode 100644 index 0000000..4d77cbc --- /dev/null +++ b/mongodb/roles/mongoc/files/secret @@ -0,0 +1,3 @@ +qGO6OYb64Uth9p9Tm8s9kqarydmAg1AUdgVz+ecjinaLZ1SlWxXMY1ug8AO7C/Vu +D8kA3+rE37Gv1GuZyPYi87NSfDhKXo4nJWxI00BxTBppmv2PTzbi7xLCx1+8A1uQ +4XU0HA diff --git a/mongodb/roles/mongoc/tasks/main.yml b/mongodb/roles/mongoc/tasks/main.yml index c343724..1478a1d 100644 --- a/mongodb/roles/mongoc/tasks/main.yml +++ b/mongodb/roles/mongoc/tasks/main.yml @@ -16,6 +16,17 @@ - name: Create the mongo configuration server file template: src=../roles/mongoc/templates/mongoc.conf.j2 dest=/etc/mongoc.conf +- name: Create the script to add the admin user + template: src=../roles/mongoc/templates/adduser.j2 dest=/tmp/adduser.js + +- name: Copy the keyfile for authentication + copy: src=../roles/mongod/files/secret dest=${mongodb_datadir_prefix}/secret owner=mongod group=mongod mode=0400 + - name: Start the mongo configuration server service command: creates=/var/lock/subsys/mongoc /etc/init.d/mongoc start +- name: pause + pause: seconds=20 + +- name: add the admin user + shell: /usr/bin/mongo localhost:7777/admin /tmp/adduser.js diff --git a/mongodb/roles/mongoc/templates/adduser.j2 b/mongodb/roles/mongoc/templates/adduser.j2 new file mode 100644 index 0000000..a1fa6ae --- /dev/null +++ b/mongodb/roles/mongoc/templates/adduser.j2 @@ -0,0 +1 @@ +db.addUser('admin','{{ mongo_admin_pass }}') diff --git a/mongodb/roles/mongoc/templates/mongoc.conf.j2 b/mongodb/roles/mongoc/templates/mongoc.conf.j2 index 59c29ba..705f0c0 100644 --- a/mongodb/roles/mongoc/templates/mongoc.conf.j2 +++ b/mongodb/roles/mongoc/templates/mongoc.conf.j2 @@ -10,7 +10,7 @@ fork = true port = {{ mongoc_port }} dbpath={{ mongodb_datadir_prefix }}configdb - +keyFile={{ mongodb_datadir_prefix }}secret # location of pidfile pidfilepath = /var/run/mongoc.pid diff --git a/mongodb/roles/mongod/files/secret b/mongodb/roles/mongod/files/secret new file mode 100644 index 0000000..4d77cbc --- /dev/null +++ b/mongodb/roles/mongod/files/secret @@ -0,0 +1,3 @@ +qGO6OYb64Uth9p9Tm8s9kqarydmAg1AUdgVz+ecjinaLZ1SlWxXMY1ug8AO7C/Vu +D8kA3+rE37Gv1GuZyPYi87NSfDhKXo4nJWxI00BxTBppmv2PTzbi7xLCx1+8A1uQ +4XU0HA diff --git a/mongodb/roles/mongod/tasks/addshard.yml b/mongodb/roles/mongod/tasks/addshard.yml index 3552ac3..32d146b 100644 --- a/mongodb/roles/mongod/tasks/addshard.yml +++ b/mongodb/roles/mongod/tasks/addshard.yml @@ -12,7 +12,7 @@ with_items: ${groups.mongosservers} - name: Add the shard to the mongos - shell: /usr/bin/mongo --port ${mongos_port} /tmp/shard_init_${inventory_hostname}.js + shell: /usr/bin/mongo localhost:8888/admin -u admin -p ${mongo_admin_pass} /tmp/shard_init_${inventory_hostname}.js delegate_to: $item with_items: ${groups.mongosservers} diff --git a/mongodb/roles/mongod/tasks/main.yml b/mongodb/roles/mongod/tasks/main.yml index 619d80f..cd37fe2 100644 --- a/mongodb/roles/mongod/tasks/main.yml +++ b/mongodb/roles/mongod/tasks/main.yml @@ -21,7 +21,7 @@ with_items: ${groups.replicationservers} - name: Add the iptable rule to allow traffice dynamically - shell: iptables -I INPUT 2 -p tcp --dport ${mongodb_port_prefix}${result.stdout} -j ACCEPT + shell: sleep `echo $RANDOM/1000 | bc`; iptables -I INPUT 1 -p tcp --dport ${mongodb_port_prefix}${result.stdout} -j ACCEPT delegate_to: $item with_items: ${groups.replicationservers} @@ -30,6 +30,10 @@ delegate_to: $item with_items: ${groups.replicationservers} +- name: Copy the keyfile for authentication + copy: src=../roles/mongod/files/secret dest=${mongodb_datadir_prefix}/secret owner=mongod group=mongod mode=0400 + + - name: Start the mongodb service command: creates=/var/lock/subsys/mongod-${inventory_hostname} /etc/init.d/mongod-${inventory_hostname} start delegate_to: $item @@ -38,6 +42,9 @@ - name: Create the file to initialize the mongod replica set template: src=../roles/mongod/templates/repset_init.j2 dest=/tmp/repset_init.js +- name: Pause for a while + pause: seconds=20 + - name: Initialize the replication set shell: /usr/bin/mongo --port "$mongodb_port_prefix${result.stdout}" /tmp/repset_init.js diff --git a/mongodb/roles/mongod/templates/mongod.conf.j2 b/mongodb/roles/mongod/templates/mongod.conf.j2 index caf0de5..a8e9e17 100644 --- a/mongodb/roles/mongod/templates/mongod.conf.j2 +++ b/mongodb/roles/mongod/templates/mongod.conf.j2 @@ -12,6 +12,7 @@ fork = true port = {{ mongodb_port_prefix }}{{ result.stdout }} dbpath={{ mongodb_datadir_prefix }}mongo-{{ inventory_hostname }} +keyFile={{ mongodb_datadir_prefix }}/secret # location of pidfile pidfilepath = /var/run/mongod.pid diff --git a/mongodb/roles/mongos/files/secret b/mongodb/roles/mongos/files/secret new file mode 100644 index 0000000..4d77cbc --- /dev/null +++ b/mongodb/roles/mongos/files/secret @@ -0,0 +1,3 @@ +qGO6OYb64Uth9p9Tm8s9kqarydmAg1AUdgVz+ecjinaLZ1SlWxXMY1ug8AO7C/Vu +D8kA3+rE37Gv1GuZyPYi87NSfDhKXo4nJWxI00BxTBppmv2PTzbi7xLCx1+8A1uQ +4XU0HA diff --git a/mongodb/roles/mongos/tasks/main.yml b/mongodb/roles/mongos/tasks/main.yml index 7e020da..bb1acb7 100644 --- a/mongodb/roles/mongos/tasks/main.yml +++ b/mongodb/roles/mongos/tasks/main.yml @@ -13,6 +13,13 @@ - name: Create the mongos configuration file template: src=../roles/mongos/templates/mongos.conf.j2 dest=/etc/mongos.conf +- name: Copy the keyfile for authentication + copy: src=../roles/mongod/files/secret dest=${mongodb_datadir_prefix}/secret owner=mongod group=mongod mode=0400 + - name: Start the mongos service command: creates=/var/lock/subsys/mongos /etc/init.d/mongos start +- name: pause + pause: seconds=20 +- name: copy the file for shard test + template: src=../roles/mongos/templates/testsharding.j2 dest=/tmp/testsharding.js diff --git a/mongodb/roles/mongos/templates/mongos.conf.j2 b/mongodb/roles/mongos/templates/mongos.conf.j2 index a619110..f7ff705 100644 --- a/mongodb/roles/mongos/templates/mongos.conf.j2 +++ b/mongodb/roles/mongos/templates/mongos.conf.j2 @@ -19,4 +19,5 @@ port = {{ mongos_port }} # location of pidfile pidfilepath = /var/run/mongodb/mongos.pid +keyFile={{ mongodb_datadir_prefix }}/secret chunkSize={{ mongos_chunk_size }} diff --git a/mongodb/roles/mongos/templates/testsharding.j2 b/mongodb/roles/mongos/templates/testsharding.j2 new file mode 100644 index 0000000..87a4451 --- /dev/null +++ b/mongodb/roles/mongos/templates/testsharding.j2 @@ -0,0 +1,12 @@ +people = ["Marc", "Bill", "George", "Eliot", "Matt", "Trey", "Tracy", "Greg", "Steve", "Kristina", "Katie", "Jeff"]; + +for(var i=0; i<100000; i++){ + name = people[Math.floor(Math.random()*people.length)]; + user_id = i; + boolean = [true, false][Math.floor(Math.random()*2)]; + added_at = new Date(); + number = Math.floor(Math.random()*10001); + db.test_collection.save({"name":name, "user_id":user_id, "boolean": boolean, "added_at":added_at, "number":number }); + } +db.test_collection.ensureIndex({number:1}) + From d04040a3e0c2f09e2f8a22872499d8009dd443c9 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Tue, 26 Mar 2013 15:24:14 +0530 Subject: [PATCH 03/22] doc update --- mongodb/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mongodb/README.md b/mongodb/README.md index e373069..620e683 100644 --- a/mongodb/README.md +++ b/mongodb/README.md @@ -25,13 +25,13 @@ The way Ansible configures the three nodes is as follows: 6) All the processes, mongod,mogos are secured using the keyfiles. -Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: +##Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: 1) Install the MongoDB application on the new node. 2) Configure the replication set with primary as the new node and the secondaries as listed in the inventory file [replicationservers]. ( don't forget to add the new node also in the replicationservers section] -3) Adds a new shard to the mongos service pointing to the new replication set. +3) Adds the new shard to the mongos service pointing to the new replication set. ###The following example deploys a three node MongoDB Cluster @@ -41,19 +41,19 @@ The inventory file looks as follows: [mongoservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where replication should happen, by default include all servers [replicationservers] mongo1 mongo2 - mongo3 + mongo3 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] @@ -191,20 +191,20 @@ To add a new node to the configured MongoDb Cluster, setup the inventory file as [mongoservers] mongo1 mongo2 - mongo3 + mongo3 mongo4 #The list of servers where replication should happen, by default include all servers [replicationservers] mongo4 mongo1 - mongo2 + mongo2 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] From bd1b4f0ca3fc40bd6fc135507a11562d8ec877d3 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Tue, 26 Mar 2013 15:25:46 +0530 Subject: [PATCH 04/22] doc update --- mongodb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongodb/README.md b/mongodb/README.md index 620e683..0581f7f 100644 --- a/mongodb/README.md +++ b/mongodb/README.md @@ -25,7 +25,7 @@ The way Ansible configures the three nodes is as follows: 6) All the processes, mongod,mogos are secured using the keyfiles. -##Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: +####Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: 1) Install the MongoDB application on the new node. From 9afa3c5a228718195b31dc630b8e9f2cc1bba024 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Wed, 27 Mar 2013 12:46:01 +0530 Subject: [PATCH 05/22] mongodb cleanup iptables --- mongodb/README.md | 73 ++++++------------- mongodb/group_vars/all | 10 ++- mongodb/hosts | 26 ++++--- mongodb/playbooks/addnode.yml | 2 + mongodb/playbooks/common.yml | 5 +- mongodb/playbooks/mongod.yml | 2 - mongodb/roles/common/tasks/main.yml | 18 +++++ mongodb/roles/mongoc/tasks/main.yml | 11 +-- mongodb/roles/mongod/handlers/main.yml | 5 -- mongodb/roles/mongod/tasks/addshard.yml | 6 +- mongodb/roles/mongod/tasks/main.yml | 16 +--- mongodb/roles/mongod/templates/mongod.conf.j2 | 62 +--------------- mongodb/roles/mongod/templates/repset_init.j2 | 2 +- mongodb/roles/mongod/templates/shard_init.j2 | 2 +- mongodb/roles/mongos/tasks/main.yml | 8 +- 15 files changed, 81 insertions(+), 167 deletions(-) delete mode 100644 mongodb/roles/mongod/handlers/main.yml diff --git a/mongodb/README.md b/mongodb/README.md index 0581f7f..976ae8d 100644 --- a/mongodb/README.md +++ b/mongodb/README.md @@ -25,13 +25,20 @@ The way Ansible configures the three nodes is as follows: 6) All the processes, mongod,mogos are secured using the keyfiles. -####Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: +Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: 1) Install the MongoDB application on the new node. 2) Configure the replication set with primary as the new node and the secondaries as listed in the inventory file [replicationservers]. ( don't forget to add the new node also in the replicationservers section] -3) Adds the new shard to the mongos service pointing to the new replication set. +3) Adds a new shard to the mongos service pointing to the new replication set. + + +#### Pre-Requesites + +1) Update the group_vars/all file which contains site specific parmaters, especially the section which contains the mapping of the hostname's and the ports that it should use for the mongod process. Please do make sure the ansible hostname matches the same. Also dont forget to add the variable when adding a new node. + +2) The default directory for storing data is /data, please do change it if requried, also make sure it has sufficient space 10G recommended. ###The following example deploys a three node MongoDB Cluster @@ -41,19 +48,19 @@ The inventory file looks as follows: [mongoservers] mongo1 mongo2 - mongo3 + mongo3 - #The list of servers where replication should happen, by default include all servers + #The list of servers where replication should happen, including the master server. [replicationservers] mongo1 mongo2 - mongo3 + mongo3 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] @@ -115,53 +122,17 @@ and issue the following command to get the status of the Shards. databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } -We can also make sure the Sharding works by creating a database and collection and populate it with documents and check if the chunks of the collection are balanced equally across nodes. -The above mentioned steps can be tested as follows: +###We can also make sure the Sharding works by creating a database,collection and populate it with documents and check if the chunks of the collection are balanced equally across nodes. -1) Once the Sharded cluster is ready, create a new database and an admin user for the database. This is done from the mongos machine. +The above mentioned steps can be tested with an automated playbook. - /usr/bin/mongo localhost:8888/admin -u admin -p 123456 - mongos> use test - switched to db test +Issue the following command to run the test. In variable passed make sure the servername is one of any mongos server. - mongos> db.addUser('admin','123456') - { - "user" : "admin", - "readOnly" : false, - "pwd" : "95ec4261124ba5951720b199908d892b", - "_id" : ObjectId("51519f349cd3a93ca7e17909") - } -2) Once the DB and the user is created, create a collection and poplulate documents, This deployment add a script to the /tmp location of the mongos server which adds a new collection and 100,000 documents. + ansible-playbook -i hosts playbooks/testsharding.yml -e servername=mongos - $/usr/bin/mongo localhost:8888/test -u admin -p 123456 /tmp/testsharding.js - -3) After the document's are populated, we have to enable sharding on the database and the collection. which can be done as follows: - - $/usr/bin/mongo localhost:8888/admin -u admin -p 123456 - mongos> db.runCommand( { enableSharding : "test" } ) - { "ok" : 1 } - mongos> db.runCommand( { shardCollection : "test.test_collection", key : {"number":1} }) - { "collectionsharded" : "test.test_collection", "ok" : 1 } - mongos> sh.status() - --- Sharding Status --- - sharding version: { "_id" : 1, "version" : 3 } - shards: - { "_id" : "bensible", "host" : "bensible/bensible:20103,web2:20103,web3:20103" } - { "_id" : "web2", "host" : "web2/bensible:20102,web2:20102,web3:20102" } - { "_id" : "web3", "host" : "web3/bensible:20101,web2:20101,web3:20101" } - databases: - { "_id" : "admin", "partitioned" : false, "primary" : "config" } - { "_id" : "test", "partitioned" : true, "primary" : "bensible" } - - test.test_collection chunks: - - web2 1 - bensible 19 - -4) In the above example we can see the chunks being balanced across nodes. After a few minutes if we excute the same command 'sh.status()' -we will see the below output, which shows all the chunks being balanced across the three nodes. +Once the playbook completes, we check if the shadring has succeded by logging on to any mongos server and issuing the following command. The output display the number of chunks spread across the shards. mongos> sh.status() --- Sharding Status --- @@ -191,20 +162,20 @@ To add a new node to the configured MongoDb Cluster, setup the inventory file as [mongoservers] mongo1 mongo2 - mongo3 + mongo3 mongo4 - #The list of servers where replication should happen, by default include all servers + #The list of servers where replication should happen, make sure the new node is listed here. [replicationservers] mongo4 mongo1 - mongo2 + mongo2 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] diff --git a/mongodb/group_vars/all b/mongodb/group_vars/all index e0a6caf..9dc45f2 100644 --- a/mongodb/group_vars/all +++ b/mongodb/group_vars/all @@ -9,9 +9,6 @@ mongos_port: 8888 #The port for mongo config server mongoc_port: 7777 -#The port prefix for mongod servers, the latter part is appended the playbook (the last octect of the ipaddress) -mongodb_port_prefix: 20 - #The directory prefix where the database files would be stored mongodb_datadir_prefix: /data/ @@ -20,3 +17,10 @@ iface: eth1 #The password for admin user mongo_admin_pass: 123456 + +mongod_ports: + bensible: 2700 + web2: 2701 + web3: 2702 + web4: 2703 + diff --git a/mongodb/hosts b/mongodb/hosts index bedc3cb..fddf4b2 100644 --- a/mongodb/hosts +++ b/mongodb/hosts @@ -1,23 +1,29 @@ #The site wide list of mongodb servers + [mongoservers] -mongo1 -mongo2 -mongo3 +web2 +web3 +web4 +bensible + #The list of servers where replication should happen, by default include all servers [replicationservers] -mongo1 -mongo2 -mongo3 +bensible +web2 +web3 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] -mongo1 -mongo2 -mongo3 +web4 +web2 +web3 #The list of servers where mongos servers would run. [mongosservers] -mongo1 +web4 +web3 + + diff --git a/mongodb/playbooks/addnode.yml b/mongodb/playbooks/addnode.yml index 5f376fc..7d284b1 100644 --- a/mongodb/playbooks/addnode.yml +++ b/mongodb/playbooks/addnode.yml @@ -4,6 +4,8 @@ - hosts: all tasks: - include: ../roles/common/tasks/main.yml + handlers: + - include: ../roles/common/handlers/main.yml - hosts: ${servername} tasks: diff --git a/mongodb/playbooks/common.yml b/mongodb/playbooks/common.yml index 5098d08..00be31a 100644 --- a/mongodb/playbooks/common.yml +++ b/mongodb/playbooks/common.yml @@ -1,7 +1,10 @@ --- # Deploys all common plays for the site -- hosts: mongoservers +- hosts: all user: root tasks: - include: ../roles/common/tasks/main.yml + + handlers: + - include: ../roles/common/handlers/main.yml diff --git a/mongodb/playbooks/mongod.yml b/mongodb/playbooks/mongod.yml index 91156c0..ade6ad5 100644 --- a/mongodb/playbooks/mongod.yml +++ b/mongodb/playbooks/mongod.yml @@ -5,5 +5,3 @@ user: root tasks: - include: ../roles/mongod/tasks/main.yml - handlers: - - include: ../roles/mongod/handlers/main.yml diff --git a/mongodb/roles/common/tasks/main.yml b/mongodb/roles/common/tasks/main.yml index 7967d0f..cb3f17a 100644 --- a/mongodb/roles/common/tasks/main.yml +++ b/mongodb/roles/common/tasks/main.yml @@ -7,9 +7,27 @@ - name: Creates the repository for 10Gen template: src=../roles/common/templates/10gen.repo.j2 dest=/etc/yum.repos.d/10gen.repo +- name: Download the EPEL repository RPM + get_url: url=http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm dest=/tmp/ force=yes + +- name: Install EPEL RPM + yum: name=/tmp/epel-release-6-8.noarch.rpm state=installed + +- name: Clean up + command: rm -f /tmp/epel-release-6-8.noarch.rpm + - name: Install the mongodb package yum: name=$item state=installed with_items: - mongo-10gen - mongo-10gen-server - bc + - python-pip + +- name: Install the latest pymongo package + pip: name=pymongo state=latest use_mirrors=no + +- name: Create the iptables file + template: src=../roles/common/templates/iptables.j2 dest=/etc/sysconfig/iptables + notify: restart iptables + diff --git a/mongodb/roles/mongoc/tasks/main.yml b/mongodb/roles/mongoc/tasks/main.yml index 1478a1d..81be6f9 100644 --- a/mongodb/roles/mongoc/tasks/main.yml +++ b/mongodb/roles/mongoc/tasks/main.yml @@ -7,17 +7,10 @@ - name: Create the mongo configuration server startup file template: src=../roles/mongoc/templates/mongoc.j2 dest=/etc/init.d/mongoc mode=0655 -- name: Insert iptables rule for mongoc - lineinfile: dest=/etc/sysconfig/iptables state=present regexp="$mongoc_port" insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport "$mongoc_port" -j ACCEPT" - -- name: Apply iptable rule - service: name=iptables state=restarted - name: Create the mongo configuration server file template: src=../roles/mongoc/templates/mongoc.conf.j2 dest=/etc/mongoc.conf -- name: Create the script to add the admin user - template: src=../roles/mongoc/templates/adduser.j2 dest=/tmp/adduser.js - name: Copy the keyfile for authentication copy: src=../roles/mongod/files/secret dest=${mongodb_datadir_prefix}/secret owner=mongod group=mongod mode=0400 @@ -28,5 +21,7 @@ - name: pause pause: seconds=20 + - name: add the admin user - shell: /usr/bin/mongo localhost:7777/admin /tmp/adduser.js + mongodb_user: database=admin name=admin password=${mongo_admin_pass} login_port=${mongoc_port} state=present + ignore_errors: yes diff --git a/mongodb/roles/mongod/handlers/main.yml b/mongodb/roles/mongod/handlers/main.yml deleted file mode 100644 index 0f563a9..0000000 --- a/mongodb/roles/mongod/handlers/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -# Handler for mongod - -- name: restart iptables - service: name=iptables state=restarted diff --git a/mongodb/roles/mongod/tasks/addshard.yml b/mongodb/roles/mongod/tasks/addshard.yml index 32d146b..6f4f57e 100644 --- a/mongodb/roles/mongod/tasks/addshard.yml +++ b/mongodb/roles/mongod/tasks/addshard.yml @@ -1,10 +1,6 @@ --- #This Playbooks adds shards to the mongos servers once everythig is added -- name: get the port number for mongod processes - shell: ifconfig ${iface} | grep "inet addr" | cut -d':' -f2 | cut -d. -f4 | cut -d' ' -f1 - register: result - - name: Create the file to initialize the mongod Shard template: src=../roles/mongod/templates/shard_init.j2 dest=/tmp/shard_init_${inventory_hostname}.js @@ -12,7 +8,7 @@ with_items: ${groups.mongosservers} - name: Add the shard to the mongos - shell: /usr/bin/mongo localhost:8888/admin -u admin -p ${mongo_admin_pass} /tmp/shard_init_${inventory_hostname}.js + shell: /usr/bin/mongo localhost:${mongos_port}/admin -u admin -p ${mongo_admin_pass} /tmp/shard_init_${inventory_hostname}.js delegate_to: $item with_items: ${groups.mongosservers} diff --git a/mongodb/roles/mongod/tasks/main.yml b/mongodb/roles/mongod/tasks/main.yml index cd37fe2..0f73753 100644 --- a/mongodb/roles/mongod/tasks/main.yml +++ b/mongodb/roles/mongod/tasks/main.yml @@ -1,29 +1,17 @@ --- -#This Playbook deploys the mongod processes and sets up the firewall rules and sets up the replication set. +#This Playbook deploys the mongod processes and sets up the replication set. - name: create data directory for mongodb file: path=${mongodb_datadir_prefix}/mongo-${inventory_hostname} state=directory owner=mongod group=mongod delegate_to: $item with_items: ${groups.replicationservers} -- name: Create a port number for mongod processes - shell: ifconfig ${iface} | grep "inet addr" | cut -d':' -f2 | cut -d. -f4 | cut -d' ' -f1 - register: result - name: Create the mongodb startup file template: src=../roles/mongod/templates/mongod.j2 dest=/etc/init.d/mongod-${inventory_hostname} mode=0655 delegate_to: $item with_items: ${groups.replicationservers} -- name: insert iptables rule for mongod - lineinfile: dest=/etc/sysconfig/iptables state=present regexp="$mongodb_port_prefix${result.stdout}" insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport "$mongodb_port_prefix${result.stdout}" -j ACCEPT" - delegate_to: $item - with_items: ${groups.replicationservers} - -- name: Add the iptable rule to allow traffice dynamically - shell: sleep `echo $RANDOM/1000 | bc`; iptables -I INPUT 1 -p tcp --dport ${mongodb_port_prefix}${result.stdout} -j ACCEPT - delegate_to: $item - with_items: ${groups.replicationservers} - name: Create the mongodb configuration file template: src=../roles/mongod/templates/mongod.conf.j2 dest=/etc/mongod-${inventory_hostname}.conf @@ -46,6 +34,6 @@ pause: seconds=20 - name: Initialize the replication set - shell: /usr/bin/mongo --port "$mongodb_port_prefix${result.stdout}" /tmp/repset_init.js + shell: /usr/bin/mongo --port "${mongod_ports.${inventory_hostname}}" /tmp/repset_init.js diff --git a/mongodb/roles/mongod/templates/mongod.conf.j2 b/mongodb/roles/mongod/templates/mongod.conf.j2 index a8e9e17..3959872 100644 --- a/mongodb/roles/mongod/templates/mongod.conf.j2 +++ b/mongodb/roles/mongod/templates/mongod.conf.j2 @@ -9,7 +9,7 @@ logappend=true # fork and run in background fork = true -port = {{ mongodb_port_prefix }}{{ result.stdout }} +port = {{ mongod_ports[inventory_hostname] }} dbpath={{ mongodb_datadir_prefix }}mongo-{{ inventory_hostname }} keyFile={{ mongodb_datadir_prefix }}/secret @@ -17,69 +17,9 @@ keyFile={{ mongodb_datadir_prefix }}/secret # location of pidfile pidfilepath = /var/run/mongod.pid -# Disables write-ahead journaling -# nojournal = true - -# Enables periodic logging of CPU utilization and I/O wait -#cpu = true - -# Turn on/off security. Off is currently the default -#noauth = true -#auth = true - -# Verbose logging output. -#verbose = true - -# Inspect all client data for validity on receipt (useful for -# developing drivers) -#objcheck = true - -# Enable db quota management -#quota = true - -# Set oplogging level where n is -# 0=off (default) -# 1=W -# 2=R -# 3=both -# 7=W+some reads -#diaglog = 0 - -# Ignore query hints -#nohints = true - -# Disable the HTTP interface (Defaults to localhost:27018). -#nohttpinterface = true - -# Turns off server-side scripting. This will result in greatly limited -# functionality -#noscripting = true - -# Turns off table scans. Any query that would do a table scan fails. -#notablescan = true - -# Disable data file preallocation. -#noprealloc = true - -# Specify .ns file size for new databases. -# nssize = - -# Accout token for Mongo monitoring server. -#mms-token = - -# Server name for Mongo monitoring server. -#mms-name = # Ping interval for Mongo monitoring server. #mms-interval = # Replication Options replSet={{ inventory_hostname }} -# in replicated mongo databases, specify here whether this is a slave or master -#slave = true -#source = master.example.com -# Slave only: specify a single database to replicate -#only = master.example.com -# or -#master = true -#source = slave.example.com diff --git a/mongodb/roles/mongod/templates/repset_init.j2 b/mongodb/roles/mongod/templates/repset_init.j2 index 7daae45..a1784fd 100644 --- a/mongodb/roles/mongod/templates/repset_init.j2 +++ b/mongodb/roles/mongod/templates/repset_init.j2 @@ -1,7 +1,7 @@ rs.initiate() sleep(13000) {% for host in groups['replicationservers'] %} -rs.add("{{ host }}:{{ mongodb_port_prefix }}{{ result.stdout }}") +rs.add("{{ host }}:{{ mongod_ports[inventory_hostname] }}") sleep(8000) {% endfor %} printjson(rs.status()) diff --git a/mongodb/roles/mongod/templates/shard_init.j2 b/mongodb/roles/mongod/templates/shard_init.j2 index db40c9a..248751b 100644 --- a/mongodb/roles/mongod/templates/shard_init.j2 +++ b/mongodb/roles/mongod/templates/shard_init.j2 @@ -1,2 +1,2 @@ -sh.addShard("{{ inventory_hostname}}/{{ inventory_hostname }}:{{ mongodb_port_prefix }}{{ result.stdout }}") +sh.addShard("{{ inventory_hostname}}/{{ inventory_hostname }}:{{ mongod_ports[inventory_hostname] }}") printjson(rs.status()) diff --git a/mongodb/roles/mongos/tasks/main.yml b/mongodb/roles/mongos/tasks/main.yml index bb1acb7..33d1c28 100644 --- a/mongodb/roles/mongos/tasks/main.yml +++ b/mongodb/roles/mongos/tasks/main.yml @@ -4,11 +4,6 @@ - name: Create the mongos startup file template: src=../roles/mongos/templates/mongos.j2 dest=/etc/init.d/mongos mode=0655 -- name: insert iptables rule for mongos - lineinfile: dest=/etc/sysconfig/iptables state=present regexp="$mongos_port" insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport "$mongos_port" -j ACCEPT" - -- name: Apply iptable rule on replication servers also - service: name=iptables state=restarted - name: Create the mongos configuration file template: src=../roles/mongos/templates/mongos.conf.j2 dest=/etc/mongos.conf @@ -23,3 +18,6 @@ - name: copy the file for shard test template: src=../roles/mongos/templates/testsharding.j2 dest=/tmp/testsharding.js + +- name: copy the file enable sharding + template: src=../roles/mongos/templates/enablesharding.j2 dest=/tmp/enablesharding.js From 01f0c6454e65fe2ae9540b1ad0e1187e5f3f2f75 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Wed, 27 Mar 2013 12:51:50 +0530 Subject: [PATCH 06/22] doc update --- mongodb/README.md | 18 ++++++++----- mongodb/playbooks/test.yml | 6 +++++ mongodb/playbooks/testsharding.yml | 17 ++++++++++++ mongodb/roles/common/handlers/main.yml | 5 ++++ mongodb/roles/common/templates/iptables.j2 | 27 +++++++++++++++++++ .../roles/mongos/templates/enablesharding.j2 | 3 +++ 6 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 mongodb/playbooks/test.yml create mode 100644 mongodb/playbooks/testsharding.yml create mode 100644 mongodb/roles/common/handlers/main.yml create mode 100644 mongodb/roles/common/templates/iptables.j2 create mode 100644 mongodb/roles/mongos/templates/enablesharding.j2 diff --git a/mongodb/README.md b/mongodb/README.md index 976ae8d..9926d1e 100644 --- a/mongodb/README.md +++ b/mongodb/README.md @@ -4,7 +4,9 @@ Deploying a shared production ready MongoDB cluster with Ansible In this example we demonstrate how we can orchestrate the deployment of a production grade MongoDB Cluster. The functionality of this example includes: 1) Deploying a N node MongoDB cluster, which has N shards and N replication nodes. + 2) Scale out capability. Expand the Cluster by adding nodes to the cluster. + 3) Security, All the mongodb process are secured using the best practices. ###Deployment Architecture. @@ -34,7 +36,7 @@ Once the cluster is deployed, if we want to scale the cluster, Ansible configure 3) Adds a new shard to the mongos service pointing to the new replication set. -#### Pre-Requesites +#### Pre-requisite 1) Update the group_vars/all file which contains site specific parmaters, especially the section which contains the mapping of the hostname's and the ports that it should use for the mongod process. Please do make sure the ansible hostname matches the same. Also dont forget to add the variable when adding a new node. @@ -48,19 +50,19 @@ The inventory file looks as follows: [mongoservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where replication should happen, including the master server. [replicationservers] mongo1 mongo2 - mongo3 + mongo3 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] @@ -109,9 +111,11 @@ and issue the command to query the status of replication set, we should get a si "ok" : 1 } + we can check the status of the Shards as follows: connect to the mongos service 'mongos --host --port 8888' and issue the following command to get the status of the Shards. + mongos> sh.status() --- Sharding Status --- @@ -162,20 +166,20 @@ To add a new node to the configured MongoDb Cluster, setup the inventory file as [mongoservers] mongo1 mongo2 - mongo3 + mongo3 mongo4 #The list of servers where replication should happen, make sure the new node is listed here. [replicationservers] mongo4 mongo1 - mongo2 + mongo2 #The list of mongodb configuration servers, make sure it is 1 or 3 [mongocservers] mongo1 mongo2 - mongo3 + mongo3 #The list of servers where mongos servers would run. [mongosservers] diff --git a/mongodb/playbooks/test.yml b/mongodb/playbooks/test.yml new file mode 100644 index 0000000..b5f7183 --- /dev/null +++ b/mongodb/playbooks/test.yml @@ -0,0 +1,6 @@ +--- +- hosts: mongoservers + tasks: + - name: test + debug: msg="hello- ${mongod_ports.${item}}" + with_items: ${groups.mongoservers} diff --git a/mongodb/playbooks/testsharding.yml b/mongodb/playbooks/testsharding.yml new file mode 100644 index 0000000..24c7849 --- /dev/null +++ b/mongodb/playbooks/testsharding.yml @@ -0,0 +1,17 @@ +--- +# The playbook creates a new database test and populates data in the database to test the sharding. + +- hosts: $servername + user: root + tasks: + - name: Create a new database and user + mongodb_user: login_user=admin login_password=${mongo_admin_pass} login_port=${mongos_port} database=test user=admin password=${mongo_admin_pass} state=present + + - name: Pause for the user to get created and replicated + pause: minutes=3 + + - name: Execute the collection creation script + command: /usr/bin/mongo localhost:${mongos_port}/test -u admin -p ${mongo_admin_pass} /tmp/testsharding.js + + - name: Enable sharding on the database and collection + command: /usr/bin/mongo localhost:${mongos_port}/admin -u admin -p ${mongo_admin_pass} /tmp/enablesharding.js diff --git a/mongodb/roles/common/handlers/main.yml b/mongodb/roles/common/handlers/main.yml new file mode 100644 index 0000000..0f563a9 --- /dev/null +++ b/mongodb/roles/common/handlers/main.yml @@ -0,0 +1,5 @@ +--- +# Handler for mongod + +- name: restart iptables + service: name=iptables state=restarted diff --git a/mongodb/roles/common/templates/iptables.j2 b/mongodb/roles/common/templates/iptables.j2 new file mode 100644 index 0000000..23b5848 --- /dev/null +++ b/mongodb/roles/common/templates/iptables.j2 @@ -0,0 +1,27 @@ +# Firewall configuration written by system-config-firewall +# Manual customization of this file is not recommended. +*filter +:INPUT ACCEPT [0:0] +:FORWARD ACCEPT [0:0] +:OUTPUT ACCEPT [0:0] +{% if 'mongocservers' in group_names %} +-A INPUT -p tcp --dport 7777 -j ACCEPT +{% endif %} +{% if 'mongosservers' in group_names %} +-A INPUT -p tcp --dport 8888 -j ACCEPT +{% endif %} +{% if 'mongoservers' in group_names %} +{% for host in groups['mongoservers'] %} +-A INPUT -p tcp --dport {{ mongod_ports[host] }} -j ACCEPT +{% endfor %} +{% endif %} +-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT +-A INPUT -p icmp -j ACCEPT +-A INPUT -i lo -j ACCEPT +-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT +-A INPUT -j REJECT --reject-with icmp-host-prohibited +-A FORWARD -j REJECT --reject-with icmp-host-prohibited +COMMIT + + + diff --git a/mongodb/roles/mongos/templates/enablesharding.j2 b/mongodb/roles/mongos/templates/enablesharding.j2 new file mode 100644 index 0000000..c6d4949 --- /dev/null +++ b/mongodb/roles/mongos/templates/enablesharding.j2 @@ -0,0 +1,3 @@ +db.runCommand( { enableSharding : "test" } ) +db.runCommand( { shardCollection : "test.test_collection", key : {"number":1} }) + From c537976273061ec681601f19b7a531bbdabdbd5e Mon Sep 17 00:00:00 2001 From: bennojoy Date: Fri, 12 Apr 2013 17:56:10 +0530 Subject: [PATCH 07/22] hadoop added --- hadoop/.common_test.yml.retry | 27 +++ hadoop/.job.yml.retry | 20 ++ hadoop/.site.yml.retry | 20 ++ hadoop/README.md | 145 ++++++++++++ hadoop/group_vars/all | 1 + hadoop/hadoop_vars/hadoop | 47 ++++ hadoop/hosts | 26 +++ hadoop/playbooks/inputfile | 19 ++ hadoop/playbooks/job.yml | 21 ++ .../roles/common/files/etc/cloudera-CDH4.repo | 5 + hadoop/roles/common/handlers/main.yml | 2 + hadoop/roles/common/tasks/common.yml | 30 +++ hadoop/roles/common/tasks/main.yml | 5 + hadoop/roles/common/templates/etc/hosts.j2 | 5 + .../templates/hadoop_conf/core-site.xml.j2 | 25 ++ .../hadoop_conf/hadoop-metrics.properties.j2 | 75 ++++++ .../hadoop_conf/hadoop-metrics2.properties.j2 | 44 ++++ .../templates/hadoop_conf/hdfs-site.xml.j2 | 57 +++++ .../templates/hadoop_conf/log4j.properties.j2 | 219 ++++++++++++++++++ .../templates/hadoop_conf/mapred-site.xml.j2 | 22 ++ .../common/templates/hadoop_conf/slaves.j2 | 3 + .../hadoop_conf/ssl-client.xml.example.j2 | 80 +++++++ .../hadoop_conf/ssl-server.xml.example.j2 | 77 ++++++ .../templates/hadoop_ha_conf/core-site.xml.j2 | 25 ++ .../hadoop-metrics.properties.j2 | 75 ++++++ .../hadoop-metrics2.properties.j2 | 44 ++++ .../templates/hadoop_ha_conf/hdfs-site.xml.j2 | 103 ++++++++ .../hadoop_ha_conf/log4j.properties.j2 | 219 ++++++++++++++++++ .../hadoop_ha_conf/mapred-site.xml.j2 | 120 ++++++++++ .../common/templates/hadoop_ha_conf/slaves.j2 | 3 + .../hadoop_ha_conf/ssl-client.xml.example.j2 | 80 +++++++ .../hadoop_ha_conf/ssl-server.xml.example.j2 | 77 ++++++ hadoop/roles/common/templates/iptables.j2 | 41 ++++ hadoop/roles/hadoop_primary/handlers/main.yml | 14 ++ .../hadoop_primary/tasks/hadoop_master.yml | 76 ++++++ hadoop/roles/hadoop_primary/tasks/main.yml | 5 + .../roles/hadoop_secondary/handlers/main.yml | 14 ++ .../tasks/hadoop_secondary.yml | 73 ++++++ hadoop/roles/hadoop_secondary/tasks/main.yml | 4 + hadoop/roles/hadoop_slaves/handlers/main.yml | 8 + hadoop/roles/hadoop_slaves/tasks/main.yml | 4 + hadoop/roles/hadoop_slaves/tasks/slaves.yml | 53 +++++ .../roles/qjournal_servers/handlers/main.yml | 5 + hadoop/roles/qjournal_servers/tasks/main.yml | 38 +++ .../roles/zookeeper_servers/handlers/main.yml | 5 + hadoop/roles/zookeeper_servers/tasks/main.yml | 13 ++ .../zookeeper_servers/templates/zoo.cfg.j2 | 9 + hadoop/roles/zookeeper_servers/vars/main.yml | 6 + hadoop/site.yml | 41 ++++ 49 files changed, 2130 insertions(+) create mode 100644 hadoop/.common_test.yml.retry create mode 100644 hadoop/.job.yml.retry create mode 100644 hadoop/.site.yml.retry create mode 100644 hadoop/README.md create mode 100644 hadoop/group_vars/all create mode 100644 hadoop/hadoop_vars/hadoop create mode 100644 hadoop/hosts create mode 100644 hadoop/playbooks/inputfile create mode 100644 hadoop/playbooks/job.yml create mode 100644 hadoop/roles/common/files/etc/cloudera-CDH4.repo create mode 100644 hadoop/roles/common/handlers/main.yml create mode 100644 hadoop/roles/common/tasks/common.yml create mode 100644 hadoop/roles/common/tasks/main.yml create mode 100644 hadoop/roles/common/templates/etc/hosts.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/hadoop-metrics.properties.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/hadoop-metrics2.properties.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/log4j.properties.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/slaves.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/ssl-client.xml.example.j2 create mode 100644 hadoop/roles/common/templates/hadoop_conf/ssl-server.xml.example.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics.properties.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics2.properties.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/log4j.properties.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/slaves.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/ssl-client.xml.example.j2 create mode 100644 hadoop/roles/common/templates/hadoop_ha_conf/ssl-server.xml.example.j2 create mode 100644 hadoop/roles/common/templates/iptables.j2 create mode 100644 hadoop/roles/hadoop_primary/handlers/main.yml create mode 100644 hadoop/roles/hadoop_primary/tasks/hadoop_master.yml create mode 100644 hadoop/roles/hadoop_primary/tasks/main.yml create mode 100644 hadoop/roles/hadoop_secondary/handlers/main.yml create mode 100644 hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml create mode 100644 hadoop/roles/hadoop_secondary/tasks/main.yml create mode 100644 hadoop/roles/hadoop_slaves/handlers/main.yml create mode 100644 hadoop/roles/hadoop_slaves/tasks/main.yml create mode 100644 hadoop/roles/hadoop_slaves/tasks/slaves.yml create mode 100644 hadoop/roles/qjournal_servers/handlers/main.yml create mode 100644 hadoop/roles/qjournal_servers/tasks/main.yml create mode 100644 hadoop/roles/zookeeper_servers/handlers/main.yml create mode 100644 hadoop/roles/zookeeper_servers/tasks/main.yml create mode 100644 hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 create mode 100644 hadoop/roles/zookeeper_servers/vars/main.yml create mode 100644 hadoop/site.yml diff --git a/hadoop/.common_test.yml.retry b/hadoop/.common_test.yml.retry new file mode 100644 index 0000000..792d547 --- /dev/null +++ b/hadoop/.common_test.yml.retry @@ -0,0 +1,27 @@ +# dynamically generated inventory file +# retries previously failed hosts only + +[hadoop_masters] +nisserver zoo_id=1 role=active +nisclient1 zoo_id=2 role=standby + +[CentOS] +nisclient1 zoo_id=2 role=standby +nisclient2 zoo_id=3 +nisserver zoo_id=1 role=active + +[qjournal_servers] +nisserver zoo_id=1 role=active +nisclient1 zoo_id=2 role=standby +nisclient2 zoo_id=3 + +[zookeeper_servers] +nisserver zoo_id=1 role=active +nisclient1 zoo_id=2 role=standby +nisclient2 zoo_id=3 + +[hadoop_slaves] +nisserver zoo_id=1 role=active +nisclient1 zoo_id=2 role=standby +nisclient2 zoo_id=3 + diff --git a/hadoop/.job.yml.retry b/hadoop/.job.yml.retry new file mode 100644 index 0000000..5bcb4c0 --- /dev/null +++ b/hadoop/.job.yml.retry @@ -0,0 +1,20 @@ +# dynamically generated inventory file +# retries previously failed hosts only + + +[hadoop_masters:children] +hadoop_master_primary +hadoop_master_secondary + +[qjournal_servers] +hadoop1 zoo_id=1 + +[hadoop_master_primary] +hadoop1 zoo_id=1 + +[zookeeper_servers] +hadoop1 zoo_id=1 + +[hadoop_slaves] +hadoop1 zoo_id=1 + diff --git a/hadoop/.site.yml.retry b/hadoop/.site.yml.retry new file mode 100644 index 0000000..5bcb4c0 --- /dev/null +++ b/hadoop/.site.yml.retry @@ -0,0 +1,20 @@ +# dynamically generated inventory file +# retries previously failed hosts only + + +[hadoop_masters:children] +hadoop_master_primary +hadoop_master_secondary + +[qjournal_servers] +hadoop1 zoo_id=1 + +[hadoop_master_primary] +hadoop1 zoo_id=1 + +[zookeeper_servers] +hadoop1 zoo_id=1 + +[hadoop_slaves] +hadoop1 zoo_id=1 + diff --git a/hadoop/README.md b/hadoop/README.md new file mode 100644 index 0000000..0711b9c --- /dev/null +++ b/hadoop/README.md @@ -0,0 +1,145 @@ +### Deploying Hadoop Clusters using Ansible. + +##### Preface + +The Playbooks in this example are made to deploy Hadoop Clusters for users, these playbooks can be used to: + +1) Deploy a fully functional Hadoop Cluster wth HA and automatic failover. + +2) Deploy a fully functional hadoop cluster with no HA. + +3) Deploy Additional nodes to scale the cluster + +4) Verify the cluster by deploying MapReduce jobs + +##### Brief introduction to diffrent components of Hadoop Cluster. + +The following diagram depicts a Hadoop Cluster with HA and automated failover which would be deployed by the Ansible Playbooks. + + +The two major categories of machines roles in a Hadoop cluster are Hadoop Masters and Hadoop Slaves. + +The Hadoop masters consists of: + +NameNode: The NameNode is the centerpiece of an HDFS file system. It keeps the directory tree of all files in the file system, and tracks where across the cluster the file data is kept. It does not store the data of these files itself. Client applications talk to the NameNode whenever they wish to locate a file, or when they want to add/copy/move/delete a file. The NameNode responds the successful requests by returning a list of relevant DataNode servers where the data lives. + +JobTracker: The JobTracker is the service within Hadoop that gives out MapReduce tasks to specific nodes in the cluster, Applications submit jobs to the Job tracker and JobTracker talks to the NameNode to determine the location of the data , once located the JobTracker submits the work to the chosen TaskTracker nodes. + +The Hadoop Slaves consists of: + +DataNode: A DataNode is responsible for storing data in the HadoopFileSystem. A functional hdfs filesystem has more than one DataNode, and data is replicated across them. + +TaskTracker: A TaskTracker is a node in the cluster that accepts tasks - Map, Reduce and Shuffle operations from a JobTracker. + + +The Hadoop Master processes does not have high availability built into them as thier counterparts (datanode, tasktracker). Inorder to have HA for the NameNode and Jobtracker we have the following processes. + +Quorum Journal Nodes: The journal nodes are responsible for maintaining a journal of any modifications made to the HDFS namespace, The active namenode logs any modifications to the jounal nodes and the standby namenode reads the changes from the journal nodes and applies it to it's local namespace. In a production environment the mininum recommended number of journal nodes is 3, these nodes can also be colocated with namenode/Jobtracker. + +Zookeeper Nodes: The purpose of Zookeepr is cluster management, Do remember that Hadoop HA is an active/passive cluster so the cluster requires stuff's like hearbeats, locks, leader election, quorum etc.. these service are provided by the zookeeper services. The recommended number for a production use is 3. + +zkfc namenode: zkfc (zookeeper failover controller) is a zookeeper client application that runs on each namenode server, it's responsibilites include health monitoring, zookeeper session management, leader election etc.. i,e incase of a namenode failure the zkfc process running on that machine detects the failure and informs the zookeeper as a result of which re-election takes place and a new active namenode is selected. + +zkfc JobTracker: The zkfc Tasktracker performs the same functionalities as that of zkfc namenode, the diffrence being the process that zkfc is resposible for is the jobtracker + + +#### Deploying a Hadoop Cluster with HA + +#####Pre-requesite's + +The Playbooks have been tested using Ansible v1.2, and Centos 6.x (64 bit) +Modify group_vars/all to choose the interface for hadoop communication. +Optionally you change the hadoop specific parameter like port's or directories by editing hadoop_vars/hadoop file. + +Before launching the deployment playbook make sure the inventory file ( hosts ) have be setup properly, Here's a sample: + + [hadoop_master_primary]15yy + zhadoop1 + + [hadoop_master_secondary] + zhadoop2 + + [hadoop_masters:children] + hadoop_master_primary + hadoop_master_secondary + + [hadoop_slaves] + hadoop1 + hadoop2 + hadoop3 + + [qjournal_servers] + zhadoop1 + zhadoop2 + zhadoop3 + + [zookeeper_servers] + zhadoop1 zoo_id=1 + zhadoop2 zoo_id=2 + zhadoop3 zoo_id=3 + +Once the inventory is setup the Hadoop cluster can be setup using the following command + + ansible-playbook -i hosts site.yml + +Once deployed we can check the cluster sanity in difrent ways, to check the status of the hdfs filesystem and a report on all the datanodes login as hdfs useron any hadoop master servers, and issue the following command to get the report. + + hadoop dfsadmin -report + +To check the sanity of HA, first login as hdfs user on any hadoop master server and get the current active/standby namenode servers. + + -bash-4.1$ hdfs haadmin -getServiceState zhadoop1 + active + -bash-4.1$ hdfs haadmin -getServiceState zhadoop2 + standby + +To get the state of the Jobtracker process login as mapred user in any hadoop master server and issue the following command: + + -bash-4.1$ hadoop mrhaadmin -getServiceState hadoop1 + standby + -bash-4.1$ hadoop mrhaadmin -getServiceState hadoop2 + active + +Once the active and the standby has been detected kill the namenode/jobtracker process in the server listed as active and issue the same commands as above +and you should get a result where the standby has been promoted to the active state. Later you can start the killed process and see those processes listed as the passive processes. + +#### Running a mapreduce job on the cluster. + +To run a mapreduce job on the cluster a sample playbook has been written, this playbook runs a job on the cluster which counts the occurance of the word 'hello' on an inputfile. A sample inputfile file has been created in the playbooks/inputfile file, modify the file to match your testing. +To deploy the mapreduce job run the following command.( Below -e server= + + ansible-playbook -i hosts playbooks/job.yml -e server=zhadoop1 + +to verify the result read the file on your ansible server located at /tmp/zhadoop1/tmp/outputfile/part-00000, which should give you the count. + +####Scale the Cluster + +The Hadoop cluster when reaches it's maximum capacity it can be scaled by adding nodes, this can be easily accomplished by adding the node entry in the invetory file (hosts) under the hadoop_slaves group and running the following command. + + ansible-playbook -i hosts site.yml --tags=slaves + +#### Deploy a non HA Hadoop Cluster + +The following diagram illustrates a standalone hadoop cluster. + +To deploy this cluster fill in the inventory file as follows: + + [hadoop_master_primary] + zhadoop1 + + [hadoop_master_secondary] + + [hadoop_masters:children] + hadoop_master_primary + hadoop_master_secondary + + [hadoop_slaves] + hadoop1 + hadoop2 + hadoop3 + +and issue the following command: + + ansible-playbook -i hosts site.yml -e ha_disabled=true --tags=no_ha + +The validity of the cluster can be checked by running the same mapreduce job that has documented above for an HA Hadoop Cluster diff --git a/hadoop/group_vars/all b/hadoop/group_vars/all new file mode 100644 index 0000000..3ad1763 --- /dev/null +++ b/hadoop/group_vars/all @@ -0,0 +1 @@ +iface: eth1 diff --git a/hadoop/hadoop_vars/hadoop b/hadoop/hadoop_vars/hadoop new file mode 100644 index 0000000..7b011e4 --- /dev/null +++ b/hadoop/hadoop_vars/hadoop @@ -0,0 +1,47 @@ + +hadoop: + +#Variables for - common + + fs.default.FS.port: 8020 + nameservice.id: mycluster2 + +#Variables for + + dfs.permissions.superusergroup: hdfs + dfs_namenode_name_dir: + - /namedir1/ + - /namedir2/ + dfs.replication: 3 + dfs.namenode.handler.count: 50 + dfs.blocksize: 67108864 + dfs_datanode_data_dir: + - /datadir1/ + - /datadir2/ + dfs.datanode.address.port: 50010 + dfs.datanode.http.address.port: 50075 + dfs.datanode.ipc.address.port: 50020 + dfs.namenode.http.address.port: 50070 + dfs.ha.zkfc.port: 8019 + qjournal.port: 8485 + qjournal.http.port: 8480 + dfs_journalnode_edits_dir: /journaldir/ + zookeeper.clientport: 2181 + zookeeper.leader_port: 2888 + zookeeper.election_port: 3888 + +#Variables for - common + mapred.job.tracker.ha.servicename: myjt2 + mapred.job.tracker.http.address.port: 50030 + mapred.task.tracker.http.address.port: 50060 + mapred.job.tracker.port: 8021 + mapred.ha.jobtracker.rpc-address.port: 8023 + mapred.ha.zkfc.port: 8018 + mapred_job_tracker_persist_jobstatus_dir: /jobdir/ + mapred_local_dir: + - /mapred1/ + - /mapred2/ + + + + diff --git a/hadoop/hosts b/hadoop/hosts new file mode 100644 index 0000000..e87b3e2 --- /dev/null +++ b/hadoop/hosts @@ -0,0 +1,26 @@ + +[hadoop_master_primary] +hadoop1 + +[hadoop_master_secondary] +hadoop2 + +[hadoop_masters:children] +hadoop_master_primary +hadoop_master_secondary + +[hadoop_slaves] +hadoop1 +hadoop2 +hadoop3 + +[qjournal_servers] +hadoop1 +hadoop2 +hadoop3 + +[zookeeper_servers] +hadoop1 zoo_id=1 +hadoop2 zoo_id=2 +hadoop3 zoo_id=3 + diff --git a/hadoop/playbooks/inputfile b/hadoop/playbooks/inputfile new file mode 100644 index 0000000..00dbe3f --- /dev/null +++ b/hadoop/playbooks/inputfile @@ -0,0 +1,19 @@ +asdf +sdf +sdf +sd +f +sf +sdf +sd +fsd +hello +asf +sf +sd +fsd +f +sdf +sd +hello + diff --git a/hadoop/playbooks/job.yml b/hadoop/playbooks/job.yml new file mode 100644 index 0000000..a31e95e --- /dev/null +++ b/hadoop/playbooks/job.yml @@ -0,0 +1,21 @@ +--- +# Launch Job to count occurance of a word. + +- hosts: $server + user: root + tasks: + - name: copy the file + copy: src=inputfile dest=/tmp/inputfile + + - name: upload the file + shell: su - hdfs -c "hadoop fs -put /tmp/inputfile /inputfile" + + - name: Run the MapReduce job to count the occurance of word hello + shell: su - hdfs -c "hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar grep /inputfile /outputfile 'hello'" + + - name: Fetch the outputfile to local tmp dir + shell: su - hdfs -c "hadoop fs -get /outputfile /tmp/outputfile" + + - name: Get the outputfile to ansible server + fetch: dest=/tmp src=/tmp/outputfile/part-00000 + diff --git a/hadoop/roles/common/files/etc/cloudera-CDH4.repo b/hadoop/roles/common/files/etc/cloudera-CDH4.repo new file mode 100644 index 0000000..249f664 --- /dev/null +++ b/hadoop/roles/common/files/etc/cloudera-CDH4.repo @@ -0,0 +1,5 @@ +[cloudera-cdh4] +name=Cloudera's Distribution for Hadoop, Version 4 +baseurl=http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/4/ +gpgkey = http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera +gpgcheck = 1 diff --git a/hadoop/roles/common/handlers/main.yml b/hadoop/roles/common/handlers/main.yml new file mode 100644 index 0000000..8860ce2 --- /dev/null +++ b/hadoop/roles/common/handlers/main.yml @@ -0,0 +1,2 @@ +- name: restart iptables + service: name=iptables state=restarted diff --git a/hadoop/roles/common/tasks/common.yml b/hadoop/roles/common/tasks/common.yml new file mode 100644 index 0000000..5b4c9d1 --- /dev/null +++ b/hadoop/roles/common/tasks/common.yml @@ -0,0 +1,30 @@ +--- +# The playbook for common tasks + +- name: Deploy the Cloudera Repository + copy: src=etc/cloudera-CDH4.repo dest=/etc/yum.repos.d/cloudera-CDH4.repo + +- name: Install the openjdk package + yum: name=java-1.6.0-openjdk state=installed + +- name: create a directory for java + file: state=directory path=/usr/java/ + tags: link + +- name: create a link for java + file: src=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre state=link path=/usr/java/default + tags: link + +- name: Create the hosts file for all machines + template: src=etc/hosts.j2 dest=/etc/hosts + +- name: Disable SELinux in conf file + lineinfile: dest=/etc/sysconfig/selinux regexp='^SELINUX=' line='SELINUX=disabled' state=present + +- name: Disabel selinux dynamically + shell: creates=/etc/sysconfig/selinux.disabled setenforce 0 ; touch /etc/sysconfig/selinux.disabled + +- name: Create the iptables file for all machines + template: src=iptables.j2 dest=/etc/sysconfig/iptables + notify: restart iptables + diff --git a/hadoop/roles/common/tasks/main.yml b/hadoop/roles/common/tasks/main.yml new file mode 100644 index 0000000..1fe5398 --- /dev/null +++ b/hadoop/roles/common/tasks/main.yml @@ -0,0 +1,5 @@ +--- +# The playbook for common tasks + +- include: common.yml tags=slaves,no_ha + diff --git a/hadoop/roles/common/templates/etc/hosts.j2 b/hadoop/roles/common/templates/etc/hosts.j2 new file mode 100644 index 0000000..df5ed34 --- /dev/null +++ b/hadoop/roles/common/templates/etc/hosts.j2 @@ -0,0 +1,5 @@ +127.0.0.1 localhost +{% for host in groups.all %} +{{ hostvars[host]['ansible_' + iface].ipv4.address }} {{ host }} +{% endfor %} + diff --git a/hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 b/hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 new file mode 100644 index 0000000..6f837c5 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 @@ -0,0 +1,25 @@ + + + + + + + fs.defaultFS + hdfs://{{ hostvars[groups['hadoop_masters'][0]]['ansible_hostname'] + ':' ~ hadoop['fs.default.FS.port'] }}/ + + diff --git a/hadoop/roles/common/templates/hadoop_conf/hadoop-metrics.properties.j2 b/hadoop/roles/common/templates/hadoop_conf/hadoop-metrics.properties.j2 new file mode 100644 index 0000000..c1b2eb7 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/hadoop-metrics.properties.j2 @@ -0,0 +1,75 @@ +# Configuration of the "dfs" context for null +dfs.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "dfs" context for file +#dfs.class=org.apache.hadoop.metrics.file.FileContext +#dfs.period=10 +#dfs.fileName=/tmp/dfsmetrics.log + +# Configuration of the "dfs" context for ganglia +# Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) +# dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# dfs.period=10 +# dfs.servers=localhost:8649 + + +# Configuration of the "mapred" context for null +mapred.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "mapred" context for file +#mapred.class=org.apache.hadoop.metrics.file.FileContext +#mapred.period=10 +#mapred.fileName=/tmp/mrmetrics.log + +# Configuration of the "mapred" context for ganglia +# Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) +# mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# mapred.period=10 +# mapred.servers=localhost:8649 + + +# Configuration of the "jvm" context for null +#jvm.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "jvm" context for file +#jvm.class=org.apache.hadoop.metrics.file.FileContext +#jvm.period=10 +#jvm.fileName=/tmp/jvmmetrics.log + +# Configuration of the "jvm" context for ganglia +# jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# jvm.period=10 +# jvm.servers=localhost:8649 + +# Configuration of the "rpc" context for null +rpc.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "rpc" context for file +#rpc.class=org.apache.hadoop.metrics.file.FileContext +#rpc.period=10 +#rpc.fileName=/tmp/rpcmetrics.log + +# Configuration of the "rpc" context for ganglia +# rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# rpc.period=10 +# rpc.servers=localhost:8649 + + +# Configuration of the "ugi" context for null +ugi.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "ugi" context for file +#ugi.class=org.apache.hadoop.metrics.file.FileContext +#ugi.period=10 +#ugi.fileName=/tmp/ugimetrics.log + +# Configuration of the "ugi" context for ganglia +# ugi.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# ugi.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# ugi.period=10 +# ugi.servers=localhost:8649 + diff --git a/hadoop/roles/common/templates/hadoop_conf/hadoop-metrics2.properties.j2 b/hadoop/roles/common/templates/hadoop_conf/hadoop-metrics2.properties.j2 new file mode 100644 index 0000000..c3ffe31 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/hadoop-metrics2.properties.j2 @@ -0,0 +1,44 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# syntax: [prefix].[source|sink].[instance].[options] +# See javadoc of package-info.java for org.apache.hadoop.metrics2 for details + +*.sink.file.class=org.apache.hadoop.metrics2.sink.FileSink +# default sampling period, in seconds +*.period=10 + +# The namenode-metrics.out will contain metrics from all context +#namenode.sink.file.filename=namenode-metrics.out +# Specifying a special sampling period for namenode: +#namenode.sink.*.period=8 + +#datanode.sink.file.filename=datanode-metrics.out + +# the following example split metrics of different +# context to different sinks (in this case files) +#jobtracker.sink.file_jvm.context=jvm +#jobtracker.sink.file_jvm.filename=jobtracker-jvm-metrics.out +#jobtracker.sink.file_mapred.context=mapred +#jobtracker.sink.file_mapred.filename=jobtracker-mapred-metrics.out + +#tasktracker.sink.file.filename=tasktracker-metrics.out + +#maptask.sink.file.filename=maptask-metrics.out + +#reducetask.sink.file.filename=reducetask-metrics.out + diff --git a/hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 b/hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 new file mode 100644 index 0000000..022118e --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 @@ -0,0 +1,57 @@ + + + + + + + dfs.blocksize + {{ hadoop['dfs.blocksize'] }} + + + dfs.permissions.superusergroup + {{ hadoop['dfs.permissions.superusergroup'] }} + + + dfs.namenode.http.address + 0.0.0.0:{{ hadoop['dfs.namenode.http.address.port'] }} + + + dfs.datanode.address + 0.0.0.0:{{ hadoop['dfs.datanode.address.port'] }} + + + dfs.datanode.http.address + 0.0.0.0:{{ hadoop['dfs.datanode.http.address.port'] }} + + + dfs.datanode.ipc.address + 0.0.0.0:{{ hadoop['dfs.datanode.ipc.address.port'] }} + + + dfs.replication + {{ hadoop['dfs.replication'] }} + + + dfs.namenode.name.dir + {{ hadoop['dfs_namenode_name_dir'] | join(',') }} + + + dfs.datanode.data.dir + {{ hadoop['dfs_datanode_data_dir'] | join(',') }} + + diff --git a/hadoop/roles/common/templates/hadoop_conf/log4j.properties.j2 b/hadoop/roles/common/templates/hadoop_conf/log4j.properties.j2 new file mode 100644 index 0000000..b92ad27 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/log4j.properties.j2 @@ -0,0 +1,219 @@ +# Copyright 2011 The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Define some default values that can be overridden by system properties +hadoop.root.logger=INFO,console +hadoop.log.dir=. +hadoop.log.file=hadoop.log + +# Define the root logger to the system property "hadoop.root.logger". +log4j.rootLogger=${hadoop.root.logger}, EventCounter + +# Logging Threshold +log4j.threshold=ALL + +# Null Appender +log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender + +# +# Rolling File Appender - cap space usage at 5gb. +# +hadoop.log.maxfilesize=256MB +hadoop.log.maxbackupindex=20 +log4j.appender.RFA=org.apache.log4j.RollingFileAppender +log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file} + +log4j.appender.RFA.MaxFileSize=${hadoop.log.maxfilesize} +log4j.appender.RFA.MaxBackupIndex=${hadoop.log.maxbackupindex} + +log4j.appender.RFA.layout=org.apache.log4j.PatternLayout + +# Pattern format: Date LogLevel LoggerName LogMessage +log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +# Debugging Pattern format +#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n + + +# +# Daily Rolling File Appender +# + +log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file} + +# Rollver at midnight +log4j.appender.DRFA.DatePattern=.yyyy-MM-dd + +# 30-day backup +#log4j.appender.DRFA.MaxBackupIndex=30 +log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout + +# Pattern format: Date LogLevel LoggerName LogMessage +log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +# Debugging Pattern format +#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n + + +# +# console +# Add "console" to rootlogger above if you want to use this +# + +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.target=System.err +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n + +# +# TaskLog Appender +# + +#Default values +hadoop.tasklog.taskid=null +hadoop.tasklog.iscleanup=false +hadoop.tasklog.noKeepSplits=4 +hadoop.tasklog.totalLogFileSize=100 +hadoop.tasklog.purgeLogSplits=true +hadoop.tasklog.logsRetainHours=12 + +log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender +log4j.appender.TLA.taskId=${hadoop.tasklog.taskid} +log4j.appender.TLA.isCleanup=${hadoop.tasklog.iscleanup} +log4j.appender.TLA.totalLogFileSize=${hadoop.tasklog.totalLogFileSize} + +log4j.appender.TLA.layout=org.apache.log4j.PatternLayout +log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n + +# +# HDFS block state change log from block manager +# +# Uncomment the following to suppress normal block state change +# messages from BlockManager in NameNode. +#log4j.logger.BlockStateChange=WARN + +# +#Security appender +# +hadoop.security.logger=INFO,NullAppender +hadoop.security.log.maxfilesize=256MB +hadoop.security.log.maxbackupindex=20 +log4j.category.SecurityLogger=${hadoop.security.logger} +hadoop.security.log.file=SecurityAuth-${user.name}.audit +log4j.appender.RFAS=org.apache.log4j.RollingFileAppender +log4j.appender.RFAS.File=${hadoop.log.dir}/${hadoop.security.log.file} +log4j.appender.RFAS.layout=org.apache.log4j.PatternLayout +log4j.appender.RFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +log4j.appender.RFAS.MaxFileSize=${hadoop.security.log.maxfilesize} +log4j.appender.RFAS.MaxBackupIndex=${hadoop.security.log.maxbackupindex} + +# +# Daily Rolling Security appender +# +log4j.appender.DRFAS=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DRFAS.File=${hadoop.log.dir}/${hadoop.security.log.file} +log4j.appender.DRFAS.layout=org.apache.log4j.PatternLayout +log4j.appender.DRFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +log4j.appender.DRFAS.DatePattern=.yyyy-MM-dd + +# +# hdfs audit logging +# +hdfs.audit.logger=INFO,NullAppender +hdfs.audit.log.maxfilesize=256MB +hdfs.audit.log.maxbackupindex=20 +log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=${hdfs.audit.logger} +log4j.additivity.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=false +log4j.appender.RFAAUDIT=org.apache.log4j.RollingFileAppender +log4j.appender.RFAAUDIT.File=${hadoop.log.dir}/hdfs-audit.log +log4j.appender.RFAAUDIT.layout=org.apache.log4j.PatternLayout +log4j.appender.RFAAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n +log4j.appender.RFAAUDIT.MaxFileSize=${hdfs.audit.log.maxfilesize} +log4j.appender.RFAAUDIT.MaxBackupIndex=${hdfs.audit.log.maxbackupindex} + +# +# mapred audit logging +# +mapred.audit.logger=INFO,NullAppender +mapred.audit.log.maxfilesize=256MB +mapred.audit.log.maxbackupindex=20 +log4j.logger.org.apache.hadoop.mapred.AuditLogger=${mapred.audit.logger} +log4j.additivity.org.apache.hadoop.mapred.AuditLogger=false +log4j.appender.MRAUDIT=org.apache.log4j.RollingFileAppender +log4j.appender.MRAUDIT.File=${hadoop.log.dir}/mapred-audit.log +log4j.appender.MRAUDIT.layout=org.apache.log4j.PatternLayout +log4j.appender.MRAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n +log4j.appender.MRAUDIT.MaxFileSize=${mapred.audit.log.maxfilesize} +log4j.appender.MRAUDIT.MaxBackupIndex=${mapred.audit.log.maxbackupindex} + +# Custom Logging levels + +#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG +#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG +#log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=DEBUG + +# Jets3t library +log4j.logger.org.jets3t.service.impl.rest.httpclient.RestS3Service=ERROR + +# +# Event Counter Appender +# Sends counts of logging messages at different severity levels to Hadoop Metrics. +# +log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter + +# +# Job Summary Appender +# +# Use following logger to send summary to separate file defined by +# hadoop.mapreduce.jobsummary.log.file : +# hadoop.mapreduce.jobsummary.logger=INFO,JSA +# +hadoop.mapreduce.jobsummary.logger=${hadoop.root.logger} +hadoop.mapreduce.jobsummary.log.file=hadoop-mapreduce.jobsummary.log +hadoop.mapreduce.jobsummary.log.maxfilesize=256MB +hadoop.mapreduce.jobsummary.log.maxbackupindex=20 +log4j.appender.JSA=org.apache.log4j.RollingFileAppender +log4j.appender.JSA.File=${hadoop.log.dir}/${hadoop.mapreduce.jobsummary.log.file} +log4j.appender.JSA.MaxFileSize=${hadoop.mapreduce.jobsummary.log.maxfilesize} +log4j.appender.JSA.MaxBackupIndex=${hadoop.mapreduce.jobsummary.log.maxbackupindex} +log4j.appender.JSA.layout=org.apache.log4j.PatternLayout +log4j.appender.JSA.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n +log4j.logger.org.apache.hadoop.mapred.JobInProgress$JobSummary=${hadoop.mapreduce.jobsummary.logger} +log4j.additivity.org.apache.hadoop.mapred.JobInProgress$JobSummary=false + +# +# Yarn ResourceManager Application Summary Log +# +# Set the ResourceManager summary log filename +#yarn.server.resourcemanager.appsummary.log.file=rm-appsummary.log +# Set the ResourceManager summary log level and appender +#yarn.server.resourcemanager.appsummary.logger=INFO,RMSUMMARY + +# Appender for ResourceManager Application Summary Log +# Requires the following properties to be set +# - hadoop.log.dir (Hadoop Log directory) +# - yarn.server.resourcemanager.appsummary.log.file (resource manager app summary log filename) +# - yarn.server.resourcemanager.appsummary.logger (resource manager app summary log level and appender) + +#log4j.logger.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=${yarn.server.resourcemanager.appsummary.logger} +#log4j.additivity.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=false +#log4j.appender.RMSUMMARY=org.apache.log4j.RollingFileAppender +#log4j.appender.RMSUMMARY.File=${hadoop.log.dir}/${yarn.server.resourcemanager.appsummary.log.file} +#log4j.appender.RMSUMMARY.MaxFileSize=256MB +#log4j.appender.RMSUMMARY.MaxBackupIndex=20 +#log4j.appender.RMSUMMARY.layout=org.apache.log4j.PatternLayout +#log4j.appender.RMSUMMARY.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n diff --git a/hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 b/hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 new file mode 100644 index 0000000..b684fb5 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 @@ -0,0 +1,22 @@ + + + + mapred.job.tracker + {{ hostvars[groups['hadoop_masters'][0]]['ansible_hostname'] }}:{{ hadoop['mapred.job.tracker.port'] }} + + + + mapred.local.dir + {{ hadoop["mapred_local_dir"] | join(',') }} + + + + mapred.task.tracker.http.address + 0.0.0.0:{{ hadoop['mapred.task.tracker.http.address.port'] }} + + + mapred.job.tracker.http.address + 0.0.0.0:{{ hadoop['mapred.job.tracker.http.address.port'] }} + + + diff --git a/hadoop/roles/common/templates/hadoop_conf/slaves.j2 b/hadoop/roles/common/templates/hadoop_conf/slaves.j2 new file mode 100644 index 0000000..44f97e2 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/slaves.j2 @@ -0,0 +1,3 @@ +{% for host in groups['hadoop_slaves'] %} +{{ host }} +{% endfor %} diff --git a/hadoop/roles/common/templates/hadoop_conf/ssl-client.xml.example.j2 b/hadoop/roles/common/templates/hadoop_conf/ssl-client.xml.example.j2 new file mode 100644 index 0000000..a50dce4 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/ssl-client.xml.example.j2 @@ -0,0 +1,80 @@ + + + + + + + ssl.client.truststore.location + + Truststore to be used by clients like distcp. Must be + specified. + + + + + ssl.client.truststore.password + + Optional. Default value is "". + + + + + ssl.client.truststore.type + jks + Optional. The keystore file format, default value is "jks". + + + + + ssl.client.truststore.reload.interval + 10000 + Truststore reload check interval, in milliseconds. + Default value is 10000 (10 seconds). + + + + + ssl.client.keystore.location + + Keystore to be used by clients like distcp. Must be + specified. + + + + + ssl.client.keystore.password + + Optional. Default value is "". + + + + + ssl.client.keystore.keypassword + + Optional. Default value is "". + + + + + ssl.client.keystore.type + jks + Optional. The keystore file format, default value is "jks". + + + + diff --git a/hadoop/roles/common/templates/hadoop_conf/ssl-server.xml.example.j2 b/hadoop/roles/common/templates/hadoop_conf/ssl-server.xml.example.j2 new file mode 100644 index 0000000..4b363ff --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_conf/ssl-server.xml.example.j2 @@ -0,0 +1,77 @@ + + + + + + + ssl.server.truststore.location + + Truststore to be used by NN and DN. Must be specified. + + + + + ssl.server.truststore.password + + Optional. Default value is "". + + + + + ssl.server.truststore.type + jks + Optional. The keystore file format, default value is "jks". + + + + + ssl.server.truststore.reload.interval + 10000 + Truststore reload check interval, in milliseconds. + Default value is 10000 (10 seconds). + + + + ssl.server.keystore.location + + Keystore to be used by NN and DN. Must be specified. + + + + + ssl.server.keystore.password + + Must be specified. + + + + + ssl.server.keystore.keypassword + + Must be specified. + + + + + ssl.server.keystore.type + jks + Optional. The keystore file format, default value is "jks". + + + + diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 new file mode 100644 index 0000000..2db7dff --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 @@ -0,0 +1,25 @@ + + + + + + + fs.defaultFS + hdfs://{{ hadoop['nameservice.id'] }}/ + + diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics.properties.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics.properties.j2 new file mode 100644 index 0000000..c1b2eb7 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics.properties.j2 @@ -0,0 +1,75 @@ +# Configuration of the "dfs" context for null +dfs.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "dfs" context for file +#dfs.class=org.apache.hadoop.metrics.file.FileContext +#dfs.period=10 +#dfs.fileName=/tmp/dfsmetrics.log + +# Configuration of the "dfs" context for ganglia +# Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) +# dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# dfs.period=10 +# dfs.servers=localhost:8649 + + +# Configuration of the "mapred" context for null +mapred.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "mapred" context for file +#mapred.class=org.apache.hadoop.metrics.file.FileContext +#mapred.period=10 +#mapred.fileName=/tmp/mrmetrics.log + +# Configuration of the "mapred" context for ganglia +# Pick one: Ganglia 3.0 (former) or Ganglia 3.1 (latter) +# mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# mapred.period=10 +# mapred.servers=localhost:8649 + + +# Configuration of the "jvm" context for null +#jvm.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "jvm" context for file +#jvm.class=org.apache.hadoop.metrics.file.FileContext +#jvm.period=10 +#jvm.fileName=/tmp/jvmmetrics.log + +# Configuration of the "jvm" context for ganglia +# jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# jvm.period=10 +# jvm.servers=localhost:8649 + +# Configuration of the "rpc" context for null +rpc.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "rpc" context for file +#rpc.class=org.apache.hadoop.metrics.file.FileContext +#rpc.period=10 +#rpc.fileName=/tmp/rpcmetrics.log + +# Configuration of the "rpc" context for ganglia +# rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# rpc.period=10 +# rpc.servers=localhost:8649 + + +# Configuration of the "ugi" context for null +ugi.class=org.apache.hadoop.metrics.spi.NullContext + +# Configuration of the "ugi" context for file +#ugi.class=org.apache.hadoop.metrics.file.FileContext +#ugi.period=10 +#ugi.fileName=/tmp/ugimetrics.log + +# Configuration of the "ugi" context for ganglia +# ugi.class=org.apache.hadoop.metrics.ganglia.GangliaContext +# ugi.class=org.apache.hadoop.metrics.ganglia.GangliaContext31 +# ugi.period=10 +# ugi.servers=localhost:8649 + diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics2.properties.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics2.properties.j2 new file mode 100644 index 0000000..c3ffe31 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/hadoop-metrics2.properties.j2 @@ -0,0 +1,44 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# syntax: [prefix].[source|sink].[instance].[options] +# See javadoc of package-info.java for org.apache.hadoop.metrics2 for details + +*.sink.file.class=org.apache.hadoop.metrics2.sink.FileSink +# default sampling period, in seconds +*.period=10 + +# The namenode-metrics.out will contain metrics from all context +#namenode.sink.file.filename=namenode-metrics.out +# Specifying a special sampling period for namenode: +#namenode.sink.*.period=8 + +#datanode.sink.file.filename=datanode-metrics.out + +# the following example split metrics of different +# context to different sinks (in this case files) +#jobtracker.sink.file_jvm.context=jvm +#jobtracker.sink.file_jvm.filename=jobtracker-jvm-metrics.out +#jobtracker.sink.file_mapred.context=mapred +#jobtracker.sink.file_mapred.filename=jobtracker-mapred-metrics.out + +#tasktracker.sink.file.filename=tasktracker-metrics.out + +#maptask.sink.file.filename=maptask-metrics.out + +#reducetask.sink.file.filename=reducetask-metrics.out + diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 new file mode 100644 index 0000000..64168f3 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 @@ -0,0 +1,103 @@ + + + + + + dfs.nameservices + {{ hadoop['nameservice.id'] }} + + + dfs.ha.namenodes.{{ hadoop['nameservice.id'] }} + {{ groups.hadoop_masters | join(',') }} + + + dfs.blocksize + {{ hadoop['dfs.blocksize'] }} + + + dfs.permissions.superusergroup + {{ hadoop['dfs.permissions.superusergroup'] }} + + + dfs.ha.automatic-failover.enabled + true + + + ha.zookeeper.quorum + {{ groups.zookeeper_servers | join(':' ~ hadoop['zookeeper.clientport'] + ',') }}:{{ hadoop['zookeeper.clientport'] }} + + +{% for host in groups['hadoop_masters'] %} + + dfs.namenode.rpc-address.{{ hadoop['nameservice.id'] }}.{{ host }} + {{ host }}:{{ hadoop['fs.default.FS.port'] }} + +{% endfor %} +{% for host in groups['hadoop_masters'] %} + + dfs.namenode.http-address.{{ hadoop['nameservice.id'] }}.{{ host }} + {{ host }}:{{ hadoop['dfs.namenode.http.address.port'] }} + +{% endfor %} + + dfs.namenode.shared.edits.dir + qjournal://{{ groups.qjournal_servers | join(':' ~ hadoop['qjournal.port'] + ';') }}:{{ hadoop['qjournal.port'] }}/{{ hadoop['nameservice.id'] }} + + + dfs.journalnode.edits.dir + {{ hadoop['dfs_journalnode_edits_dir'] }} + + + dfs.client.failover.proxy.provider.{{ hadoop['nameservice.id'] }} + org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider + + + dfs.ha.fencing.methods + shell(/bin/true ) + + + + dfs.ha.zkfc.port + {{ hadoop['dfs.ha.zkfc.port'] }} + + + + dfs.datanode.address + 0.0.0.0:{{ hadoop['dfs.datanode.address.port'] }} + + + dfs.datanode.http.address + 0.0.0.0:{{ hadoop['dfs.datanode.http.address.port'] }} + + + dfs.datanode.ipc.address + 0.0.0.0:{{ hadoop['dfs.datanode.ipc.address.port'] }} + + + dfs.replication + {{ hadoop['dfs.replication'] }} + + + dfs.namenode.name.dir + {{ hadoop['dfs_namenode_name_dir'] | join(',') }} + + + dfs.datanode.data.dir + {{ hadoop['dfs_datanode_data_dir'] | join(',') }} + + diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/log4j.properties.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/log4j.properties.j2 new file mode 100644 index 0000000..b92ad27 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/log4j.properties.j2 @@ -0,0 +1,219 @@ +# Copyright 2011 The Apache Software Foundation +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Define some default values that can be overridden by system properties +hadoop.root.logger=INFO,console +hadoop.log.dir=. +hadoop.log.file=hadoop.log + +# Define the root logger to the system property "hadoop.root.logger". +log4j.rootLogger=${hadoop.root.logger}, EventCounter + +# Logging Threshold +log4j.threshold=ALL + +# Null Appender +log4j.appender.NullAppender=org.apache.log4j.varia.NullAppender + +# +# Rolling File Appender - cap space usage at 5gb. +# +hadoop.log.maxfilesize=256MB +hadoop.log.maxbackupindex=20 +log4j.appender.RFA=org.apache.log4j.RollingFileAppender +log4j.appender.RFA.File=${hadoop.log.dir}/${hadoop.log.file} + +log4j.appender.RFA.MaxFileSize=${hadoop.log.maxfilesize} +log4j.appender.RFA.MaxBackupIndex=${hadoop.log.maxbackupindex} + +log4j.appender.RFA.layout=org.apache.log4j.PatternLayout + +# Pattern format: Date LogLevel LoggerName LogMessage +log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +# Debugging Pattern format +#log4j.appender.RFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n + + +# +# Daily Rolling File Appender +# + +log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DRFA.File=${hadoop.log.dir}/${hadoop.log.file} + +# Rollver at midnight +log4j.appender.DRFA.DatePattern=.yyyy-MM-dd + +# 30-day backup +#log4j.appender.DRFA.MaxBackupIndex=30 +log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout + +# Pattern format: Date LogLevel LoggerName LogMessage +log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +# Debugging Pattern format +#log4j.appender.DRFA.layout.ConversionPattern=%d{ISO8601} %-5p %c{2} (%F:%M(%L)) - %m%n + + +# +# console +# Add "console" to rootlogger above if you want to use this +# + +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.target=System.err +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n + +# +# TaskLog Appender +# + +#Default values +hadoop.tasklog.taskid=null +hadoop.tasklog.iscleanup=false +hadoop.tasklog.noKeepSplits=4 +hadoop.tasklog.totalLogFileSize=100 +hadoop.tasklog.purgeLogSplits=true +hadoop.tasklog.logsRetainHours=12 + +log4j.appender.TLA=org.apache.hadoop.mapred.TaskLogAppender +log4j.appender.TLA.taskId=${hadoop.tasklog.taskid} +log4j.appender.TLA.isCleanup=${hadoop.tasklog.iscleanup} +log4j.appender.TLA.totalLogFileSize=${hadoop.tasklog.totalLogFileSize} + +log4j.appender.TLA.layout=org.apache.log4j.PatternLayout +log4j.appender.TLA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n + +# +# HDFS block state change log from block manager +# +# Uncomment the following to suppress normal block state change +# messages from BlockManager in NameNode. +#log4j.logger.BlockStateChange=WARN + +# +#Security appender +# +hadoop.security.logger=INFO,NullAppender +hadoop.security.log.maxfilesize=256MB +hadoop.security.log.maxbackupindex=20 +log4j.category.SecurityLogger=${hadoop.security.logger} +hadoop.security.log.file=SecurityAuth-${user.name}.audit +log4j.appender.RFAS=org.apache.log4j.RollingFileAppender +log4j.appender.RFAS.File=${hadoop.log.dir}/${hadoop.security.log.file} +log4j.appender.RFAS.layout=org.apache.log4j.PatternLayout +log4j.appender.RFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +log4j.appender.RFAS.MaxFileSize=${hadoop.security.log.maxfilesize} +log4j.appender.RFAS.MaxBackupIndex=${hadoop.security.log.maxbackupindex} + +# +# Daily Rolling Security appender +# +log4j.appender.DRFAS=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DRFAS.File=${hadoop.log.dir}/${hadoop.security.log.file} +log4j.appender.DRFAS.layout=org.apache.log4j.PatternLayout +log4j.appender.DRFAS.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n +log4j.appender.DRFAS.DatePattern=.yyyy-MM-dd + +# +# hdfs audit logging +# +hdfs.audit.logger=INFO,NullAppender +hdfs.audit.log.maxfilesize=256MB +hdfs.audit.log.maxbackupindex=20 +log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=${hdfs.audit.logger} +log4j.additivity.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=false +log4j.appender.RFAAUDIT=org.apache.log4j.RollingFileAppender +log4j.appender.RFAAUDIT.File=${hadoop.log.dir}/hdfs-audit.log +log4j.appender.RFAAUDIT.layout=org.apache.log4j.PatternLayout +log4j.appender.RFAAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n +log4j.appender.RFAAUDIT.MaxFileSize=${hdfs.audit.log.maxfilesize} +log4j.appender.RFAAUDIT.MaxBackupIndex=${hdfs.audit.log.maxbackupindex} + +# +# mapred audit logging +# +mapred.audit.logger=INFO,NullAppender +mapred.audit.log.maxfilesize=256MB +mapred.audit.log.maxbackupindex=20 +log4j.logger.org.apache.hadoop.mapred.AuditLogger=${mapred.audit.logger} +log4j.additivity.org.apache.hadoop.mapred.AuditLogger=false +log4j.appender.MRAUDIT=org.apache.log4j.RollingFileAppender +log4j.appender.MRAUDIT.File=${hadoop.log.dir}/mapred-audit.log +log4j.appender.MRAUDIT.layout=org.apache.log4j.PatternLayout +log4j.appender.MRAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n +log4j.appender.MRAUDIT.MaxFileSize=${mapred.audit.log.maxfilesize} +log4j.appender.MRAUDIT.MaxBackupIndex=${mapred.audit.log.maxbackupindex} + +# Custom Logging levels + +#log4j.logger.org.apache.hadoop.mapred.JobTracker=DEBUG +#log4j.logger.org.apache.hadoop.mapred.TaskTracker=DEBUG +#log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=DEBUG + +# Jets3t library +log4j.logger.org.jets3t.service.impl.rest.httpclient.RestS3Service=ERROR + +# +# Event Counter Appender +# Sends counts of logging messages at different severity levels to Hadoop Metrics. +# +log4j.appender.EventCounter=org.apache.hadoop.log.metrics.EventCounter + +# +# Job Summary Appender +# +# Use following logger to send summary to separate file defined by +# hadoop.mapreduce.jobsummary.log.file : +# hadoop.mapreduce.jobsummary.logger=INFO,JSA +# +hadoop.mapreduce.jobsummary.logger=${hadoop.root.logger} +hadoop.mapreduce.jobsummary.log.file=hadoop-mapreduce.jobsummary.log +hadoop.mapreduce.jobsummary.log.maxfilesize=256MB +hadoop.mapreduce.jobsummary.log.maxbackupindex=20 +log4j.appender.JSA=org.apache.log4j.RollingFileAppender +log4j.appender.JSA.File=${hadoop.log.dir}/${hadoop.mapreduce.jobsummary.log.file} +log4j.appender.JSA.MaxFileSize=${hadoop.mapreduce.jobsummary.log.maxfilesize} +log4j.appender.JSA.MaxBackupIndex=${hadoop.mapreduce.jobsummary.log.maxbackupindex} +log4j.appender.JSA.layout=org.apache.log4j.PatternLayout +log4j.appender.JSA.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n +log4j.logger.org.apache.hadoop.mapred.JobInProgress$JobSummary=${hadoop.mapreduce.jobsummary.logger} +log4j.additivity.org.apache.hadoop.mapred.JobInProgress$JobSummary=false + +# +# Yarn ResourceManager Application Summary Log +# +# Set the ResourceManager summary log filename +#yarn.server.resourcemanager.appsummary.log.file=rm-appsummary.log +# Set the ResourceManager summary log level and appender +#yarn.server.resourcemanager.appsummary.logger=INFO,RMSUMMARY + +# Appender for ResourceManager Application Summary Log +# Requires the following properties to be set +# - hadoop.log.dir (Hadoop Log directory) +# - yarn.server.resourcemanager.appsummary.log.file (resource manager app summary log filename) +# - yarn.server.resourcemanager.appsummary.logger (resource manager app summary log level and appender) + +#log4j.logger.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=${yarn.server.resourcemanager.appsummary.logger} +#log4j.additivity.org.apache.hadoop.yarn.server.resourcemanager.RMAppManager$ApplicationSummary=false +#log4j.appender.RMSUMMARY=org.apache.log4j.RollingFileAppender +#log4j.appender.RMSUMMARY.File=${hadoop.log.dir}/${yarn.server.resourcemanager.appsummary.log.file} +#log4j.appender.RMSUMMARY.MaxFileSize=256MB +#log4j.appender.RMSUMMARY.MaxBackupIndex=20 +#log4j.appender.RMSUMMARY.layout=org.apache.log4j.PatternLayout +#log4j.appender.RMSUMMARY.layout.ConversionPattern=%d{ISO8601} %p %c{2}: %m%n diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 new file mode 100644 index 0000000..fc46214 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 @@ -0,0 +1,120 @@ + + + + mapred.job.tracker + {{ hadoop['mapred.job.tracker.ha.servicename'] }} + + + + mapred.jobtrackers.{{ hadoop['mapred.job.tracker.ha.servicename'] }} + {{ groups['hadoop_masters'] | join(',') }} + Comma-separated list of JobTracker IDs. + + + + mapred.ha.automatic-failover.enabled + true + + + + mapred.ha.zkfc.port + {{ hadoop['mapred.ha.zkfc.port'] }} + + + + mapred.ha.fencing.methods + shell(/bin/true) + + + + ha.zookeeper.quorum + {{ groups.zookeeper_servers | join(':' ~ hadoop['zookeeper.clientport'] + ',') }}:{{ hadoop['zookeeper.clientport'] }} + + +{% for host in groups['hadoop_masters'] %} + + mapred.jobtracker.rpc-address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} + {{ host }}:{{ hadoop['mapred.job.tracker.port'] }} + +{% endfor %} +{% for host in groups['hadoop_masters'] %} + + mapred.job.tracker.http.address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} + 0.0.0.0:{{ hadoop['mapred.job.tracker.http.address.port'] }} + +{% endfor %} +{% for host in groups['hadoop_masters'] %} + + mapred.ha.jobtracker.rpc-address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} + {{ host }}:{{ hadoop['mapred.ha.jobtracker.rpc-address.port'] }} + +{% endfor %} +{% for host in groups['hadoop_masters'] %} + + mapred.ha.jobtracker.http-redirect-address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} + {{ host }}:{{ hadoop['mapred.job.tracker.http.address.port'] }} + +{% endfor %} + + + mapred.jobtracker.restart.recover + true + + + + mapred.job.tracker.persist.jobstatus.active + true + + + + mapred.job.tracker.persist.jobstatus.hours + 1 + + + + mapred.job.tracker.persist.jobstatus.dir + {{ hadoop['mapred_job_tracker_persist_jobstatus_dir'] }} + + + + mapred.client.failover.proxy.provider.{{ hadoop['mapred.job.tracker.ha.servicename'] }} + org.apache.hadoop.mapred.ConfiguredFailoverProxyProvider + + + + mapred.client.failover.max.attempts + 15 + + + + mapred.client.failover.sleep.base.millis + 500 + + + + mapred.client.failover.sleep.max.millis + 1500 + + + + mapred.client.failover.connection.retries + 0 + + + + mapred.client.failover.connection.retries.on.timeouts + 0 + + + + + mapred.local.dir + {{ hadoop["mapred_local_dir"] | join(',') }} + + + + mapred.task.tracker.http.address + 0.0.0.0:{{ hadoop['mapred.task.tracker.http.address.port'] }} + + + diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/slaves.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/slaves.j2 new file mode 100644 index 0000000..44f97e2 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/slaves.j2 @@ -0,0 +1,3 @@ +{% for host in groups['hadoop_slaves'] %} +{{ host }} +{% endfor %} diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/ssl-client.xml.example.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/ssl-client.xml.example.j2 new file mode 100644 index 0000000..a50dce4 --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/ssl-client.xml.example.j2 @@ -0,0 +1,80 @@ + + + + + + + ssl.client.truststore.location + + Truststore to be used by clients like distcp. Must be + specified. + + + + + ssl.client.truststore.password + + Optional. Default value is "". + + + + + ssl.client.truststore.type + jks + Optional. The keystore file format, default value is "jks". + + + + + ssl.client.truststore.reload.interval + 10000 + Truststore reload check interval, in milliseconds. + Default value is 10000 (10 seconds). + + + + + ssl.client.keystore.location + + Keystore to be used by clients like distcp. Must be + specified. + + + + + ssl.client.keystore.password + + Optional. Default value is "". + + + + + ssl.client.keystore.keypassword + + Optional. Default value is "". + + + + + ssl.client.keystore.type + jks + Optional. The keystore file format, default value is "jks". + + + + diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/ssl-server.xml.example.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/ssl-server.xml.example.j2 new file mode 100644 index 0000000..4b363ff --- /dev/null +++ b/hadoop/roles/common/templates/hadoop_ha_conf/ssl-server.xml.example.j2 @@ -0,0 +1,77 @@ + + + + + + + ssl.server.truststore.location + + Truststore to be used by NN and DN. Must be specified. + + + + + ssl.server.truststore.password + + Optional. Default value is "". + + + + + ssl.server.truststore.type + jks + Optional. The keystore file format, default value is "jks". + + + + + ssl.server.truststore.reload.interval + 10000 + Truststore reload check interval, in milliseconds. + Default value is 10000 (10 seconds). + + + + ssl.server.keystore.location + + Keystore to be used by NN and DN. Must be specified. + + + + + ssl.server.keystore.password + + Must be specified. + + + + + ssl.server.keystore.keypassword + + Must be specified. + + + + + ssl.server.keystore.type + jks + Optional. The keystore file format, default value is "jks". + + + + diff --git a/hadoop/roles/common/templates/iptables.j2 b/hadoop/roles/common/templates/iptables.j2 new file mode 100644 index 0000000..2a2b368 --- /dev/null +++ b/hadoop/roles/common/templates/iptables.j2 @@ -0,0 +1,41 @@ +# Firewall configuration written by system-config-firewall +# Manual customization of this file is not recommended. +*filter +:INPUT ACCEPT [0:0] +:FORWARD ACCEPT [0:0] +:OUTPUT ACCEPT [0:0] +{% if 'hadoop_masters' in group_names %} +-A INPUT -p tcp --dport {{ hadoop['fs.default.FS.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs.namenode.http.address.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred.job.tracker.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred.job.tracker.http.address.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred.ha.jobtracker.rpc-address.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred.ha.zkfc.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs.ha.zkfc.port'] }} -j ACCEPT + +{% endif %} +{% if 'hadoop_slaves' in group_names %} +-A INPUT -p tcp --dport {{ hadoop['dfs.datanode.address.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs.datanode.http.address.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs.datanode.ipc.address.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred.task.tracker.http.address.port'] }} -j ACCEPT +{% endif %} +{% if 'qjournal_servers' in group_names %} +-A INPUT -p tcp --dport {{ hadoop['qjournal.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['qjournal.http.port'] }} -j ACCEPT +{% endif %} +{% if 'zookeeper_servers' in group_names %} +-A INPUT -p tcp --dport {{ hadoop['zookeeper.clientport'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['zookeeper.leader_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['zookeeper.election_port'] }} -j ACCEPT +{% endif %} +-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT +-A INPUT -p icmp -j ACCEPT +-A INPUT -i lo -j ACCEPT +-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT +-A INPUT -j REJECT --reject-with icmp-host-prohibited +-A FORWARD -j REJECT --reject-with icmp-host-prohibited +COMMIT + + + diff --git a/hadoop/roles/hadoop_primary/handlers/main.yml b/hadoop/roles/hadoop_primary/handlers/main.yml new file mode 100644 index 0000000..c493318 --- /dev/null +++ b/hadoop/roles/hadoop_primary/handlers/main.yml @@ -0,0 +1,14 @@ +--- +# Handlers for the hadoop master services + +- name: restart hadoop master services + service: name=${item} state=restarted + with_items: + - hadoop-0.20-mapreduce-jobtracker + - hadoop-hdfs-namenode + +- name: restart hadoopha master services + service: name=${item} state=restarted + with_items: + - hadoop-0.20-mapreduce-jobtrackerha + - hadoop-hdfs-namenode diff --git a/hadoop/roles/hadoop_primary/tasks/hadoop_master.yml b/hadoop/roles/hadoop_primary/tasks/hadoop_master.yml new file mode 100644 index 0000000..44c13c0 --- /dev/null +++ b/hadoop/roles/hadoop_primary/tasks/hadoop_master.yml @@ -0,0 +1,76 @@ +--- +# Playbook for Hadoop master servers + +- name: Install the namenode and jobtracker packages + yum: name=${item} state=installed + with_items: + - hadoop-0.20-mapreduce-jobtracker + - hadoop-hdfs-namenode + when_set: $ha_disabled + +- name: Install the namenode and jobtracker packages + yum: name=${item} state=installed + with_items: + - hadoop-0.20-mapreduce-jobtrackerha + - hadoop-hdfs-namenode + - hadoop-hdfs-zkfc + - hadoop-0.20-mapreduce-zkfc + when_unset: $ha_disabled + +- name: Copy the hadoop configuration files + template: src=roles/common/templates/hadoop_ha_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + when_unset: $ha_disabled + notify: restart hadoopha master services + +- name: Copy the hadoop configuration files for no ha + template: src=roles/common/templates/hadoop_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + when_set: $ha_disabled + notify: restart hadoop master services + +- name: Create the data directory for the namenode metadata + file: path=${item} owner=hdfs group=hdfs state=directory + with_items: ${hadoop.dfs_namenode_name_dir} + +- name: Create the data directory for the jobtracker ha + file: path=${item} owner=mapred group=mapred state=directory + with_items: ${hadoop.mapred_job_tracker_persist_jobstatus_dir} + when_unset: $ha_disabled + + +- name: Format the namenode + shell: creates=/usr/lib/hadoop/namenode.formatted su - hdfs -c "hadoop namenode -format"; touch /usr/lib/hadoop/namenode.formatted + +- name: start hadoop namenode services + service: name=${item} state=started + with_items: + - hadoop-hdfs-namenode + +- name: Give permissions for mapred users + shell: creates=/usr/lib/hadoop/fs.initialized su - hdfs -c "hadoop fs -chown hdfs:hadoop /"; su - hdfs -c "hadoop fs -chmod 0774 /"; touch /usr/lib/hadoop/namenode.initialized + when_set: $ha_disabled + +- name: start hadoop jobtracker services + service: name=${item} state=started + with_items: + - hadoop-0.20-mapreduce-jobtracker + when_set: $ha_disabled diff --git a/hadoop/roles/hadoop_primary/tasks/main.yml b/hadoop/roles/hadoop_primary/tasks/main.yml new file mode 100644 index 0000000..f8eba61 --- /dev/null +++ b/hadoop/roles/hadoop_primary/tasks/main.yml @@ -0,0 +1,5 @@ +--- +# Playbook for Hadoop master primary servers + +- include: hadoop_master.yml tags=no_ha + diff --git a/hadoop/roles/hadoop_secondary/handlers/main.yml b/hadoop/roles/hadoop_secondary/handlers/main.yml new file mode 100644 index 0000000..c493318 --- /dev/null +++ b/hadoop/roles/hadoop_secondary/handlers/main.yml @@ -0,0 +1,14 @@ +--- +# Handlers for the hadoop master services + +- name: restart hadoop master services + service: name=${item} state=restarted + with_items: + - hadoop-0.20-mapreduce-jobtracker + - hadoop-hdfs-namenode + +- name: restart hadoopha master services + service: name=${item} state=restarted + with_items: + - hadoop-0.20-mapreduce-jobtrackerha + - hadoop-hdfs-namenode diff --git a/hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml b/hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml new file mode 100644 index 0000000..18de1ae --- /dev/null +++ b/hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml @@ -0,0 +1,73 @@ +--- +# Playbook for Hadoop master secondary server + + +- name: Install the namenode and jobtracker packages + yum: name=${item} state=installed + with_items: + - hadoop-0.20-mapreduce-jobtrackerha + - hadoop-hdfs-namenode + - hadoop-hdfs-zkfc + - hadoop-0.20-mapreduce-zkfc + +- name: Copy the hadoop configuration files + template: src=roles/common/templates/hadoop_ha_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + when_unset: $ha_disabled + notify: restart hadoopha master services + +- name: Create the data directory for the namenode metadata + file: path=${item} owner=hdfs group=hdfs state=directory + with_items: ${hadoop.dfs_namenode_name_dir} + +- name: Create the data directory for the jobtracker ha + file: path=${item} owner=mapred group=mapred state=directory + with_items: ${hadoop.mapred_job_tracker_persist_jobstatus_dir} + + +- name: Initialize the secodary namenode + shell: creates=/usr/lib/hadoop/namenode.formatted su - hdfs -c "hadoop namenode -bootstrapStandby"; touch /usr/lib/hadoop/namenode.formatted + +- name: start hadoop namenode services + service: name=${item} state=started + with_items: + - hadoop-hdfs-namenode + +- name: Initialize the zkfc for namenode + shell: creates=/usr/lib/hadoop/zkfc.formatted su - hdfs -c "hdfs zkfc -formatZK"; touch /usr/lib/hadoop/zkfc.formatted + register: nn_result + +- name: restart zkfc for namenode + service: name=hadoop-hdfs-zkfc state=restarted + delegate_to: ${item} + with_items: ${groups.hadoop_masters} + when_set: $nn_result and $nn_result.changed + +- name: Give permissions for mapred users + shell: creates=/usr/lib/hadoop/fs.initialized su - hdfs -c "hadoop fs -chown hdfs:hadoop /"; su - hdfs -c "hadoop fs -chmod 0774 /"; touch /usr/lib/hadoop/namenode.initialized + +- name: Initialize the zkfc for jobtracker + shell: creates=/usr/lib/hadoop/zkfcjob.formatted su - mapred -c "hadoop mrzkfc -formatZK"; touch /usr/lib/hadoop/zkfcjob.formatted + register: jt_result + +- name: restart zkfc for jobtracker + service: name=hadoop-0.20-mapreduce-zkfc state=restarted + delegate_to: ${item} + with_items: ${groups.hadoop_masters} + when_set: $jt_result and $jt_result.changed + +- name: start hadoop Jobtracker services + service: name=hadoop-0.20-mapreduce-jobtrackerha state=started + delegate_to: ${item} + with_items: ${groups.hadoop_masters} + when_set: $jt_result and $jt_result.changed + diff --git a/hadoop/roles/hadoop_secondary/tasks/main.yml b/hadoop/roles/hadoop_secondary/tasks/main.yml new file mode 100644 index 0000000..d58cdb9 --- /dev/null +++ b/hadoop/roles/hadoop_secondary/tasks/main.yml @@ -0,0 +1,4 @@ +--- +# Playbook for Hadoop master secondary server + +- include: hadoop_secondary.yml diff --git a/hadoop/roles/hadoop_slaves/handlers/main.yml b/hadoop/roles/hadoop_slaves/handlers/main.yml new file mode 100644 index 0000000..82ccc5c --- /dev/null +++ b/hadoop/roles/hadoop_slaves/handlers/main.yml @@ -0,0 +1,8 @@ +--- +# Handlers for the hadoop slave services + +- name: restart hadoop slave services + service: name=${item} state=restarted + with_items: + - hadoop-0.20-mapreduce-tasktracker + - hadoop-hdfs-datanode diff --git a/hadoop/roles/hadoop_slaves/tasks/main.yml b/hadoop/roles/hadoop_slaves/tasks/main.yml new file mode 100644 index 0000000..5294ab4 --- /dev/null +++ b/hadoop/roles/hadoop_slaves/tasks/main.yml @@ -0,0 +1,4 @@ +--- +# Playbook for Hadoop slave servers + +- include: slaves.yml tags=slaves,no_ha diff --git a/hadoop/roles/hadoop_slaves/tasks/slaves.yml b/hadoop/roles/hadoop_slaves/tasks/slaves.yml new file mode 100644 index 0000000..0856f0c --- /dev/null +++ b/hadoop/roles/hadoop_slaves/tasks/slaves.yml @@ -0,0 +1,53 @@ +--- +# Playbook for Hadoop slave servers + +- name: Install the datanode and tasktracker packages + yum: name=${item} state=installed + with_items: + - hadoop-0.20-mapreduce-tasktracker + - hadoop-hdfs-datanode + +- name: Copy the hadoop configuration files + template: src=roles/common/templates/hadoop_ha_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + when_unset: $ha_disabled + notify: restart hadoop slave services + +- name: Copy the hadoop configuration files for non ha + template: src=roles/common/templates/hadoop_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + when_set: $ha_disabled + notify: restart hadoop slave services + +- name: Create the data directory for the slave nodes to store the data + file: path=${item} owner=hdfs group=hdfs state=directory + with_items: ${hadoop.dfs_datanode_data_dir} + +- name: Create the data directory for the slave nodes for mapreduce + file: path=${item} owner=mapred group=mapred state=directory + with_items: ${hadoop.mapred_local_dir} + +- name: start hadoop slave services + service: name=${item} state=restarted + with_items: + - hadoop-0.20-mapreduce-tasktracker + - hadoop-hdfs-datanode + diff --git a/hadoop/roles/qjournal_servers/handlers/main.yml b/hadoop/roles/qjournal_servers/handlers/main.yml new file mode 100644 index 0000000..a466737 --- /dev/null +++ b/hadoop/roles/qjournal_servers/handlers/main.yml @@ -0,0 +1,5 @@ +--- +# The journal node handlers + +- name: restart qjournal services + service: name=hadoop-hdfs-journalnode state=restarted diff --git a/hadoop/roles/qjournal_servers/tasks/main.yml b/hadoop/roles/qjournal_servers/tasks/main.yml new file mode 100644 index 0000000..347bb10 --- /dev/null +++ b/hadoop/roles/qjournal_servers/tasks/main.yml @@ -0,0 +1,38 @@ +--- +# Playbook for the qjournal nodes + +- name: Install the qjournal package + yum: name=hadoop-hdfs-journalnode state=installed + +- name: Create folder for Journaling + file: path=${hadoop.dfs_journalnode_edits_dir} state=directory owner=hdfs group=hdfs + +- name: Copy the hadoop configuration files + template: src=roles/common/templates/hadoop_ha_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + when_unset: $ha_disabled + notify: restart qjournal services + +- name: Copy the non ha hadoop configuration files + template: src=roles/common/templates/hadoop_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + when_set: $ha_disabled + notify: restart qjournal services diff --git a/hadoop/roles/zookeeper_servers/handlers/main.yml b/hadoop/roles/zookeeper_servers/handlers/main.yml new file mode 100644 index 0000000..b0a9cc1 --- /dev/null +++ b/hadoop/roles/zookeeper_servers/handlers/main.yml @@ -0,0 +1,5 @@ +--- +# Handler for the zookeeper services + +- name: restart zookeeper + service: name=zookeeper-server state=restarted diff --git a/hadoop/roles/zookeeper_servers/tasks/main.yml b/hadoop/roles/zookeeper_servers/tasks/main.yml new file mode 100644 index 0000000..c791a39 --- /dev/null +++ b/hadoop/roles/zookeeper_servers/tasks/main.yml @@ -0,0 +1,13 @@ +--- +# The plays for zookeper daemons + +- name: Install the zookeeper files + yum: name=zookeeper-server state=installed + +- name: Copy the configuration file for zookeeper + template: src=zoo.cfg.j2 dest=/etc/zookeeper/conf/zoo.cfg + notify: restart zookeeper + +- name: initialize the zookeper + shell: creates=/var/lib/zookeeper/myid service zookeeper-server init --myid=${zoo_id} + diff --git a/hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 b/hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 new file mode 100644 index 0000000..540f894 --- /dev/null +++ b/hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 @@ -0,0 +1,9 @@ +tickTime=2000 +dataDir=/var/lib/zookeeper/ +clientPort={{ hadoop['zookeeper.clientport'] }} +initLimit=5 +syncLimit=2 +{% for host in groups['zookeeper_servers'] %} +server.{{ hostvars[host].zoo_id }}={{ host }}:{{ hadoop['zookeeper.leader_port'] }}:{{ hadoop['zookeeper.election_port'] }} +{% endfor %} + diff --git a/hadoop/roles/zookeeper_servers/vars/main.yml b/hadoop/roles/zookeeper_servers/vars/main.yml new file mode 100644 index 0000000..32486ad --- /dev/null +++ b/hadoop/roles/zookeeper_servers/vars/main.yml @@ -0,0 +1,6 @@ +--- +# Vars for Zookeeper + +clientport: 2181 +leader_port: 2888 +election_port: 3888 diff --git a/hadoop/site.yml b/hadoop/site.yml new file mode 100644 index 0000000..3f3f532 --- /dev/null +++ b/hadoop/site.yml @@ -0,0 +1,41 @@ +--- +# The main file to delpoy the site + + +- hosts: all + vars_files: + - hadoop_vars/hadoop + roles: + - common + +- hosts: zookeeper_servers + vars_files: + - hadoop_vars/hadoop + roles: + - zookeeper_servers + +- hosts: qjournal_servers + vars_files: + - hadoop_vars/hadoop + roles: + - qjournal_servers + +- hosts: hadoop_master_primary + vars_files: + - hadoop_vars/hadoop + roles: + - hadoop_primary + +- hosts: hadoop_master_secondary + vars_files: + - hadoop_vars/hadoop + roles: + - hadoop_secondary + +- hosts: hadoop_slaves + vars_files: + - hadoop_vars/hadoop + roles: + - hadoop_slaves + + From 591963a32ffa4ee51a9b11586b6198d9cc11ba11 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Fri, 12 Apr 2013 18:05:11 +0530 Subject: [PATCH 08/22] hadoop readme update --- hadoop/README.md | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/hadoop/README.md b/hadoop/README.md index 0711b9c..dba88ca 100644 --- a/hadoop/README.md +++ b/hadoop/README.md @@ -1,6 +1,7 @@ -### Deploying Hadoop Clusters using Ansible. - -##### Preface +## Deploying Hadoop Clusters using Ansible. +-------------------------------------------------- + +### Preface The Playbooks in this example are made to deploy Hadoop Clusters for users, these playbooks can be used to: @@ -12,7 +13,7 @@ The Playbooks in this example are made to deploy Hadoop Clusters for users, the 4) Verify the cluster by deploying MapReduce jobs -##### Brief introduction to diffrent components of Hadoop Cluster. +### Brief introduction to diffrent components of Hadoop Cluster. The following diagram depicts a Hadoop Cluster with HA and automated failover which would be deployed by the Ansible Playbooks. @@ -21,31 +22,43 @@ The two major categories of machines roles in a Hadoop cluster are Hadoop Master The Hadoop masters consists of: -NameNode: The NameNode is the centerpiece of an HDFS file system. It keeps the directory tree of all files in the file system, and tracks where across the cluster the file data is kept. It does not store the data of these files itself. Client applications talk to the NameNode whenever they wish to locate a file, or when they want to add/copy/move/delete a file. The NameNode responds the successful requests by returning a list of relevant DataNode servers where the data lives. +####NameNode: + +The NameNode is the centerpiece of an HDFS file system. It keeps the directory tree of all files in the file system, and tracks where across the cluster the file data is kept. It does not store the data of these files itself. Client applications talk to the NameNode whenever they wish to locate a file, or when they want to add/copy/move/delete a file. The NameNode responds the successful requests by returning a list of relevant DataNode servers where the data lives. -JobTracker: The JobTracker is the service within Hadoop that gives out MapReduce tasks to specific nodes in the cluster, Applications submit jobs to the Job tracker and JobTracker talks to the NameNode to determine the location of the data , once located the JobTracker submits the work to the chosen TaskTracker nodes. +####JobTracker: + +The JobTracker is the service within Hadoop that gives out MapReduce tasks to specific nodes in the cluster, Applications submit jobs to the Job tracker and JobTracker talks to the NameNode to determine the location of the data , once located the JobTracker submits the work to the chosen TaskTracker nodes. The Hadoop Slaves consists of: -DataNode: A DataNode is responsible for storing data in the HadoopFileSystem. A functional hdfs filesystem has more than one DataNode, and data is replicated across them. +####DataNode: + +A DataNode is responsible for storing data in the HadoopFileSystem. A functional hdfs filesystem has more than one DataNode, and data is replicated across them. -TaskTracker: A TaskTracker is a node in the cluster that accepts tasks - Map, Reduce and Shuffle operations from a JobTracker. +####TaskTracker: + +A TaskTracker is a node in the cluster that accepts tasks - Map, Reduce and Shuffle operations from a JobTracker. The Hadoop Master processes does not have high availability built into them as thier counterparts (datanode, tasktracker). Inorder to have HA for the NameNode and Jobtracker we have the following processes. -Quorum Journal Nodes: The journal nodes are responsible for maintaining a journal of any modifications made to the HDFS namespace, The active namenode logs any modifications to the jounal nodes and the standby namenode reads the changes from the journal nodes and applies it to it's local namespace. In a production environment the mininum recommended number of journal nodes is 3, these nodes can also be colocated with namenode/Jobtracker. +####Quorum Journal Nodes: + +The journal nodes are responsible for maintaining a journal of any modifications made to the HDFS namespace, The active namenode logs any modifications to the jounal nodes and the standby namenode reads the changes from the journal nodes and applies it to it's local namespace. In a production environment the mininum recommended number of journal nodes is 3, these nodes can also be colocated with namenode/Jobtracker. + +####Zookeeper Nodes: -Zookeeper Nodes: The purpose of Zookeepr is cluster management, Do remember that Hadoop HA is an active/passive cluster so the cluster requires stuff's like hearbeats, locks, leader election, quorum etc.. these service are provided by the zookeeper services. The recommended number for a production use is 3. +The purpose of Zookeepr is cluster management, Do remember that Hadoop HA is an active/passive cluster so the cluster requires stuff's like hearbeats, locks, leader election, quorum etc.. these service are provided by the zookeeper services. The recommended number for a production use is 3. zkfc namenode: zkfc (zookeeper failover controller) is a zookeeper client application that runs on each namenode server, it's responsibilites include health monitoring, zookeeper session management, leader election etc.. i,e incase of a namenode failure the zkfc process running on that machine detects the failure and informs the zookeeper as a result of which re-election takes place and a new active namenode is selected. zkfc JobTracker: The zkfc Tasktracker performs the same functionalities as that of zkfc namenode, the diffrence being the process that zkfc is resposible for is the jobtracker -#### Deploying a Hadoop Cluster with HA +### Deploying a Hadoop Cluster with HA -#####Pre-requesite's +####Pre-requesite's The Playbooks have been tested using Ansible v1.2, and Centos 6.x (64 bit) Modify group_vars/all to choose the interface for hadoop communication. @@ -103,7 +116,7 @@ To get the state of the Jobtracker process login as mapred user in any hadoop ma Once the active and the standby has been detected kill the namenode/jobtracker process in the server listed as active and issue the same commands as above and you should get a result where the standby has been promoted to the active state. Later you can start the killed process and see those processes listed as the passive processes. -#### Running a mapreduce job on the cluster. +### Running a mapreduce job on the cluster. To run a mapreduce job on the cluster a sample playbook has been written, this playbook runs a job on the cluster which counts the occurance of the word 'hello' on an inputfile. A sample inputfile file has been created in the playbooks/inputfile file, modify the file to match your testing. To deploy the mapreduce job run the following command.( Below -e server= @@ -112,13 +125,13 @@ To deploy the mapreduce job run the following command.( Below -e server= Date: Fri, 12 Apr 2013 18:12:02 +0530 Subject: [PATCH 09/22] hadoop readme update1 --- hadoop/README.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/hadoop/README.md b/hadoop/README.md index dba88ca..2303eb1 100644 --- a/hadoop/README.md +++ b/hadoop/README.md @@ -20,7 +20,7 @@ The following diagram depicts a Hadoop Cluster with HA and automated failover wh The two major categories of machines roles in a Hadoop cluster are Hadoop Masters and Hadoop Slaves. -The Hadoop masters consists of: +#####The Hadoop masters consists of: ####NameNode: @@ -30,7 +30,7 @@ The NameNode is the centerpiece of an HDFS file system. It keeps the directory t The JobTracker is the service within Hadoop that gives out MapReduce tasks to specific nodes in the cluster, Applications submit jobs to the Job tracker and JobTracker talks to the NameNode to determine the location of the data , once located the JobTracker submits the work to the chosen TaskTracker nodes. -The Hadoop Slaves consists of: +#####The Hadoop Slaves consists of: ####DataNode: @@ -41,7 +41,7 @@ A DataNode is responsible for storing data in the HadoopFileSystem. A functional A TaskTracker is a node in the cluster that accepts tasks - Map, Reduce and Shuffle operations from a JobTracker. -The Hadoop Master processes does not have high availability built into them as thier counterparts (datanode, tasktracker). Inorder to have HA for the NameNode and Jobtracker we have the following processes. +#####The Hadoop Master processes does not have high availability built into them as thier counterparts (datanode, tasktracker). Inorder to have HA for the NameNode and Jobtracker we have the following processes. ####Quorum Journal Nodes: @@ -51,9 +51,13 @@ The journal nodes are responsible for maintaining a journal of any modifications The purpose of Zookeepr is cluster management, Do remember that Hadoop HA is an active/passive cluster so the cluster requires stuff's like hearbeats, locks, leader election, quorum etc.. these service are provided by the zookeeper services. The recommended number for a production use is 3. -zkfc namenode: zkfc (zookeeper failover controller) is a zookeeper client application that runs on each namenode server, it's responsibilites include health monitoring, zookeeper session management, leader election etc.. i,e incase of a namenode failure the zkfc process running on that machine detects the failure and informs the zookeeper as a result of which re-election takes place and a new active namenode is selected. +####zkfc namenode: -zkfc JobTracker: The zkfc Tasktracker performs the same functionalities as that of zkfc namenode, the diffrence being the process that zkfc is resposible for is the jobtracker +zkfc (zookeeper failover controller) is a zookeeper client application that runs on each namenode server, it's responsibilites include health monitoring, zookeeper session management, leader election etc.. i,e incase of a namenode failure the zkfc process running on that machine detects the failure and informs the zookeeper as a result of which re-election takes place and a new active namenode is selected. + +####zkfc JobTracker: + +The zkfc Tasktracker performs the same functionalities as that of zkfc namenode, the diffrence being the process that zkfc is resposible for is the jobtracker ### Deploying a Hadoop Cluster with HA @@ -61,7 +65,9 @@ zkfc JobTracker: The zkfc Tasktracker performs the same functionalities as that ####Pre-requesite's The Playbooks have been tested using Ansible v1.2, and Centos 6.x (64 bit) + Modify group_vars/all to choose the interface for hadoop communication. + Optionally you change the hadoop specific parameter like port's or directories by editing hadoop_vars/hadoop file. Before launching the deployment playbook make sure the inventory file ( hosts ) have be setup properly, Here's a sample: From b45ac44ac526b1d3ef01bf1024d9e94ee1605656 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Fri, 12 Apr 2013 18:30:18 +0530 Subject: [PATCH 10/22] hadoop image --- hadoop/README.md | 2 +- hadoop/hadoop_ha.png | Bin 0 -> 279997 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 hadoop/hadoop_ha.png diff --git a/hadoop/README.md b/hadoop/README.md index 2303eb1..df64705 100644 --- a/hadoop/README.md +++ b/hadoop/README.md @@ -16,7 +16,7 @@ The Playbooks in this example are made to deploy Hadoop Clusters for users, the ### Brief introduction to diffrent components of Hadoop Cluster. The following diagram depicts a Hadoop Cluster with HA and automated failover which would be deployed by the Ansible Playbooks. - +![Alt text](/hadoop_ha.png "Hadoop HA") The two major categories of machines roles in a Hadoop cluster are Hadoop Masters and Hadoop Slaves. diff --git a/hadoop/hadoop_ha.png b/hadoop/hadoop_ha.png new file mode 100644 index 0000000000000000000000000000000000000000..fd519725d4bfaa4ef3848fb26435f95a294c4d5c GIT binary patch literal 279997 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

1g>7~hgdZ|F&d_{y6|JfyfzTRrc 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

$M0d1IPF$!LRF=}Fo9?wRSe2j!XY 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�g8Zv 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�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

*p+0)g% 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�h=h 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 r5oP Date: Sat, 13 Apr 2013 11:12:00 +0530 Subject: [PATCH 11/22] image update --- hadoop/.common_test.yml.retry | 27 --------------------------- hadoop/.job.yml.retry | 20 -------------------- hadoop/.site.yml.retry | 20 -------------------- hadoop/README.md | 3 +++ hadoop/hadoop_simple.png | Bin 0 -> 112315 bytes 5 files changed, 3 insertions(+), 67 deletions(-) delete mode 100644 hadoop/.common_test.yml.retry delete mode 100644 hadoop/.job.yml.retry delete mode 100644 hadoop/.site.yml.retry create mode 100644 hadoop/hadoop_simple.png diff --git a/hadoop/.common_test.yml.retry b/hadoop/.common_test.yml.retry deleted file mode 100644 index 792d547..0000000 --- a/hadoop/.common_test.yml.retry +++ /dev/null @@ -1,27 +0,0 @@ -# dynamically generated inventory file -# retries previously failed hosts only - -[hadoop_masters] -nisserver zoo_id=1 role=active -nisclient1 zoo_id=2 role=standby - -[CentOS] -nisclient1 zoo_id=2 role=standby -nisclient2 zoo_id=3 -nisserver zoo_id=1 role=active - -[qjournal_servers] -nisserver zoo_id=1 role=active -nisclient1 zoo_id=2 role=standby -nisclient2 zoo_id=3 - -[zookeeper_servers] -nisserver zoo_id=1 role=active -nisclient1 zoo_id=2 role=standby -nisclient2 zoo_id=3 - -[hadoop_slaves] -nisserver zoo_id=1 role=active -nisclient1 zoo_id=2 role=standby -nisclient2 zoo_id=3 - diff --git a/hadoop/.job.yml.retry b/hadoop/.job.yml.retry deleted file mode 100644 index 5bcb4c0..0000000 --- a/hadoop/.job.yml.retry +++ /dev/null @@ -1,20 +0,0 @@ -# dynamically generated inventory file -# retries previously failed hosts only - - -[hadoop_masters:children] -hadoop_master_primary -hadoop_master_secondary - -[qjournal_servers] -hadoop1 zoo_id=1 - -[hadoop_master_primary] -hadoop1 zoo_id=1 - -[zookeeper_servers] -hadoop1 zoo_id=1 - -[hadoop_slaves] -hadoop1 zoo_id=1 - diff --git a/hadoop/.site.yml.retry b/hadoop/.site.yml.retry deleted file mode 100644 index 5bcb4c0..0000000 --- a/hadoop/.site.yml.retry +++ /dev/null @@ -1,20 +0,0 @@ -# dynamically generated inventory file -# retries previously failed hosts only - - -[hadoop_masters:children] -hadoop_master_primary -hadoop_master_secondary - -[qjournal_servers] -hadoop1 zoo_id=1 - -[hadoop_master_primary] -hadoop1 zoo_id=1 - -[zookeeper_servers] -hadoop1 zoo_id=1 - -[hadoop_slaves] -hadoop1 zoo_id=1 - diff --git a/hadoop/README.md b/hadoop/README.md index df64705..985ef88 100644 --- a/hadoop/README.md +++ b/hadoop/README.md @@ -141,6 +141,9 @@ The Hadoop cluster when reaches it's maximum capacity it can be scaled by adding The following diagram illustrates a standalone hadoop cluster. +![Alt text](/hadoop_simple.png "Optional title") + + To deploy this cluster fill in the inventory file as follows: [hadoop_master_primary] diff --git a/hadoop/hadoop_simple.png b/hadoop/hadoop_simple.png new file mode 100644 index 0000000000000000000000000000000000000000..7265d7bfbf4b649009133eaacbf42e611463b991 GIT binary patch literal 112315 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 Date: Tue, 16 Apr 2013 17:04:00 +0530 Subject: [PATCH 12/22] update 1.2 changes --- hadoop/README.md | 30 ++++++-- hadoop/group_vars/all | 49 +++++++++++++ hadoop/hadoop_vars/hadoop | 47 ------------ hadoop/roles/common/tasks/common.yml | 2 - hadoop/roles/common/tasks/main.yml | 2 +- .../templates/hadoop_conf/core-site.xml.j2 | 2 +- .../templates/hadoop_conf/hdfs-site.xml.j2 | 14 ++-- .../templates/hadoop_conf/mapred-site.xml.j2 | 6 +- .../templates/hadoop_ha_conf/core-site.xml.j2 | 2 +- .../templates/hadoop_ha_conf/hdfs-site.xml.j2 | 32 ++++---- .../hadoop_ha_conf/mapred-site.xml.j2 | 28 +++---- hadoop/roles/common/templates/iptables.j2 | 34 ++++----- .../hadoop_primary/tasks/hadoop_master.yml | 52 ++----------- .../tasks/hadoop_master_no_ha.yml | 38 ++++++++++ hadoop/roles/hadoop_primary/tasks/main.yml | 6 +- .../tasks/hadoop_secondary.yml | 73 ------------------- hadoop/roles/hadoop_secondary/tasks/main.yml | 62 +++++++++++++++- hadoop/roles/hadoop_slaves/tasks/main.yml | 2 +- hadoop/roles/hadoop_slaves/tasks/slaves.yml | 14 ++-- hadoop/roles/qjournal_servers/tasks/main.yml | 20 +---- .../zookeeper_servers/templates/zoo.cfg.j2 | 4 +- hadoop/roles/zookeeper_servers/vars/main.yml | 6 -- hadoop/site.yml | 22 ++---- 23 files changed, 259 insertions(+), 288 deletions(-) delete mode 100644 hadoop/hadoop_vars/hadoop create mode 100644 hadoop/roles/hadoop_primary/tasks/hadoop_master_no_ha.yml delete mode 100644 hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml delete mode 100644 hadoop/roles/zookeeper_servers/vars/main.yml diff --git a/hadoop/README.md b/hadoop/README.md index 985ef88..601a3df 100644 --- a/hadoop/README.md +++ b/hadoop/README.md @@ -68,11 +68,11 @@ The Playbooks have been tested using Ansible v1.2, and Centos 6.x (64 bit) Modify group_vars/all to choose the interface for hadoop communication. -Optionally you change the hadoop specific parameter like port's or directories by editing hadoop_vars/hadoop file. +Optionally you change the hadoop specific parameter like port's or directories by editing group_vars/all file. Before launching the deployment playbook make sure the inventory file ( hosts ) have be setup properly, Here's a sample: - [hadoop_master_primary]15yy + [hadoop_master_primary] zhadoop1 [hadoop_master_secondary] @@ -124,12 +124,22 @@ and you should get a result where the standby has been promoted to the active st ### Running a mapreduce job on the cluster. -To run a mapreduce job on the cluster a sample playbook has been written, this playbook runs a job on the cluster which counts the occurance of the word 'hello' on an inputfile. A sample inputfile file has been created in the playbooks/inputfile file, modify the file to match your testing. -To deploy the mapreduce job run the following command.( Below -e server= +To deploy the mapreduce job run the following script from any of the hadoop master nodes as user 'hdfs'. The job would count the number of occurance of the word 'hello' in the given inputfile. Eg: su - hdfs -c "/tmp/job.sh" - ansible-playbook -i hosts playbooks/job.yml -e server=zhadoop1 + #!/bin/bash + cat > /tmp/inputfile << EOF + hello + sf + sdf + hello + sdf + sdf + EOF + hadoop fs -put /tmp/inputfile /inputfile + hadoop jar /usr/lib/hadoop-0.20-mapreduce/hadoop-examples.jar grep /inputfile /outputfile 'hello' + hadoop fs -get /outputfile /tmp/outputfile/ -to verify the result read the file on your ansible server located at /tmp/zhadoop1/tmp/outputfile/part-00000, which should give you the count. +to verify the result read the file on server located at /tmp/outputfile/part-00000, which should give you the count. ###Scale the Cluster @@ -160,8 +170,12 @@ To deploy this cluster fill in the inventory file as follows: hadoop2 hadoop3 -and issue the following command: +and edit the group_vars/all file to disable HA: + + ha_enabled: False + +and run the following command: - ansible-playbook -i hosts site.yml -e ha_disabled=true --tags=no_ha + ansible-playbook -i hosts site.yml The validity of the cluster can be checked by running the same mapreduce job that has documented above for an HA Hadoop Cluster diff --git a/hadoop/group_vars/all b/hadoop/group_vars/all index 3ad1763..8e902a1 100644 --- a/hadoop/group_vars/all +++ b/hadoop/group_vars/all @@ -1 +1,50 @@ iface: eth1 + +ha_enabled: False + +hadoop: + +#Variables for - common + + fs_default_FS_port: 8020 + nameservice_id: mycluster3 + +#Variables for + + dfs_permissions_superusergroup: hdfs + dfs_namenode_name_dir: + - /namedir1/ + - /namedir2/ + dfs_replication: 3 + dfs_namenode_handler_count: 50 + dfs_blocksize: 67108864 + dfs_datanode_data_dir: + - /datadir1/ + - /datadir2/ + dfs_datanode_address_port: 50010 + dfs_datanode_http_address_port: 50075 + dfs_datanode_ipc_address_port: 50020 + dfs_namenode_http_address_port: 50070 + dfs_ha_zkfc_port: 8019 + qjournal_port: 8485 + qjournal_http_port: 8480 + dfs_journalnode_edits_dir: /journaldir/ + zookeeper_clientport: 2181 + zookeeper_leader_port: 2888 + zookeeper_election_port: 3888 + +#Variables for - common + mapred_job_tracker_ha_servicename: myjt3 + mapred_job_tracker_http_address_port: 50030 + mapred_task_tracker_http_address_port: 50060 + mapred_job_tracker_port: 8021 + mapred_ha_jobtracker_rpc-address_port: 8023 + mapred_ha_zkfc_port: 8018 + mapred_job_tracker_persist_jobstatus_dir: /jobdir/ + mapred_local_dir: + - /mapred1/ + - /mapred2/ + + + + diff --git a/hadoop/hadoop_vars/hadoop b/hadoop/hadoop_vars/hadoop deleted file mode 100644 index 7b011e4..0000000 --- a/hadoop/hadoop_vars/hadoop +++ /dev/null @@ -1,47 +0,0 @@ - -hadoop: - -#Variables for - common - - fs.default.FS.port: 8020 - nameservice.id: mycluster2 - -#Variables for - - dfs.permissions.superusergroup: hdfs - dfs_namenode_name_dir: - - /namedir1/ - - /namedir2/ - dfs.replication: 3 - dfs.namenode.handler.count: 50 - dfs.blocksize: 67108864 - dfs_datanode_data_dir: - - /datadir1/ - - /datadir2/ - dfs.datanode.address.port: 50010 - dfs.datanode.http.address.port: 50075 - dfs.datanode.ipc.address.port: 50020 - dfs.namenode.http.address.port: 50070 - dfs.ha.zkfc.port: 8019 - qjournal.port: 8485 - qjournal.http.port: 8480 - dfs_journalnode_edits_dir: /journaldir/ - zookeeper.clientport: 2181 - zookeeper.leader_port: 2888 - zookeeper.election_port: 3888 - -#Variables for - common - mapred.job.tracker.ha.servicename: myjt2 - mapred.job.tracker.http.address.port: 50030 - mapred.task.tracker.http.address.port: 50060 - mapred.job.tracker.port: 8021 - mapred.ha.jobtracker.rpc-address.port: 8023 - mapred.ha.zkfc.port: 8018 - mapred_job_tracker_persist_jobstatus_dir: /jobdir/ - mapred_local_dir: - - /mapred1/ - - /mapred2/ - - - - diff --git a/hadoop/roles/common/tasks/common.yml b/hadoop/roles/common/tasks/common.yml index 5b4c9d1..08a8bed 100644 --- a/hadoop/roles/common/tasks/common.yml +++ b/hadoop/roles/common/tasks/common.yml @@ -9,11 +9,9 @@ - name: create a directory for java file: state=directory path=/usr/java/ - tags: link - name: create a link for java file: src=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre state=link path=/usr/java/default - tags: link - name: Create the hosts file for all machines template: src=etc/hosts.j2 dest=/etc/hosts diff --git a/hadoop/roles/common/tasks/main.yml b/hadoop/roles/common/tasks/main.yml index 1fe5398..ef6677f 100644 --- a/hadoop/roles/common/tasks/main.yml +++ b/hadoop/roles/common/tasks/main.yml @@ -1,5 +1,5 @@ --- # The playbook for common tasks -- include: common.yml tags=slaves,no_ha +- include: common.yml tags=slaves diff --git a/hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 b/hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 index 6f837c5..75ac8f6 100644 --- a/hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 +++ b/hadoop/roles/common/templates/hadoop_conf/core-site.xml.j2 @@ -20,6 +20,6 @@ fs.defaultFS - hdfs://{{ hostvars[groups['hadoop_masters'][0]]['ansible_hostname'] + ':' ~ hadoop['fs.default.FS.port'] }}/ + hdfs://{{ hostvars[groups['hadoop_masters'][0]]['ansible_hostname'] + ':' ~ hadoop['fs_default_FS_port'] }}/ diff --git a/hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 b/hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 index 022118e..0c537fc 100644 --- a/hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 +++ b/hadoop/roles/common/templates/hadoop_conf/hdfs-site.xml.j2 @@ -20,31 +20,31 @@ dfs.blocksize - {{ hadoop['dfs.blocksize'] }} + {{ hadoop['dfs_blocksize'] }} dfs.permissions.superusergroup - {{ hadoop['dfs.permissions.superusergroup'] }} + {{ hadoop['dfs_permissions_superusergroup'] }} dfs.namenode.http.address - 0.0.0.0:{{ hadoop['dfs.namenode.http.address.port'] }} + 0.0.0.0:{{ hadoop['dfs_namenode_http_address_port'] }} dfs.datanode.address - 0.0.0.0:{{ hadoop['dfs.datanode.address.port'] }} + 0.0.0.0:{{ hadoop['dfs_datanode_address_port'] }} dfs.datanode.http.address - 0.0.0.0:{{ hadoop['dfs.datanode.http.address.port'] }} + 0.0.0.0:{{ hadoop['dfs_datanode_http_address_port'] }} dfs.datanode.ipc.address - 0.0.0.0:{{ hadoop['dfs.datanode.ipc.address.port'] }} + 0.0.0.0:{{ hadoop['dfs_datanode_ipc_address_port'] }} dfs.replication - {{ hadoop['dfs.replication'] }} + {{ hadoop['dfs_replication'] }} dfs.namenode.name.dir diff --git a/hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 b/hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 index b684fb5..0941698 100644 --- a/hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 +++ b/hadoop/roles/common/templates/hadoop_conf/mapred-site.xml.j2 @@ -2,7 +2,7 @@ mapred.job.tracker - {{ hostvars[groups['hadoop_masters'][0]]['ansible_hostname'] }}:{{ hadoop['mapred.job.tracker.port'] }} + {{ hostvars[groups['hadoop_masters'][0]]['ansible_hostname'] }}:{{ hadoop['mapred_job_tracker_port'] }} @@ -12,11 +12,11 @@ mapred.task.tracker.http.address - 0.0.0.0:{{ hadoop['mapred.task.tracker.http.address.port'] }} + 0.0.0.0:{{ hadoop['mapred_task_tracker_http_address_port'] }} mapred.job.tracker.http.address - 0.0.0.0:{{ hadoop['mapred.job.tracker.http.address.port'] }} + 0.0.0.0:{{ hadoop['mapred_job_tracker_http_address_port'] }} diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 index 2db7dff..62f355d 100644 --- a/hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 +++ b/hadoop/roles/common/templates/hadoop_ha_conf/core-site.xml.j2 @@ -20,6 +20,6 @@ fs.defaultFS - hdfs://{{ hadoop['nameservice.id'] }}/ + hdfs://{{ hadoop['nameservice_id'] }}/ diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 index 64168f3..7dadd91 100644 --- a/hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 +++ b/hadoop/roles/common/templates/hadoop_ha_conf/hdfs-site.xml.j2 @@ -19,19 +19,19 @@ dfs.nameservices - {{ hadoop['nameservice.id'] }} + {{ hadoop['nameservice_id'] }} - dfs.ha.namenodes.{{ hadoop['nameservice.id'] }} + dfs.ha.namenodes.{{ hadoop['nameservice_id'] }} {{ groups.hadoop_masters | join(',') }} dfs.blocksize - {{ hadoop['dfs.blocksize'] }} + {{ hadoop['dfs_blocksize'] }} dfs.permissions.superusergroup - {{ hadoop['dfs.permissions.superusergroup'] }} + {{ hadoop['dfs_permissions_superusergroup'] }} dfs.ha.automatic-failover.enabled @@ -39,31 +39,31 @@ ha.zookeeper.quorum - {{ groups.zookeeper_servers | join(':' ~ hadoop['zookeeper.clientport'] + ',') }}:{{ hadoop['zookeeper.clientport'] }} + {{ groups.zookeeper_servers | join(':' ~ hadoop['zookeeper_clientport'] + ',') }}:{{ hadoop['zookeeper_clientport'] }} {% for host in groups['hadoop_masters'] %} - dfs.namenode.rpc-address.{{ hadoop['nameservice.id'] }}.{{ host }} - {{ host }}:{{ hadoop['fs.default.FS.port'] }} + dfs.namenode.rpc-address.{{ hadoop['nameservice_id'] }}.{{ host }} + {{ host }}:{{ hadoop['fs_default_FS_port'] }} {% endfor %} {% for host in groups['hadoop_masters'] %} - dfs.namenode.http-address.{{ hadoop['nameservice.id'] }}.{{ host }} - {{ host }}:{{ hadoop['dfs.namenode.http.address.port'] }} + dfs.namenode.http-address.{{ hadoop['nameservice_id'] }}.{{ host }} + {{ host }}:{{ hadoop['dfs_namenode_http_address_port'] }} {% endfor %} dfs.namenode.shared.edits.dir - qjournal://{{ groups.qjournal_servers | join(':' ~ hadoop['qjournal.port'] + ';') }}:{{ hadoop['qjournal.port'] }}/{{ hadoop['nameservice.id'] }} + qjournal://{{ groups.qjournal_servers | join(':' ~ hadoop['qjournal_port'] + ';') }}:{{ hadoop['qjournal_port'] }}/{{ hadoop['nameservice_id'] }} dfs.journalnode.edits.dir {{ hadoop['dfs_journalnode_edits_dir'] }} - dfs.client.failover.proxy.provider.{{ hadoop['nameservice.id'] }} + dfs.client.failover.proxy.provider.{{ hadoop['nameservice_id'] }} org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider @@ -73,24 +73,24 @@ dfs.ha.zkfc.port - {{ hadoop['dfs.ha.zkfc.port'] }} + {{ hadoop['dfs_ha_zkfc_port'] }} dfs.datanode.address - 0.0.0.0:{{ hadoop['dfs.datanode.address.port'] }} + 0.0.0.0:{{ hadoop['dfs_datanode_address_port'] }} dfs.datanode.http.address - 0.0.0.0:{{ hadoop['dfs.datanode.http.address.port'] }} + 0.0.0.0:{{ hadoop['dfs_datanode_http_address_port'] }} dfs.datanode.ipc.address - 0.0.0.0:{{ hadoop['dfs.datanode.ipc.address.port'] }} + 0.0.0.0:{{ hadoop['dfs_datanode_ipc_address_port'] }} dfs.replication - {{ hadoop['dfs.replication'] }} + {{ hadoop['dfs_replication'] }} dfs.namenode.name.dir diff --git a/hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 b/hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 index fc46214..4a839c9 100644 --- a/hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 +++ b/hadoop/roles/common/templates/hadoop_ha_conf/mapred-site.xml.j2 @@ -2,11 +2,11 @@ mapred.job.tracker - {{ hadoop['mapred.job.tracker.ha.servicename'] }} + {{ hadoop['mapred_job_tracker_ha_servicename'] }} - mapred.jobtrackers.{{ hadoop['mapred.job.tracker.ha.servicename'] }} + mapred.jobtrackers.{{ hadoop['mapred_job_tracker_ha_servicename'] }} {{ groups['hadoop_masters'] | join(',') }} Comma-separated list of JobTracker IDs. @@ -18,7 +18,7 @@ mapred.ha.zkfc.port - {{ hadoop['mapred.ha.zkfc.port'] }} + {{ hadoop['mapred_ha_zkfc_port'] }} @@ -28,31 +28,31 @@ ha.zookeeper.quorum - {{ groups.zookeeper_servers | join(':' ~ hadoop['zookeeper.clientport'] + ',') }}:{{ hadoop['zookeeper.clientport'] }} + {{ groups.zookeeper_servers | join(':' ~ hadoop['zookeeper_clientport'] + ',') }}:{{ hadoop['zookeeper_clientport'] }} {% for host in groups['hadoop_masters'] %} - mapred.jobtracker.rpc-address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} - {{ host }}:{{ hadoop['mapred.job.tracker.port'] }} + mapred.jobtracker.rpc-address.{{ hadoop['mapred_job_tracker_ha_servicename'] }}.{{ host }} + {{ host }}:{{ hadoop['mapred_job_tracker_port'] }} {% endfor %} {% for host in groups['hadoop_masters'] %} - mapred.job.tracker.http.address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} - 0.0.0.0:{{ hadoop['mapred.job.tracker.http.address.port'] }} + mapred.job.tracker.http.address.{{ hadoop['mapred_job_tracker_ha_servicename'] }}.{{ host }} + 0.0.0.0:{{ hadoop['mapred_job_tracker_http_address_port'] }} {% endfor %} {% for host in groups['hadoop_masters'] %} - mapred.ha.jobtracker.rpc-address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} - {{ host }}:{{ hadoop['mapred.ha.jobtracker.rpc-address.port'] }} + mapred.ha.jobtracker.rpc-address.{{ hadoop['mapred_job_tracker_ha_servicename'] }}.{{ host }} + {{ host }}:{{ hadoop['mapred_ha_jobtracker_rpc-address_port'] }} {% endfor %} {% for host in groups['hadoop_masters'] %} - mapred.ha.jobtracker.http-redirect-address.{{ hadoop['mapred.job.tracker.ha.servicename'] }}.{{ host }} - {{ host }}:{{ hadoop['mapred.job.tracker.http.address.port'] }} + mapred.ha.jobtracker.http-redirect-address.{{ hadoop['mapred_job_tracker_ha_servicename'] }}.{{ host }} + {{ host }}:{{ hadoop['mapred_job_tracker_http_address_port'] }} {% endfor %} @@ -77,7 +77,7 @@ - mapred.client.failover.proxy.provider.{{ hadoop['mapred.job.tracker.ha.servicename'] }} + mapred.client.failover.proxy.provider.{{ hadoop['mapred_job_tracker_ha_servicename'] }} org.apache.hadoop.mapred.ConfiguredFailoverProxyProvider @@ -114,7 +114,7 @@ mapred.task.tracker.http.address - 0.0.0.0:{{ hadoop['mapred.task.tracker.http.address.port'] }} + 0.0.0.0:{{ hadoop['mapred_task_tracker_http_address_port'] }} diff --git a/hadoop/roles/common/templates/iptables.j2 b/hadoop/roles/common/templates/iptables.j2 index 2a2b368..f9814fc 100644 --- a/hadoop/roles/common/templates/iptables.j2 +++ b/hadoop/roles/common/templates/iptables.j2 @@ -1,33 +1,33 @@ # Firewall configuration written by system-config-firewall -# Manual customization of this file is not recommended. +# Manual customization of this file is not recommended_ *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] {% if 'hadoop_masters' in group_names %} --A INPUT -p tcp --dport {{ hadoop['fs.default.FS.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['dfs.namenode.http.address.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['mapred.job.tracker.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['mapred.job.tracker.http.address.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['mapred.ha.jobtracker.rpc-address.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['mapred.ha.zkfc.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['dfs.ha.zkfc.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['fs_default_FS_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs_namenode_http_address_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred_job_tracker_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred_job_tracker_http_address_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred_ha_jobtracker_rpc-address_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred_ha_zkfc_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs_ha_zkfc_port'] }} -j ACCEPT {% endif %} {% if 'hadoop_slaves' in group_names %} --A INPUT -p tcp --dport {{ hadoop['dfs.datanode.address.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['dfs.datanode.http.address.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['dfs.datanode.ipc.address.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['mapred.task.tracker.http.address.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs_datanode_address_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs_datanode_http_address_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['dfs_datanode_ipc_address_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['mapred_task_tracker_http_address_port'] }} -j ACCEPT {% endif %} {% if 'qjournal_servers' in group_names %} --A INPUT -p tcp --dport {{ hadoop['qjournal.port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['qjournal.http.port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['qjournal_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['qjournal_http_port'] }} -j ACCEPT {% endif %} {% if 'zookeeper_servers' in group_names %} --A INPUT -p tcp --dport {{ hadoop['zookeeper.clientport'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['zookeeper.leader_port'] }} -j ACCEPT --A INPUT -p tcp --dport {{ hadoop['zookeeper.election_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['zookeeper_clientport'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['zookeeper_leader_port'] }} -j ACCEPT +-A INPUT -p tcp --dport {{ hadoop['zookeeper_election_port'] }} -j ACCEPT {% endif %} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT diff --git a/hadoop/roles/hadoop_primary/tasks/hadoop_master.yml b/hadoop/roles/hadoop_primary/tasks/hadoop_master.yml index 44c13c0..67632ec 100644 --- a/hadoop/roles/hadoop_primary/tasks/hadoop_master.yml +++ b/hadoop/roles/hadoop_primary/tasks/hadoop_master.yml @@ -2,23 +2,15 @@ # Playbook for Hadoop master servers - name: Install the namenode and jobtracker packages - yum: name=${item} state=installed - with_items: - - hadoop-0.20-mapreduce-jobtracker - - hadoop-hdfs-namenode - when_set: $ha_disabled - -- name: Install the namenode and jobtracker packages - yum: name=${item} state=installed + yum: name={{ item }} state=installed with_items: - hadoop-0.20-mapreduce-jobtrackerha - hadoop-hdfs-namenode - hadoop-hdfs-zkfc - hadoop-0.20-mapreduce-zkfc - when_unset: $ha_disabled - name: Copy the hadoop configuration files - template: src=roles/common/templates/hadoop_ha_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + template: src=roles/common/templates/hadoop_ha_conf/{{ item }}.j2 dest=/etc/hadoop/conf/{{ item }} with_items: - core-site.xml - hadoop-metrics.properties @@ -29,48 +21,18 @@ - slaves - ssl-client.xml.example - ssl-server.xml.example - when_unset: $ha_disabled notify: restart hadoopha master services -- name: Copy the hadoop configuration files for no ha - template: src=roles/common/templates/hadoop_conf/${item}.j2 dest=/etc/hadoop/conf/${item} - with_items: - - core-site.xml - - hadoop-metrics.properties - - hadoop-metrics2.properties - - hdfs-site.xml - - log4j.properties - - mapred-site.xml - - slaves - - ssl-client.xml.example - - ssl-server.xml.example - when_set: $ha_disabled - notify: restart hadoop master services - - name: Create the data directory for the namenode metadata - file: path=${item} owner=hdfs group=hdfs state=directory - with_items: ${hadoop.dfs_namenode_name_dir} + file: path={{ item }} owner=hdfs group=hdfs state=directory + with_items: hadoop.dfs_namenode_name_dir - name: Create the data directory for the jobtracker ha - file: path=${item} owner=mapred group=mapred state=directory - with_items: ${hadoop.mapred_job_tracker_persist_jobstatus_dir} - when_unset: $ha_disabled - + file: path={{ item }} owner=mapred group=mapred state=directory + with_items: hadoop.mapred_job_tracker_persist_jobstatus_dir - name: Format the namenode shell: creates=/usr/lib/hadoop/namenode.formatted su - hdfs -c "hadoop namenode -format"; touch /usr/lib/hadoop/namenode.formatted - name: start hadoop namenode services - service: name=${item} state=started - with_items: - - hadoop-hdfs-namenode - -- name: Give permissions for mapred users - shell: creates=/usr/lib/hadoop/fs.initialized su - hdfs -c "hadoop fs -chown hdfs:hadoop /"; su - hdfs -c "hadoop fs -chmod 0774 /"; touch /usr/lib/hadoop/namenode.initialized - when_set: $ha_disabled - -- name: start hadoop jobtracker services - service: name=${item} state=started - with_items: - - hadoop-0.20-mapreduce-jobtracker - when_set: $ha_disabled + service: name=hadoop-hdfs-namenode state=started diff --git a/hadoop/roles/hadoop_primary/tasks/hadoop_master_no_ha.yml b/hadoop/roles/hadoop_primary/tasks/hadoop_master_no_ha.yml new file mode 100644 index 0000000..3508c92 --- /dev/null +++ b/hadoop/roles/hadoop_primary/tasks/hadoop_master_no_ha.yml @@ -0,0 +1,38 @@ +--- +# Playbook for Hadoop master servers + +- name: Install the namenode and jobtracker packages + yum: name={{ item }} state=installed + with_items: + - hadoop-0.20-mapreduce-jobtracker + - hadoop-hdfs-namenode + +- name: Copy the hadoop configuration files for no ha + template: src=roles/common/templates/hadoop_conf/{{ item }}.j2 dest=/etc/hadoop/conf/{{ item }} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + notify: restart hadoop master services + +- name: Create the data directory for the namenode metadata + file: path={{ item }} owner=hdfs group=hdfs state=directory + with_items: hadoop.dfs_namenode_name_dir + +- name: Format the namenode + shell: creates=/usr/lib/hadoop/namenode.formatted su - hdfs -c "hadoop namenode -format"; touch /usr/lib/hadoop/namenode.formatted + +- name: start hadoop namenode services + service: name=hadoop-hdfs-namenode state=started + +- name: Give permissions for mapred users + shell: creates=/usr/lib/hadoop/fs.initialized su - hdfs -c "hadoop fs -chown hdfs:hadoop /"; su - hdfs -c "hadoop fs -chmod 0774 /"; touch /usr/lib/hadoop/namenode.initialized + +- name: start hadoop jobtracker services + service: name=hadoop-0.20-mapreduce-jobtracker state=started diff --git a/hadoop/roles/hadoop_primary/tasks/main.yml b/hadoop/roles/hadoop_primary/tasks/main.yml index f8eba61..bfc20ca 100644 --- a/hadoop/roles/hadoop_primary/tasks/main.yml +++ b/hadoop/roles/hadoop_primary/tasks/main.yml @@ -1,5 +1,9 @@ --- # Playbook for Hadoop master primary servers -- include: hadoop_master.yml tags=no_ha +- include: hadoop_master.yml + when: ha_enabled + +- include: hadoop_master_no_ha.yml + when: not ha_enabled diff --git a/hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml b/hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml deleted file mode 100644 index 18de1ae..0000000 --- a/hadoop/roles/hadoop_secondary/tasks/hadoop_secondary.yml +++ /dev/null @@ -1,73 +0,0 @@ ---- -# Playbook for Hadoop master secondary server - - -- name: Install the namenode and jobtracker packages - yum: name=${item} state=installed - with_items: - - hadoop-0.20-mapreduce-jobtrackerha - - hadoop-hdfs-namenode - - hadoop-hdfs-zkfc - - hadoop-0.20-mapreduce-zkfc - -- name: Copy the hadoop configuration files - template: src=roles/common/templates/hadoop_ha_conf/${item}.j2 dest=/etc/hadoop/conf/${item} - with_items: - - core-site.xml - - hadoop-metrics.properties - - hadoop-metrics2.properties - - hdfs-site.xml - - log4j.properties - - mapred-site.xml - - slaves - - ssl-client.xml.example - - ssl-server.xml.example - when_unset: $ha_disabled - notify: restart hadoopha master services - -- name: Create the data directory for the namenode metadata - file: path=${item} owner=hdfs group=hdfs state=directory - with_items: ${hadoop.dfs_namenode_name_dir} - -- name: Create the data directory for the jobtracker ha - file: path=${item} owner=mapred group=mapred state=directory - with_items: ${hadoop.mapred_job_tracker_persist_jobstatus_dir} - - -- name: Initialize the secodary namenode - shell: creates=/usr/lib/hadoop/namenode.formatted su - hdfs -c "hadoop namenode -bootstrapStandby"; touch /usr/lib/hadoop/namenode.formatted - -- name: start hadoop namenode services - service: name=${item} state=started - with_items: - - hadoop-hdfs-namenode - -- name: Initialize the zkfc for namenode - shell: creates=/usr/lib/hadoop/zkfc.formatted su - hdfs -c "hdfs zkfc -formatZK"; touch /usr/lib/hadoop/zkfc.formatted - register: nn_result - -- name: restart zkfc for namenode - service: name=hadoop-hdfs-zkfc state=restarted - delegate_to: ${item} - with_items: ${groups.hadoop_masters} - when_set: $nn_result and $nn_result.changed - -- name: Give permissions for mapred users - shell: creates=/usr/lib/hadoop/fs.initialized su - hdfs -c "hadoop fs -chown hdfs:hadoop /"; su - hdfs -c "hadoop fs -chmod 0774 /"; touch /usr/lib/hadoop/namenode.initialized - -- name: Initialize the zkfc for jobtracker - shell: creates=/usr/lib/hadoop/zkfcjob.formatted su - mapred -c "hadoop mrzkfc -formatZK"; touch /usr/lib/hadoop/zkfcjob.formatted - register: jt_result - -- name: restart zkfc for jobtracker - service: name=hadoop-0.20-mapreduce-zkfc state=restarted - delegate_to: ${item} - with_items: ${groups.hadoop_masters} - when_set: $jt_result and $jt_result.changed - -- name: start hadoop Jobtracker services - service: name=hadoop-0.20-mapreduce-jobtrackerha state=started - delegate_to: ${item} - with_items: ${groups.hadoop_masters} - when_set: $jt_result and $jt_result.changed - diff --git a/hadoop/roles/hadoop_secondary/tasks/main.yml b/hadoop/roles/hadoop_secondary/tasks/main.yml index d58cdb9..c16d0fe 100644 --- a/hadoop/roles/hadoop_secondary/tasks/main.yml +++ b/hadoop/roles/hadoop_secondary/tasks/main.yml @@ -1,4 +1,64 @@ --- # Playbook for Hadoop master secondary server -- include: hadoop_secondary.yml + +- name: Install the namenode and jobtracker packages + yum: name=${item} state=installed + with_items: + - hadoop-0.20-mapreduce-jobtrackerha + - hadoop-hdfs-namenode + - hadoop-hdfs-zkfc + - hadoop-0.20-mapreduce-zkfc + +- name: Copy the hadoop configuration files + template: src=roles/common/templates/hadoop_ha_conf/{{ item }}.j2 dest=/etc/hadoop/conf/{{ item }} + with_items: + - core-site.xml + - hadoop-metrics.properties + - hadoop-metrics2.properties + - hdfs-site.xml + - log4j.properties + - mapred-site.xml + - slaves + - ssl-client.xml.example + - ssl-server.xml.example + notify: restart hadoopha master services + +- name: Create the data directory for the namenode metadata + file: path={{ item }} owner=hdfs group=hdfs state=directory + with_items: hadoop.dfs_namenode_name_dir + +- name: Create the data directory for the jobtracker ha + file: path={{ item }} owner=mapred group=mapred state=directory + with_items: hadoop.mapred_job_tracker_persist_jobstatus_dir + + +- name: Initialize the secodary namenode + shell: creates=/usr/lib/hadoop/namenode.formatted su - hdfs -c "hadoop namenode -bootstrapStandby"; touch /usr/lib/hadoop/namenode.formatted + +- name: start hadoop namenode services + service: name=hadoop-hdfs-namenode state=started + +- name: Initialize the zkfc for namenode + shell: creates=/usr/lib/hadoop/zkfc.formatted su - hdfs -c "hdfs zkfc -formatZK"; touch /usr/lib/hadoop/zkfc.formatted + +- name: start zkfc for namenodes + service: name=hadoop-hdfs-zkfc state=started + delegate_to: ${item} + with_items: groups.hadoop_masters + +- name: Give permissions for mapred users + shell: creates=/usr/lib/hadoop/fs.initialized su - hdfs -c "hadoop fs -chown hdfs:hadoop /"; su - hdfs -c "hadoop fs -chmod 0774 /"; touch /usr/lib/hadoop/namenode.initialized + +- name: Initialize the zkfc for jobtracker + shell: creates=/usr/lib/hadoop/zkfcjob.formatted su - mapred -c "hadoop mrzkfc -formatZK"; touch /usr/lib/hadoop/zkfcjob.formatted + +- name: start zkfc for jobtracker + service: name=hadoop-0.20-mapreduce-zkfc state=started + delegate_to: ${item} + with_items: groups.hadoop_masters + +- name: start hadoop Jobtracker services + service: name=hadoop-0.20-mapreduce-jobtrackerha state=started + delegate_to: ${item} + with_items: groups.hadoop_masters diff --git a/hadoop/roles/hadoop_slaves/tasks/main.yml b/hadoop/roles/hadoop_slaves/tasks/main.yml index 5294ab4..9056ea2 100644 --- a/hadoop/roles/hadoop_slaves/tasks/main.yml +++ b/hadoop/roles/hadoop_slaves/tasks/main.yml @@ -1,4 +1,4 @@ --- # Playbook for Hadoop slave servers -- include: slaves.yml tags=slaves,no_ha +- include: slaves.yml tags=slaves diff --git a/hadoop/roles/hadoop_slaves/tasks/slaves.yml b/hadoop/roles/hadoop_slaves/tasks/slaves.yml index 0856f0c..2807bac 100644 --- a/hadoop/roles/hadoop_slaves/tasks/slaves.yml +++ b/hadoop/roles/hadoop_slaves/tasks/slaves.yml @@ -19,7 +19,7 @@ - slaves - ssl-client.xml.example - ssl-server.xml.example - when_unset: $ha_disabled + when: ha_enabled notify: restart hadoop slave services - name: Copy the hadoop configuration files for non ha @@ -34,19 +34,19 @@ - slaves - ssl-client.xml.example - ssl-server.xml.example - when_set: $ha_disabled + when: not ha_enabled notify: restart hadoop slave services - name: Create the data directory for the slave nodes to store the data - file: path=${item} owner=hdfs group=hdfs state=directory - with_items: ${hadoop.dfs_datanode_data_dir} + file: path={{ item }} owner=hdfs group=hdfs state=directory + with_items: hadoop.dfs_datanode_data_dir - name: Create the data directory for the slave nodes for mapreduce - file: path=${item} owner=mapred group=mapred state=directory - with_items: ${hadoop.mapred_local_dir} + file: path={{ item }} owner=mapred group=mapred state=directory + with_items: hadoop.mapred_local_dir - name: start hadoop slave services - service: name=${item} state=restarted + service: name={{ item }} state=started with_items: - hadoop-0.20-mapreduce-tasktracker - hadoop-hdfs-datanode diff --git a/hadoop/roles/qjournal_servers/tasks/main.yml b/hadoop/roles/qjournal_servers/tasks/main.yml index 347bb10..86fa9e3 100644 --- a/hadoop/roles/qjournal_servers/tasks/main.yml +++ b/hadoop/roles/qjournal_servers/tasks/main.yml @@ -5,10 +5,10 @@ yum: name=hadoop-hdfs-journalnode state=installed - name: Create folder for Journaling - file: path=${hadoop.dfs_journalnode_edits_dir} state=directory owner=hdfs group=hdfs + file: path={{ hadoop.dfs_journalnode_edits_dir }} state=directory owner=hdfs group=hdfs - name: Copy the hadoop configuration files - template: src=roles/common/templates/hadoop_ha_conf/${item}.j2 dest=/etc/hadoop/conf/${item} + template: src=roles/common/templates/hadoop_ha_conf/{{ item }}.j2 dest=/etc/hadoop/conf/{{ item }} with_items: - core-site.xml - hadoop-metrics.properties @@ -19,20 +19,4 @@ - slaves - ssl-client.xml.example - ssl-server.xml.example - when_unset: $ha_disabled - notify: restart qjournal services - -- name: Copy the non ha hadoop configuration files - template: src=roles/common/templates/hadoop_conf/${item}.j2 dest=/etc/hadoop/conf/${item} - with_items: - - core-site.xml - - hadoop-metrics.properties - - hadoop-metrics2.properties - - hdfs-site.xml - - log4j.properties - - mapred-site.xml - - slaves - - ssl-client.xml.example - - ssl-server.xml.example - when_set: $ha_disabled notify: restart qjournal services diff --git a/hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 b/hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 index 540f894..a5e3f9f 100644 --- a/hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 +++ b/hadoop/roles/zookeeper_servers/templates/zoo.cfg.j2 @@ -1,9 +1,9 @@ tickTime=2000 dataDir=/var/lib/zookeeper/ -clientPort={{ hadoop['zookeeper.clientport'] }} +clientPort={{ hadoop['zookeeper_clientport'] }} initLimit=5 syncLimit=2 {% for host in groups['zookeeper_servers'] %} -server.{{ hostvars[host].zoo_id }}={{ host }}:{{ hadoop['zookeeper.leader_port'] }}:{{ hadoop['zookeeper.election_port'] }} +server.{{ hostvars[host].zoo_id }}={{ host }}:{{ hadoop['zookeeper_leader_port'] }}:{{ hadoop['zookeeper_election_port'] }} {% endfor %} diff --git a/hadoop/roles/zookeeper_servers/vars/main.yml b/hadoop/roles/zookeeper_servers/vars/main.yml deleted file mode 100644 index 32486ad..0000000 --- a/hadoop/roles/zookeeper_servers/vars/main.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# Vars for Zookeeper - -clientport: 2181 -leader_port: 2888 -election_port: 3888 diff --git a/hadoop/site.yml b/hadoop/site.yml index 3f3f532..59a075f 100644 --- a/hadoop/site.yml +++ b/hadoop/site.yml @@ -3,39 +3,27 @@ - hosts: all - vars_files: - - hadoop_vars/hadoop roles: - common - hosts: zookeeper_servers - vars_files: - - hadoop_vars/hadoop roles: - - zookeeper_servers + - { role: zookeeper_servers, when: ha_enabled } - hosts: qjournal_servers - vars_files: - - hadoop_vars/hadoop roles: - - qjournal_servers + - { role: qjournal_servers, when: ha_enabled } - hosts: hadoop_master_primary - vars_files: - - hadoop_vars/hadoop roles: - - hadoop_primary + - { role: hadoop_primary } - hosts: hadoop_master_secondary - vars_files: - - hadoop_vars/hadoop roles: - - hadoop_secondary + - { role: hadoop_secondary, when: ha_enabled } - hosts: hadoop_slaves - vars_files: - - hadoop_vars/hadoop roles: - - hadoop_slaves + - { role: hadoop_slaves } From f5b5f656bc37f58622abb48f95996a0ac02c10b5 Mon Sep 17 00:00:00 2001 From: bennojoy Date: Tue, 16 Apr 2013 17:21:17 +0530 Subject: [PATCH 13/22] readme updated --- hadoop/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hadoop/README.md b/hadoop/README.md index 601a3df..d69cda3 100644 --- a/hadoop/README.md +++ b/hadoop/README.md @@ -170,6 +170,9 @@ To deploy this cluster fill in the inventory file as follows: hadoop2 hadoop3 + [qjournal_servers] + [zookeeper_servers] + and edit the group_vars/all file to disable HA: ha_enabled: False From 34fb6ef9031e6c51c8a04ea59b6655def525765e Mon Sep 17 00:00:00 2001 From: bennojoy Date: Tue, 16 Apr 2013 18:46:51 +0530 Subject: [PATCH 14/22] fix delegate_to for jinja --- hadoop/README.md | 3 --- hadoop/group_vars/all | 6 +++--- hadoop/roles/hadoop_secondary/tasks/main.yml | 4 ++-- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/hadoop/README.md b/hadoop/README.md index d69cda3..601a3df 100644 --- a/hadoop/README.md +++ b/hadoop/README.md @@ -170,9 +170,6 @@ To deploy this cluster fill in the inventory file as follows: hadoop2 hadoop3 - [qjournal_servers] - [zookeeper_servers] - and edit the group_vars/all file to disable HA: ha_enabled: False diff --git a/hadoop/group_vars/all b/hadoop/group_vars/all index 8e902a1..4c3886d 100644 --- a/hadoop/group_vars/all +++ b/hadoop/group_vars/all @@ -1,13 +1,13 @@ iface: eth1 -ha_enabled: False +ha_enabled: True hadoop: #Variables for - common fs_default_FS_port: 8020 - nameservice_id: mycluster3 + nameservice_id: mycluster4 #Variables for @@ -34,7 +34,7 @@ hadoop: zookeeper_election_port: 3888 #Variables for - common - mapred_job_tracker_ha_servicename: myjt3 + mapred_job_tracker_ha_servicename: myjt4 mapred_job_tracker_http_address_port: 50030 mapred_task_tracker_http_address_port: 50060 mapred_job_tracker_port: 8021 diff --git a/hadoop/roles/hadoop_secondary/tasks/main.yml b/hadoop/roles/hadoop_secondary/tasks/main.yml index c16d0fe..4836c45 100644 --- a/hadoop/roles/hadoop_secondary/tasks/main.yml +++ b/hadoop/roles/hadoop_secondary/tasks/main.yml @@ -55,10 +55,10 @@ - name: start zkfc for jobtracker service: name=hadoop-0.20-mapreduce-zkfc state=started - delegate_to: ${item} + delegate_to: '{{ item }}' with_items: groups.hadoop_masters - name: start hadoop Jobtracker services service: name=hadoop-0.20-mapreduce-jobtrackerha state=started - delegate_to: ${item} + delegate_to: '{{ item }}' with_items: groups.hadoop_masters From 0defd33f42d14430bed704f53c452aaac64f12fa Mon Sep 17 00:00:00 2001 From: bennojoy Date: Wed, 17 Apr 2013 21:16:45 +0530 Subject: [PATCH 15/22] mongod 1.2 update --- mongodb/README.md | 97 ++++++++++++------ mongodb/group_vars/all | 8 +- mongodb/hosts | 35 +++---- mongodb/images/check.png | Bin 0 -> 184558 bytes mongodb/images/nosql_primer.png | Bin 0 -> 185485 bytes mongodb/images/replica_set.png | Bin 0 -> 144874 bytes mongodb/images/scale.png | Bin 0 -> 437275 bytes mongodb/images/sharding.png | Bin 0 -> 243335 bytes mongodb/images/site.png | Bin 0 -> 426155 bytes mongodb/playbooks/addnode.yml | 13 --- mongodb/playbooks/addshard.yml | 9 -- mongodb/playbooks/common.yml | 10 -- mongodb/playbooks/mongoc.yml | 7 -- mongodb/playbooks/mongod.yml | 7 -- mongodb/playbooks/mongos.yml | 7 -- mongodb/playbooks/nodes.yml | 13 +++ mongodb/playbooks/test.yml | 6 -- mongodb/roles/common/tasks/main.yml | 19 ++-- mongodb/roles/common/templates/epel.repo.j2 | 26 +++++ mongodb/roles/common/templates/hosts.j2 | 2 +- mongodb/roles/common/templates/iptables.j2 | 8 +- mongodb/roles/mongoc/tasks/main.yml | 11 +- mongodb/roles/mongoc/templates/mongoc.j2 | 2 +- mongodb/roles/mongod/tasks/addshard.yml | 15 --- mongodb/roles/mongod/tasks/main.yml | 28 ++--- mongodb/roles/mongod/tasks/shards.yml | 15 +++ mongodb/roles/mongod/templates/mongod.j2 | 2 +- mongodb/roles/mongod/templates/repset_init.j2 | 2 +- mongodb/roles/mongos/tasks/main.yml | 10 +- mongodb/roles/mongos/templates/mongos.conf.j2 | 2 +- mongodb/roles/mongos/templates/mongos.j2 | 2 +- mongodb/site.yml | 22 +++- 32 files changed, 199 insertions(+), 179 deletions(-) create mode 100644 mongodb/images/check.png create mode 100644 mongodb/images/nosql_primer.png create mode 100644 mongodb/images/replica_set.png create mode 100644 mongodb/images/scale.png create mode 100644 mongodb/images/sharding.png create mode 100644 mongodb/images/site.png delete mode 100644 mongodb/playbooks/addnode.yml delete mode 100644 mongodb/playbooks/addshard.yml delete mode 100644 mongodb/playbooks/common.yml delete mode 100644 mongodb/playbooks/mongoc.yml delete mode 100644 mongodb/playbooks/mongod.yml delete mode 100644 mongodb/playbooks/mongos.yml create mode 100644 mongodb/playbooks/nodes.yml delete mode 100644 mongodb/playbooks/test.yml create mode 100644 mongodb/roles/common/templates/epel.repo.j2 delete mode 100644 mongodb/roles/mongod/tasks/addshard.yml create mode 100644 mongodb/roles/mongod/tasks/shards.yml diff --git a/mongodb/README.md b/mongodb/README.md index 9926d1e..b487f4b 100644 --- a/mongodb/README.md +++ b/mongodb/README.md @@ -1,80 +1,106 @@ -Deploying a shared production ready MongoDB cluster with Ansible +##Deploying a sharded production ready MongoDB cluster with Ansible ------------------------------------------------------------------------------ -In this example we demonstrate how we can orchestrate the deployment of a production grade MongoDB Cluster. The functionality of this example includes: +####A Primer into the MongoDB NoSQL database. -1) Deploying a N node MongoDB cluster, which has N shards and N replication nodes. +![Alt text](/images/nosql_primer.png "Primer NoSQL") -2) Scale out capability. Expand the Cluster by adding nodes to the cluster. +The above diagram shows how the MongoDB nosql differs from the traditional relational database model. In RDBMS the data of a user is stored in table and the records of users are stored in rows/columns, While in mongodb the 'table' is replaced by 'collection' and the individual 'records' are called 'documents'. +One thing also to be noticed is that the data is stored as key/value pairs in BJSON format. -3) Security, All the mongodb process are secured using the best practices. +Another thing to be noticed is that nosql has a looser consistency model, as an example the second document in the users collection has an additonal field of 'last name'. Due to this flexibility the nosql database model can give us: -###Deployment Architecture. +Better Horizontal scaling capability. -To better explain the deployment architecture let's take an example where we are deploying a 3 node MongoDB cluster ( Minimum recommended by MongoDB). +Also mongodb has inbuilt support for -The way Ansible configures the three nodes is as follows: +Data Replication & HA -1) Install the mongodb software on all nodes. +Which makes it good choice for users who have very large data to handle and less requirement for ACID. + + +#### MongoDB's Data replication . + +![Alt text](/images/replica_set.png "Replica Set") + + +Data backup is achieved in Mongodb via Replica sets. As the figure above show's a single replication set consists of a replication master (active) and several other replications slaves (passive). All the database operations like Add/Delete/Update happens on the replication master and the master replicates the data to the slave nodes. mongod is the process which is resposible for all the database activities as well as replication processes. The minimum recommended number of slave servers are 3. -2) Creates 3 replication sets, with one primary on each node and the rest two acting as secondaries. -3) Configures MongodDB configuration DB servers as listed in the inventory section[mongocservers]. Recommended number is 3, so it can be the same three servers as the datanodes. +#### MongoDB's Sharding (Horizontal Scaling) . -4) Configures a Mongos server as listed in the inventory file [mongosservers]. +![Alt text](/images/Sharding.png "Sharding") -5) Adds 3 Shards each belonging to individual replication sets. +Sharding allows to achieve a very high performing database, by partioning the data into seperate chunks and allocating diffent ranges of chunks to diffrent shard servers. The figure above shows a collection which has 90 documents which has been sharded across the three shard server, The first shard getting ranges from 1- 29 etc... . When a client wants to access a certian document it contacts the query router (mongos process), which inturn would contact the 'configuration node' (lightweight mongod process) which keeps a record of which ranges of chunks are distributed across which shards. -6) All the processes, mongod,mogos are secured using the keyfiles. +Please do note that every shard server should be backed by a replica set, so that when data is written/queried copies of the data are available. So in a three shard deployment we would require 3 replica sets and primaries of each would act as the sharding server. -Once the cluster is deployed, if we want to scale the cluster, Ansible configures it as follows: +Here's a basic steps of how sharding works. -1) Install the MongoDB application on the new node. +1) A new database is created, and collections are added. -2) Configure the replication set with primary as the new node and the secondaries as listed in the inventory file [replicationservers]. ( don't forget to add the new node also in the replicationservers section] +2) New documents get updated as an when clients update, all the new documents goes into a single shard. -3) Adds a new shard to the mongos service pointing to the new replication set. +3) when the size of collection in a shard exceeds the 'chunk_size' the collection is split and balanced across shards. -#### Pre-requisite +##Deploy MongoDB cluster via Ansible. +-------------------------------------------- -1) Update the group_vars/all file which contains site specific parmaters, especially the section which contains the mapping of the hostname's and the ports that it should use for the mongod process. Please do make sure the ansible hostname matches the same. Also dont forget to add the variable when adding a new node. +### Deploy the Cluster. -2) The default directory for storing data is /data, please do change it if requried, also make sure it has sufficient space 10G recommended. +![Alt text](/images/site.png "Site") + +The above diagram illustrates the deployment model for mongodb cluster via Ansible, This deployment models focuses on deploying a three shard servers, each having a replica set, the backup replica servers are other two shard primaries. The configuration server are co-located with the shard's. The mongos servers are best deployed on seperate servers. These are the minimum recomended configuration for a production grade mongodb deployment. +Please note that the playbooks are capable of deploying N node cluster not necesarily three. Also all the processes are secured using keyfiles. + +####Pre-Requisite's + +Edit the group_vars/all file to reflect the below variables. + +1) iface: 'eth1' # the interface to be used for all communication. +2) mongod_ports: # The hostname and tcp/ip port combination. + mongo1: 2700 + mongo2: 2701 + mongo3: 2702 + +3) The default directory for storing data is /data, please do change it if requried, also make sure it has sufficient space 10G recommended. -###The following example deploys a three node MongoDB Cluster +###Once the pre-requisite's have been done, we can procced with the site deployment. The following example deploys a three node MongoDB Cluster The inventory file looks as follows: #The site wide list of mongodb servers - [mongoservers] + [mongo_servers] mongo1 mongo2 mongo3 #The list of servers where replication should happen, including the master server. - [replicationservers] + [replication_servers] mongo1 mongo2 mongo3 #The list of mongodb configuration servers, make sure it is 1 or 3 - [mongocservers] + [mongoc_servers] mongo1 mongo2 mongo3 #The list of servers where mongos servers would run. [mongosservers] - mongos + mongos1 + mongos2 Build the site with the following command: ansible-playbook -i hosts site.yml + ###Verifying the deployed MongoDB Cluster -Once completed we can check replication set availibitly by connecting to individual primary replication set nodes, 'mongo --host --port +Once completed we can check replication set availibitly by connecting to individual primary replication set nodes, 'mongo --host 192.168.1.1 --port 2700 and issue the command to query the status of replication set, we should get a similar output. @@ -112,7 +138,7 @@ and issue the command to query the status of replication set, we should get a si } -we can check the status of the Shards as follows: connect to the mongos service 'mongos --host --port 8888' +we can check the status of the Shards as follows: connect to the mongos service 'mongos --host 192.168.1.1 --port 8888' and issue the following command to get the status of the Shards. @@ -127,7 +153,10 @@ and issue the following command to get the status of the Shards. { "_id" : "admin", "partitioned" : false, "primary" : "config" } -###We can also make sure the Sharding works by creating a database,collection and populate it with documents and check if the chunks of the collection are balanced equally across nodes. +###We can also make sure the Sharding works by creating a database,collection and populate it with documents and check if the chunks of the collection are balanced equally across nodes. The below diagram illustrates the verification step. + + +![Alt text](/images/check.png "check") The above mentioned steps can be tested with an automated playbook. @@ -158,7 +187,9 @@ Once the playbook completes, we check if the shadring has succeded by logging on -### Adding a new node to the Cluster +### Scaling the Cluster + +![Alt text](/images/scale.png "scale") To add a new node to the configured MongoDb Cluster, setup the inventory file as follows: @@ -172,6 +203,7 @@ To add a new node to the configured MongoDb Cluster, setup the inventory file as #The list of servers where replication should happen, make sure the new node is listed here. [replicationservers] mongo4 + mongo3 mongo1 mongo2 @@ -183,11 +215,12 @@ To add a new node to the configured MongoDb Cluster, setup the inventory file as #The list of servers where mongos servers would run. [mongosservers] - mongos + mongos1 + mongos2 Make sure you have the new node added in the replicationservers section and execute the following command: - ansible-playbook -i hosts playbooks/addnode.yml -e servername=mongo4 + ansible-playbook -i hosts site.yml ###Verification. diff --git a/mongodb/group_vars/all b/mongodb/group_vars/all index 9dc45f2..6fd5474 100644 --- a/mongodb/group_vars/all +++ b/mongodb/group_vars/all @@ -19,8 +19,8 @@ iface: eth1 mongo_admin_pass: 123456 mongod_ports: - bensible: 2700 - web2: 2701 - web3: 2702 - web4: 2703 + hadoop1: 2700 + hadoop2: 2701 + hadoop3: 2702 + hadoop4: 2703 diff --git a/mongodb/hosts b/mongodb/hosts index fddf4b2..821d246 100644 --- a/mongodb/hosts +++ b/mongodb/hosts @@ -1,29 +1,28 @@ #The site wide list of mongodb servers -[mongoservers] -web2 -web3 -web4 -bensible - +[mongo_servers] +hadoop1 +hadoop2 +hadoop3 +hadoop4 #The list of servers where replication should happen, by default include all servers -[replicationservers] -bensible -web2 -web3 - +[replication_servers] +hadoop1 +hadoop2 +hadoop3 +hadoop4 #The list of mongodb configuration servers, make sure it is 1 or 3 -[mongocservers] -web4 -web2 -web3 +[mongoc_servers] +hadoop1 +hadoop2 +hadoop3 #The list of servers where mongos servers would run. -[mongosservers] -web4 -web3 +[mongos_servers] +hadoop1 +hadoop2 diff --git a/mongodb/images/check.png b/mongodb/images/check.png new file mode 100644 index 0000000000000000000000000000000000000000..51867e3b9ce5431f175645ddb11d7972cd4a4637 GIT binary patch literal 184558 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