Top Banner
Event storage and real-time analysis at Booking.com with Riak Damien Krotkine
112

Using Riak for Events storage and analysis at Booking.com

Jul 15, 2015

Download

Software

Damien Krotkine
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: Using Riak for Events storage and analysis at Booking.com

Event storage and real-time analysis at Booking.com with Riak

Damien Krotkine

Page 2: Using Riak for Events storage and analysis at Booking.com

Damien Krotkine

• Software Engineer at Booking.com

• github.com/dams

• @damsieboy

• dkrotkine

Page 3: Using Riak for Events storage and analysis at Booking.com

• 800,000 room nights reserved per day

WE ARE HIRING

Page 4: Using Riak for Events storage and analysis at Booking.com

INTRODUCTION

Page 5: Using Riak for Events storage and analysis at Booking.com
Page 6: Using Riak for Events storage and analysis at Booking.com
Page 7: Using Riak for Events storage and analysis at Booking.com
Page 8: Using Riak for Events storage and analysis at Booking.com
Page 9: Using Riak for Events storage and analysis at Booking.com

www APImobi

Page 10: Using Riak for Events storage and analysis at Booking.com

www APImobi

Page 11: Using Riak for Events storage and analysis at Booking.com

www APIfro

nten

dba

cken

dmobi

events storage

events: info about subsystems status

Page 12: Using Riak for Events storage and analysis at Booking.com

back

end

web mobi api

databases

caches

load balancersavailability

cluster

email

etc…

Page 13: Using Riak for Events storage and analysis at Booking.com

WHAT IS AN EVENT ?

Page 14: Using Riak for Events storage and analysis at Booking.com

EVENT STRUCTURE

• Provides info about subsystems

• Data

• Deep HashMap

• Timestamp

• Type + Subtype

• The rest: specific data

• Schema-less

Page 15: Using Riak for Events storage and analysis at Booking.com

EXAMPLE 1: WEB APP EVENT

• Large event

• Info about users actions

• Requests, user type

• Timings

• Warnings, errors

• Etc…

Page 16: Using Riak for Events storage and analysis at Booking.com

