cassandra nodejs driver & nodejs paris

42
@doanduyhai NodeJS Cassandra driver DuyHai DOAN, Technical Advocate

Upload: duyhai-doan

Post on 28-Nov-2014

493 views

Category:

Technology


11 download

DESCRIPTION

Cassandra NodeJS Driver presentation at NodeJS Paris

TRANSCRIPT

Page 1: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

NodeJS Cassandra driver DuyHai DOAN, Technical Advocate

Page 2: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Shameless self-promotion!

2

Duy Hai DOAN Cassandra technical advocate •  talks, meetups, confs •  open-source devs (Achilles, …) •  Cassandra technical point of contact

[email protected]

Page 3: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Agenda!

3

C* quick intro •  Cluster, Replication, Consistency, Data Model NodeJS Driver •  Architecture, Streaming, API

Live DEMO!

Page 4: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Cassandra history!

4

NoSQL database •  created at Facebook •  open-sourced since 2008 •  current version = 2.1 •  column-oriented ☞ distributed table

Page 5: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Cassandra in 5 points!

5

•  Linear scalability •  Continuous availability (≈100% up-time) •  Multi-data centers •  Consistent performance (99% percentile) •  Operational simplicity

Page 6: Cassandra NodeJS driver & NodeJS Paris

Cassandra quick intro!

Cluster Replication

Consistency

Page 7: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Cluster!

7

Random: hash of #partition → token = hash(#p) Hash: ]0, 2127-1] Each node: 1/8 of ]0, 2127-1]

n1

n2

n3

n4

n5

n6

n7

n8

Page 8: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Linear scalability!

8

n1

n2

n3

n4

n5

n6

n7

n8

n1

n2

n3 n4

n5

n6

n7

n8 n9

n10

8 nodes 10 nodes

Page 9: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Failure tolerance!

9

Replication Factor (RF) = 3

n1

n2

n3

n4

n5

n6

n7

n8

1

2

3

Page 10: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Coordinator node!Incoming requests (read/write) Coordinator node handles the request

Every node can be coordinator àmasterless

n1

n2

n3

n4

n5

n6

n7

n8

1

2

3

coordinator request

Page 11: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Consistency!

11

Tunable at runtime •  ONE •  QUORUM (strict majority w.r.t. RF) •  ALL Apply both to read & write

Page 12: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Write consistency!Write ONE •  write request to all replicas in // •  wait for ONE ack before returning to

client •  other acks later, asynchronously

n1

n2

n3

n4

n5

n6

n7

n8

1

2

3

coordinator

Page 13: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Write consistency!Write QUORUM •  write request to all replicas in // •  wait for QUORUM acks before

returning to client •  other acks later, asynchronously

n1

n2

n3

n4

n5

n6

n7

n8

1

2

3

coordinator

Page 14: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Read consistency!Read ONE •  read from one node among all replicas •  contact the least-loaded node (stats)

n1

n2

n3

n4

n5

n6

n7

n8

1

2

3

coordinator

Page 15: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Read consistency!Read QUORUM •  read from one least-loaded node •  AND request digest from other

replicas to reach QUORUM •  return most up-to-date data to client •  repair if digest mismatch n1

n2

n3

n4

n5

n6

n7

n8

1

2

3

coordinator

Page 16: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Consistency trade-off!

16

Page 17: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

CRUD Operations!

17

INSERT INTO users(login, name, age) VALUES(‘jdoe’, ‘John DOE’, 33);

UPDATE users SET age = 34 WHERE login = jdoe;

DELETE age FROM users WHERE login = jdoe;

SELECT age FROM users WHERE login = jdoe;

Page 18: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

DDL!

18

CREATE TABLE users ( login text, name text, age int, … PRIMARY KEY(login));

