65
1 Taming the Cloud Database with Apache jclouds http://rack.to/jo14db

JavaOne 2014: Taming the Cloud Database with jclouds

Embed Size (px)

DESCRIPTION

- The Cloud - OpenStack - jclouds - OpenStack Trove for users - jclouds for contributors

Citation preview

Page 1: JavaOne 2014: Taming the Cloud Database with jclouds

1

Taming the Cloud Database

with

Apache jclouds

http://rack.to/jo14db

Page 2: JavaOne 2014: Taming the Cloud Database with jclouds

Before we begin: Setup

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

2

Virtual Machine pre-setup provided

http://rack.to/jo14vm

Avoid downloading during this presentation

Convenient way to get up to speed with jclouds

Page 3: JavaOne 2014: Taming the Cloud Database with jclouds

Before we begin: Setup

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

3

Alternatively you need

Oracle Java 7

http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-

ubuntu-via.html

maven

http://maven.apache.org/download.cgi

git

git config --global core.autocrlf false

Page 4: JavaOne 2014: Taming the Cloud Database with jclouds

Before we begin: Setup

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

4

Testing on your machine (no subscriptions)

Devstack

Download yourself

http://devstack.org/

Run in cloud

http://blog.phymata.com/2014/04/18/devstack-icehouse-on-the-

rackspace-cloud/

Providers: Rackspace, HP, others

http://www.openstack.org/marketplace/public-clouds/

Page 5: JavaOne 2014: Taming the Cloud Database with jclouds

Before we begin: Setup

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

5

Testing on your machine with Rackspace:

http://rack.to/jo14signup

Page 6: JavaOne 2014: Taming the Cloud Database with jclouds

Before we begin: Setup

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

6

git clone https://github.com/zack-shoylev/jclouds-

developer-examples.git

Multiple branches

git clone https://github.com/rackerlabs/jclouds-

examples.git

Branch trove-example-only

Page 7: JavaOne 2014: Taming the Cloud Database with jclouds

Introductions

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

7

Zack Shoylev

irc: zacksh twitter: @zackshoylev

freenode #jclouds

Also email

@rackspace.com

Page 8: JavaOne 2014: Taming the Cloud Database with jclouds

Introductions

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

8

Developer Experience

[email protected]

Page 9: JavaOne 2014: Taming the Cloud Database with jclouds

Goals

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

9

jclouds

Create a database in the cloud

Abstractions and how to contribute

How to add support for an API

Page 10: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

10

Networked and distributed computing

Variety of services

Compute (servers)

Storage (files)

Databases

Email

Page 11: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

11

Can’t someone else do it?

Page 12: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

12

Page 13: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

13

Public cloud (external provider)

Private cloud (internal deployment)

Hybrid cloud

Public + Private

Rackspace example

Page 14: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

14

Your

System

S

D

K

Cloud

A

P

I

VM VM

VM

This can be an application server

Or your home machine

Or belong to one of your end users

Or a cloud VM

Or a smartphone

jclouds

Page 15: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

15

Advantages

Metered pricing (pay as you go)

Project scalability (unlimited)

Safer (offsite/redundant)

Economies of scale

Expertise

Support

Page 16: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

16

Disadvantages

Less hardware control

Provider-controlled downtime

Virtualization (efficiency)

Provider lock-in

Provider-specific apis/sdks/features

Expensive to switch clouds or deploy locally

jclouds minimizes this disadvantage

Page 17: JavaOne 2014: Taming the Cloud Database with jclouds

The Cloud

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

17

Database specific advantages

Optimized by provider

Settings

Container virtualization

Automated software updates

Redundant data storage

Backup

Migration

Choice

Clustering (upcoming)

Support

Page 18: JavaOne 2014: Taming the Cloud Database with jclouds

OpenStack

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

18

Cloud OS

Open-sourced by Rackspace and NASA

(2010)

Free

Supported

AT&T, HP, IBM, Red Hat, Rackspace, Dell, Cisco,

Intel, VMware, …

