fleetdb: a schema-free database in clojure

68
FleetDB A Schema-Free Database in Clojure Mark McGranaghan January 23, 2010

Upload: mark-mcgranaghan

Post on 27-Jun-2015

2.182 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: FleetDB: A Schema-Free Database in Clojure

FleetDBA Schema-Free Database in Clojure

Mark McGranaghan

January 23, 2010

Page 2: FleetDB: A Schema-Free Database in Clojure

Motivation

Walkthrough

Implementation

Page 3: FleetDB: A Schema-Free Database in Clojure

Motivation

optimize for agile development

Page 4: FleetDB: A Schema-Free Database in Clojure

Motivation

optimize for agile development

Page 5: FleetDB: A Schema-Free Database in Clojure

Walkthrough

I Client Quickstart

I Basic Queries

I Concurrency Tools

Page 6: FleetDB: A Schema-Free Database in Clojure

Client Quickstart

(use ’fleetdb.client)

(def client (connect))

(client ["ping"])

=> "pong"

Page 7: FleetDB: A Schema-Free Database in Clojure

Insert

(client

["insert" "accounts"

{"id" 1 "owner" "Eve" "credits" 100}])

=> 1

Page 8: FleetDB: A Schema-Free Database in Clojure

Insert

(client

["insert" "accounts"

{"id" 1 "owner" "Eve" "credits" 100}])

=> 1

Page 9: FleetDB: A Schema-Free Database in Clojure

Select

(client

["select" "accounts" {"where" ["=" "id" 1]}])

=> [{"id" 1 "owner" "Eve" "credits" 100}]

Page 10: FleetDB: A Schema-Free Database in Clojure

Select

(client

["select" "accounts" {"where" ["=" "id" 1]}])

=> [{"id" 1 "owner" "Eve" "credits" 100}]

Page 11: FleetDB: A Schema-Free Database in Clojure

Select with Conditions

(client

["select" "accounts"

{"where" [">=" "credits" 150]}])

Page 12: FleetDB: A Schema-Free Database in Clojure

Select with Order and Limit

(client

["select" "accounts"

{"order" ["credits" "asc"] "limit" 2}])

Page 13: FleetDB: A Schema-Free Database in Clojure

Update

(client

["update" "accounts" {"credits" 105}

{"where" ["=" "owner" "Eve"]}])

Page 14: FleetDB: A Schema-Free Database in Clojure

Explain (I)

(client

["explain" ["select" "accounts"

{"where" ["=" "owner" "Eve"]}]])

=> ["filter" ["=" "owner" "Eve"]

["collection-scan" "accounts"]]

Page 15: FleetDB: A Schema-Free Database in Clojure

Explain (I)

(client

["explain" ["select" "accounts"

{"where" ["=" "owner" "Eve"]}]])

=> ["filter" ["=" "owner" "Eve"]

["collection-scan" "accounts"]]

Page 16: FleetDB: A Schema-Free Database in Clojure

Create Index

(client

["create-index" "accounts" "owner"])

Page 17: FleetDB: A Schema-Free Database in Clojure

Explain (II)

(client

["explain" ["select" "accounts"

{"where" ["=" "owner" "Eve"]}]])

=> ["index-lookup" ["accounts" "owner" "Eve"]]]

Page 18: FleetDB: A Schema-Free Database in Clojure

Multi-Write

(client

["multi-write"

[write-query-1 write-query-2 ...]])

=> [result-1 result-2 ...]

Page 19: FleetDB: A Schema-Free Database in Clojure

Multi-Write

(client

["multi-write"

[write-query-1 write-query-2 ...]])

=> [result-1 result-2 ...]

Page 20: FleetDB: A Schema-Free Database in Clojure

Multi-Write

(client

["multi-write"

[write-query-1 write-query-2 ...]])

=> [result-1 result-2 ...]

Page 21: FleetDB: A Schema-Free Database in Clojure

Checked-Write

(client

["checked-write"

read-query

expected-read-result

write-query])

=> [true write-result]

=> [false actual-read-result]

