Adobe Experience Manager 6 with a MongoDB Setup

With AEM 6 the persistence layer which is used to store content, configurations, and program code, is called a MicroKernel (MK). AEM 6 introduced a new MicroKernel and here's what you should know.

AEM 6 introduced a new MicroKernel (MongoMK) which allows the use of MongoDB as a repository. Further MicroKernels may be added along the line but are not fully confirmed yet. In this article we will be looking at a very basic local MongoDB setup.

A simple and local MongoDB with AEM

Requirements:

  • Linux or Mac
  • Java 7 (preferably JDK and possibly from Oracle so you can make full use of JMX)
  • An AEM 6 license
  • An AEM 6 crx-quickstart jar
  • The mongodb binaries (linked below)

Follow the steps below to get an AEM author (or publish) up and running using a local MongoDB


1. Prepare a folder structure (sample) as below

  1. ./aem_600_mongodb
    ./aem_600_mongodb/mongodb
    ./aem_600_mongodb/mongodb/data
    ./aem_600_mongodb/mongodb/logs

2. Download MongoDB for Mac OSX or other OS (configs in this guide also work with Linux)

http://www.mongodb.org/downloads

3. extract the packages content directly into the mongodb directory as created under point 1. -> ( ./aem_600_mongodb/mongodb/bin should then exist )

4. in your mongodb directory, parallel to the data & logs & bin directory create the mongod.cfg file

mongod.cfg 

bind_ip = 127.0.0.1
port = 27017
quiet = false
dbpath = ../data
logpath = ../logs/mongod.log
logappend = true
journal = true
directoryperdb = true
rest = true
httpinterface = true

5. now place your license.properties & AEM 6 quickstart jar in your base directory (in this case ./aem_600_mongodb)

6. extract the AEM 6 jar file (java -jar aem-6.0.0.20140515.jar -unpack)

7. edit the start script under ./aem_600_mongodb/crx-quickstart/bin and add the following properties

CQ_RUNMODE='author,crx3mongo' -> crx3mongo is added here
CQ_JVM_OPTS='-server -Xmx1024m -XX:MaxPermSize=256M -Djava.awt.headless=true -Doak.mongo.uri=mongodb://localhost:27017' -> -Doak.mongo.uri=mongodb://localhost:27017 is added here

8. once the above steps are completed go to your bin directory in your mongodb directory and start mongo db & tail the log

./mongod --config ../mongod.cfg && tail -f ../logs/mongod.log

9. now start your AEM from the ../crx-quickstart/bin directory and tail the log 

./start && tail -f ../error.log

10. once your AEM is started and everything has been created you got an AEM running on MongoDB

11. for administration purposes have a look at using the robomongo app: http://robomongo.org/

The Adobe documentation and MongoDB documentation is your best bet for further details.

Setup a replica set

A. Change mongod.cfg
 

bind_ip = mongotest
port = 27017
quiet = false
dbpath = ../data
logpath = ../logs/mongod.log
logappend = true
journal = true
directoryperdb = true
rest = true
httpinterface = true

B. Modify /etc/hosts
 

172.32.10.10 mongotest

C. Start Mongo with Option --replSet
 

./mongod --replSet "rs0" --config ../mongod.cfg

D. Open Mongo Console
 

./mongo 192.168.36.72 
rs.initiate()
rs.conf()
{
        "_id" : "rs0",
        "version" : 1,
        "members" : [
            {
                "_id" : 1,
                "host" : "mongotest:27017"
            }
        ]
}
rs.add(mongotest2)
rs.status()
{
        "set" : "rs0",
        "date" : ISODate("2014-07-21T16:45:15Z"),
        "myState" : 1,
        "members" : [
            {
                "_id" : 0,
                "name" : "mongotest:27017",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 5559,
                "optime" : Timestamp(1405961115, 1),
                "optimeDate" : ISODate("2014-07-21T16:45:15Z"),
                "electionTime" : Timestamp(1405955596, 2),
                "electionDate" : ISODate("2014-07-21T15:13:16Z"),
                "self" : true
            },
            {
                "_id" : 3,
                "name" : "mongotest2:27017",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 3445,
                "optime" : Timestamp(1405961115, 1),
                "optimeDate" : ISODate("2014-07-21T16:45:15Z"),
                "lastHeartbeat" : ISODate("2014-07-21T16:45:15Z"),
                "lastHeartbeatRecv" : ISODate("2014-07-21T16:45:15Z"),
                "pingMs" : 4,
                "syncingTo" : "mongotest:27017"
            },
        ],
        "ok" : 1
}

Failover logic with a MongoDB replica set

 

  • The logic for the actual failover needs to be defined in a separate layer, in this case in the Load Balancer.
  • This makes the setup a bit more complex but also offers you a bit more flexibility as you can do some fancy setups.
  • To make it work overall you are required to have a virtual IP located in front of the AEM and a separate virtual IP in front of the Mongo Replica Set.
  • In general the logic won't differ too much from a CRX2 cluster setup except that you introduce a second Loadbalancer, as seen above.
  • This one sits between the AEM and MongoDB to handle connections in case a Primary node drops out of the pool.
  • In any case you are required to also have an Arbiter node or a 3rd MongoDB also acting as a secondary. This is required due to the nature of the MongoDB Primary node election process.

 

Next Blog Post

by Christine Hart

Digital Strategy,  Developer

Avoid Ambiguous Requirements, See Unicorns

These are 7 steps to avoid the ambiguous requirement and maybe see a unicorn. "The perfect requirement is like a unicorn. You really wish it existed, but it doesn't. Get over it."

Read more...
Stephan Becker