Top Banner
Apache Cassandra Ruby Driver explained
46

Ruby Driver Explained: DataStax Webinar May 5th 2015

Jul 18, 2015

Download

Technology

DataStax
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Ruby Driver Explained: DataStax Webinar May 5th 2015

Apache CassandraRuby Driver explained

Page 2: Ruby Driver Explained: DataStax Webinar May 5th 2015

IntroductionCassandra Overview

Page 3: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Datacenter Datacenter

Cassandra Topology

3

Node

NodeNode

Node

Client Client

Node

NodeNode

Node

Client Client

Cluster

Page 4: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Datacenter Datacenter

Request Coordinator

4

Node

NodeNode

Node

Client Client

Node

NodeCoordinator

Node

Client Client

Coordinator node:Forwards requeststo corresponding replicas

Page 5: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Datacenter

Row Replica

5

Replica

NodeNode

Replica

Client Client

Datacenter

Node

Node

Replica

Client Client

Coordinator

Replica node:Stores a slice of total rows of each keyspace

Page 6: Ruby Driver Explained: DataStax Webinar May 5th 2015

Quick StartInstallation and Usage

Page 7: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Installation

7

gem 'cassandra-driver', '~> 1.0.0'

gem install cassandra-driver

Page 8: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Usage

8

require 'cassandra'

cluster = Cassandra.cluster

cluster.each_host do |h| puts "Host #{h.ip}: datacenter=#{h.datacenter} rack=#{h.rack}" end

keyspace = 'system' session = cluster.connect(keyspace)

future = session.execute_async('SELECT * FROM schema_columnfamilies')

future.on_success do |rows| rows.each do |row| puts “Table: #{row[‘keyspace_name']}.#{row['columnfamily_name']}" end end

future.join

Page 9: Ruby Driver Explained: DataStax Webinar May 5th 2015

Asynchronous ExecutionIO Reactor, Request Pipelining and Future Composition

Page 10: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Asynchronous Core

10

Application Thread

Business Logic

Driver

Background Thread

IO Reactor

Page 11: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Request Pipelining

11

Client

WithoutRequest Pipelining

Server

Client Server WithRequest Pipelining

1

2

2

3

1

3

1

2

3

1

2

3

Page 12: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Future Composition

12

select_user = session.prepare("SELECT * FROM users WHERE id = ?") select_page = session.prepare("SELECT * FROM pages WHERE slug = ?") user_ids = [1, 2, 3, 4] futures = user_ids.map do |id| future = session.execute_async(select_user, id)

