OVO is an In-Memory Distributed Cache and a Key/Value Storage.

ovo

OVO is an In-Memory Distributed Cache and a Key/Value Storage.

Main features

OVO is a distributed in-memory cache that supports data sharding on multiple instances and data replication. OVO offers these features:

  • Multi-Master cluster architecture
  • The nodes can be added and removed without stopping the cluster
  • Data are replicated on many nodes if the cluster is configured for replication (Twin nodes)
  • Keys are strings but every kind of data values can be stored (JSON documents, XML, images, byte arrays, ...)
  • Auto-expiration, data will be automatically removed from the storage if the TTL of the object is setted
  • Atomic counters
  • OVO supports data sharding on many cluster nodes using smart clients

The project is under development.

Building OVO

Latest Build

Build Status

Build Commands

$ go get github.com/maxzerbini/ovo
$ go build -i github.com/maxzerbini/ovo

Starting OVO

Start a single node

$ ovo

Start a three node cluster

$ ovo -conf=./conf/serverconf.json

$ ovo -conf=./conf/serverconf2.json

$ ovo -conf=./conf/serverconf3.json

Node configuration

The configuration file

The configuration file serverconf.json is a JSON file that defines the addresses and ports used by OVO to listen for HTTP calls and cluster communications. The configuration file defines also other configurations parameters used by the server node. These are the all the configuration parameters:

  • Name is the unique node name, if omitted the node will generate a random one
  • Host is the hostname or IP address of the HTTP listener, if it's omitted the server binds all the interfaces
  • Port is the port of the HTTP listener
  • APIHost is the hostname or IP address used for inter-cluster communications, if it's omitted the server binds all the interfaces
  • APIPort is the port used for inter-cluster communications
  • Twins is a list of node names of the cluster, the twins are the nodes used by the server to replicate its data
  • Stepbrothers is a list of node names of the cluster, stepbrothers are the nodes to which the server requests to become a replica
  • Debug is a flag that enables internal logging

This is a configuration file example

{
	"ServerNode":
	{
		"Node":
		{
			"Name":"mizard",
			"Host":"192.168.1.102",
			"Port":5050,
			"APIHost":"192.168.1.102",
			"APIPort":5052
		},
		"Twins":[],
		"Stepbrothers":[]
	},
	"Debug":true
}

Cluster configuration

OVO cluster can be formed by two or more nodes. Nodes can be added or removed without stopping the cluster activities. We must configure the node that is added to a cluster so that I can see at least another active node. This is done by providing a description (maybe partial) of the topology. This sample configuration allows us to create a cluster formed by two nodes mizard and righel and in which one is the twin of the other. The node mizard uses the above configuration, while the node righel uses the following configuration.

{
  "ServerNode": {
    "Node": {
      "Name": "righel",
      "Host": "192.168.1.103",
      "Port": 5050,
      "APIHost": "192.168.1.103",
      "APIPort": 5052
    },
    "Twins": ["mizard"],
    "Stepbrothers": ["mizard"]
  },
  "Topology": {
    "Nodes": [
      {
        "Node": {
          "Name": "mizard",
          "Host": "192.168.1.102",
          "Port": 5050,
          "APIHost": "192.168.1.102",
          "APIPort": 5052
        }
      }
    ]
  },
  "Debug": true
}

The temporary configuration file

Every time that the server starts or every time that the cluster topology changes the temporary configuration file is updated and saved. The temporary configuration file resides in the same folder of the configuration file and has the same name but its extension is .temp .

RESTful API

Clients can connect OVO using RESTful API.

The available API set includes these endpoints:

  • GET /ovo/keystorage gives the count of all the stored keys
  • GET /ovo/keys gives the list of all the stored keys
  • GET /ovo/keystorage/:key retrieves the object corresponding to key
  • POST /ovo/keystorage puts the body object in the storage
  • PUT /ovo/keystorage same as POST
  • DELETE /ovo/keystorage/:key removes the object from the storage
  • GET /ovo/keystorage/:key/getandremove gets the object and removes it from the storage
  • POST /ovo/keystorage/:key/updatevalueifequal updates the object with a new value if the input old value is equal to the stored object value
  • POST /ovo/keystorage/:key/updatekeyvalueifequal updates the object end the key with a new values if the input old value is equal to the stored object value
  • POST /ovo/keystorage/:key/updatekey changes the key of an object
  • GET /ovo/cluster gets the cluster topology
  • GET /ovo/cluster/me gets the node details
  • POST /ovo/counters sets the value of the counter
  • PUT /ovo/counters increments (or decrements) the value of the counter
  • GET /ovo/counters/:key gets the value of the counter
  • DELETE /ovo/counters/:key delete the counter
  • POST /ovo/keystorage/:key/deletevalueifequal delete the object if it's not changed

Client libraries

Go client library

The Go OVO Client can connect a cluster of OVO nodes. The Go client source code can be found here ovoclient.

.Net client library

The .Net OVO Client can connect a cluster of OVO nodes and offers the same API of the Go client. The .Net client source code can be found here ovodotnet. The library can be downloaded from Nuget.org at https://www.nuget.org/packages/OVOdotNetClient/ or using the Nuget Package Manager.

