TL;DR: Copy this script to
/etc/init and run
start n1ql from the command line to start N1QL as a service.
The 3rd developer preview of N1QL, the new Couchbase query language, has been out for a while now and I've seen several clients developing code for N1QL already. The one compaint they all had was that it doesn't come with a convenient installer that would set it up on their dev/CI/production environments. (Well, actually, clients always complain about everything, but this is what we're solving today.) Obviously, in the production release it will be part of Couchbase Server itself, but for now we have to run it as a separate service.
Setting up N1QL as a service on Linux is actually quite simple, since pretty much every disto these days uses Upstart as its init daemon.
Note that the new 2.0 generation of Couchbase SDKs assumes that the cbq (N1QL) service is running on every Couchbase node in the cluster, so you'll need to repeat the following process on every node.
First, download and extract N1QL DP3 somewhere on your system, for example into
Next, create a file named
n1ql.conf in your
/etc/init folder with the following content:
#!upstart description "N1QL Service" author "David Ostrovsky" start on stopped rc RUNLEVEL= respawn script export HOME="/root" echo $$ > /var/run/n1ql.pid exec /opt/n1ql/cbq-engine -couchbase http://localhost:8091 >> /var/log/n1ql.sys.log 2>&1 end script pre-start script # Date format same as (new Date()).toISOString() for consistency echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/n1ql.sys.log end script pre-stop script rm /var/run/n1ql.pid echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/n1ql.sys.log end script post-stop exec sleep 5
We want to start the N1QL service only after Couchbase Server starts. However, because Couchbase still uses the old SysV init stript, we can't configure our Upstart service to start and stop N1QL depending on the status of the Couchbase service itself. The best we can do is start N1QL after all the SysV scripts have finished executing, which is what
start on stopped rc RUNLEVEL= does. We also tell it to
respawn if the process exits with a non-zero error code, because even if the Couchbase init script has finished, the server might not be accepting connections just yet, so Upstart will keep trying until cbq-engine connects. Remember to replace the path to cbq-engine in the script with the correct location on your system.
You can now start the N1QL service from the command line:
Unsurprisingly, to stop the service run:
To check its status:
It will also persist through reboots, so give that a try (extra points for doing it on the production system!) If you run into any issues, whether on start or at runtime, check the N1QL service log, which is set to
/var/log/n1ql.sys.log in the example script.
With the service running, you can use N1QL from your application code through the SDK, or from the command line shell that comes with the developer preview:
Important note: If you're using Couchbase Server 3.0.x, before you can run N1QL queries, you have to create the primary index for every bucket you intend to query. To do so, either run the following command in the cbq shell:
CREATE PRIMARY INDEX ON <bucket>
Or use the HTTP API (the query has to be URL encoded):
That's it. Go forth and query all the things!
PS - Thanks to Tim Smart for the pre and post start log file idea, which I shamelessly "borrowed". Read the rest of his blog to learn how to use Monit to monitor the service and restart it if the process stops responding for any reason.