Page 22: FleetDB: A Schema-Free Database in Clojure

Checked-Write

(client

["checked-write"

read-query

expected-read-result

write-query])

=> [true write-result]

=> [false actual-read-result]

Page 23: FleetDB: A Schema-Free Database in Clojure

Checked-Write

(client

["checked-write"

read-query

expected-read-result

write-query])

=> [true write-result]

=> [false actual-read-result]

Page 24: FleetDB: A Schema-Free Database in Clojure

Checked-Write

(client

["checked-write"

read-query

expected-read-result

write-query])

=> [true write-result]

=> [false actual-read-result]

Page 25: FleetDB: A Schema-Free Database in Clojure

Implementation

I Background

I Organization

I Key ideas

Page 26: FleetDB: A Schema-Free Database in Clojure

Background

I http://clojure.org/data_structures

I http://clojure.org/sequences

I http://clojure.org/state

Page 27: FleetDB: A Schema-Free Database in Clojure

Organization

I fleetdb.core: pure functions

I fleetdb.embedded: identity and durability

I fleetdb.server: network interface

Page 28: FleetDB: A Schema-Free Database in Clojure

Organization

I fleetdb.core: pure functions

I fleetdb.embedded: identity and durability

I fleetdb.server: network interface

Page 29: FleetDB: A Schema-Free Database in Clojure

Organization

I fleetdb.core: pure functions

I fleetdb.embedded: identity and durability

I fleetdb.server: network interface

Page 30: FleetDB: A Schema-Free Database in Clojure

Organization

I fleetdb.core: pure functions

I fleetdb.embedded: identity and durability

I fleetdb.server: network interface

Page 31: FleetDB: A Schema-Free Database in Clojure

fleetdb.core

I Pure functions

I Databases as Clojure data structures

I Read: db + query → result

I ‘Write’: db + query → result + new db

Page 32: FleetDB: A Schema-Free Database in Clojure

fleetdb.core

I Pure functions

I Databases as Clojure data structures

I Read: db + query → result

I ‘Write’: db + query → result + new db

Page 33: FleetDB: A Schema-Free Database in Clojure

fleetdb.core

I Pure functions

I Databases as Clojure data structures

I Read: db + query → result

I ‘Write’: db + query → result + new db

Page 34: FleetDB: A Schema-Free Database in Clojure

fleetdb.core

I Pure functions

I Databases as Clojure data structures

I Read: db + query → result

I ‘Write’: db + query → result + new db

Page 35: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Planner

I Implements declarative queries

I Database + query → plan

["select" "accounts"

{"where" ["=" "owner" "Eve"]}]

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

["index-lookup" ["accounts" "owner" "Eve"]]

Page 36: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Planner

I Implements declarative queries

I Database + query → plan

["select" "accounts"

{"where" ["=" "owner" "Eve"]}]

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

["index-lookup" ["accounts" "owner" "Eve"]]

Page 37: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Planner

I Implements declarative queries

I Database + query → plan

["select" "accounts"

{"where" ["=" "owner" "Eve"]}]

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

["index-lookup" ["accounts" "owner" "Eve"]]

Page 38: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Planner

I Implements declarative queries

I Database + query → plan

["select" "accounts"

{"where" ["=" "owner" "Eve"]}]

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

["index-lookup" ["accounts" "owner" "Eve"]]

Page 39: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Planner

I Implements declarative queries

I Database + query → plan

["select" "accounts"

{"where" ["=" "owner" "Eve"]}]

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

["index-lookup" ["accounts" "owner" "Eve"]]

Page 40: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Planner

I Implements declarative queries

I Database + query → plan

["select" "accounts"

{"where" ["=" "owner" "Eve"]}]

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

["index-lookup" ["accounts" "owner" "Eve"]]

Page 41: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Executor

I Database + plan → result

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

(filter (fn [r] (= (r "owner") "Eve"))

(vals (:rmap (db "accounts"))))

Page 42: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Executor

I Database + plan → result

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

(filter (fn [r] (= (r "owner") "Eve"))

(vals (:rmap (db "accounts"))))

