42
Google App Engine e NoSQL: Alta disponibilidade Giovane Liberato @ TDC 2014

Google App Engine e NoSQL: Alta disponibilidade

Embed Size (px)

DESCRIPTION

O datastore é sem dúvidas um dos protagonistas da plataforma de aplicativos do google, o Google App Engine, quando falamos em disponibilidade. O objetivo desta palestra é mostrar todos os detalhes do BigTable, desde sua estrutura interna, operadores e tipos de queries, custo e modelagem de dados.

Citation preview

Page 1: Google App Engine e NoSQL: Alta disponibilidade

Google App Engine e NoSQL: Alta disponibilidade

Giovane Liberato @ TDC 2014

Page 2: Google App Engine e NoSQL: Alta disponibilidade

$whoami

Page 3: Google App Engine e NoSQL: Alta disponibilidade

Giovane Liberato

Fatec São José dos Campos, Python web developer, Comunidade,

Page 4: Google App Engine e NoSQL: Alta disponibilidade

Google App Engine - overview

Page 5: Google App Engine e NoSQL: Alta disponibilidade
Page 6: Google App Engine e NoSQL: Alta disponibilidade

Quem usa o Google App Engine?

cloud.google.com/customers

Page 7: Google App Engine e NoSQL: Alta disponibilidade

Características

Sistemas multi-tenentes com API de namespaces

APIs de memcache, Cron Jobs e Task Queues

Limitações “Libertadoras”

Vendor Lock In

Precificação camarada

Page 8: Google App Engine e NoSQL: Alta disponibilidade

GAE Datastore

Page 9: Google App Engine e NoSQL: Alta disponibilidade

Características

Banco de dados colunar

Distribuido com alta replicação

Usado por mais de 60 projetos no Google*[1]

Cache automático

APIs assíncronas para acesso ao banco

Page 10: Google App Engine e NoSQL: Alta disponibilidade

Banco de dados colunar

Row Column

Page 11: Google App Engine e NoSQL: Alta disponibilidade

Escalabilidade do banco

Page 12: Google App Engine e NoSQL: Alta disponibilidade

Entidades e Atributos

Objetos da linguagem que herdam da classe Model

Campo Key é definido pelo sistema

Classes são como tabelas, atributos são como linhas

É possível criar subclasses de modelo

Page 13: Google App Engine e NoSQL: Alta disponibilidade

Entidades e Atributos - exemplo

from google.appengine.ext import ndb

class Person(ndb.Model):

name = ndb.StringProperty()

age = ndb.IntegerProperty()

Page 14: Google App Engine e NoSQL: Alta disponibilidade

Modelagem de dados

Schemaless

Redundância de dados facilita o acesso

Relações podem ser feitas, porem sem integridade

referencial

Page 15: Google App Engine e NoSQL: Alta disponibilidade

Modelagem - exemplofrom google.appengine.ext import ndb

class Person(ndb.Model):

name = ndb.StringProperty()

age = ndb.IntegerProperty()

friends = ndb.StructuredProperty(Person,

repated=True)

Page 16: Google App Engine e NoSQL: Alta disponibilidade

Relações de dados - sugestões

One-to-one

Feito com referências por keys

One-to-many

Feito com listas ou tabela de relacionamento

Many-to-many

Feito com tabela de relacionamentos

Page 17: Google App Engine e NoSQL: Alta disponibilidade

Datastore Query

Page 18: Google App Engine e NoSQL: Alta disponibilidade

Query - API de buscas

Toda subclasse de ndb.Model sabe fazer query

Métodos filter, count, order, get, fetch, etc…

Buscas paginadas, buscas com offset e limite

Funções de map nos resultados da query

Page 19: Google App Engine e NoSQL: Alta disponibilidade

Query - exemplo busca simples

from models import Person

pessoas = Person.query().fetch()

# ou

for p in Person.query():

print p

Page 20: Google App Engine e NoSQL: Alta disponibilidade

Query - exemplo condicional

from models import Person

p = Person.query(Person.age > 5).fetch()

p = Person.query(Person.name == “Giovane”) .fetch()

