NoSQL databases Voldemort db


NoSQL databases refer to database direction systems ( DBMS ) that differ from RDBMS in some manner. NoSQL databases avoid articulation operations and usually scale out horizontally.

Hire a custom writer who has experience.
It's time for you to submit amazing papers!

order now

Here are some of the advantages of NoSQL datbases.


  • Elastic grading: NoSQL databases graduated table out horizontally. Usually we can add low-priced trade good waiters and scale NoSQL databases.
  • Large informations: NoSQL databases are usually designed to manage immense unstructured informations. Social Networking sites such as Facebook, Linkedin usage NoSQL systems for their operation.
  • Less DBA demand: NoSQL databases require less intervention from database decision maker. With designs such as read-repair, informations distribution and reproduction there is less administrative undertaking left for the DBA.
  • Flexible informations theoretical accounts: NoSQL systems such as MongoDB is document-based database. It does non hold any built-in scheme demand. Thus the scheme of the informations can alter on the fly.

However there are some challenges of NoSQL, which should be kept in head.


  • Adulthood: NoSQL databases have late started deriving impulse. There are non many experts who know these systems in and out and most of the databases are non mature.
  • Support: NoSQL databases are largely open-source and built with the aid of community attempt. Therefore they may miss speedy support, client attention, etc.
  • Administration: NoSQL databases installing necessitate good proficient accomplishments. The care of these systems is besides boring.
  • Expertness: There are few NoSQL developers and most of them are still in the learning stage.


NoSQL executions can be categorized by their mode of execution.

Here are different classs along with an execution.

  • Document shop: MongoDB
  • Graph: Neo4j
  • Key-value shop: Voldemort
  • Wide-column: Cassandra

Voldemort Introduction

Voldemort is a distributed key-value storage system.

It ‘s assorted features are:

  • Automatic reproduction of informations over multiple waiters.
  • Automatic breakdown of informations, so each waiter contains merely a subset of the entire informations
  • Crystalline handling of waiter failure
  • Pluggable serialisation support
  • Versioning of informations points to maximise informations unity
  • No cardinal point of failure as each node is independent of other nodes.
  • Pluggable informations arrangement schemes support for things like distribution across information centres that are far geographically.

Voldemort is used at Linkedin.


For handiness and high-performance grounds, merely fiddling key-value informations entree is permitted. The questions which have been supported are:

* value = storeClient.get ( cardinal )

* storeClient.put ( cardinal, value )

* storeClient.delete ( cardinal )

Both keys and values can be simple or complex objects like lists, maps. The keys and values are so serialized.

Though the question format means that there can be no complex question filters, no foreign cardinal restraints, no triggers and that joins must be in done in codification, there are several advantages like:

  • Easy distribution across bunch
  • Ready-made caching bed
  • Predictable public presentation as lone questions listed supra are possible
  • For maintaining the services slackly coupled, we have to make database-joins in codification anyhow.
  • For public presentation, anyways serialized format is required.
  • Clean separation of logic and storage.

Architecture of the System

Logical Architecture of the System

As we can see the logical architecture of the system is a superimposed architecture. Each bed execute its ain remarkable undertaking such as serialisation, failover or interacting with the implicit in storage engine. For case, in serialisation layer the system handles the work of interpreting objects to byte arrays. That is suppose I have a key, value brace to be stored in the Voldemort ‘store ‘ . And suppose key is threading and value is a complex Java object. Then I have to declare this that serialisation for cardinal is threading, and serialisation for value is java-serialization in stores.xml file in the config directory of Voldemort. Then appropriate categories are used to accomplish serialisation.

The beauty of the superimposed architecture is that, we can mix-n-match different beds and accommodate the architecture harmonizing to a specific use-case. For case we can compact the serialized informations and so reassign it over the web, by adding a ‘Compression Layer ‘ after serialisation. Likewise the architecture can be adapted for deserialization.

Besides informations can be intelligently routed to its appropriate divider. This can be achieved by following three attacks:

* 3-Tier, Server Routed: In this partition-aware routing is done on the server side.

* 3-Tier, Client Routed: In this partition-aware routing is done on the client side.

* 2-Tier, Front-end routed: In this the client needs to be really smart and it will manage the routing of informations to its appropriate divider. Typically the client needs to be really closely tied to implementation item of the database ( like written in Java, utilizing Voldemort libraries ) .