Page 19: JavaOne 2014: Taming the Cloud Database with jclouds

OpenStack

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

19

http://stackalytics.com/

Page 20: JavaOne 2014: Taming the Cloud Database with jclouds

jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

20

Cloud SDK

Apache project

Java (and Clojure)

Easy

Portable

Cloud-agnostic

Community

Open source

Page 21: JavaOne 2014: Taming the Cloud Database with jclouds

jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

21

https://jclouds.apache.org/

Page 22: JavaOne 2014: Taming the Cloud Database with jclouds

jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

22

HTTP requests, responses, retries

Authentication and re-authentication

Pagination

Polling

Rate limits

Retries

Abstractions

Logging

Less code

Page 23: JavaOne 2014: Taming the Cloud Database with jclouds

jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

23

Page 24: JavaOne 2014: Taming the Cloud Database with jclouds

jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

24

Services

Storage

Compute

VM Images

Load Balancers

DNS

Databases

Providers

Openstack

Rackspace

HP

Amazon

Azure

Page 25: JavaOne 2014: Taming the Cloud Database with jclouds

jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

25

AWS aws-ec2 US-VA,US-CA,IE,SG

Bluelock bluelock-vcloud-zone01 US-IN

CloudSigma US cloudsigma-lvs US-NV

CloudSigma CH cloudsigma-zrh CH-ZH

CloudSigma DC cloudsigma-wdc US-DC

DigitalOcean digitalocean

ElasticHosts GB elastichosts-lon-b GB-LND

ElasticHosts GB elastichosts-lon-p GB-LND

ElasticHosts US elastichosts-sat-p US-TX

Go2Cloud go2cloud-jhb1 ZA-GP

GoGrid gogrid US-CA,US-VA

Green House Data greenhousedata-element-

vcloud

US-WY

HP hpcloud-compute US-NV

Ninefold ninefold-compute AU-NSW

OpenHosting openhosting-east1 US-VA

Rackspace UK (First Gen) cloudservers-uk GB-SLG

Rackspace US (First Gen) cloudservers-us US-IL,US-TX

Rackspace UK (Next Gen) rackspace-cloudservers-uk GB-SLG

Rackspace US (Next Gen) rackspace-cloudservers-us US-IL,US-TX

SeverLove serverlove-z1-man GB-MAN

SkaliCloud skalicloud-sdg-my MY-10

SoftLayer softlayer

Compute

Providers

Page 26: JavaOne 2014: Taming the Cloud Database with jclouds

jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

26

Showcase database code

Best practices

Compare with compute code

Gotchas and workarounds

Abstractions

Page 27: JavaOne 2014: Taming the Cloud Database with jclouds

Requirements

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

27

Maven 3

Java 7+

jclouds

Windows or Linux [etc..] (thanks Java!)

Page 28: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

28

Skeleton

Project

Create User

Create Instance

Initialize API

Create Database

Test Connection

Cleanup

Page 29: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

29

Maven Dependencies

Selective subset

Versioning

jclouds-labs

Page 30: JavaOne 2014: Taming the Cloud Database with jclouds

POM

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

30

https://github.com/jclouds/jclouds-examples/blob/master/rackspace/pom.xml

<dependency>

<groupId>org.apache.jclouds.provider</groupId>

<artifactId>rackspace-clouddatabases-us</artifactId>

<version>${jclouds.version}</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.25</version>

</dependency>

Page 31: JavaOne 2014: Taming the Cloud Database with jclouds

POM

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

31

mvn dependency:copy-dependencies "-DoutputDirectory=./lib"

Page 32: JavaOne 2014: Taming the Cloud Database with jclouds

Logging

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

32

// This module is responsible for enabling logging Iterable<Module> modules = ImmutableSet.<Module> of(new SLF4JLoggingModule()); ComputeServiceContext context = ContextBuilder.newBuilder(provider) .credentials(username, apiKey) .modules(modules) // don't forget to add the modules to your context! .buildView(ComputeServiceContext.class);

