There are some neat little libraries that help with this in Clojure. The basic idea is that when you introduce changes through transactions, the actual transaction (code) is appended to disk (which is very fast), and this becomes your "database" file. So, what is persisted is just a list of state changes that are "replayed" to restore state.
The individual transactions could also easily be distributed to multiple nodes via a message queue.
The individual transactions could also easily be distributed to multiple nodes via a message queue.