The followers is pictural representation of the same:

As we can see from the figure, fewer hops are required when we move the intelligence of routing up the stack. Performance is usually degraded by web hop and disk-access. As mentioned above we can utilize the flexibleness of the architecture in riddance of the web hops. Avoiding disk entree can be achieved by partitioning the information and wherever possible hoarding it.

Where can we happen this in the beginning codification?

In interface we can see that it exposed basic operations such as get/put and delete. The bundle has several sub-packages and in that we find the execution of different functionalities for each shop. This is what provided it functional layering. Some of the bundles here are:

* This execution handles routing to nodes.

* This execution handles change overing objects to byte array.

* Execution of in-memory storage engine.

* When a value is ‘put ‘ more than one time for a key, its version is incremented. The execution lies in this bundle.

The chief server side codification can be found in the bundle voldemort.server, where the chief category is VoldemortServer. It is responsible for bootstrapping all the needed services like storage service, http service, etc. Following are different service types in Voldemort:

public enum ServiceType {

HTTP ( “ http-service ” ) ,

SOCKET ( “ socket-service ” ) ,

ADMIN ( “ admin-service ” ) ,

JMX ( “ jmx-service ” ) ,

SCHEDULER ( “ scheduler-service ” ) ,

Storage ( “ storage-service ” ) ,

VOLDEMORT ( “ voldemort-server ” ) ,

ASYNC_SCHEDULER ( “ async-scheduler ” ) ,

GOSSIP ( “ gossip-service ” ) ,

REBALANCE ( “ rebalance-service ” ) ;

private concluding String show ;

private ServiceType ( String show ) {

this.display = show ;


public String getDisplayName ( ) {

return this.display ;



The client side codification resides in voldemort.client bundle. The StoreClient category is the chief interface that the user trades with.

Partitioning of informations and Reproduction

The first inquiry we need to inquire is why do we necessitate to partition the informations? Why ca n’t we have all informations in one disc? The reply is that if we had the informations on a individual disc or a individual waiter it would be a individual point of failure. It means that if the waiter goes down, all our informations is lost. Now-a-days the monetary value of information is really big and it is really of import to maintain multiple transcripts of informations and non to maintain all eggs in one basket or all the informations in one location.

Besides partitioning helps better the public presentation. We can understand this as follows. Suppose one of the node contains the full data-set, that is, it is a “hot” node. Then if multiple concurrent questions are hit on that node, it will be a public presentation hit, and the response will be slow. On the other manus if we split the information into multiple locations / dividers and we know which partition the requested informations belongs to, each divider will largely hold just burden.

So Lashkar-e-Taibas say we partition the information into S dividers ( one divider per waiter ) and we store excess transcript of each cardinal K on R waiters. Now we can tie in the cardinal K with R waiters utilizing modulo hashing:

a = K mod S

and so the values can be stored on the waiters a, a+1, … a+r.

This system is utile because we can cognize the location of informations, given its cardinal K. And this question can be answered by any of the equals and there is no demand of cardinal waiter which shops the function of keys to the waiter location. However its downside can be seen when a waiter is added or removed. Lashkar-e-taibas understand this with an illustration:

Problem with Hashing in a bunch:

Modulo hashing: K mod ( N ) where, n=10

Lashkar-e-taibas put 100 paperss in nodes: 1..10

18 mod ( 10 ) = 8…etc

Say, node 10 dies

So, n=9

Now, if you want 18th physician: 18mod ( 9 ) =0

Node0 does non hold 18th physician! It ‘s in Node8!

Solution: You need to re-hash all the values!

Expensive when you have 100Petabytes of informations.

Consistent Hashing aid here.

Let ‘s visualise consistent hashing with the aid of above diagram. In consistent hashing, the nodes reside on an fanciful ring which is split into say 2^31 dividers. An arbitrary hash map is used to map the key onto the ring and we pick R alone nodes responsible for this key, by tracking the ring in clockwise way.

Therefore in consistent hashing when a waiter is removed or added the burden is automatically balanced between the waiters.

Important points in Consistent Hashing

  • There are 2^m keys in an m-bit cardinal infinite.
  • Keies ordered in a ring topology
  • In instance of waiter failure, it minimizes re-balancing or rehashing of keys between two nodes.

Important points of Reproduction

  • Ensure lastingness and
  • High handiness of informations
  • Reproduction scheme: Data is non merely persisted in nodeA, but besides in following N nodes ( clock wise mode ) . Where N=Replication factor
  • So, when node A is down, petition is handed to the following node in the ring.

Where can I happen this in the beginning codification?

The constellation files cluster.xml holds all information sing the bunchs present and the dividers it maps to. The file contains the single node Idaho which is used in the cluster.xml file.

The bundle voldemort.client.rebalance included codification related to re equilibrating the bunch. The category RebalanceController is the chief category and acts as the cardinal accountant for doing the determinations sing equilibrating the bunch.

Data Model and Serialization

As we have seen, Voldemort supports simple operations such as put, get and delete. Both keys and values can be simple or complex objects. Serialization means interpreting the object into an byte array for transmittal over the web. Pluggable serialisation in Voldemort is a really good characteristic and this allows one to implement one ‘s ain serializer.

The undermentioned types of serialisation are supported:

* json

* twine

* java-serialization

* protobuf

* thrift

* avro

* individuality

Let ‘s see json type in more item.

JSON Serialization

The information should be easy translated between the undermentioned different provinces:

Object – Network transmittal – Text Representation

JSON is being widely used in the industry as it supports common data-types across assorted programming linguistic communications. It does non hold an built-in scheme. However we can stipulate the scheme by specifying the ‘type ‘ of field. The ‘type ‘ can be ‘int32 ‘ , ‘string ‘ , etc..

For the shop incorporating a simple ‘User ‘ object, we could specify type as:

{ “ firstname ” : ” twine ” , “ lastname ” : ” twine ” , “ Idaho ” : ” int32 ” }

In this instance Java codification will return a Map & lt ; String, Object & gt ; . It will incorporate each of the keys which were specified, and the corresponding value.

Where can I happen this in the beginning codification?

The bundle voldemort.serialization contains execution for the assorted serialisations supported.

Some of the sub-packages here are:

* voldemort.serialization.avro

* voldemort.serialization.json

* voldemort.serialization.protobuf

* voldemort.serialization.thrift

Consistency and Versioning

In a read-only database, when the information is fetched, it will be consistent as there are no updates in the read-only database. In a traditional RDBMS, consistence is maintained by utilizing minutess. That is at a clip merely one procedure is allowed to alter the information at a row-level.

In a distributed universe, the informations can shack on many waiters and there can be multiple reproduction of the information. In instance an update is made, all the transcripts of the information should hold same value. This is possible utilizing a distributed dealing but it is really slow.

Another attack is that we tolerate a small incompatibility. Harmonizing to CAP theorem, for accomplishing both handiness and partition-tolerance we should loosen up consistence. Such AP systems are known as finally consistent. Following figures gives an overview of NoSQL databases based on CAP throrem

What is eventual consistence? Eventual consistence means that over a period of clip the update of the informations will make all the nodes in the bunch.

Approachs such as Two-phase commit and Paxos-style consensus prevent lasting incompatibility. Voldemort uses Read Repair for making consistence. Let ‘s understand Read Repair:

Read fix scheme means that all the nodes in the bunch will finally hold the latest version of informations. In this attack, all the inconsistent values are written to the nodes when there is a write petition. At the clip of reading, it is checked if the version of the informations read from a node is stale. If yes, a struggle is detected and so all nodes should be synchronized so that all nodes portion the same value.

Weak consistence in read operations means that the public presentation of read will be optimized by returning requested informations before all the nodes are synchronized with the same information. That is, a read operation returns instantly, and triggers an async procedure which will take attention of synchronism of informations across all nodes. This does execute faster than strong consistence, but has drawback that the informations returned is non ever consistent.

Strong consistence in read operations means that consistent informations will be returned to the user. In this when stale informations is detected at clip of read, all the nodes are synchronized with the same information and so the response is sent. This does execute slower than weak consistence, but has warrants that the information is ever consistent.


Versioning can be achieved in a centralised database by optimistic lockup. We merely store a counter for each row, and when the row is updated we increment the counter. Here the updates are merely allowed when the ‘counter ‘ value is right. This manner we know the latest version of informations.

In a distributed system, versioning is hard as waiters can neglect, waiters can be added and reproduction of informations can take clip. We need to cognize for each waiter what was the latest information value antecedently and the information to find if that is disused.

# 2 waiters fetch the same value at the same time

[ client 1 ] get ( 12345 ) = & gt ; { “ name ” : ” tushar ” , “ electronic mail ” : ” tushar.m.s @ ” }

[ client 2 ] get ( 12345 ) = & gt ; { “ name ” : ” tushar ” , “ electronic mail ” : ” tushar.m.s @ ” }

# client 1 updates the ‘name ‘

[ client 1 ] put ( 12345, { “ name ” : ” tushar sjsu ” , “ electronic mail ” : ” tushar.m.s @ ” } )

# client 2 updates the ’email ‘

[ client 2 ] put ( 12345, { “ name ” : ” tushar ” , “ electronic mail ” : ” tushar.m.s @ ” } )

# We now have the undermentioned conflicting versions:

{ “ name ” : ” tushar ” , “ electronic mail ” : ” tushar.m.s @ ” }

{ “ name ” : ” tushar sjsu ” , “ electronic mail ” : ” tushar.m.s @ ” }

{ “ name ” : ” tushar ” , “ electronic mail ” : ” tushar.m.s @ ” }

Therefore here the original value is overwritten by both clients. But we do non cognize which is the latest portion on each client. And besides we need information to find which of the version is disused.

This can be achieved by vector-clock. A vector-clock helps us by keeping a counter and updating it on each write and Lashkar-e-Taiba ‘s us know when 2 versions are in struggle, and which is the latest version.

A vector-clock can be thought of as a list of waiter: version braces, where version is an index that waiter was the maestro for that no. of writes:

[ 1:50, 2:3, 5:66 ]

“A version v1 succeeds a version v2 if for all I, v1i & gt ; v2i. If neither v1 & gt ; v2 nor v1 & lt ; v2, so v1 and v2 co-occur, and are in conflict.” Here is a illustration of 2 conflicting versions:

[ 1:2,2:1 ]

[ 1:1,2:2 ]

Following diagram shows the working of Vector clock.

Vector Clock

As shown in the diagram, Alice, Ben, Cathy and Dave are friends. They want to make up one’s mind a twenty-four hours to run into, which is flexible for all. Following sequence of stairss occur:

* Alice writes ‘Wed ‘ on the clock and sends to rest all.

* For Ben, it is non possible on ‘Wed ‘ so he updates clock with ‘Tue ‘ . However this update is missed by Cathy.

* Cathy is comfy with ‘Thu ‘ so she updates clock to ‘Thu ‘ .

* Now Dave receives two updates ; of ‘Tue ‘ and ‘Thu ‘ . Dave is smart and realizes Cathy was non in cringle for ‘Tue ‘ . So he sends ‘Thu ‘ as concluding Cathy and Alice.

* Alice sends a concluding verification with clock value ‘Thu ‘ to all.

Where can I happen it in the codification?

The bundle contains execution for routing informations across all nodes in the bunch. The category ReadRepairer in this bundle is responsible for executing read-repair.

The description of category says:

“Repair out-dated reads, by directing an up-to-date value back to the offending clients”

In bundle voldemort.versioning you can happen execution of Vector-clock in the category VectorClock.


In one of our database category undertakings, we had to research NoSQL databases. We had to take one NoSQL database for each class viz. , key-value, wide-column and document-based. So we choose the followers:

  1. Key-value: Voldemort
  2. Wide-column: Cassandra
  3. Document-based: MongoDB

The end of the undertaking was to analyze these NoSQL databases and acquire a feel of how the information is stored in these databases and how these databases perform for CRUD operations. Wikipedia was used as the beginning of informations as it provided a rich aggregation of interrelated paperss which was necessary for us to analyse the public presentation of three databases.

We used Page Scraper to roll up informations from Wikipedia site. We fetched informations from Wikipedia and stored it in our local file and so performed our operations sing the file as beginning. The Page Scraper uses a predetermined list of stop-words through which the downloaded papers is passed through. These stop words are filtered out and remainder of the information consists of keywords, links, url and rubric. This information is so stored in each of the NoSQL databases and CRUD public presentation is measured.

Following Junit trial instances were written for each databases and each trial file had five trial instances.

* Case1: inserts all nine pages into several database

* Case2: removes peculiar page

* Case3: retrieves the pages whose rubric contains ‘table ‘ word

* Case4: hunt the page and modify the rubric of the page

* Case5: retrieves a individual page given the key

Above trials were performed on a single-node bunch. All three databases were installed on the same machine and were running at the same time while testcases were executed. The public presentation Numberss may differ if reproduction and sharding were to be used on a multi-node bunch. We had set the timers in each of the No-SQL executions on our insert, select, delete and update operations to hold comparing on the clip taken for making each operation.

Let ‘s see how Voldemort performs in CRUD operations:

In Voldemort, information is stored in the database as a “store” . Data in Voldemort is stored as simple key-value informations. Both keys and values can be every bit complex as lists or maps. Each key is alone to a shop, and each key can hold at most one value. In a multi-node bunch, informations will be automatically sharded into multiple machines and hence it will be extremely available. Each waiter would incorporate merely a subset of the entire informations.

Voldemort Configuration

In Voldemort waiter operations are chiefly controlled by three constellation files:

* cluster.xml: This config file contains information about all the waiters in the bunch like their hostname, port they use, etc. It is indistinguishable for all voldemort nodes. It does non incorporate information which is specific to the peculiar node such as tuning parametric quantities or informations booklets for those nodes, but instead information which is public to the bunch.

* stores.xml: This includes information about all the shops in the bunch. Information like required-reads and required-writes to keep consistence, and besides how the serialisation of keys and values is done, is stored in this file. It is indistinguishable on all noded in the bunch.

* This contains tunable statements that control a peculiar waiter ( node ) . Local node Idaho ( which corresponds to the entry in cluster.xml ) , threadpool size, and besides local continuity engine parametric quantities. This file varies on each node.

Here is cluster.xml for our undertaking:

& lt ; bunch & gt ;

& lt ; name & gt ; mycluster & lt ; /name & gt ;

& lt ; server & gt ;

& lt ; id & gt ; 0 & lt ; /id & gt ;

& lt ; host & gt ; localhost & lt ; /host & gt ;

& lt ; http-port & gt ; 8081 & lt ; /http-port & gt ;

& lt ; socket-port & gt ; 6666 & lt ; /socket-port & gt ;

& lt ; dividers & gt ; 0, 1 & lt ; /partitions & gt ;

& lt ; /server & gt ;

& lt ; /cluster & gt ;

Here it is of import to observe that dividers are non inactive dividers of node, but a manner for partitioning the key-space such that each key is mapped to a specific information divider. This means that a specific bunch may back up multiple shops each with variable reproduction factors. This is important, since some informations is more important than other informations, and the tradeoff between consistence and public presentation for one shop may non be same as another shop. The count of informations dividers is fixed and can non be changed.

It is of import that both config files cluster.xml every bit good as stores.xml be same for each node, and besides divider and node Idahos remain same for consistence across nodes.

Here is for our undertaking:

# The ID of *this* peculiar bunch node

# # # # # # # # # # # # # # # DB options # # # # # # # # # # # # # # # # # # # # # #



# NIO connection scenes.

Here is stores.xml for our undertaking:

& lt ; shop & gt ;

& lt ; name & gt ; trial & lt ; /name & gt ;

& lt ; continuity & gt ; bdb & lt ; /persistence & gt ;

& lt ; routing & gt ; client & lt ; /routing & gt ;

& lt ; replication-factor & gt ; 1 & lt ; /replication-factor & gt ;

& lt ; required-reads & gt ; 1 & lt ; /required-reads & gt ;

& lt ; required-writes & gt ; 1 & lt ; /required-writes & gt ;

& lt ; key-serializer & gt ;

& lt ; type & gt ; threading & lt ; /type & gt ;

& lt ; /key-serializer & gt ;

& lt ; value-serializer & gt ;

& lt ; type & gt ; java-serialization & lt ; /type & gt ;

& lt ; /value-serializer & gt ;

& lt ; /store & gt ;

Here name represents the name of the shop, and we say that we will utilize bdb as local continuity engine. With respects to routing parametric quantity, we say that client will execute the routing. Now let ‘s see about the parametric quantities N ( Replication factor ) , R ( required reads ) and W ( required writes ) . The reproduction factor says how many reproductions do we desire. R parametric quantity is the minimal figure of reads that should win. Similarly W parametric quantity is the minimal figure of writes that should be successful in our bunch.

Following of import thing is serialisation. We say that we will be utilizing ‘url ‘ which is a normal twine as cardinal for each of our record. Therefore key-serialization is threading. However for value, we are non hive awaying simple twine. It will a Map & lt ; String, Object & gt ; . In bend the map will incorporate different keys such as ’tilte ‘ , ‘keywords ‘ , ‘links ‘ and their several values. That is the ground why we need to utilize java-serialization.

Get Voldemort up and running:

  1. Install Voldemort
  2. Make certain all config files ( cluster.xml, store.xml and ) match those given above.
  3. From voldemort booklet run the bid:
  4. bin/ config/single_node_cluster & gt ; /tmp/voldemort.log & A ;
  5. Via Shell: Connect to ‘test ‘ shop utilizing following bid and so execute shop operations.
  6. bin/ trial transmission control protocol: //localhost:6666

Voldemort CRUD

Connect to shop:

Stringing bootstrapUrl = “ transmission control protocol: //localhost:6666 ” ;

mill = new SocketStoreClientFactory (

new ClientConfig ( ) .setBootstrapUrls ( bootstrapUrl ) ) ;

client = factory.getStoreClient ( “ trial ” ) ;

Gulf from the shop:

factory.close ( ) ;

Inserting informations:

// Get the file ( wiki page ) stored on local disc.

URL pageUrl = new URL ( “ file: // ”

+ historyfiles [ one ] .getCanonicalPath ( ) ) ;

// Scrape the page with followingURL

Page pg = s.scrape ( pageUrl ) ;

// Get meta-data

Stringing rubric = pg.getTitle ( ) ;

Stringing url = pg.getUrl ( ) ;

// TheURLActs of the Apostless as a alone key

Stringing cardinal = URL ;

// We get aVersionedobject for a known key from the shop.

// Get operation of the shop

Versioned & lt ; Map & lt ; String, Object & gt ; & gt ; currentValue = client.get ( cardinal ) ;

// Fill thehashmap, the ‘value ‘ for the key in our shop.

Map & lt ; String, Object & gt ; pageMap = new HashMap & lt ; String, Object & gt ; ( ) ;

if ( url! = nothing ) {

urls.add ( url ) ;

pageMap.put ( “ URL ” , url ) ;


if ( rubric! = null ) {

pageMap.put ( “ rubric ” , rubric ) ;


// Similar codification for make fulling keywords, links in map…

// …

if ( currentValue == nothing ) {

// There was no bing key-value brace for the given key

// So create new value

currentValue = new Versioned & lt ; Map & lt ; String, Object & gt ; & gt ; ( pageMap ) ;

} else {

// Update bing value.

currentValue.setObject ( pageMap ) ;


// Put operation of the shop

client.put ( cardinal, pageMap ) ;

Recovering informations:

Versioned & lt ; Map & lt ; String, Object & gt ; & gt ; currentValue = client.get ( url ) ;

Deleting informations:

client.delete ( url ) ;

Updating informations:

Versioned & lt ; Map & lt ; String, Object & gt ; & gt ; currentValue = client.get ( url ) ;
Map & lt ; String, Object & gt ; informations = currentValue.getValue ( ) ;
data.put ( “ URL ” , url ) ;
currentValue.setObject ( informations ) ;
client.put ( url, informations ) ;

Searching informations:

The standards used for seeking across all the pages stored in the databases was: “Find all pages which have the word ‘table ‘ in its title” .

Stringing searchInTitle = “ table ” ;

ArrayList & lt ; String & gt ; ensue = new ArrayList & lt ; String & gt ; ( ) ;

Versioned & lt ; Map & lt ; String, Object & gt ; & gt ; currentValue = nothing ;

for ( int i=0 ; i & lt ; urls.size ( ) ; i++ ) {

currentValue = client.get ( urls.get ( one ) ) ;

Map & lt ; String, Object & gt ; informations = currentValue.getValue ( ) ;

Stringing rubric = ( Stringing ) data.get ( “ rubric ” ) ;

if ( title.contains ( searchInTitle ) )

result.add ( urls.get ( one ) ) ;


Please note that we had inserted nine pages in the Voldemort shop.
Here is the end product when the trial was executed:

Test End product

Voldemort ‘s public presentation compared to other databases

The consequence was that we found writes are faster in Cassandra. Reads are faster in Voldemort, MongoDB than Cassandra. These consequences were for a single-node bunch.