Top Banner
Codebits 2014 SNAKES ON THE CLOUD
52
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: MEO Cloud - Python Lisbon Meetup

Codebits 2014

SNAKES ON THE CLOUD

Page 2: MEO Cloud - Python Lisbon Meetup

Índice

1. MEO Cloud - apresentação

2. Backend

3. Desktop apps

4. API pública

5. Q/A

Page 3: MEO Cloud - Python Lisbon Meetup

MEO Cloud• Serviço de alojamento e sincronização de ficheiros

• Clientes desktop para Windows, OSX e Linux (inc RPI)

• Clientes mobile para iOS, Android, Windows Phone

• Cifra client-side (beta)

• Tráfego mobile gratuito na rede PT

• Music player

• Upload2Me

Page 4: MEO Cloud - Python Lisbon Meetup

Backend

Page 5: MEO Cloud - Python Lisbon Meetup

Ideia inicial

1. Enviar ficheiros

2. Receber ficheiros

3. ????

4. Profit!!!

Page 6: MEO Cloud - Python Lisbon Meetup

Arquitectura inicial• Metadata:

• BD relacional (MySQL)

• Ficheiros:

• Filesystem distribuído (GlusterFS)

• Web app:

• Nginx + Apache (mod_wsgi) + Python (Django)

Page 7: MEO Cloud - Python Lisbon Meetup

Boneco

Page 8: MEO Cloud - Python Lisbon Meetup

Desafios desenvolvimento

• Pedidos buffered

• Muitos pedidos lentos em simultâneo

• Green threads

• Modelo event-driven

• Expor servidor aplicacional

Page 9: MEO Cloud - Python Lisbon Meetup

Desafios desenvolvimento

• Sincronização de alterações eficiente (deltas)

• Objectos (ficheiros) potencialmente grandes

• librsync

• dividir ficheiros em blocos <= 4MB

Page 10: MEO Cloud - Python Lisbon Meetup

Desafios desenvolvimento

• Grande volume de dados (e metadados)

• Resiliência a falhas

• Sistemas escaláveis na horizontal

• Sem SPOF

Page 11: MEO Cloud - Python Lisbon Meetup

Desafios desenvolvimento

• Deduplicação de dados

• Hashes dos blocos

Page 12: MEO Cloud - Python Lisbon Meetup

Desafios desenvolvimento

• Segurança da informação

• Cifra em todos os passos

Page 13: MEO Cloud - Python Lisbon Meetup

Tecnologias usadas• Python + gevent + Django + M2Crypto

• Cassandra

• Solr

• Zookeeper

• Swift

• uWSGI

• Nginx

• SAPO Broker

• Memcached

Page 14: MEO Cloud - Python Lisbon Meetup

Diagrama

Page 15: MEO Cloud - Python Lisbon Meetup

requirements.txt

• Django

• uWSGI

• gevent

• greenlet

• oauthlib

• M2Crypto

• duplicity

Core

Page 16: MEO Cloud - Python Lisbon Meetup

requirements.txt

• SAPO-Broker

• requests

• pycassa

• kazoo

• python-memcached

Serviços

Page 17: MEO Cloud - Python Lisbon Meetup

requirements.txt

• Pillow

• mutagen

• pybloomfiltermmap

• progressbar

• defusedxml

• dm.xmlsec.binding

• objgraph

• Jinja2

Utils

Page 18: MEO Cloud - Python Lisbon Meetup

Desafios pós-lançamento

• Solução criada de raiz usando tecnologia recente (bleeding edge)

• uWSGI - http parser, connector https, Gevent loop engine, cache distribuído de sessões SSL

• Pycassa - connection pool && long-lived applications

• Solr - SolrCloud

Page 19: MEO Cloud - Python Lisbon Meetup

Desafios pós-lançamento

• Schema Cassandra

• normalização vs desnormalização

• tombstones && slice queries

Page 20: MEO Cloud - Python Lisbon Meetup

Desafios pós-lançamento

• Swift

• PUT && Rename VS store local

Page 21: MEO Cloud - Python Lisbon Meetup

Desafios pós-lançamento

• Python GC

• objgraph

Page 22: MEO Cloud - Python Lisbon Meetup

Desafios pós-lançamento

• Processamento não cooperativo ou CPU bound

• Muitos stacktraces, muito debugging

Page 23: MEO Cloud - Python Lisbon Meetup

Alguns números…

• 60% imagens, 20% música, 10% vídeos

• 1,2M uploads/dia - 4,8MB tamanho médio

• 310K downloads/dia - 35MB tamanho médio

• Compressão - BZip2 (12,4%) - Zlib (11,7%)

Page 24: MEO Cloud - Python Lisbon Meetup

Desktop Apps

Page 25: MEO Cloud - Python Lisbon Meetup

Desafios• Codebase comum entre Windows, OS X e Linux

• Sincronização transparente em background (daemon que reage a eventos de rede e filesystem)

• Efficiente (RAM, CPU, Disco, Rede, Bateria)

• Robusta/Fiável -> Just works

• De longe, o maior desafio

• A vossa ajuda é preciosa. Really

Page 26: MEO Cloud - Python Lisbon Meetup

Python 2.7 (custom) + C

Because awesome

Because speed

Page 27: MEO Cloud - Python Lisbon Meetup

Tecnologias usadas

• GUI Windows: C++, Win32 API [Jorge Cruz]

• GUI OS X: Objective-C, Cocoa [Paulo Andrade]

• CLI Linux: Python, gevent [Francisco Vieira]

• GUI Linux: Python, GTK [Ivo Nunes]

Page 28: MEO Cloud - Python Lisbon Meetup

