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 --image=quay.io/mhausenblas/jump:0.2 -- 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.
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