TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

37
Logs Distribuídos uma introdução ao Apache Kafka Pedro Arthur P. R. Duarte [email protected]

Transcript of TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Page 1: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Logs Distribuídosuma introdução ao Apache Kafka

Pedro Arthur P. R. [email protected]

Page 2: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Conceitos básicos

2

Page 3: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Origens e Objetivos

Projeto criado pela equipe de arquitetura do LinkedIn. O objetivo doprojeto é prover uma insfraestrutura de mensagens de alto troughpute fácil escalabilidade.

3

Page 4: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Mas... Como?

O servidores de mensagem (aka brokers) preocupam-se somentecom a manutenção do estado do cluster Kafka;

Para o mundo externo, os brokers provem somente a visão detópicos e offsets para que os clientes possam manter seu próprioestado.

4

Page 5: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

"Apache Kafka ispusblish-subscribemessaging rethought as adistributed commit log"Apache Kafka’s home pagehttp://kafka.apache.org

5

Page 6: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Log? Log tipo arquivos de log?

$ sudo tail -n 5 -f /var/log/syslog

Jun 4 19:37:07 inception systemd[1]: Time has been ch ...

Jun 4 19:37:07 inception systemd[1]: apt-daily.timer: ...

Jun 4 19:39:13 inception systemd[1]: Started Cleanup ...

