Skip to content
Educational Kubernetes-native NoSQL datastore using StatefulSet and persistent volumes
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
Gopkg.toml inits code base Jun 19, 2018
Makefile fixes readiness probe logic Jun 19, 2018
app.yaml fixes readiness probe logic Jun 19, 2018
main.go fixes readiness probe logic Jun 19, 2018


This is mehdb, an educational Kubernetes-native NoSQL data store. It is not meant for production usage but purely to learn and experiment with StatefulSets.


Deploy it:

$ kubectl create ns mehdb
$ kubectl -n=mehdb apply -f app.yaml

Access it from within the cluster:

$ kubectl -n=mehdb run -i -t --rm jumpod --restart=Never -- sh
$ echo "test data" > /tmp/test
$ curl -L -XPUT -T /tmp/test mehdb:9876/set/test
$ curl mehdb:9876/get/test
$ curl mehdb-1.mehdb:9876/get/test

Scale to 3 shards (1 leader, 2 followers):

$ kubectl -n=mehdb scale sts mehdb --replicas=4

Clean up:

$ kubectl -n=mehdb delete sts/mehdb
$ kubectl -n=mehdb delete pvc/data-mehdb-0
$ kubectl -n=mehdb delete pvc/data-mehdb-1
$ kubectl -n=mehdb delete svc/mehdb

Note: I tested it in OpenShift Online with Kubernetes in version 1.9 and the setup assumes that a storage class ebs exists.


Once deployed you can use mehdb to store and retrieve data. Keep the following in mind:

  • The keys are restricted, that is, they must match [a-z]+. For example, abc is a valid key, 123 or _mykey42 is not.
  • The leader shard accepts both reads and writes, a follower shard will redirect to the leader shard if you attempt a write operation.

The following public endpoints are available:

/get/$KEY … a HTTP GET at this endpoint retrieves the payload available under the key $KEY or a 404 if the key does not exist.

/set/$KEY … a HTTP PUT at this endpoint stores the payload provided under the key $KEY.

/status … by default returns a 200 and the role (leader or follower), which can be used for a liveness probe, with ?level=full it returns a 200 and the number of keys it can serve, which can be used for a readiness probe.

Local development

Run a leader shard like so:

$ MEHDB_HOST=mehdb-0 MEHDB_PORT=9999 go run main.go

Run a follower shard like so:

$ MEHDB_LOCAL=yes MEHDB_DATADIR=./follower-data go run main.go

Now you can for example write to and/or read from the leader:

$ http PUT localhost:9999/set/abc < test/somedata
$ http localhost:9999/get/abc

Also, you can read from the follower:

$ http localhost:9876/get/abc

If you try to write to the follower, you'll be redirected:

$ http PUT localhost:9876/set/abc < test/somedata
HTTP/1.1 307 Temporary Redirect
Content-Length: 0
Date: Tue, 19 Jun 2018 12:28:57 GMT
Location: http://localhost:9999/set/abc
You can’t perform that action at this time.