logback.xml <configuration scan="false"> … <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender"> <file>target/test-data/jclouds-wire.log</file> <encoder> <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern> </encoder> </appender>

Page 33: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

33

Skeleton

Project

Create User

Create Instance

Initialize API

Create Database

Test Connection

Cleanup

Page 34: JavaOne 2014: Taming the Cloud Database with jclouds

Initialize

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

34

private final TroveApi troveApi;

troveApi = ContextBuilder

.newBuilder("rackspace-clouddatabases-us")

.credentials(username, apiKey)

.buildApi(TroveApi.class);

Page 35: JavaOne 2014: Taming the Cloud Database with jclouds

Architecture

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

35

Cloud Databases

Trove

jclouds-database

Increasing level of abstraction

Provider settings:

Endpoint, etc.

Implementation code

Abstractions

Page 36: JavaOne 2014: Taming the Cloud Database with jclouds

Architecture

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

36

Cloud Databases

Trove

jclouds-database

Increasing level of abstraction

Provider settings:

Endpoint, etc.

Implementation code

Abstractions

Not implemented

Page 37: JavaOne 2014: Taming the Cloud Database with jclouds

Initialize

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

37

private final FlavorApi flavorApi;

flavorApi = troveApi.getFlavorApiForZone(ZONE);

Page 38: JavaOne 2014: Taming the Cloud Database with jclouds

APIs

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

38

TroveApi

FlavorApi

InstanceApi

DatabaseApi

UserApi

Utils

Page 39: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

39

Skeleton

Project

Create User

Create Instance

Initialize API

Create Database

Test Connection

Cleanup

Page 40: JavaOne 2014: Taming the Cloud Database with jclouds

Create Instance

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

40

Flavor flavor = Iterables.getFirst(flavorApi.list(), null);

Instance instance = instanceApi.create(flavorId, size, name);

flavor.getId()

Volume size in GB

Page 41: JavaOne 2014: Taming the Cloud Database with jclouds

Create Instance

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

41

Instance updatedInstance = awaitAvailable(instance, instanceApi);

Page 42: JavaOne 2014: Taming the Cloud Database with jclouds

Create Instance

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

42

Instance updatedInstance = awaitAvailable(instance, instanceApi);

Polls status, waits until ready. Will not retry by itself!

Page 43: JavaOne 2014: Taming the Cloud Database with jclouds

Actual Code

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

43

InstanceApi instanceApi = api.getInstanceApiForZone(zone);

for (int retries = 0; retries < 10; retries++) {

Instance instance = null;

try {

instance = instanceApi.create(flavorId, size, name);

} catch (Exception e) {

Uninterruptibles.sleepUninterruptibly(15, TimeUnit.SECONDS);

logger.error(Arrays.toString(e.getStackTrace()));

continue;

}

Instance updatedInstance = awaitAvailable(instance, instanceApi);

if (updatedInstance != null) {

return updatedInstance;

}

instanceApi.delete(instance.getId());

InstancePredicates.awaitDeleted(instanceApi).apply(instance);

}

return null;

Page 44: JavaOne 2014: Taming the Cloud Database with jclouds

Actual Code

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

44

Utils.

getWorkingInstance(

String zone,

String name,

String flavorId,

int size)

Page 45: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

45

Skeleton

Project

Create User

Create Instance

Initialize API

Create Database

Test Connection

Cleanup

Page 46: JavaOne 2014: Taming the Cloud Database with jclouds

Create Database

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

46

troveApi = ContextBuilder.newBuilder(PROVIDER)

.credentials(username, apiKey)

.buildApi(TroveApi.class);

instanceApi = troveApi.getInstanceApiForZone(ZONE);

databaseApi = troveApi

.getDatabaseApiForZoneAndInstance(ZONE,getInstance().getId());

getSomeApiForXandYandZ – fairly common in jclouds

Page 47: JavaOne 2014: Taming the Cloud Database with jclouds

Create Database

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

47

boolean result = databaseApi.create(NAME);

Page 48: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

48

Skeleton

Project

Create User