Tecnologias usadas

Core de sincronização

Page 29: MEO Cloud - Python Lisbon Meetup

Lessons Learned

Page 30: MEO Cloud - Python Lisbon Meetup

Tratamento de erros

Page 31: MEO Cloud - Python Lisbon Meetup

Tratamento de errosPOSIX Win32

Page 32: MEO Cloud - Python Lisbon Meetup

Tratamento de errosErros do Windows: It’s over 9000!

Page 33: MEO Cloud - Python Lisbon Meetup

Tratamento de erros• Não podemos pedir ao utilizador “Tente novamente mais

tarde”.

• Manter estado:

• O que é que falhou?

• Porque é que falhou?

• Já avisámos o utilizador?

• Quando é podemos voltar a tentar?

• O problema já está resolvido?

• Se é para rebentar, fazê-lo ASAP!

Page 34: MEO Cloud - Python Lisbon Meetup

Sistema de Ficheiros• Surpresas do Python em Windows (para quem vem do Unix)

• rename() se ficheiro de destino já existe, erro

• open(<path>, ‘rb’) abertura em modo exclusivo -> várias aplicações partem

• readlink() (suporte para symlinks em Windows) não existe

• Tesourinhos: PROGRA~1 -> Usar GetLongPathNameW()

• OS X e Linux

• Pop quiz: link(file1, file2); rename(file1, file2). O que acontece?

Hint: é diferente de mv file1 file2

Page 35: MEO Cloud - Python Lisbon Meetup

Nomes de ficheiros

Unicode Normalization

NFC, NFD, NFKC, NFKD

Page 36: MEO Cloud - Python Lisbon Meetup

Nomes de ficheiros(pequeno guia para manter a sanidade mental)

• Em Windows, utilizar paths Unicode e “Long Path Names”, e.g. u’\\\\?\\C:\\file.txt' (>= Windows Vista)

• Em OS X, filesystem utiliza NFD

>>> unicodedata.normalize('NFC', u'João').encode('utf-8')

'Jo\xc3\xa3o'

>>> unicodedata.normalize('NFD', u'João').encode('utf-8')

'Joa\xcc\x83o'

• Em Linux, vale tudo :(

Page 37: MEO Cloud - Python Lisbon Meetup

Rede(Much love for pycurl and pyuv)

• Reutilizar ligações para reduzir overhead handshake TCP e SSL

• Transferências simultâneas

• Mitigar overhead relacionado com disk seeks, deltas rsync, etc.

• Minimizar efeito “dente de serra” do TCP quando a latência ou packet loss são elevados

• Enviar apenas o que foi modificado (deltas rsync)

• SSL/TLS: garantir que os certificados são mesmo validados. Bonus points: Certificate Pinning

• Tratar timeouts, resets, stalls, outros.

Page 38: MEO Cloud - Python Lisbon Meetup

CPU

• “O Python é lento” -> ineficiente, battery hog?

• “O Python não consegue usar mais que um processador em simultâneo” o “drama” do GIL (Global Interpreter Lock)”

Page 39: MEO Cloud - Python Lisbon Meetup

CPU• O core é IO-bound (filesystem e rede)

• Tarefas que usam mais CPU implementadas em C:

• Crypto (block hashes, cifra client-side, SSL)

• deltas rsync

• sqlite (Row objects are cool)

Page 40: MEO Cloud - Python Lisbon Meetup

CPU

• Na verdade, o GIL é liberto em muitos casos:

• Quando há IO (rede, filesystem)

• Quando os módulos querem :)

The GIL is free

Page 41: MEO Cloud - Python Lisbon Meetup

• Cython

• Quando em dúvida, profile stuff: cProfile, logs (!), etc.

CPU10x mais rápido :)

Page 42: MEO Cloud - Python Lisbon Meetup

Memória

6 lessons from Dropbox, on http://highscalability.com/

Page 43: MEO Cloud - Python Lisbon Meetup

Memória

:(

malloc(…)

free(obj1)free(obj3)

Page 44: MEO Cloud - Python Lisbon Meetup

Memória

To the moon!

Page 45: MEO Cloud - Python Lisbon Meetup

Memória• Melhorou muito a partir do Python 3.4 (issue #11849)

• Fizemos backport do novo memory allocator (mmap/VirtualAlloc based) para o nossa versão do Python

• Exemplo: Quanta RAM precisamos para sincronizar?:

• 148.887 ficheiros (100.000 ficheiros aleatórios de 10KB + Linux 3.14 source tree):

• Ficheiro 50GB (much data)

Page 46: MEO Cloud - Python Lisbon Meetup

MemóriaMB 100k ficheiros kernel tree

ficheiro 50 GB

force reclaim

50 MB RAM

Page 47: MEO Cloud - Python Lisbon Meetup

API Pública

Page 48: MEO Cloud - Python Lisbon Meetup

API Pública• Autenticação:

• OAuth 1.0a

• OAuth 2.0

• Documentação:

• https://meocloud.pt/developers

• Superset da API REST da Dropbox

• 40+ operações

Page 49: MEO Cloud - Python Lisbon Meetup

Exemplos• Long-polling para notificação de alterações

• Key-Value store por user e por aplicação

• Download de pasta como zip

• Thumbnails

• …

• 95% da funcionalidade do web site

Page 50: MEO Cloud - Python Lisbon Meetup

Use case(s)

• Cameras + Long polling = motion sensor

• CopyRef + Proximidade = instant transfers

• Upload 2 me = transferências anónimas

Page 51: MEO Cloud - Python Lisbon Meetup

Perguntas?

Page 52: MEO Cloud - Python Lisbon Meetup

Obrigado