{ timestamp => 12345, type => 'WEB', subtype => 'app',

action => { is_normal_user => 1, pageview_id => '188a362744c301c2', # ... }, tuning => { the_request => 'GET /display/...' bytes_body => 35, wallclock => 111, nr_warnings => 0, # ... }, # ... }

Page 17: Using Riak for Events storage and analysis at Booking.com

EXAMPLE 2: AVAILABILITY CLUSTER EVENT

• Small event

• Cluster provides availability info

• Event: Info about request types and timings

Page 18: Using Riak for Events storage and analysis at Booking.com

{ type => 'FAV', subtype => 'fav', timestamp => 1401262979, dc => 1, tuning => { flatav => { cluster => '205', sum_latencies => 21, role => 'fav', num_queries => 7 } } }

Page 19: Using Riak for Events storage and analysis at Booking.com

EVENTS FLOW PROPERTIES

• Read-only

• Schema-less

• Continuous, ordered, timed

• 15 K events per sec

• 1.25 Billion events per day

• peak at 70 MB/s, min 25MB/s

• 100 GB per hour

Page 20: Using Riak for Events storage and analysis at Booking.com

SERIALIZATION

• JSON didn’t work for us (slow, big, lack features)

• Created Sereal in 2012

• « Sereal, a new, binary data serialization format that provides high-performance, schema-less serialization »

• Added Sereal encoder & decoder in Erlang in 2014

Page 21: Using Riak for Events storage and analysis at Booking.com

USAGE

Page 22: Using Riak for Events storage and analysis at Booking.com

ASSESS THE NEEDS

• Before thinking about storage

• Think about the usage

Page 23: Using Riak for Events storage and analysis at Booking.com

USAGE

1. GRAPHS 2. DECISION MAKING 3. SHORT TERM ANALYSIS 4. A/B TESTING

Page 24: Using Riak for Events storage and analysis at Booking.com

GRAPHS

• Graph in real-time ( few seconds lag )

• Graph as many systems as possible

• General platform health check

Page 25: Using Riak for Events storage and analysis at Booking.com

GRAPHS

Page 26: Using Riak for Events storage and analysis at Booking.com

GRAPHS

Page 27: Using Riak for Events storage and analysis at Booking.com

DASHBOARDS

Page 28: Using Riak for Events storage and analysis at Booking.com

META GRAPHS

Page 29: Using Riak for Events storage and analysis at Booking.com

USAGE

1. GRAPHS 2. DECISION MAKING 3. SHORT TERM ANALYSIS 4. A/B TESTING

Page 30: Using Riak for Events storage and analysis at Booking.com

DECISION MAKING

• Strategic decision ( use facts )

• Long term or short term

• Technical / Non technical Reporting

Page 31: Using Riak for Events storage and analysis at Booking.com

USAGE

1. GRAPHS 2. DECISION MAKING 3. SHORT TERM ANALYSIS 4. A/B TESTING

Page 32: Using Riak for Events storage and analysis at Booking.com

SHORT TERM ANALYSIS

• From 10 sec ago -> 8 days ago

• Code deployment checks and rollback

• Anomaly Detector

Page 33: Using Riak for Events storage and analysis at Booking.com

USAGE

1. GRAPHS 2. DECISION MAKING 3. SHORT TERM ANALYSIS 4. A/B TESTING

Page 34: Using Riak for Events storage and analysis at Booking.com

A/B TESTING

• Our core philosophy: use facts

• It means: do A/B testing

• Concept of Experiments

• Events provide data to compare

Page 35: Using Riak for Events storage and analysis at Booking.com

EVENT AGGREGATION

Page 36: Using Riak for Events storage and analysis at Booking.com

EVENT AGGREGATION

• Group events

• Granularity we need: second

Page 37: Using Riak for Events storage and analysis at Booking.com

eventeventevents storage

eventevent

even

t

eventevent

eventevent

event

even

t

event event

Page 38: Using Riak for Events storage and analysis at Booking.com

e ee e

ee

e e

e ee

e eee

ee

e

LOGGER

e

e

Page 39: Using Riak for Events storage and analysis at Booking.com

web apieeeeee

eee

e ee e

ee

e e

e ee

e eee

ee

ee

e

Page 40: Using Riak for Events storage and analysis at Booking.com

web api dbseeeeeeee

eeeeeeeee

eeeeeee

e ee e

ee

e e

e ee

e eee

ee

ee

e

Page 41: Using Riak for Events storage and analysis at Booking.com

web api dbseeeeeeee

eeeeeeeee

eeeeeee

e ee e

ee

e e

e ee

e eee

ee

e

1 sec

e

e

Page 42: Using Riak for Events storage and analysis at Booking.com

web api dbseeeeeeee

eeeeeeeee

eeeeeee

e ee e

ee

e e

e ee

e eee

ee

e

1 sec

e

e

Page 43: Using Riak for Events storage and analysis at Booking.com

web api dbseeeee

eeeee

eeeee

1 sec

events storage

Page 44: Using Riak for Events storage and analysis at Booking.com

web api dbs

ee

eeeee

eeeee

1 sec

events storage

ee e reserialize + compress

Page 45: Using Riak for Events storage and analysis at Booking.com

events storage

LOGGER …LOGGER LOGGER

Page 46: Using Riak for Events storage and analysis at Booking.com

STORAGE

Page 47: Using Riak for Events storage and analysis at Booking.com

WHAT WE WANT

• Storage security

• Mass write performance

• Mass read performance

• Easy administration

• Very scalable

Page 48: Using Riak for Events storage and analysis at Booking.com

WE CHOSE RIAK

• Security: cluster, distributed, very robust

• Good and predictable read / write performance

• The easiest to setup and administrate

• Advanced features (MapReduce, triggers, 2i, CRDTs …)

• Riak Search

• Multi Datacenter Replication

Page 49: Using Riak for Events storage and analysis at Booking.com
Page 50: Using Riak for Events storage and analysis at Booking.com

CLUSTER

• Commodity hardware • All nodes serve data • Data replication

• Gossip between nodes • No master

Ring of servers

Page 51: Using Riak for Events storage and analysis at Booking.com

hash(key)

Page 52: Using Riak for Events storage and analysis at Booking.com

KEY VALUE STORE

• Namespaces: bucket

• Values: opaque or CRDTs

Page 53: Using Riak for Events storage and analysis at Booking.com

RIAK: ADVANCED FEATURES

• MapReduce

• Secondary indexes

• Riak Search

• Multi DataCenter Replication

Page 54: Using Riak for Events storage and analysis at Booking.com

MULTI-BACKEND

• Bitcask

• Eleveldb

• Memory

Page 55: Using Riak for Events storage and analysis at Booking.com

BACKEND: BITCASK

• Log-based storage backend

• Append-only files

• Advanced expiration

• Predictable performance

• Perfect for reading sequential data

Page 56: Using Riak for Events storage and analysis at Booking.com

CLUSTER CONFIGURATION

Page 57: Using Riak for Events storage and analysis at Booking.com

DISK SPACE NEEDED

• 8 days

• 100 GB per hour

• Replication 3

• 100 * 24 * 8 * 3

• Need 60 T

Page 58: Using Riak for Events storage and analysis at Booking.com

HARDWARE

• 16 nodes

• 12 CPU cores ( Xeon 2.5Ghz)

• 192 GB RAM

• network 1 Gbit/s

• 8 TB (raid 6)

• Cluster space: 128 TB

Page 59: Using Riak for Events storage and analysis at Booking.com

RIAK CONFIGURATION

• Vnodes: 256

• Replication: n_val = 3

• Expiration: 8 days

• 4 GB files

• Compaction only when file is full

• Compact only once a day

Page 60: Using Riak for Events storage and analysis at Booking.com

DISK SPACE RECLAIMED

one day

Page 61: Using Riak for Events storage and analysis at Booking.com

DATA DESIGN

Page 62: Using Riak for Events storage and analysis at Booking.com

web api dbs

ee

eeeee

eeeee

1 sec

events storage

1 blob per EPOCH / DC / CELL / TYPE / SUBTYPE 500 KB max chunks

Page 63: Using Riak for Events storage and analysis at Booking.com

DATA

• Bucket name: “data“

• Key: “12345:1:cell0:WEB:app:chunk0“

• Value: serialized compressed data

• About 120 keys per seconds

Page 64: Using Riak for Events storage and analysis at Booking.com

METADATA

• Bucket name: “metadata“

• Key: epoch-dc “12345-2“

• Value: list of data keys:[ “12345:1:cell0:WEB:app:chunk0“, “12345:1:cell0:WEB:app:chunk1“ … “12345:4:cell0:EMK::chunk3“ ]

• As pipe separated value

Page 65: Using Riak for Events storage and analysis at Booking.com

PUSH DATA IN

Page 66: Using Riak for Events storage and analysis at Booking.com

PUSH DATA IN

• In each DC, in each cell, Loggers push to Riak

• 2 protocols: REST or ProtoBuf

• Every seconds:

• Push data values to Riak, async

• Wait for success

• Push metadata

Page 67: Using Riak for Events storage and analysis at Booking.com

JAVA

Bucket DataBucket = riakClient.fetchBucket("data").execute(); DataBucket.store("12345:1:cell0:WEB:app:chunk0", Data1).execute(); DataBucket.store("12345:1:cell0:WEB:app:chunk1", Data2).execute(); DataBucket.store("12345:1:cell0:WEB:app:chunk2", Data3).execute();

Bucket MetaDataBucket = riakClient.fetchBucket("metadata").execute(); MetaDataBucket.store("12345-1", metaData).execute(); riakClient.shutdown();

Page 68: Using Riak for Events storage and analysis at Booking.com

Perl

my $client = Riak::Client->new(…);

$client->put(data => '12345:1:cell0:WEB:app:chunk0', $data1); $client->put(data => '12345:1:cell0:WEB:app:chunk1', $data2); $client->put(data => '12345:1:cell0:WEB:app:chunk2', $data3);

$client->put(metadata => '12345-1', $metadata, 'text/plain' );

Page 69: Using Riak for Events storage and analysis at Booking.com

GET DATA OUT

Page 70: Using Riak for Events storage and analysis at Booking.com

GET DATA OUT

• Request metadata for epoch-DC

• Parse value

• Filter out unwanted types / subtypes

• Fetch the data keys

Page 71: Using Riak for Events storage and analysis at Booking.com

Perl

my $client = Riak::Client->new(…); my @array = split '\|', $client->get(metadata => '12345-1'); @filtered_array = grep { /WEB/ } @array; $client->get(data => $_) foreach @array;

Page 72: Using Riak for Events storage and analysis at Booking.com

REAL TIME PROCESSING OUTSIDE OF RIAK

Page 73: Using Riak for Events storage and analysis at Booking.com

STREAMING

• Fetch 1 second every second

• Or a range ( last 10 min )

• Client generates all the epochs for the range

• Fetch all epochs from Riak

Page 74: Using Riak for Events storage and analysis at Booking.com

EXAMPLES

• Continuous fetch => Graphite ( every sec )

• Continuous fetch => Anomaly Detector ( last 2 min )

• Continuous fetch => Experiment analysis ( last day )

• Continuous fetch => Hadoop

• Manual request => test, debug, investigate

• Batch fetch => ad hoc analysis

• => Huge numbers of fetches

Page 75: Using Riak for Events storage and analysis at Booking.com

events storage

graphite cluster

Anomaly detector

experimentcluster

hadoop cluster

mysql analysis

manual requests

50 MB/s

50 MB/s

50 M

B/s 50 MB/s

50 MB/s50 MB/s

Page 76: Using Riak for Events storage and analysis at Booking.com

REALTIME

• 1 second of data

• Stored in < 1 sec

• Available after < 1 sec

• Issue : network saturation

Page 77: Using Riak for Events storage and analysis at Booking.com

REAL TIME PROCESSING INSIDE RIAK

Page 78: Using Riak for Events storage and analysis at Booking.com

THE IDEA

• Instead of

• Fetching data, crunch data, small result

• Do

• Bring code to data

Page 79: Using Riak for Events storage and analysis at Booking.com

WHAT TAKES TIME

• Takes a lot of time

• Fetching data out

• Decompressing

• Takes almost no time

• Crunching data

Page 80: Using Riak for Events storage and analysis at Booking.com

MAPREDUCE

• Send code to be executed

• Works fine for 1 job

• Takes < 1s to process 1s of data

• Doesn’t work for multiple jobs

• Has to be written in Erlang

Page 81: Using Riak for Events storage and analysis at Booking.com

HOOKS

• Every time metadata is written

• Post-Commit hook triggered

• Crunch data on the nodes

Page 82: Using Riak for Events storage and analysis at Booking.com
Page 83: Using Riak for Events storage and analysis at Booking.com

Riak post-commit hook

REST serviceRIAK service

key keysocket

new data sent for storage

fetch, decompressand process all tasks

NODE HOST

Page 84: Using Riak for Events storage and analysis at Booking.com

HOOK CODE

metadata_stored_hook(RiakObject) -> Key = riak_object:key(RiakObject), Bucket = riak_object:bucket(RiakObject), [ Epoch, DC ] = binary:split(Key, <<"-">>), Data = riak_object:get_value(RiakObject), DataKeys = binary:split(Data, <<"|">>, [ global ]), send_to_REST(Epoch, Hostname, DataKeys), ok.

Page 85: Using Riak for Events storage and analysis at Booking.com

send_to_REST(Epoch, Hostname, DataKeys) -> Method = post, URL = "http://" ++ binary_to_list(Hostname) ++ ":5000?epoch=" ++ binary_to_list(Epoch), HTTPOptions = [ { timeout, 4000 } ], Options = [ { body_format, string }, { sync, false }, { receiver, fun(ReplyInfo) -> ok end } ], Body = iolist_to_binary(mochijson2:encode( DataKeys )), httpc:request(Method, {URL, [], "application/json", Body}, HTTPOptions, Options), ok.

Page 86: Using Riak for Events storage and analysis at Booking.com

REST SERVICE

• In Perl, using PSGI, Starman, preforks

• Allow to write data cruncher in Perl

• Also supports loading code on demand

Page 87: Using Riak for Events storage and analysis at Booking.com

ADVANTAGES

• CPU usage and execution time can be capped

• Data is local to processing

• Two systems are decoupled

• REST service written in any language

• Data processing done all at once

• Data is decompressed only once

Page 88: Using Riak for Events storage and analysis at Booking.com

DISADVANTAGES

• Only for incoming data (streaming), not old data

• Can’t easily use cross-second data

• What if the companion service goes down ?

Page 89: Using Riak for Events storage and analysis at Booking.com

FUTURE

• Use this companion to generate optional small values

• Use Riak Search to index and search those

Page 90: Using Riak for Events storage and analysis at Booking.com

THE BANDWIDTH PROBLEM

Page 91: Using Riak for Events storage and analysis at Booking.com

• PUT - bad case

• n_val = 3

• inside usage = 3 x outside usage

Page 92: Using Riak for Events storage and analysis at Booking.com

• PUT - good case

• n_val = 3

• inside usage = 2 x outside usage

Page 93: Using Riak for Events storage and analysis at Booking.com

• GET - bad case

• inside usage = 3 x outside usage

Page 94: Using Riak for Events storage and analysis at Booking.com

• GET - good case

• inside usage = 2 x outside usage

Page 95: Using Riak for Events storage and analysis at Booking.com

• network usage ( PUT and GET ): • 3 x 13/16+ 2 x 3/16= 2.81 • plus gossip • inside network > 3 x outside network

Page 96: Using Riak for Events storage and analysis at Booking.com

• Usually it’s not a problem • But in our case: • big values, constant PUTs, lots of GETs • sadly, only 1 Gbit/s

• => network bandwidth issue

Page 97: Using Riak for Events storage and analysis at Booking.com

THE BANDWIDTH SOLUTIONS

Page 98: Using Riak for Events storage and analysis at Booking.com

THE BANDWIDTH SOLUTIONS

1. Optimize GET for network usage, not speed 2. Don’t choose a node at random

Page 99: Using Riak for Events storage and analysis at Booking.com

• GET - bad case

• n_val = 1

• inside usage = 1 x outside

Page 100: Using Riak for Events storage and analysis at Booking.com

• GET - good case

• n_val = 1

• inside usage = 0 x outside

Page 101: Using Riak for Events storage and analysis at Booking.com

WARNING

• Possible only because data is read-only

• Data has internal checksum

• No conflict possible

• Corruption detected

Page 102: Using Riak for Events storage and analysis at Booking.com

RESULT

• practical network usage reduced by 2 !

Page 103: Using Riak for Events storage and analysis at Booking.com

THE BANDWIDTH SOLUTIONS

1. Optimize GET for network usage, not speed 2. Don’t choose a node at random

Page 104: Using Riak for Events storage and analysis at Booking.com

• bucket = “metadata” • key = “12345”

Page 105: Using Riak for Events storage and analysis at Booking.com

• bucket = “metadata”

• key = “12345”

Hash = hashFunction(bucket + key)

RingStatus = getRingStatus

PrimaryNodes = Fun(Hash, RingStatus)

Page 106: Using Riak for Events storage and analysis at Booking.com

hashFunction()

getRingStatus()

Page 107: Using Riak for Events storage and analysis at Booking.com

hashFunction()

getRingStatus()

Page 108: Using Riak for Events storage and analysis at Booking.com

WARNING

• Possible only if • Nodes list is monitored • In case of failed node, default to random • Data is requested in an uniform way

Page 109: Using Riak for Events storage and analysis at Booking.com

RESULT

• Network usage even more reduced ! • Especially for GETs

Page 110: Using Riak for Events storage and analysis at Booking.com

CONCLUSION

Page 111: Using Riak for Events storage and analysis at Booking.com

CONCLUSION

• We used only Riak Open Source

• No training, self-taught, small team

• Riak is a great solution

• Robust, fast, scalable, easy

• Very flexible and hackable

• Helps us continue scaling

Page 112: Using Riak for Events storage and analysis at Booking.com

Q&A@damsieboy