future.then do |users| user = users.first future = session.execute_async(select_page, user[‘username'])

future.then do |pages| page = pages.first

User.new(user, Page.new(page)) end end end Cassandra::Future.all(futures).get

Page 13: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Future Composition

13

select_user = session.prepare("SELECT * FROM users WHERE id = ?") select_page = session.prepare("SELECT * FROM pages WHERE slug = ?") user_ids = [1, 2, 3, 4] futures = user_ids.map do |id| future = session.execute_async(select_user, id)

future.then do |users| user = users.first future = session.execute_async(select_page, user[‘username'])

future.then do |pages| page = pages.first

User.new(user, Page.new(page)) end end end Cassandra::Future.all(futures).get

Page 14: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Future Composition

14

select_user = session.prepare("SELECT * FROM users WHERE id = ?") select_page = session.prepare("SELECT * FROM pages WHERE slug = ?") user_ids = [1, 2, 3, 4] futures = user_ids.map do |id| future = session.execute_async(select_user, id)

future.then do |users| user = users.first future = session.execute_async(select_page, user[‘username'])

future.then do |pages| page = pages.first

User.new(user, Page.new(page)) end end end Cassandra::Future.all(futures).get

Page 15: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Future Composition

15

select_user = session.prepare("SELECT * FROM users WHERE id = ?") select_page = session.prepare("SELECT * FROM pages WHERE slug = ?") user_ids = [1, 2, 3, 4] futures = user_ids.map do |id| future = session.execute_async(select_user, id)

future.then do |users| user = users.first future = session.execute_async(select_page, user[‘username'])

future.then do |pages| page = pages.first

User.new(user, Page.new(page)) end end end Cassandra::Future.all(futures).get

Page 16: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Future Composition

16

select_user = session.prepare("SELECT * FROM users WHERE id = ?") select_page = session.prepare("SELECT * FROM pages WHERE slug = ?") user_ids = [1, 2, 3, 4] futures = user_ids.map do |id| future = session.execute_async(select_user, id)

future.then do |users| user = users.first future = session.execute_async(select_page, user[‘username'])

future.then do |pages| page = pages.first

User.new(user, Page.new(page)) end end end Cassandra::Future.all(futures).get

Page 17: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Future Composition

17

select_user = session.prepare("SELECT * FROM users WHERE id = ?") select_page = session.prepare("SELECT * FROM pages WHERE slug = ?") user_ids = [1, 2, 3, 4] futures = user_ids.map do |id| future = session.execute_async(select_user, id)

future.then do |users| user = users.first future = session.execute_async(select_page, user[‘username'])

future.then do |pages| page = pages.first

User.new(user, Page.new(page)) end end end Cassandra::Future.all(futures).get

Page 18: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Future Composition

18

[#<User @id=1 @username="avalanche123"; @page=#<Page @slug="avalanche123" ... > ... >, ... ]

Page 19: Ruby Driver Explained: DataStax Webinar May 5th 2015

Load BalancingPrinciples and Implementations

Page 20: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Load Balancing

20

ApplicationThread

Node

Pool

SessionPool

Pool

Pool

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Load Balancing Policy

Page 21: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Load Balancing

20

ApplicationThread

Node

Pool

SessionPool

Pool

Pool

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Load Balancing Policy

Page 22: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Load Balancing

20

ApplicationThread

Node

Pool

SessionPool

Pool

Pool

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Load Balancing Policy

Page 23: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Datacenter

Datacenter

DataCenter Aware Balancing

21

Node

Node

NodeClient

Node

Node

Node

Client

Client

Client

Client

Client

Local nodes are queried first, if non are available, the request could be sent to a remote node.

Page 24: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Token Aware Balancing

22

Route request directly to Replicas

Node

Node

ReplicaNode

Client

Replica

Replica

Uses prepared statement metadata to get the token

Page 25: Ruby Driver Explained: DataStax Webinar May 5th 2015

Fault ToleranceSources of Failure and Error Handling

Page 26: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Fault Tolerance

24

Coordinator

Node Replica

Replica

ReplicaNode

Business Logic

Driver

Application

Page 27: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved. 25

Coordinator

Node Replica

Replica

ReplicaNode

Business Logic

Driver

Application

Invalid Requests

Network Timeouts

Server ErrorsPossible Failures

Page 28: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Automatic Retry of Server Errors

26

ApplicationThread

Node

Pool

SessionPool

Pool

Pool

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Load Balancing Policy

Page 29: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Automatic Retry of Server Errors

26

ApplicationThread

Node

Pool

SessionPool

Pool

Pool

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Load Balancing Policy

Page 30: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Automatic Retry of Server Errors

26

ApplicationThread

Node

Pool

SessionPool

Pool

Pool

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Load Balancing Policy

Page 31: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved. 27

Coordinator

Node Replica

Replica

ReplicaNode

Business Logic

Driver

Application

Unreachable Consistency

Page 32: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Coordinator

Node Replica

ReplicaNode

28

Replica

Business Logic

Driver

Application

Read / Write Timeout Error

Page 33: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Coordinator

Node Replica

ReplicaNode

28

Replica

Business Logic

Driver

Application

Read / Write Timeout Error

Page 34: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Coordinator

Node Replica

ReplicaNode

28

Replica

Business Logic

Driver

Application

Read / Write Timeout Error

read / write timeout

Page 35: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved. 29

Coordinator

Node Replica

Replica

ReplicaNode

Business Logic

Driver

Application

Unavailable Error

Page 36: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved. 29

Coordinator

Node Replica

Replica

ReplicaNode

Business Logic

Driver

Application

Unavailable Error

unavailable

Page 37: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved. 30

Error Handling

Page 38: Ruby Driver Explained: DataStax Webinar May 5th 2015

Address ResolutionTopology Aware Client

Page 39: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Datacenter Datacenter

Multiple Addresses

32

Node

NodeNode

Node

Client Client

Node

NodeNode

Node

Client Client

Within Datacenter: Private IPs

Across Datacenters: Public IPs

Page 40: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Address Resolution

33

ApplicationThread

ApplicationThread

ApplicationThread

Client Cluster

Page 41: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Address Resolution

33

ApplicationThread Node

Cluster

ApplicationThread

ApplicationThread

Client Cluster

Address Resolution Policy

Page 42: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Address Resolution

33

ApplicationThread Node

Cluster

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Address Resolution Policy

Control Connection

Page 43: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Address Resolution

33

ApplicationThread Node

Cluster

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Address Resolution Policy

Control Connection

Page 44: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

Application Driver

Address Resolution

33

ApplicationThread Node

Pool

Cluster

Pool

Pool

Pool

ApplicationThread

ApplicationThread

Client Cluster

Node

Node

Node

Address Resolution Policy

Control Connection

Session

Page 45: Ruby Driver Explained: DataStax Webinar May 5th 2015

© 2015 DataStax, All Rights Reserved.

EC2 Multi-Region Address Resolution

34