Create Instance

Initialize API

Create Database

Test Connection

Cleanup

Page 49: JavaOne 2014: Taming the Cloud Database with jclouds

Create User

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

49

userApi = troveApi

.getUserApiForZoneAndInstance(ZONE, instance.getId());

boolean result = userApi.create(UNAME, PASSWORD, DBNAME);

User name

User password

Database name

Page 50: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

50

Skeleton

Project

Create User

Create Instance

Initialize API

Create Database

Test Connection

Cleanup

Page 51: JavaOne 2014: Taming the Cloud Database with jclouds

Test Connection

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

51

Load balancer needed!

CreateLoadBalancer createLB = CreateLoadBalancer.builder()

.name(NAME)

.protocol("MYSQL")

.port(3306)

.algorithm(LoadBalancer.Algorithm.RANDOM)

.nodes(addNodes)

.virtualIPType(VirtualIP.Type.PUBLIC)

.build();

Page 52: JavaOne 2014: Taming the Cloud Database with jclouds

Test Connection

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

52

loadBalancer = lbApi.create(createLB);

Page 53: JavaOne 2014: Taming the Cloud Database with jclouds

Test Connection

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

53

StringBuilder connString = new StringBuilder();

connString.append("jdbc:mysql://");

connString

.append(getVirtualIPv4(getLb().getVirtualIPs()));

connString.append("/");

connString.append(DBNAME); connString.append("?user=");

connString.append(UNAME);

connString.append("&password=");

connString.append(PASSWORD);

Page 54: JavaOne 2014: Taming the Cloud Database with jclouds

Test Connection

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

54

Connection conn =

DriverManager.getConnection(connString.toString());

Page 55: JavaOne 2014: Taming the Cloud Database with jclouds

Test Connection

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

55

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT 3+5");

rs.first();

System.out.format(" 3+5 is %s%n", rs.getInt(1));

Page 57: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

57

Linux

Compile

javac -classpath "lib/*:src/main/java/:src/main/resources/"

src/main/java/org/jclouds/examples/rackspace/*.java

Run

java -classpath "lib/*:src/main/java/:src/main/resources/"

org.jclouds.examples.rackspace.clouddatabases.CreateInstance username apikey

Page 58: JavaOne 2014: Taming the Cloud Database with jclouds

Java Project

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

58

Windows

Compile

javac -classpath "lib/*;src/main/java/;src/main/resources/"

src/main/java/org/jclouds/examples/rackspace/*.java

Run

java -classpath "lib/*;src/main/java/;src/main/resources/"

org.jclouds.examples.rackspace.clouddatabases.CreateInstance username apikey

Page 59: JavaOne 2014: Taming the Cloud Database with jclouds

Going forward

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

59

TroveApi

Backup Extension

Settings Extension

Clustering

Abstraction layer

Page 60: JavaOne 2014: Taming the Cloud Database with jclouds

Going forward

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

60

TroveApi

Backup Extension

Settings Extension

Abstraction layer

Rackspace Microsoft Amazon

CouchDB

Salesforce

Page 61: JavaOne 2014: Taming the Cloud Database with jclouds

Going forward

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

61

TroveApi

Backup Extension

Settings Extension

Abstraction layer

Rackspace Microsoft Amazon

CouchDB

Salesforce

Page 62: JavaOne 2014: Taming the Cloud Database with jclouds

Going forward

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

62

Trove Roadmap

Page 63: JavaOne 2014: Taming the Cloud Database with jclouds

Going forward

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

63

Collaborate!

http://jclouds.apache.org/

http://jclouds.apache.org/community/

Page 64: JavaOne 2014: Taming the Cloud Database with jclouds

Implementing an API

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

64

On to the IDE

Page 65: JavaOne 2014: Taming the Cloud Database with jclouds

Taming the Cloud Database with Apache jclouds

http://rack.to/jo14db

65

Thank you!

http://developer.rackspace.com

[email protected] Zack Shoylev

Software Developer

zacksh #jclouds

@zackshoylev