partition key (#partition)

Page 19: Cassandra NodeJS driver & NodeJS Paris

Cassandra NodeJS Driver!

Architecture!Streaming!

API!

Page 20: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Connection pooling!

20

n2

n3

n4

Client

Pool1

Pool2

Pool3

CallBack1

CallBack2

CallBack3

Page 21: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Request Pipelining!

21

Client Cassandra

Page 22: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Request Pipelining!

22

Client Cassandra

StreamID

StreamID

Page 23: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Nodes Discovery!

23

n2

n3

n4

n5

n6

n7

n8

n1 Client

Control Connection

Page 24: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Round Robin Load Balancing!

24

n2

n3

n4

n5

n6

n7

n8

n1 Client 1

2 3

4

Page 25: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

DC Aware Load Balancing!

25

Client1 DC1

DC2 Client2

Page 26: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

DC Aware Load Balancing!

26

Client1 DC1

DC2 Client2

Page 27: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Token Aware Load Balancing!

27

n2

n3

n4

n5

n6

n7

n8

n1 Client

1

2

3

Page 28: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Combining Load Balancing Policies!

28

Load Balancing Policy

Round Robin DC Aware Round Robin

Token Aware

extends

wraps

Default config

Page 29: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Automatic Failover!

29

n2

n3

n4

Client

Pool1

Pool2

Pool3

Request

Page 30: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Other policies!

30

Retry policy •  write/read timeout •  node unavailable Reconnection policy •  constant schedule •  exponential schedule

Page 31: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Where do I get the driver ?!

31

$ npm install cassandra-driver

Page 32: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Common Usage!

32

var cassandra = require('cassandra-driver');

var client = new cassandra.Client({contactPoints: [’192.168.0.12', ’node2'], keyspace: ’my_keyspace'});

var query = 'SELECT email, last_name FROM users WHERE login=?';

client.execute(query, [’jdoe'], function(err, result) { console.log('got user with email ' + result.rows[0].email);

});

Page 33: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

API!

33

Insert/Update

var query = ‘’INSERT INTO sensor_data(id,date,value) VALUES(?, ?, ?)’’; client.query(query,

[‘mySensor’, ‘2014-10-15 12:00:00’, 34.5], {prepare: true, consistency: cassandra.types.consistencies.one}, function(err) { //error handling });

Page 34: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

API!

34

Select

var query = ‘’SELECT * sensor_data WHERE id = ?’’; client.query(query,

[‘mySensor’], {prepare: true, consistency: cassandra.types.consistencies.one}, function(err, result) { result.rows.forEach(function(row) { console.log(‘value = ‘ + row.value); }); });

Page 35: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

API!

35

Client creation

new cassandra.Client( { policies: {}, // load balancing, retry, reconnection queryOptions: {}, // default consistency, fetchSize protocolOptions: {}, // port pooling: {}, // #connection/host socketOptions: {}, //timeout authProvider: {}, //plain text login/password, SSL maxPrepared: 500});

Page 36: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Streaming!

36

var query = ‘’SELECT * FROM sensor_data‘’; var stream = client.stream(query, [ ], {autoPage: true});

Default fetchSize = 5000

Page 37: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Streaming!

37

stream .on(‘end’, function() { //no more data }) .on(‘readable’, function() { while (row = this.read()) { // do something with the row } }) .on(‘error’, function(err) { // process error });

Page 38: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Types!

38

Cassandra Javascript bigint Long (dCodeIO)

blob Buffer

boolean Boolean

counter Long (dCodeIO)

Decimal Buffer

Double Number

Float Number

int Number

list Array

map Object

set Array

Cassandra Javascript text String

timestamp Date

timeuuid String

uuid String

varchar* String

varint* Buffer

ascii* String

Page 39: Cassandra NodeJS driver & NodeJS Paris

@doanduyhai

Special types!

39

var cassandra = require('cassandra-driver'); //generate a new v4 uuid var id1 = cassandra.types.uuid(); //generate a new v1 uuid var id2 = cassandra.types.timeuuid(); //big int value var bigIntValue = new cassandra.types.Long.fromString("5764607523034211");

Page 40: Cassandra NodeJS driver & NodeJS Paris

Code demo

Page 41: Cassandra NodeJS driver & NodeJS Paris

Q & R

! " !

Page 42: Cassandra NodeJS driver & NodeJS Paris

Thank You @doanduyhai

[email protected]