cassandra drivers and tools
DESCRIPTION
Cassandra Drivers and ToolsTRANSCRIPT
@doanduyhai
Cassandra Java Driver & Tool DuyHai DOAN, Technical Advocate
Cassandra Drivers Architecture!
Architecture!Policies!
Java driver API!
@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)
@doanduyhai
Connection pooling!
4
n2
n3
n4
Driver
Pool1
Pool2
Pool3
Client Thread1
Client Thread2
Client Thread3
@doanduyhai
Connection pooling!
5
n2
n3
n4
Driver
Pool1
Pool2
Pool3
Client Thread1
Client Thread2
Client Thread3
1
2 3
4 5
6
@doanduyhai
Request Pipelining!
6
Client Cassandra
@doanduyhai
Request Pipelining!
7
Client Cassandra
StreamID
StreamID
@doanduyhai
Nodes Discovery!
8
n2
n3
n4
n5
n6
n7
n8
n1 Driver
Control Connection
@doanduyhai
Round Robin Load Balancing!
9
n2
n3
n4
n5
n6
n7
n8
n1 Client 1
2 3
4
@doanduyhai
DC Aware Load Balancing!
10
Client1 DC1
DC2 Client2
⤫
@doanduyhai
DC Aware Load Balancing!
11
Client1 DC1
DC2 Client2
⤫
@doanduyhai
Token Aware Load Balancing!
12
n2
n3
n4
n5
n6
n7
n8
n1 Client
1
2
3
⤫
@doanduyhai
Combining Load Balancing Policies!
13
Load Balancing Policy
Round Robin DC Aware Round Robin
Token Aware
extends
wraps
Default config
@doanduyhai
Automatic Failover!
14
n2
n3
n4
Driver
Pool1
Pool2
Pool3
Client Thread
⤫
1
2 3
4 5
6 7 8
@doanduyhai
Other policies!
15
Retry policy • write/read timeout • node unavailable Reconnection policy • constant schedule • exponential schedule
@doanduyhai
Statements!
16
Plain statement • convenient, one-off query • plain string ☞ parsing overhead
INSERT INTO user(login, name, age) VALUES(‘jdoe’, ‘John DOE’, 33)’;
@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)’;
@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(?, ?, ?)’;
@doanduyhai
Java Driver!
19
Reference implementation Base on asynchronous Netty library Configurable policies Query tracing support Client-node compression & SSL
@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
@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]’)");
@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();
@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
@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"); }
@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();
@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);
@doanduyhai
Java Driver Object Mapper!
27
• simple mapper
• KISS
• annotations à-la JPA (but no JPA dependencies)
• templating system à-la Spring Data
@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
@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
@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
@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() ); }
@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;
@doanduyhai
New automatic paging!
33
n2
n3
n4
n5
n6
n7
n8
n1 Driver
Query
Page 1 + paging state 1
@doanduyhai
New automatic paging!
34
n2
n3
n4
n5
n6
n7
n8
n1 Driver
Query
Page 2 + paging state 2
@doanduyhai
New automatic paging!
35
Paging state ≈ stateless cookie Resilient to node failure
@doanduyhai
Paging during node failure!
36
n2
n3
n4
n5
n6
n7
n8
n1 Driver
Query
Page 1 + paging state 1
@doanduyhai
Paging during node failure!
37
n2
n3
n4
n5
n6
n7
n8
n1 Driver
Query
Page 2 + paging state 2
⤫
Q & R
! " !
Dev Center demo
@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