Page 21: Google App Engine e NoSQL: Alta disponibilidade

Query - exemplo paginaçãofrom models import Person

p, cursor, more = Person.query().fetch_page(20)

if more:

p2 = Person.query().fetch_page(20,

start_cursor=cursor)

Page 22: Google App Engine e NoSQL: Alta disponibilidade

Query - API de buscas assíncronas

Reduz o tempo de resposta da requisição

Todo método tem um correspondente _async

get_async, fetch_async, map_async, count_async...

Page 23: Google App Engine e NoSQL: Alta disponibilidade

Query - API de buscas assíncronas

Async

Serial

Page 24: Google App Engine e NoSQL: Alta disponibilidade

Query - Índices

Para toda busca, o datastore cria um índice usando as condições e ordenação da query

Subsets indexados e ordenados = buscas mais rápidas

Geradas automaticamente pelo GAE

Page 25: Google App Engine e NoSQL: Alta disponibilidade

Google Query Language

SELECT * FROM Person WHERE age >= 18

SELECT * FROM Person WHERE name IN ('Betty', 'Charlie')

SELECT name FROM Person

SELECT __key__ FROM Person WHERE age = NULL

Page 26: Google App Engine e NoSQL: Alta disponibilidade

Datastore ORM

Page 27: Google App Engine e NoSQL: Alta disponibilidade

ORM - Métodos

Atributos estáticos: query, get_by_id(),

get_or_insert()

Atributos de instância: populate, put, delete, to_dict

Pre Hooks e Post Hooks

Page 28: Google App Engine e NoSQL: Alta disponibilidade

ORM - exemplos

p = Person(name='Arthur Dent', age=42)

p_key = p.put()

p2 = p_key.get()

p2 == p #Retorna True

p_key.delete()

Page 29: Google App Engine e NoSQL: Alta disponibilidade

ORM - exemplos

p = Person()

p.populate(name='Arthur Dent', age=42)

p.put()

Page 30: Google App Engine e NoSQL: Alta disponibilidade

ORM - Datastore Viewer

Page 31: Google App Engine e NoSQL: Alta disponibilidade
Page 32: Google App Engine e NoSQL: Alta disponibilidade
Page 33: Google App Engine e NoSQL: Alta disponibilidade
Page 34: Google App Engine e NoSQL: Alta disponibilidade

Problemas da vida real

Page 35: Google App Engine e NoSQL: Alta disponibilidade

Problemas da vida real

Problema: Dados indisponíveis imediatamente após a

inserção

Causa: Eventual Consistency do Datastore

Resolução: Algoritmo do avestruz

Isso acontece porque o datastore precisa de até 1 segundo para replicar o dado em todas as

instâncias do datastore. Paradigma BASE.

Page 36: Google App Engine e NoSQL: Alta disponibilidade

Problemas da vida real

Problema: Fazer backup/dump do banco de dados

Resolução: Bulkloader e remote_api_shell

Page 37: Google App Engine e NoSQL: Alta disponibilidade

Problemas da vida real

Problema: Erros em querys logo após o deploy

Causa: GAE Gerando novos índices

Resolução: esperar e trocar a versão default para uma

estável

Page 38: Google App Engine e NoSQL: Alta disponibilidade

Problemas da vida real

Problema: Qual tipo de busca/inserção realizar?

Resolução: Utilize a forma que menos fizer chamadas ao

banco de dados

Page 39: Google App Engine e NoSQL: Alta disponibilidade

Problemas da vida real

Problema: É possível paralelizar buscas?

Resolução: Através das tasklets é possível paralelizar o

acesso ao banco

Page 40: Google App Engine e NoSQL: Alta disponibilidade

Referências

[1] Bigtable: A Distributed Storage System for Structured Data

[2] Documentação Google App Engine para Python

[3] App Engine e Python: Você Programa e o Google Escala

[4] Programming Google App Engine 2nd Edition

Page 41: Google App Engine e NoSQL: Alta disponibilidade
Page 42: Google App Engine e NoSQL: Alta disponibilidade

Obrigado!

[email protected]/giovaneliberato