tdc2016poa | trilha arquitetura - apache kafka: uma introdução a logs distribuídos
TRANSCRIPT
Logs Distribuídosuma introdução ao Apache Kafka
Pedro Arthur P. R. [email protected]
Conceitos básicos
2
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
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
"Apache Kafka ispusblish-subscribemessaging rethought as adistributed commit log"Apache Kafka’s home pagehttp://kafka.apache.org
5
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
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
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
O que é um log?
time
First entry
...
(t) entry
(t+1) entry
(t+2) entry
(t+n) entry
...
next entry
7
Onde logs são utilizados?
Sempre que precismos armazenar o que aconteceu e quandoaconteceu...
8
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
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
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
Integração de Dados
12
Mais sistemas, mais dados, mais problemas...
13
Utilizando um log como um perspective broker
14
Replicação de Máquinas deEstado
15
Replicação Ativo/Ativo e Back-up Primário
16
A Single Source of Truth
17
Detalhes do Kafka
18
Visão geral do Kafka
Zookeepercluster
Producer
Producer
Producer
ConsumerGroup A
ConsumerGroup B
ConsumerGroup C
Block Storage
19
"Apache Zookeeper is an ...server which enableshighly reliable distributedcoordination"Apache Zookeeper’s home page
20
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
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
Use case
23
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
Programando para Kafka
25
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
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
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
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
Referência Básica
30
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
Demonstação
32
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
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
Logs Distribuídosuma introdução ao Apache Kafka
Pedro Arthur P. R. [email protected]