Cassandra for Java Developers @ Paris JUG
-
Upload
alexandre-dutra -
Category
Technology
-
view
190 -
download
0
Transcript of Cassandra for Java Developers @ Paris JUG
Cassandra for Java DevelopersDataStax Java Driver & DevCenter
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
About Me
Alexandre DutraDriver and Tools Software Engineer @
3
@alexdut
linkedin.com/in/alexandredutra
github.com/adutra
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Agenda
1. Java Driver Architecture• Native Protocol• Node Discovery• Load Balancing• Failover & Fault Tolerance
4
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Agenda
1. Java Driver Architecture• Native Protocol• Node Discovery• Load Balancing• Failover & Fault Tolerance
2. Java Driver In Practice• Asynchronous queries• Prepared Statements• Query Builder• Object Mapping API
5
TDD!
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Agenda
1. Java Driver Architecture• Native Protocol• Node Discovery• Load Balancing• Failover & Fault Tolerance
2. Java Driver In Practice• Asynchronous queries• Prepared Statements• Query Builder• Object Mapping API
6
3. DevCenter• Connection Manager• CQL Editor• Query Tracing• Visual DDL
TDD!
Demo!
I. Java Driver Architecture
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Native Protocol - Basics
8
Client Coord
Node Replica
Replica
ReplicaNode
Coordinator node:Forwards all R/W requeststo corresponding replicas
Native Protocol
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Native Protocol - Request Pipelining
9
Client
WithoutRequest Pipelining
Cassandra
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Native Protocol - Request Pipelining
10
Client
WithRequest Pipelining
Cassandra
1
2
1
3
2
3
StreamID
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Native Protocol - Notifications
11
Client
WithoutNotifications
WithNotifications
NodeNode
Node
Client
NodeNode
Node
Poll
Push
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Node Discovery
12
Contact point will reply with cluster topology, peer addresses etc.
Node
Node
Contact Point Node
Client
Contact Point
Contact Point
Cluster.init()
Control connection
Session.init()
Regular connections
Discovered node
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing
13
Node
Node
Node
ClientThread
Node
Driver
Cassandra 2.0N connections per node
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing
14
Node
Node
Node
ClientThread
Node
Driver
Cassandra 2.1+ 1 single connection per node
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing
15
ClientThread
Node
Node
Node
Node
6
23
45
1Driver
Load balancing picks up a node
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing - Round Robin
16
Node
Node
NodeNode
Client
Node
Node
1
2
3 etc.
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing - DC Aware Round Robin
17
Node
Node
Node
Client
Datacenter A
Local nodes are tried first
Node
Node
Node
Datacenter B
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing - DC Aware Round Robin
18
Node
Node
Node
Client
Datacenter A
Node
Node
Node
Datacenter B
If no local node is available, the request is sent to a remote node.
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing - Available Policies
19
RoundRobinPolicy
LoadBalancingPolicy
DCAwareRoundRobinPolicy
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing - Available Policies
20
TokenAwarePolicy
WhiteListPolicy
LatencyAwarePolicy
RoundRobinPolicy
LoadBalancingPolicy
DCAwareRoundRobinPolicy
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing - Token Awareness
21
Nodes that own a Replica of the PK being read or written by the query will be contacted first.
Node
Node
ReplicaNode
Client
Replica
Replica
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Load Balancing - Default Policy
22
TokenAwarePolicy
DCAwareRoundRobinPolicy
Token awareness
DC awareness
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Automatic Failover
23
ClientThread
Node
Node
Node
Node
7
2
4
53
1
Driver
6
X
Load balancing tries next node
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Fault Tolerance
24
• UnavailableException
• Consistency level not met
• ReadTimeoutException
• WriteTimeoutException
• Coordinator times out
Retry
X⚠️
Client
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Fault Tolerance
25
• UnavailableException
• Consistency level not met
• ReadTimeoutException
• WriteTimeoutException
• Coordinator times out
Retry
X⚠️
Client
• NoHostAvailableException
• Cluster is down
• Network connectivity issue
Client X
Reconnect
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Retry - Available Policies
26
LoggingRetryPolicyDefaultRetryPolicy
RetryPolicy
DowngradingConsistencyRetryPolicy
FallthroughRetryPolicy
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Reconnection - Available Policies
27
ExponentialReconnectionPolicy
ReconnectionPolicy
ConstantReconnectionPolicy
(default)
II. Java Driver In Practice
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Java Driver - Maven Artifact
<dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-‐driver-‐core</artifactId> <version>2.1.4</version>
</dependency>
Available in Maven Central (OSGi bundle).
Supports Apache Cassandra 1.2 to 2.1
• https://github.com/datastax/java-driver
• http://www.datastax.com/documentation/developer/java-driver/2.1
29
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Bootstrapping
30
1) Ready… (configure)
Cluster cluster = Cluster.builder() .addContactPoints("10.1.2.5", "cassandra_node3") .build();
2) Steady… (connect)
Session session = cluster.connect("my_keyspace");
3) Go! (execute)
session.execute( "INSERT INTO user (user_id, name, email) VALUES (12345, 'johndoe', '[email protected]')");
The rest of the nodes will be discovered by the driver
Cluster and Session are thread-safe. Singletons should be created at startup!
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Live Coding!
• https://www.github.com/adutra/cassandra-java-driver-demo
31
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Object Mapping API
• Map Objects to Statements and ResultSets to Objects
• Avoid boilerplate for common use cases
• Do NOT hide Cassandra from the developer
• No “clever tricks” à la Hibernate
• Not JPA compatible, but JPA-ish API
32
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Object Mapping API - Maven Artifact
33
<dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-‐driver-‐mapping</artifactId> <version>2.1.4</version>
</dependency>
Additional artifact for object mapping
Available since Driver 2.1.0
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Basic Object Mapping
34
CREATE TYPE address ( street text, city text, zip int ); CREATE TABLE users ( login text PRIMARY KEY, name text, age int, address frozen<address> );
@UDT(name = "address") public class Address { private String street; private String city; private int zip; // getters and setters omitted... } @Table(name = "users") public class User { @PartitionKey private String login; private String name; private Integer age; @Frozen private Address address; // getters and setters omitted... }
III. DevCenter
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
DevCenter
• Easy-to-use visual query tool for Cassandra and DSE• Current version: 1.2.2
• 1.3 coming soon• Features
• Create and manage connections• Create and run CQL queries + results visualization• Syntax highlighting & validation• Content assist• Query Tracing Support• Visual DDL assistants (coming soon)
36
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
DevCenter
• Audience• Developers (prototyping)• Ops (administration)• Students (learn CQL)
• Technology• Standalone Eclipse RCP application• Linux, Mac, Windows
• datastax.com/download
37
Questions?
We’re Hiring!
@DataStaxCareers
blog.datastax.com
github.com/datastax
Copyright @ 2015 ParisJug. Licence CC - Creative Commons 2.0 France – Paternité - Pas d'Utilisation Commerciale - Partage des Conditions Initiales à l'Identique
Paris JUG Sponsors
40