Multitenancy

2,346
-1

Published on

Talk meu e do Fernando Hamazaki na Rubyconf BR 2011.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,346
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Multitenancy

  1. 1. MULTITENANCY EM RAILScortando custos e aumentando capacidade
  2. 2. RICARDO BERNARDELLI @rbernardelli http://github.com/bernardelli http://rbernardelli.com
  3. 3. FERNANDO HAMASAKI @prodis http://github.com/prodis http://prodis.blog.br
  4. 4. MULTITENANCY EM RAILScortando custos e aumentando capacidade
  5. 5. MULTITENANCY EM RAILScortando custos e aumentando capacidade
  6. 6. O QUE É MULTITENANCY?
  7. 7. COM O QUE SE PREOCUPAR?
  8. 8. COM O QUE SE PREOCUPAR? separação de dados
  9. 9. COM O QUE SE PREOCUPAR? separação de dados customização
  10. 10. COM O QUE SE PREOCUPAR? separação de dados customização escalabilidade
  11. 11. ABORDAGENS
  12. 12. ABORDAGENSuma instância e uma base de dados
  13. 13. ABORDAGENS uma instância e uma base de dados• facilidade para novo tenant
  14. 14. ABORDAGENS uma instância e uma base de dados• facilidade para novo tenant• deploy simples
  15. 15. ABORDAGENS uma instância e uma base de dados• facilidade para novo tenant• deploy simples• arquivos centralizados
  16. 16. ABORDAGENS uma instância e uma base de dados• facilidade para novo tenant• deploy simples• arquivos centralizados• fácil gerenciamento dos dados compartilhados
  17. 17. 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
  18. 18. ABORDAGENS
  19. 19. ABORDAGENSuma instância com vários schemas
  20. 20. ABORDAGENS uma instância com vários schemas• facilidade de customização
  21. 21. ABORDAGENS uma instância com vários schemas• facilidade de customização• gerenciamento das migrations
  22. 22. ABORDAGENS uma instância com vários schemas• facilidade de customização• gerenciamento das migrations• dificuldade no gerenciamento dos schemas
  23. 23. ABORDAGENS uma instância com vários schemas• facilidade de customização• gerenciamento das migrations• dificuldade no gerenciamento dos schemas• postgresql, oracle
  24. 24. ABORDAGENS
  25. 25. ABORDAGENSuma instância com bases separadas
  26. 26. ABORDAGENS uma instância com bases separadas• separação total de dados
  27. 27. ABORDAGENS uma instância com bases separadas• separação total de dados• dificuldades no gerenciamento das bases
  28. 28. ABORDAGENS
  29. 29. ABORDAGENSvárias instâncias com várias bases
  30. 30. ABORDAGENS várias instâncias com várias bases• separação total de dados
  31. 31. ABORDAGENS várias instâncias com várias bases• separação total de dados• escalabilidade de um único tenant
  32. 32. ABORDAGENS várias instâncias com várias bases• separação total de dados• escalabilidade de um único tenant• dificuldade no gerenciamento das bases
  33. 33. 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
  34. 34. 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
  35. 35. 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)
  36. 36. EXEMPLOS PARA RAILS
  37. 37. EXEMPLOS PARA RAILS• multitenant (https://github.com/wireframe/multitenant)
  38. 38. EXEMPLOS PARA RAILS• multitenant (https://github.com/wireframe/multitenant)• acts_as_tenant (https://github.com/ErwinM/acts_as_tenant)
  39. 39. EXEMPLOS PARA RAILS• multitenant (https://github.com/wireframe/multitenant)• acts_as_tenant (https://github.com/ErwinM/acts_as_tenant)• devise + inherited_resources
  40. 40. EXEMPLOS PARA RAILS• multitenant (https://github.com/wireframe/multitenant)• acts_as_tenant (https://github.com/ErwinM/acts_as_tenant)• devise + inherited_resources• ...
  41. 41. MULTITENANCY EM RAILScortando custos e aumentando capacidade
  42. 42. MULTITENANCY EM RAILScortando custos e aumentando capacidade
  43. 43. MULTITENANCY EM RAILScortando custos e aumentando capacidade (ou como nós fizemos)
  44. 44. HISTÓRICOloja pronta (antigo e-commerce Locaweb)
  45. 45. HISTÓRICOequipe inicial sem experiência em ruby on rails
  46. 46. FATORES EXTERNOS
  47. 47. FATORES EXTERNOS time to market
  48. 48. FATORES EXTERNOS time to market pressão
  49. 49. DECISÕES
  50. 50. DECISÕESaplicação do zero?
  51. 51. DECISÕES aplicação do zero?utilizar solução já existente open-source?
  52. 52. DECISÕES* http://2.bp.blogspot.com/_wWmWqyCEKEs/TA_SiflDXsI/AAAAAAAADlc/TOg9IwXGZfQ/s400/spree.png
  53. 53. DECISÕES* http://2.bp.blogspot.com/_wWmWqyCEKEs/TA_SiflDXsI/AAAAAAAADlc/TOg9IwXGZfQ/s400/spree.png
  54. 54. COMO VAMOS ATENDER VÁRIOS CLIENTES ?
  55. 55. IDÉIAS
  56. 56. IDÉIAS
  57. 57. CLOUD ?* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
  58. 58. CLOUD ?* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
  59. 59. ?
  60. 60. MULTI-INSTÂNCIA
  61. 61. PRIMEIRO SERVIDOR 16 cpus 18 gb ram apache + passenger mysql arquivos locais
  62. 62. PRIMEIRA ARQUITETURA
  63. 63. PRIMEIRA ARQUITETURA
  64. 64. MAGIC NUMBER
  65. 65. MAGIC NUMBER 600
  66. 66. MAGIC NUMBER 600
  67. 67. MAGIC NUMBER 600não aguentou 400!
  68. 68. O QUE FAZER AGORA?
  69. 69. 12
  70. 70. DIFICULDADES
  71. 71. DIFICULDADES deploy
  72. 72. DIFICULDADES deploy migrations
  73. 73. DIFICULDADES deploy migrationsum tenant afetando tenants vizinhos
  74. 74. DIFICULDADES deploy migrations um tenant afetando tenants vizinhostenant com muitos arquivos distribuídos
  75. 75. DIFICULDADES deploy migrations um tenant afetando tenants vizinhostenant com muitos arquivos distribuídos manutenção
  76. 76. ALTA DISPONIBILIDADE * http://thatcrazytattooedbaldbroad.files.wordpress.com/2011/07/finger-pointing1.jpg
  77. 77. PRECISAMOS DE UMA NOVA ARQUITETURA
  78. 78. VANTAGENS A NOSSO FAVOR
  79. 79. VANTAGENS A NOSSO FAVOR rails usa rack
  80. 80. VANTAGENS A NOSSO FAVOR rails usa rack domínios centralizados
  81. 81. DESVANTAGENS
  82. 82. DESVANTAGENS bases separadas
  83. 83. DESVANTAGENS bases separadastenants descentralizados
  84. 84. BRAINSTORM
  85. 85. BRAINSTORMtrocar a conexão do banco
  86. 86. MAS, PODE ISSO ? * http://fjblogger.com/triboaser/files/2011/06/duvida.jpg
  87. 87. PROVA DE CONCEITO
  88. 88. RACK MIDDLEWARE
  89. 89. RACK MIDDLEWAREconfig.middleware.use MultiTenant::Middleware
  90. 90. RACK MIDDLEWAREdef 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 endend
  91. 91. RACK MIDDLEWAREdef 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 endend
  92. 92. RACK MIDDLEWAREmodule MultiTenant class TenantAddressMap ... def get_tenant(options = {}) tenant_hash = @manager.get_tenant(options[:address]) tenant_hash ? Tenant.new(tenant_hash) : nil end ... endend
  93. 93. RACK MIDDLEWAREdef 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 endend
  94. 94. RACK MIDDLEWAREdef 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 endend
  95. 95. RACK MIDDLEWAREmodule MultiTenant class Tenant ... def current! database_switcher.switch!(self) log_switcher.switch!(self) assets_switcher.switch!(self) end ... endend
  96. 96. RACK MIDDLEWAREmodule MultiTenant class Tenant ... def current! database_switcher.switch!(self) log_switcher.switch!(self) assets_switcher.switch!(self) end ... endend
  97. 97. RACK MIDDLEWAREmodule MultiTenant class DatabaseSwitcher ... def switch!(tenant) if ActiveRecord::Base.connection.current_database !=tenant.config[database] ActiveRecord::Base.establish_connection(tenant.config) end end ... endend
  98. 98. RACK MIDDLEWAREdef 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 endend
  99. 99. RACK MIDDLEWAREdef 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 endend
  100. 100. ESCALA ?
  101. 101. TESTES DE DESEMPENHO o que utilizamos:
  102. 102. TESTES DE DESEMPENHO o que utilizamos: máquina idêntica de produção
  103. 103. TESTES DE DESEMPENHO o que utilizamos: máquina idêntica de produção jmeter para fazer a carga
  104. 104. TESTES DE DESEMPENHO
  105. 105. TESTES DE DESEMPENHO$ request-log-analyzer all-production.log
  106. 106. TESTES DE DESEMPENHO $ request-log-analyzer all-production.logTaxonsController#show.html [GET] 71297 hits 25.9%ProductsController#index.html [GET] 68717 hits 25.0%ProductsController#show.html [GET] 64132 hits 23.3%
  107. 107. RESULTADOS
  108. 108. RESULTADOS
  109. 109. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  110. 110. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  111. 111. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  112. 112. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  113. 113. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  114. 114. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  115. 115. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  116. 116. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  117. 117. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  118. 118. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  119. 119. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  120. 120. RESULTADOS antes depois seminstância/tenant 2 preocupações req/s ? 300consumo total toda estável de memória
  121. 121. E DEPOIS DO TESTE ?
  122. 122. METAS
  123. 123. METASser fácil de escalar
  124. 124. METASser fácil de escalar reduzir custos
  125. 125. METASser fácil de escalar reduzir custosalta disponibilidade
  126. 126. EXTRAÇÃO DE BASES
  127. 127. EXTRAÇÃO DE ARQUIVOS
  128. 128. NOVA ARQUITETURA
  129. 129. SERVIDOR 16 cpus 18 gb ram
  130. 130. SERVIDOR 16 cpus 18 gb rambaixo consumo de memória e processamento
  131. 131. CLOUD ?* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
  132. 132. CLOUD ?* http://jodsonfritz.files.wordpress.com/2011/03/illustratie-illustration_cloud-computing-lek-leak-wolken1-450x299.jpg
  133. 133. SERVIDOR
  134. 134. SERVIDOR 8 cpus
  135. 135. SERVIDOR 8 cpus 10 gb ram
  136. 136. PROPAGANDA
  137. 137. PROPAGANDA
  138. 138. PROPAGANDAcrescimento em 5x a quantidade de tenants
  139. 139. COMO ESCALAR AINDA MAIS?
  140. 140. BALANCEADOR DE CARGA
  141. 141. BALANCEADOR DE CARGA Linux Virtual Server (LVS)
  142. 142. NOVA ARQUITETURA
  143. 143. NOVA ARQUITETURA
  144. 144. O QUE ESTÁ POR VIR
  145. 145. O QUE ESTÁ POR VIRnúmero de banco de dados crescendo
  146. 146. O QUE ESTÁ POR VIRnúmero de banco de dados crescendo logs estão distribuídos
  147. 147. CONCLUSÕES
  148. 148. CONCLUSÕEStenha números concretos
  149. 149. CONCLUSÕES tenha números concretosexperimente, teste se funciona
  150. 150. CONCLUSÕES tenha números concretos experimente, teste se funcionatenha solução ideal para o seu problema
  151. 151. CONCLUSÕES tenha números concretos experimente, teste se funcionatenha solução ideal para o seu problema execute em pequenos passos
  152. 152. OBRIGADO !
  153. 153. PERGUNTAS ?
  154. 154. Ricardo Bernardelli Fernando Hamasaki @rbernardelli @prodis WebStore http://www.locaweb.com.br/Loja
  155. 155. REFERÊNCIAShttp://www.tectura.com.br/topics/abordagens_de_multitenanthttp://msdn.microsoft.com/en-us/library/aa479086.aspximagem fail: http://hidefgames.com.br/wp-content/uploads/2011/04/failed1.gifimagem approved: http://3.bp.blogspot.com/-fKxVGdl1KMo/TcdEdjCMuMI/AAAAAAAABQM/FFJOzalJ7EU/s1600/approved-stamp-hi.png

×