Jun 4 19:40:01 inception CRON[5892]: (root) CMD (test ...

Jun 4 19:44:51 inception org.kde.kaccessibleapp[6056] ...

_

6

Page 7: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Log? Log tipo arquivos de log?

$ sudo tail -n 5 -f /var/log/syslog

Jun 4 19:37:07 inception systemd[1]: Time has been ch ...

Jun 4 19:37:07 inception systemd[1]: apt-daily.timer: ...

Jun 4 19:39:13 inception systemd[1]: Started Cleanup ...

Jun 4 19:40:01 inception CRON[5892]: (root) CMD (test ...

Jun 4 19:44:51 inception org.kde.kaccessibleapp[6056] ...

Jun 4 19:49:02 inception ntpd[711]: receive: Unexpect ...

_

6

Page 8: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Log? Log tipo arquivos de log?

$ sudo tail -n 5 -f /var/log/syslog

Jun 4 19:37:07 inception systemd[1]: Time has been ch ...

Jun 4 19:37:07 inception systemd[1]: apt-daily.timer: ...

Jun 4 19:39:13 inception systemd[1]: Started Cleanup ...

Jun 4 19:40:01 inception CRON[5892]: (root) CMD (test ...

Jun 4 19:44:51 inception org.kde.kaccessibleapp[6056] ...

Jun 4 19:49:02 inception ntpd[711]: receive: Unexpect ...

Jun 4 19:55:31 inception kernel: [11996.667253] hrtim ...

_

6

Page 9: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

O que é um log?

time

First entry

...

(t) entry

(t+1) entry

(t+2) entry

(t+n) entry

...

next entry

7

Page 10: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Onde logs são utilizados?

Sempre que precismos armazenar o que aconteceu e quandoaconteceu...

8

Page 11: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Onde logs são utilizados?

Sistemas de Base de Dados– PostgreSQL’s Write-Ahead Loggind (WAL)– Oracles 10/11G Redo Log

Sistemas de controle de versão– Git, The Stupid Content Tracker– Subversion

9

Page 12: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Git’s log: um log, mas nem tanto

$ git log --oneline

498d410 Fixes message format and adds some logging

e09c955 Enhances the ContainerStub with a StoredObject stub

18fe603 Puts topic name in a configuration companion object

89d9c5d Separates consumer from producer configuration

a9f1a76 Adds a provisory container stub

d800dfe Creates consumer configuration

fa4da8e Removes trash

4808450 Adds kafka producer

333b14f Let there be light

10

Page 13: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Git’s reflog: um verdadeiro log

$ git reflog

498d410 HEAD@0: commit (amend): Fixes message format and adds some ...

9147167 HEAD@1: commit (amend): Fixes message format and adds some ...

97d8661 HEAD@2: commit: Fixes message format and adds some logging

e09c955 HEAD@3: commit: Enhances the ContainerStub with a StoredOb ...

18fe603 HEAD@4: rebase finished: returning to refs/heads/master

18fe603 HEAD@5: rebase: checkout refs/remotes/origin/master

d800dfe HEAD@6: rebase finished: returning to refs/heads/master

d800dfe HEAD@7: rebase: Creates consumer configuration

fa4da8e HEAD@8: rebase: checkout refs/remotes/origin/master

701b3e6 HEAD@9: commit: Creates consumer configuration

4808450 HEAD@10: commit: Adds kafka producer

333b14f HEAD@11: clone: from https://[email protected]/ped ...

11

Page 14: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Integração de Dados

12

Page 15: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Mais sistemas, mais dados, mais problemas...

13

Page 16: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Utilizando um log como um perspective broker

14

Page 17: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Replicação de Máquinas deEstado

15

Page 18: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Replicação Ativo/Ativo e Back-up Primário

16

Page 19: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

A Single Source of Truth

17

Page 20: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Detalhes do Kafka

18

Page 21: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Visão geral do Kafka

Zookeepercluster

Producer

Producer

Producer

ConsumerGroup A

ConsumerGroup B

ConsumerGroup C

Block Storage

19

Page 22: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

"Apache Zookeeper is an ...server which enableshighly reliable distributedcoordination"Apache Zookeeper’s home page

20

Page 23: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Zookeeper

Do ponto de vista das interfaces de programação, o Zookeeper é um"sistema de arquivos com garantias"; por exemplo

– Diferentes clientes tentam criar um arquivo, somente um delesreceberá uma notificação positiva;

– Diferentes clientes tentam alterar um arquivo, somente um delesreceberá a notificação de escrita e os demais devem retentar aoperação

21

Page 24: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Anatomia de um Tópico

Partition 0 @ broker_a

Partition 1 @ broker_b

Partition 2 @ broker_c

topic

Consumer 2

Consumer 0

Consumer 1

Cosumer Group AProducer

Producer

Producer

22

Page 25: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Use case

23

Page 26: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Anonimizado xD

A/B data aggregation

Source ADatabase

Source BDatabase

A/B AggregationDatabase

A/B AggregationTopic

Data EnrichmentPipeline

Data AnalysisEngine

A Topic

B Topic

Source A DataTransformation

Source B DataTransformation

Flume Master Node

Data Source A

Data Source B2

Data Source B1

Query API

Publish/SubscriberIntegration API

AnalysisDatabase

24

Page 27: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Programando para Kafka

25

Page 28: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Producer em Scala (>= 0.9.0.0)

val properties = new Properties () {

put("bootstrap.servers", "broker1 :9092 , broker2 :9092")

put("key.serializer",

"org.apache.kafka.common.serialization.StringSerializer")

put("value.serializer",

"org.apache.kafka.common.serialization.StringSerializer")

put("acks", "1")

put("retries", "0")

/* any colour you like */

}

val producer = new KafkaProducer[String , String ]( properties)

26

Page 29: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Producer em Scala (>= 0.9.0.0)

val message = new ProducerRecord[String , String ](

"the_destination_topic", "entry key", "your data")

/* just try to send data */

val future: Future[RecordMetadata] = producer.send(message)

/* try to send data and call -me back after it */

val futureAndCallback: Future[RecordMetadata] =

producer.send(message ,

new Callback () {

def onCompletion(

metadata: RecordMetadata , exception: Exception) {

/* (metadata XOR exception) is non -null :( */

}

})

producer.close () /* release */

27

Page 30: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Consumer em Scala (>= 0.9.0.0)

val properties = new Properties () {

put("bootstrap.servers", "broker1 :9092 , broker2 :9092")

put("group.id", "the_group_id")

put("enable.auto.commit", "true")

put("auto.commit.interval.ms", "1000")

put("key.deserializer",

"org.apache.kafka.common.serialization.StringDeserializer")

put("value.deserializer",

"org.apache.kafka.common.serialization.StringDeserializer")

/* any colour you like */

}

val consumer = new KafkaConsumer[String , String ]( properties)

28

Page 31: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Consumer em Scala (>= 0.9.0.0)

/* subscribe to as many topics as you like */

consumer.subscribe(Arrays.asList("the_destination_topic"))

while (true) {

val records: /* argument is the timeout in millis */

ConsumerRecords[String , String] = consumer.poll (100)

records foreach {

record: ConsumerRecord[String , String] =>

log.info("${record.topic ()} is at ${record.offset ()}")

}

}

29

Page 32: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Referência Básica

30

Page 33: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Jay Krep’s I Heart Logs

"Why a book about logs? Thats easy: the humble log is anabstraction that lies at the heart of many systems, from NoSQLdatabases to cryptocurrencies. Even though most engineers dontthink much about them, this short book shows you why logs areworthy of your attention ..."

Release Date: October 2014

31

Page 34: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Demonstação

32

Page 35: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Kafkabox: sincronização de arquivos

Pequeno projeto prova de conceito utilizando Kafka, OpenStackSwift e inotify; baixe-o com o comando a seguir:

$ git clone http://bitbucket.com/pedroarthur/kafkabox/

33

Page 36: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Implementação

– Inotify: escute todas as mudanças do diretório;– Para cada mudança,

– Envie mudança para o Swift via HTTP;– Escreva a mudança ocorrida no tópico Kafka.

34

Page 37: TDC2016POA | Trilha Arquitetura - Apache Kafka: uma introdução a logs distribuídos

Logs Distribuídosuma introdução ao Apache Kafka

Pedro Arthur P. R. [email protected]