MULTITENANCY EM RAILS
cortando custos e aumentando capacidade
RICARDO BERNARDELLI

         @rbernardelli

  http://github.com/bernardelli

     http://rbernardelli.com
FERNANDO HAMASAKI

          @prodis

  http://github.com/prodis

    http://prodis.blog.br
MULTITENANCY EM RAILS
cortando custos e aumentando capacidade
MULTITENANCY EM RAILS
cortando custos e aumentando capacidade
O QUE É MULTITENANCY?
COM O QUE SE PREOCUPAR?
COM O QUE SE PREOCUPAR?

      separação de dados
COM O QUE SE PREOCUPAR?

      separação de dados
        customização
COM O QUE SE PREOCUPAR?

      separação de dados
        customização
        escalabilidade
ABORDAGENS
ABORDAGENS
uma instância e uma base de dados
ABORDAGENS
     uma instância e uma base de dados


• facilidade para novo tenant
ABORDAGENS
     uma instância e uma base de dados


• facilidade para novo tenant
• deploy simples
ABORDAGENS
     uma instância e uma base de dados


• facilidade para novo tenant
• deploy simples
• arquivos centralizados
ABORDAGENS
     uma instância e uma base de dados


• facilidade para novo tenant
• deploy simples
• arquivos centralizados
• fácil gerenciamento dos dados compartilhados
ABORDAGENS
     uma instância e uma base de dados


• facilidade para novo tenant
• deploy simples
• arquivos centralizados
• fácil gerenciamento dos dados compartilhados
• interferências na performance
ABORDAGENS
ABORDAGENS
uma instância com vários schemas
ABORDAGENS
      uma instância com vários schemas


• facilidade de customização
ABORDAGENS
     uma instância com vários schemas


• facilidade de customização
• gerenciamento das migrations
ABORDAGENS
     uma instância com vários schemas


• facilidade de customização
• gerenciamento das migrations
• dificuldade no gerenciamento dos schemas
ABORDAGENS
     uma instância com vários schemas


• facilidade de customização
• gerenciamento das migrations
• dificuldade no gerenciamento dos schemas
• postgresql, oracle
ABORDAGENS
ABORDAGENS
uma instância com bases separadas
ABORDAGENS
     uma instância com bases separadas


• separação total de dados
ABORDAGENS
     uma instância com bases separadas


• separação total de dados
• dificuldades no gerenciamento das bases
ABORDAGENS
ABORDAGENS
várias instâncias com várias bases
ABORDAGENS
      várias instâncias com várias bases

• separação total de dados
ABORDAGENS
       várias instâncias com várias bases

• separação total de dados
• escalabilidade de um único tenant
ABORDAGENS
      várias instâncias com várias bases

• separação total de dados
• escalabilidade de um único tenant
• dificuldade no gerenciamento das bases
ABORDAGENS
      várias instâncias com várias bases

• separação total de dados
• escalabilidade de um único tenant
• dificuldade no gerenciamento das bases
• dificuldade de deploys
ABORDAGENS
      várias instâncias com várias bases

• separação total de dados
• escalabilidade de um único tenant
• dificuldade no gerenciamento das bases
• dificuldade de deploys
• alto custo de infra
ABORDAGENS
      várias instâncias com várias bases

• separação total de dados
• escalabilidade de um único tenant
• dificuldade no gerenciamento das bases
• dificuldade de deploys
• alto custo de infra
               (multi-instância)
EXEMPLOS PARA RAILS
EXEMPLOS PARA RAILS