Page 43: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Executor

I Database + plan → result

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

(filter (fn [r] (= (r "owner") "Eve"))

(vals (:rmap (db "accounts"))))

Page 44: FleetDB: A Schema-Free Database in Clojure

fleetdb.core Query Executor

I Database + plan → result

["filter" ["=" "owner" "Eve"]

["record-scan" "accounts"]]

(filter (fn [r] (= (r "owner") "Eve"))

(vals (:rmap (db "accounts"))))

Page 45: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded

I Wraps fleetdb.core

I Adds identity and durability

I Databases in atoms

I Append-only log

Page 46: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded

I Wraps fleetdb.core

I Adds identity and durability

I Databases in atoms

I Append-only log

Page 47: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded

I Wraps fleetdb.core

I Adds identity and durability

I Databases in atoms

I Append-only log

Page 48: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded

I Wraps fleetdb.core

I Adds identity and durability

I Databases in atoms

I Append-only log

Page 49: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Read Path

I Dereference database atom

I Pass to fleetdb.core

I Return result

Page 50: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Read Path

I Dereference database atom

I Pass to fleetdb.core

I Return result

Page 51: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Read Path

I Dereference database atom

I Pass to fleetdb.core

I Return result

Page 52: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Read Path

I Dereference database atom

I Pass to fleetdb.core

I Return result

Page 53: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Write Path

I Enter fair lock

I Dereference database atom

I Pass to fleetdb.core

I Append query to log

I Swap in new database value

I Return result

Page 54: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Write Path

I Enter fair lock

I Dereference database atom

I Pass to fleetdb.core

I Append query to log

I Swap in new database value

I Return result

Page 55: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Write Path

I Enter fair lock

I Dereference database atom

I Pass to fleetdb.core

I Append query to log

I Swap in new database value

I Return result

Page 56: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Write Path

I Enter fair lock

I Dereference database atom

I Pass to fleetdb.core

I Append query to log

I Swap in new database value

I Return result

Page 57: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Write Path

I Enter fair lock

I Dereference database atom

I Pass to fleetdb.core

I Append query to log

I Swap in new database value

I Return result

Page 58: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Write Path

I Enter fair lock

I Dereference database atom

I Pass to fleetdb.core

I Append query to log

I Swap in new database value

I Return result

Page 59: FleetDB: A Schema-Free Database in Clojure

fleetdb.embedded Write Path

I Enter fair lock

I Dereference database atom

I Pass to fleetdb.core

I Append query to log

I Swap in new database value

I Return result

Page 60: FleetDB: A Schema-Free Database in Clojure

fleetdb.server

I Wraps fleetdb.embedded

I Adds JSON client API

Page 61: FleetDB: A Schema-Free Database in Clojure

fleetdb.server

I Wraps fleetdb.embedded

I Adds JSON client API

Page 62: FleetDB: A Schema-Free Database in Clojure

Aside: Source Size

Lines of Codecore 630embedded 130server 120lint 280utilities 140total 1300

Page 63: FleetDB: A Schema-Free Database in Clojure

Aside: Source Size

Lines of Codecore 630embedded 130server 120lint 280utilities 140total 1300

Page 64: FleetDB: A Schema-Free Database in Clojure

Takeaways

I Clojure’s data structures are awesome

I Clojure is viable for infrastructure software

I Try FleetDB!

Page 65: FleetDB: A Schema-Free Database in Clojure

Takeaways

I Clojure’s data structures are awesome

I Clojure is viable for infrastructure software

I Try FleetDB!

Page 66: FleetDB: A Schema-Free Database in Clojure

Takeaways

I Clojure’s data structures are awesome

I Clojure is viable for infrastructure software

I Try FleetDB!

Page 67: FleetDB: A Schema-Free Database in Clojure

Takeaways

I Clojure’s data structures are awesome

I Clojure is viable for infrastructure software

I Try FleetDB!

Page 68: FleetDB: A Schema-Free Database in Clojure

Learn More

I http://FleetDB.org

I http://github.com/mmcgrana