PM> Install-Package OVOdotNetClient

Java client library

The Java client library is under development. The source code is in ovojava.

Owner
Similar Resources

Simple in memory key-value store.

Simple in memory key-value store. Development This project is written in Go. Make sure you have Go installed (download). Version 1.17 or higher is req

Nov 6, 2021

ZedisDB - a key-value memory database written in Go

ZedisDB - a key-value memory database written in Go

Sep 4, 2022

A simple in-memory key-value store application

A simple in-memory key-value store application

vtec vtec, is a simple in-memory key-value store application. vtec provides persistence by appending transactions to a json file and restoring data fr

Jun 22, 2022

kvStore is a simple key/value in-memory store

kvStore is a simple key/value in-memory store. It is designed for the API. kvStore keeps records at /tmp/kvStore/dbName.db. You can specify server port, dbName and, file save interval in your RunServer(Addr, dbName) call.

Feb 24, 2022

FlashDB is an embeddable, in-memory key/value database in Go

FlashDB is an embeddable, in-memory key/value database in Go

FlashDB is an embeddable, in-memory key/value database in Go (with Redis like commands and super easy to read)

Dec 28, 2022

rosedb is a fast, stable and embedded key-value (k-v) storage engine based on bitcask.

rosedb is a fast, stable and embedded key-value (k-v) storage engine based on bitcask.

rosedb is a fast, stable and embedded key-value (k-v) storage engine based on bitcask. Its on-disk files are organized as WAL(Write Ahead Log) in LSM trees, optimizing for write throughput.

Dec 28, 2022

Fault tolerant, sharded key value storage written in GoLang

Fault tolerant, sharded key value storage written in GoLang

Ravel is a sharded, fault-tolerant key-value store built using BadgerDB and hashicorp/raft. You can shard your data across multiple clusters with mult

Nov 1, 2022

The TinyKV course builds a key-value storage system with the Raft consensus algorithm.

The TinyKV course builds a key-value storage system with the Raft consensus algorithm.

The TinyKV Course The TinyKV course builds a key-value storage system with the Raft consensus algorithm. It is inspired by MIT 6.824 and TiKV Project.

Jan 4, 2022

A key-value storage transaction interpretator.

kv-txn-interpreter A key-value storage transaction interpreter, which provides an etcd-like transaction interface to help you build a transaction over

Feb 22, 2022
Related tags
A key-value db api with multiple storage engines and key generation
A key-value db api with multiple storage engines and key generation

Jet is a deadly-simple key-value api. The main goals of this project are : Making a simple KV tool for our other projects. Learn tests writing and git

Apr 5, 2022
Golang-key-value-store - Key Value Store API Service with Go DDD Architecture

This document specifies the tools used in the Key-Value store and reorganizes how to use them. In this created service, In-Memory Key-Value Service was created and how to use the API is specified in the HTML file in the folder named "doc"

Jul 31, 2022
GhostDB is a distributed, in-memory, general purpose key-value data store that delivers microsecond performance at any scale.
GhostDB is a distributed, in-memory, general purpose key-value data store that delivers microsecond performance at any scale.

GhostDB is designed to speed up dynamic database or API driven websites by storing data in RAM in order to reduce the number of times an external data source such as a database or API must be read. GhostDB provides a very large hash table that is distributed across multiple machines and stores large numbers of key-value pairs within the hash table.

Jan 6, 2023
Simple Distributed key-value database (in-memory/disk) written with Golang.

Kallbaz DB Simple Distributed key-value store (in-memory/disk) written with Golang. Installation go get github.com/msam1r/kallbaz-db Usage API // Get

Jan 18, 2022
Distributed, fault-tolerant key-value storage written in go.
Distributed, fault-tolerant key-value storage written in go.

A simple, distributed, fault-tolerant key-value storage inspired by Redis. It uses Raft protocotol as consensus algorithm. It supports the following data structures: String, Bitmap, Map, List.

Jan 3, 2023
Distributed reliable key-value store for the most critical data of a distributed system

etcd Note: The master branch may be in an unstable or even broken state during development. Please use releases instead of the master branch in order

Dec 28, 2022
KV - a toy in-memory key value store built primarily in an effort to write more go and check out grpc

KV KV is a toy in-memory key value store built primarily in an effort to write more go and check out grpc. This is still a work in progress. // downlo

Dec 30, 2021
Key-value database stored in memory with option of persistence
Key-value database stored in memory with option of persistence

Easy and intuitive command line tool allows you to spin up a database avaliable from web or locally in a few seconds. Server can be run over a custom TCP protocol or over HTTP.

Aug 1, 2022
yakv is a simple, in-memory, concurrency-safe key-value store for hobbyists.
yakv is a simple, in-memory, concurrency-safe key-value store for hobbyists.

yakv (yak-v. (originally intended to be "yet-another-key-value store")) is a simple, in-memory, concurrency-safe key-value store for hobbyists. yakv provides persistence by appending transactions to a transaction log and restoring data from the transaction log on startup.

Feb 24, 2022
A rest-api that works with golang as an in-memory key value store

In Store A rest-api that works with golang as an in-memory key value store Usage Fist of all, clone the repo with the command below. You must have gol

Oct 24, 2021