Cassandra Drivers and Tools

41
@doanduyhai Cassandra Java Driver & Tool DuyHai DOAN, Technical Advocate

description

Cassandra Drivers and Tools

Transcript of Cassandra Drivers and Tools

Page 1: Cassandra Drivers and Tools

@doanduyhai

Cassandra Java Driver & Tool DuyHai DOAN, Technical Advocate

Page 2: Cassandra Drivers and Tools

Cassandra Drivers Architecture!

Architecture!Policies!

Java driver API!

Page 3: Cassandra Drivers and Tools

@doanduyhai

Drivers list!

3

•  Java •  C# •  Python •  Node.js •  Ruby (1.0.0.rc1) •  C++ (beta) •  ODBC (beta) •  Clojure (community) •  Go (community) •  PHP (to be announced)

Page 4: Cassandra Drivers and Tools

@doanduyhai

Connection pooling!

4

n2

n3

n4

Driver

Pool1

Pool2

Pool3

Client Thread1

Client Thread2

Client Thread3

Page 5: Cassandra Drivers and Tools

@doanduyhai

Connection pooling!

5

n2

n3

n4

Driver

Pool1

Pool2

Pool3

Client Thread1

Client Thread2

Client Thread3

1

2 3

4 5

6

Page 6: Cassandra Drivers and Tools

@doanduyhai

Request Pipelining!

6

Client Cassandra

Page 7: Cassandra Drivers and Tools

@doanduyhai

Request Pipelining!

7

Client Cassandra

StreamID

StreamID

Page 8: Cassandra Drivers and Tools

@doanduyhai

Nodes Discovery!

8

n2

n3

n4

n5

n6

n7

n8

n1 Driver

Control Connection

Page 9: Cassandra Drivers and Tools

@doanduyhai

Round Robin Load Balancing!

9

n2

n3

n4

n5

n6

n7

n8

n1 Client 1

2 3

4

Page 10: Cassandra Drivers and Tools

@doanduyhai

DC Aware Load Balancing!

10

Client1 DC1

DC2 Client2

Page 11: Cassandra Drivers and Tools

@doanduyhai

DC Aware Load Balancing!

11

Client1 DC1

DC2 Client2

Page 12: Cassandra Drivers and Tools

@doanduyhai

Token Aware Load Balancing!

12

n2

n3

n4

n5

n6

n7

n8

n1 Client

1

2

3

Page 13: Cassandra Drivers and Tools

@doanduyhai

Combining Load Balancing Policies!

13

Load Balancing Policy

Round Robin DC Aware Round Robin

Token Aware

extends

wraps

Default config

Page 14: Cassandra Drivers and Tools

@doanduyhai

Automatic Failover!

14

n2

n3

n4

Driver

Pool1

Pool2

Pool3

Client Thread

1

2 3

4 5

6 7 8

Page 15: Cassandra Drivers and Tools

@doanduyhai

Other policies!

15

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

Page 16: Cassandra Drivers and Tools

@doanduyhai

Statements!

16

Plain statement •  convenient, one-off query •  plain string ☞ parsing overhead

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

Page 17: Cassandra Drivers and Tools

@doanduyhai

Statements!

17

Prepared statements •  avoid parsing overhead •  query structure should be known ahead of time •  bound values •  named parameters

INSERT INTO user(login, name, age) VALUES(?, ?, ?)’;

INSERT INTO user(login, name, age) VALUES(:login, :name, :age)’;

Page 18: Cassandra Drivers and Tools

@doanduyhai

Statements!

18

Parameterized statements •  same as plain statement •  pass bound values as bytes ☞ avoid ser/deser of values

INSERT INTO user(login, name, age) VALUES(?, ?, ?)’;

Page 19: Cassandra Drivers and Tools

@doanduyhai

Java Driver!

19

Reference implementation Base on asynchronous Netty library Configurable policies Query tracing support Client-node compression & SSL

Page 20: Cassandra Drivers and Tools

@doanduyhai

Maven dependency!

20

<dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>2.1.1</version> </dependency>

depends on Netty, Guava, Metrics

Available on Maven Central

Page 21: Cassandra Drivers and Tools

@doanduyhai

Connect and Write!

21

