by Rinat Abdullin
During the last week at HPC my focus has been on FoundationDB. FDB is a nice NoSQL database which has a bunch of great properties:
- It stores key-value pairs of bytes, where keys are always sorted. You have usual
GET/SET/DELETEoperations along with range operations that come from sorted key nature
- Multiple key operations can happen in a transaction
- Many advanced operations can be implemented as Layers on top of that storage abstraction. There is even a SQL layer for that.
- FDB scales nicely as you add new nodes to the cluster
- Cluster of up to 6 nodes can be used for free in production
- We (or Tomas, to be more precise :]) managed to get 75k write transactions out of a small cluster we setup at the digital Ocean
- Setting up a cluster is a no-brainer even for a Linux noob like me
- FDB handles load distribution automatically, it moves data as necessary, too
- FDB has client libraries for python, golang, erlang, Node.js and even .NET
- Their team is extremely helpful and humble
- You can configure level of replication (e.g.: single, double, triple) before write is ACKed
- FDB can be configured to store views in memory or on disk, transaction store is always durable
I personally really like that FDB is extremely opinionated about what it does (just a replicated transactional key-value storage), but it does this extremely well so far.
We are planning to use FDB as our event store and for persisting view models (which will be replicated across the cluster). I’m actually the one having fun with that implementation. Event Storage itself is a simple abstraction, however making implementation work properly with FDB key-value storage is something that requires better insight into inner workings of FDB. Plus, I get to do that in a go language.
My next week will focus on getting our full planned stack to play together (in an extremely jacky way), so that we could start developing components for the HPC2.
PS: my current development environment looks like this (Ubuntu LTS + “awesome” tiling manager + sublime + GoSublime):