• multitenant (https://github.com/wireframe/multitenant)
EXEMPLOS PARA RAILS

• multitenant (https://github.com/wireframe/multitenant)
• acts_as_tenant (https://github.com/ErwinM/acts_as_tenant)
EXEMPLOS PARA RAILS

• multitenant (https://github.com/wireframe/multitenant)
• acts_as_tenant (https://github.com/ErwinM/acts_as_tenant)
• devise + inherited_resources
EXEMPLOS PARA RAILS

• multitenant (https://github.com/wireframe/multitenant)
• acts_as_tenant (https://github.com/ErwinM/acts_as_tenant)
• devise + inherited_resources
• ...
MULTITENANCY EM RAILS
cortando custos e aumentando capacidade
MULTITENANCY EM RAILS
cortando custos e aumentando capacidade
MULTITENANCY EM RAILS
cortando custos e aumentando capacidade

         (ou como nós fizemos)
Multitenancy
HISTÓRICO
loja pronta (antigo e-commerce Locaweb)
HISTÓRICO


equipe inicial sem experiência
      em ruby on rails
FATORES EXTERNOS
FATORES EXTERNOS


    time to market
FATORES EXTERNOS


    time to market
       pressão
DECISÕES
DECISÕES


aplicação do zero?
DECISÕES


           aplicação do zero?
utilizar solução já existente open-source?
DECISÕES




* http://2.bp.blogspot.com/_wWmWqyCEKEs/TA_SiflDXsI/AAAAAAAADlc/TOg9IwXGZfQ/s400/spree.png
DECISÕES




* http://2.bp.blogspot.com/_wWmWqyCEKEs/TA_SiflDXsI/AAAAAAAADlc/TOg9IwXGZfQ/s400/spree.png
COMO VAMOS ATENDER
  VÁRIOS CLIENTES ?
IDÉIAS
IDÉIAS
CLOUD ?




* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
CLOUD ?




* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
?
MULTI-INSTÂNCIA
PRIMEIRO SERVIDOR
       16 cpus
      18 gb ram

  apache + passenger
        mysql
    arquivos locais
PRIMEIRA ARQUITETURA
PRIMEIRA ARQUITETURA
MAGIC NUMBER
MAGIC NUMBER


   600
MAGIC NUMBER


   600
MAGIC NUMBER


     600
não aguentou 400!
O QUE FAZER AGORA?
Multitenancy
Multitenancy
Multitenancy
Multitenancy
12
DIFICULDADES
DIFICULDADES
    deploy
DIFICULDADES
    deploy
   migrations
DIFICULDADES
              deploy
            migrations
um tenant afetando tenants vizinhos
DIFICULDADES
                deploy
              migrations
  um tenant afetando tenants vizinhos
tenant com muitos arquivos distribuídos
DIFICULDADES
                deploy
              migrations
  um tenant afetando tenants vizinhos
tenant com muitos arquivos distribuídos
             manutenção
ALTA DISPONIBILIDADE




   * http://thatcrazytattooedbaldbroad.files.wordpress.com/2011/07/finger-pointing1.jpg
PRECISAMOS DE UMA NOVA
      ARQUITETURA
VANTAGENS A NOSSO FAVOR
VANTAGENS A NOSSO FAVOR


        rails usa rack
VANTAGENS A NOSSO FAVOR


         rails usa rack
     domínios centralizados
DESVANTAGENS
DESVANTAGENS


  bases separadas
DESVANTAGENS


    bases separadas
tenants descentralizados
BRAINSTORM
BRAINSTORM


trocar a conexão do banco
MAS, PODE ISSO ?




        * http://fjblogger.com/triboaser/files/2011/06/duvida.jpg
PROVA DE CONCEITO
RACK MIDDLEWARE
RACK MIDDLEWARE


config.middleware.use MultiTenant::Middleware
RACK MIDDLEWARE
def call(env)
  begin
    tenant = map.get_tenant(:address => address(env))

    return respond_302 unless tenant
    return respond_403 if tenant.suspended?

    tenant.current!

    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  rescue Exception => ex
    @logger.error ex.message + "n" + ex.backtrace.join("n")
    respond_500
  end
end
RACK MIDDLEWARE
def call(env)
  begin
    tenant = map.get_tenant(:address => address(env))

    return respond_302 unless tenant
    return respond_403 if tenant.suspended?

    tenant.current!

    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  rescue Exception => ex
    @logger.error ex.message + "n" + ex.backtrace.join("n")
    respond_500
  end
end
RACK MIDDLEWARE

module MultiTenant
  class TenantAddressMap
    ...

   def get_tenant(options = {})
     tenant_hash = @manager.get_tenant(options[:address])

     tenant_hash ? Tenant.new(tenant_hash) : nil
   end

    ...
  end
end
RACK MIDDLEWARE
def call(env)
  begin
    tenant = map.get_tenant(:address => address(env))

    return respond_302 unless tenant
    return respond_403 if tenant.suspended?

    tenant.current!

    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  rescue Exception => ex
    @logger.error ex.message + "n" + ex.backtrace.join("n")
    respond_500
  end
end
RACK MIDDLEWARE
def call(env)
  begin
    tenant = map.get_tenant(:address => address(env))

    return respond_302 unless tenant
    return respond_403 if tenant.suspended?

    tenant.current!

    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  rescue Exception => ex
    @logger.error ex.message + "n" + ex.backtrace.join("n")
    respond_500
  end
end
RACK MIDDLEWARE

module MultiTenant
  class Tenant
    ...

   def current!
     database_switcher.switch!(self)
     log_switcher.switch!(self)
     assets_switcher.switch!(self)
   end

    ...
  end
end
RACK MIDDLEWARE

module MultiTenant
  class Tenant
    ...

   def current!
     database_switcher.switch!(self)
     log_switcher.switch!(self)
     assets_switcher.switch!(self)
   end

    ...
  end
end
RACK MIDDLEWARE

module MultiTenant
  class DatabaseSwitcher
    ...

    def switch!(tenant)
      if ActiveRecord::Base.connection.current_database !=
tenant.config['database']
        ActiveRecord::Base.establish_connection(tenant.config)
      end
    end

    ...
  end
end
RACK MIDDLEWARE
def call(env)
  begin
    tenant = map.get_tenant(:address => address(env))

    return respond_302 unless tenant
    return respond_403 if tenant.suspended?

    tenant.current!

    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  rescue Exception => ex
    @logger.error ex.message + "n" + ex.backtrace.join("n")
    respond_500
  end
end
RACK MIDDLEWARE
def call(env)
  begin
    tenant = map.get_tenant(:address => address(env))

    return respond_302 unless tenant
    return respond_403 if tenant.suspended?

    tenant.current!

    @status, @headers, @response = @app.call(env)
    [@status, @headers, @response]
  rescue Exception => ex
    @logger.error ex.message + "n" + ex.backtrace.join("n")
    respond_500
  end
end
ESCALA ?
TESTES DE DESEMPENHO
     o que utilizamos:
TESTES DE DESEMPENHO
        o que utilizamos:


  máquina idêntica de produção
TESTES DE DESEMPENHO
        o que utilizamos:


  máquina idêntica de produção
    jmeter para fazer a carga
TESTES DE DESEMPENHO
TESTES DE DESEMPENHO

$ request-log-analyzer all-production.log
TESTES DE DESEMPENHO

   $ request-log-analyzer all-production.log

TaxonsController#show.html [GET]      71297 hits   25.9%

ProductsController#index.html [GET]   68717 hits   25.0%

ProductsController#show.html [GET]    64132 hits   23.3%
RESULTADOS
RESULTADOS
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
RESULTADOS

                   antes      depois

                               sem
instância/tenant    2
                           preocupações

     req/s           ?         300

consumo total
                   toda       estável
 de memória
E DEPOIS DO TESTE ?
METAS
METAS

ser fácil de escalar
METAS

ser fácil de escalar
  reduzir custos
METAS

ser fácil de escalar
  reduzir custos
alta disponibilidade
EXTRAÇÃO DE BASES
EXTRAÇÃO DE ARQUIVOS
NOVA ARQUITETURA
SERVIDOR

  16 cpus
 18 gb ram
SERVIDOR

                16 cpus
               18 gb ram



baixo consumo de memória e processamento
CLOUD ?




* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
CLOUD ?




* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
SERVIDOR
SERVIDOR


  8 cpus
SERVIDOR


  8 cpus

 10 gb ram
PROPAGANDA
PROPAGANDA
PROPAGANDA


crescimento em 5x a quantidade de tenants
COMO ESCALAR AINDA MAIS?
BALANCEADOR DE CARGA
BALANCEADOR DE CARGA



   Linux Virtual Server (LVS)
NOVA ARQUITETURA
NOVA ARQUITETURA
O QUE ESTÁ POR VIR
O QUE ESTÁ POR VIR


número de banco de dados crescendo
O QUE ESTÁ POR VIR


número de banco de dados crescendo
       logs estão distribuídos
CONCLUSÕES
CONCLUSÕES

tenha números concretos
CONCLUSÕES

  tenha números concretos
experimente, teste se funciona
CONCLUSÕES

       tenha números concretos
    experimente, teste se funciona
tenha solução ideal para o seu problema
CONCLUSÕES

       tenha números concretos
    experimente, teste se funciona
tenha solução ideal para o seu problema
     execute em pequenos passos
OBRIGADO !
PERGUNTAS ?
Ricardo Bernardelli   Fernando Hamasaki
   @rbernardelli           @prodis


             WebStore
   http://www.locaweb.com.br/Loja
REFERÊNCIAS
http://www.tectura.com.br/topics/abordagens_de_multitenant
http://msdn.microsoft.com/en-us/library/aa479086.aspx

imagem fail: http://hidefgames.com.br/wp-content/uploads/2011/04/failed1.gif

imagem approved: http://3.bp.blogspot.com/-fKxVGdl1KMo/TcdEdjCMuMI/
AAAAAAAABQM/FFJOzalJ7EU/s1600/approved-stamp-hi.png

Mais conteúdo relacionado

PPTX
PDF
Aws sao paulo summit 2015 elasti cache avancado
PDF
Raising the bar #4 - Economize utilizando instâncias Spot no Amazon EC2
DOCX
PDF
Infraestrutura como código
PDF
Machine Learning in Ecommerce
PDF
Multitenancy em aplicações na nuvem
PDF
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
Aws sao paulo summit 2015 elasti cache avancado
Raising the bar #4 - Economize utilizando instâncias Spot no Amazon EC2
Infraestrutura como código
Machine Learning in Ecommerce
Multitenancy em aplicações na nuvem
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015

Destaque (10)

PPTX
O framework spring
PDF
Multi-tenancy in Java
PPT
Multi Tenancy With Python and Django
PPTX
Multi-tenancy: Winning formula for a PaaS
PDF
E-commerce product classification with deep learning
PDF
ConFoo 2015 - Supporting Multi-tenancy Applications with Java EE
PPT
Multi-tenancy with Rails
PDF
Spring Security e Spring Boot Aula - 2018
PPTX
Saa s multitenant database architecture
PPTX
Understanding Multitenancy and the Architecture of the Salesforce Platform
O framework spring
Multi-tenancy in Java
Multi Tenancy With Python and Django
Multi-tenancy: Winning formula for a PaaS
E-commerce product classification with deep learning
ConFoo 2015 - Supporting Multi-tenancy Applications with Java EE
Multi-tenancy with Rails
Spring Security e Spring Boot Aula - 2018
Saa s multitenant database architecture
Understanding Multitenancy and the Architecture of the Salesforce Platform
Anúncio

Semelhante a Multitenancy (20)

PDF
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)
PDF
5. rodando containers docker na aws
PPTX
Road to serverless
PPTX
DevTalk 08/2019
PPTX
Migrando seu workload de Big Data para o Amazon EMR
PPTX
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
PPTX
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
PDF
Infraestrutura em nuvem com Amazon Web Services (AWS)
PDF
Docker.io:
PDF
Redis um banco chave valor
PDF
Docker Swarm - Sua aplicação pronta para escalar
PDF
Armazenamento+de+alta+disponibilidade+com+amazon+ebs
PPT
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
PPTX
Evento CA ArcServe D2D on Demand
PDF
Serverless Containers - execute instâncias de containers do Azure sob demanda...
PDF
Novidades do Universo MySQL para PHP Web Developers - Dezembro 2014
PPTX
Azure Overview
PPTX
Overview Azure
PPTX
Seu banco de dados na nuvem: Opções de bancos de dados na AWS e padrões de...
DevOps containers x86 - Baremetal, Virtual e Cloud (pt_br)
5. rodando containers docker na aws
Road to serverless
DevTalk 08/2019
Migrando seu workload de Big Data para o Amazon EMR
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Infraestrutura em nuvem com Amazon Web Services (AWS)
Docker.io:
Redis um banco chave valor
Docker Swarm - Sua aplicação pronta para escalar
Armazenamento+de+alta+disponibilidade+com+amazon+ebs
Blueprints & Patterns de Arquitetura para Sistemas que Escalam Linearmente (p...
Evento CA ArcServe D2D on Demand
Serverless Containers - execute instâncias de containers do Azure sob demanda...
Novidades do Universo MySQL para PHP Web Developers - Dezembro 2014
Azure Overview
Overview Azure
Seu banco de dados na nuvem: Opções de bancos de dados na AWS e padrões de...
Anúncio

Último (12)

PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Analise Estatica de Compiladores para criar uma nova LP
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PPTX
Utilizando code blockes por andre backes
PPTX
Tipos de servidor em redes de computador.pptx
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PPTX
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PDF
Manejo integrado de pragas na cultura do algodão
PPT
Conceitos básicos de Redes Neurais Artificiais
PDF
Jira Software projetos completos com scrum
PDF
Processos no SAP Extended Warehouse Management, EWM100 Col26
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Analise Estatica de Compiladores para criar uma nova LP
Viasol Energia Solar -Soluções para geração e economia de energia
Utilizando code blockes por andre backes
Tipos de servidor em redes de computador.pptx
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Manejo integrado de pragas na cultura do algodão
Conceitos básicos de Redes Neurais Artificiais
Jira Software projetos completos com scrum
Processos no SAP Extended Warehouse Management, EWM100 Col26

Multitenancy