Cluster cluster = Cluster.builder() .addContactPoints("127.0.0.1", “another-host").build();

seed nodes (IP or DNS name)

Session session = cluster.connect("my_keyspace");

session.execute("INSERT INTO user (user_id, name, email) VALUES (12345, 'johndoe', '[email protected]’)");

Page 22: Cassandra Drivers and Tools

@doanduyhai

Configuration!

22

Cluster cluster = Cluster.builder() .addContactPoints("127.0.0.1", “another-host") .withLoadBalancingPolicy(new DCAwareRoundRobinPolicy("DC1") .withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE) .withReconnectionPolicy(new ConstantReconnectionPolicy(1000)) .build();

Page 23: Cassandra Drivers and Tools

@doanduyhai

Read!

23

ResultSet resultSet = session.execute("SELECT * FROM user");

List<Row> rows = resultSet.all();

for (Row row : rows) { Long userId = row.getLong("user_id"); String name = row.getString("name"); String email = row.getString("email"); }

Stateless ☞ thread-safe

Page 24: Cassandra Drivers and Tools

@doanduyhai 24

Asynchronous Read!

ResultSetFuture future = session.executeAsync("SELECT * FROM user");

ResultSet resultSet = future.get(); //blocking call

List<Row> rows = resultSet.all();

for (Row row : rows) { Long userId = row.getLong("user_id"); String name = row.getString("name"); String email = row.getString("email"); }

Page 25: Cassandra Drivers and Tools

@doanduyhai 25

Asynchronous Read with CallBack!

ResultSetFuture future = session.executeAsync("SELECT * FROM user");

future.addListener(new Runnable() { public void run() { // Process the results here } }, executor);

executor = Executors .newCachedThreadPool(); or

executor = Executors .sameThreadExecutor();

Page 26: Cassandra Drivers and Tools

@doanduyhai 26

Query Builder!

Query query = QueryBuilder .select() .all() .from( "my_keyspace", "user") .where(eq("login", "jdoe"));

query.setConsistencyLevel(ConsistencyLevel.ONE);

ResultSet rs = session.execute(query);

Page 27: Cassandra Drivers and Tools

@doanduyhai

Java Driver Object Mapper!

27

•  simple mapper

•  KISS

•  annotations à-la JPA (but no JPA dependencies)

•  templating system à-la Spring Data

Page 28: Cassandra Drivers and Tools

@doanduyhai

Java Driver Object Mapper!

28

@Table(keyspace =  "mapper_module", name = "users") public class User {

@PartitionKey private String login;

private String name; // getters and setters omitted... }

Mapping

Page 29: Cassandra Drivers and Tools

@doanduyhai

Java Driver Object Mapper!

29

MappingManager manager = new MappingManager(session); Mapper mapper = manager.mapper(User.class);

User user = mapper.get("[email protected]");

mapper.saveAsync(new User("[email protected]"));

mapper.delete("[email protected]");

Usage

Page 30: Cassandra Drivers and Tools

@doanduyhai

Java Driver Object Mapper!

30

@Accessor interface UserAccessor { @Query("SELECT * FROM users LIMIT :max") Result<User> firstNUsers(@Param("max") int limit); }

Accessors (SpringData template-like) definition

Page 31: Cassandra Drivers and Tools

@doanduyhai

Java Driver Object Mapper!

31

Accessors usage

UserAccessor accessor = manager.createAccessor(UserAccessor.class); List<User> users = accessor.firstNUsers(10).all(); for (User user : users) { System.out.println( profile.getAddress().getZip() ); }

Page 32: Cassandra Drivers and Tools

@doanduyhai

Old manual paging!

32

Some time you need to fetch all table content Manual paging:

SELECT * FROM users WHERE token(login) >= token(<last_fetched_login>) LIMIT 100;

Page 33: Cassandra Drivers and Tools

@doanduyhai

New automatic paging!

33

n2

n3

n4

n5

n6

n7

n8

n1 Driver

Query

Page 1 + paging state 1

Page 34: Cassandra Drivers and Tools

@doanduyhai

New automatic paging!

34

n2

n3

n4

n5

n6

n7

n8

n1 Driver

Query

Page 2 + paging state 2

Page 35: Cassandra Drivers and Tools

@doanduyhai

New automatic paging!

35

Paging state ≈ stateless cookie Resilient to node failure

Page 36: Cassandra Drivers and Tools

@doanduyhai

Paging during node failure!

36

n2

n3

n4

n5

n6

n7

n8

n1 Driver

Query

Page 1 + paging state 1

Page 37: Cassandra Drivers and Tools

@doanduyhai

Paging during node failure!

37

n2

n3

n4

n5

n6

n7

n8

n1 Driver

Query

Page 2 + paging state 2

Page 38: Cassandra Drivers and Tools

Q & R

! " !

Page 39: Cassandra Drivers and Tools

Dev Center demo

Page 40: Cassandra Drivers and Tools

@doanduyhai Company Confidential 40

Training Day | December 3rd Beginner Track •  Introduction to Cassandra •  Introduction to Spark, Shark, Scala and

Cassandra

Advanced Track •  Data Modeling •  Performance Tuning

Conference Day | December 4th Cassandra Summit Europe 2014 will be the single largest gathering of Cassandra users in Europe. Learn how the world's most successful companies are transforming their businesses and growing faster than ever using Apache Cassandra. http://bit.ly/cassandrasummit2014

Page 41: Cassandra Drivers and Tools

Thank You @doanduyhai

[email protected]

https://academy.datastax.com/