Upload
sergio-bossa
View
7.336
Download
1
Embed Size (px)
Citation preview
TerrastoreA document database for
developers
Sergio Bossa @sbtourist
About MeSoftware architect and engineer
Gioco Digitale (online gambling and casinos).
Long time open source enthusiast and contributorSpring.Taconite.Terracotta.Actorom, Terrastore ...
(Micro)-Bloggerhttp://twitter.com/sbtouristhttp://sbtourist.blogspot.com
NOSQL ... what?1998
Just a tiny non-relational database.2009
Non-relational databases as a replacement for relational ones?
Nowadays ...Not Only SQL.
Use the right tool for your job.
NOSQL ... why?When you're in troubles with ...
Data Model.Relational mismatch.Variable schema.
Data Access Patterns.Expensive joins.Denormalized data.
Scalability.More data.More processing.
No SQL, Yes ... ?Heterogeneity.
Key/Value based.Voldemort.
Document based.MongoDB.Riak.Terrastore.
Column based.Cassandra.HBase.
Graph based.Neo4J.
Terrastore!Document Store.
Ubiquitous.Consistent.Distributed.Scalable.
Written in Java.Based on Terracotta.Open Source.Apache-licensed.
Your data, your documents{ "name" : "Sergio", "surname" : "Bossa", "twitter" : "@sbtourist"}
Access everywhere
Keep consistent
Distribute as a single cluster
Distribute as multiple clusters
But ... Why Terrastore?!?!
Make ...
Simple things easy
Complex things possible
( almost ;)
Get started in seconds
$> ant -f terrastore-install.xml \ quickstart -Dquickstart.dir=...
One command installation and startup ...
Easy installation
$> ant -f terrastore-install.xml \ single-master \-Dmaster.server.port 9510 \-Dinstall.dir=...
Master:
$> ant -f terrastore-install.xml \server \-Dinstall.dir=...
Server:
No complex configuration
$master>./start.sh
Master:
$server>./start.sh \--master \--httpHost \--httpPort \--nodeHost \--nodePort \...
Server:
No impedence mismatch
public class Character { private String name; private List<Character> friends; private List<Character> foes; // ...}
{"name" : "Spider-man", "friends" : [{"name" : "Iceman"}]"foes" : [{"name" : "Kingpin"}]}
Java:
Json:
Simple basic operations
PUT /bucket/keyContent-Type: application/json{...}
Put documents in buckets ...
GET /bucket/keyContent-Type: application/json{...}
Get documents from buckets ...
Range queries
GET /bucket/range?comparator=comparator_name&startKey=start_key&endKey=end_key&timeToLive=max_ageContent-Type: application/json{...}
Find documents in bucket with keys in a given range ...
Built-in comparators
LexicographicalAscendant.Descendant.
Numerical.Ascendant.Descendant.
What if ... custom comparators?
@AutoDetect(name="my-comparator")public class MyComparator implements terrastore.store.operators.Comparator { public int compare(String key1, String key2) { // ... }}
Predicate queries
GET /bucket/predicate?predicate=type:expressionContent-Type: application/json{...}
Find documents in bucket satisfying a given predicate condition ...
Conditional put/get
PUT /bucket/key?predicate=type:expressionContent-Type: application/json{...}
Conditionally put documents in buckets ...
GET /bucket/key?predicate=type:expressionContent-Type: application/json{...}
Conditionally get documents from buckets ...
Built-in predicate conditions
JXPapthBased on X-Path.Find people whose name is 'Sergio':
jxpath:/name[.='Sergio']JavaScript
Applies a JavaScript-like condition.Find people whose name is 'Sergio':
js:value.name=='Sergio'
What if ... custom conditions?
@AutoDetect(name="my-condition")public class MyCondition implements terrastore.store.operators.Condition { public boolean isSatisfied(String key, Map<String, Object> value, String expression) { // ... }}
Server-side updates
PUT /bucket/key/update?function=function_name&timeout=timeout_valueContent-Type: application/json{...}
Atomically execute complex updates to a document ...
Built-in update functions
Atomic CountersAtomically increment/decrement/set-up one or more counters.
MergeMerge the stored document with provided values.
JavaScript custom updateUpdate the stored document by executing a user-provided javascript function.
What if ... custom functions?
@AutoDetect(name="my-function")public class MyFunction implements terrastore.store.operators.Function { public Map<String, Object> apply(String key, Map<String, Object> value, Map<String, Object> parameters) { // ... }}
Easy scale-out
$server>./start.sh \--master \--ensemble
A command line parameter:
{"localCluster" : "apple","discoveryInterval" : 5000,"clusters" : ["apple", "orange"],"seeds" : {"orange" : "192.168.1.2:6001"}}
And a json configuration file:
DSL-like Java APIs
// Create client:TerrastoreClient client = new TerrastoreClient("http://localhost:8080", new HTTPConnectionFactory());
// Create object:Person sbtourist = new Person("Sergio Bossa”, "sbtourist")
// Put:client.bucket("people").key("1").put(person);
// Get:sbtourist = client.bucket("people").key("1").get(Person.class);
Fluent APIs.Http-based.Transparent (yet configurable) object conversion.
Support for other languagesClojure
http://github.com/sbtourist/terrastore-clojPython
http://dnene.bitbucket.org/docs/pyterrastoreScala
http://github.com/ssuravarapu/Terrastore-Scala-Client http://github.com/teigen/terrastore-scala
Easy to add more!
Pure Javascript Web Console
More!Backup
Import/export documents to/from buckets.Events management
Get notified of document updates.Third-party products integration.Write-behind.
ActiveMQ integration for higher reliability.Custom data partitioning
Retain control of where your data is placed.Indexing and searching
Terrastore-Search.ElasticSearch integration.
Cross-origin resource sharing supportIntegrate with browser-based clients.
Now that I have an hammer ...Don't go blinded.
Use the right tool for the job!
Terrastore is best suited for:Data hot spots.Computational data.Complex, rich or variable data.Throw-away data.
Final words ... engaging.Explore
http://code.google.com/p/terrastoreDownload
http://code.google.com/p/terrastore/downloads/listHack
http://code.google.com/p/terrastore/source/checkout
Participatehttp://groups.google.com/group/terrastore-discussions
Enjoy!
Q & AContact me on:
http://twitter.com/sbtourist