Escalar	
  aplicações	
  PHP




                                       Augusto Pascutti
Wednesday, February 8, 2012
@augustohp




Wednesday, February 8, 2012
HTTP	
  =	
  Stateless	
  
                              (Share	
  Nothing)
Wednesday, February 8, 2012
Escalar?


Wednesday, February 8, 2012
!=	
  Velocidade
Wednesday, February 8, 2012
~=	
  quanBdade
Wednesday, February 8, 2012
Escalabilidade	
  =	
  Arquitetura
Wednesday, February 8, 2012
Nosso	
  ambiente
Wednesday, February 8, 2012
Wednesday, February 8, 2012
Level	
  1




Wednesday, February 8, 2012
Internet




Wednesday, February 8, 2012
Índices
Wednesday, February 8, 2012
Um	
  índice	
  muito	
  grande	
  é	
  INÚTIL.




                              Índices
Wednesday, February 8, 2012
CREATE TABLE compras (
             id INT AUTO_INCREMENT,
             data DATE NOT NULL,
             valor FLOAT NOT NULL,
             PRIMARY KEY (id)
             INDEX data_compra(data)
     )                        Índices
Wednesday, February 8, 2012
SELECT *
  FROM compras
  WHERE
  TO_DAYS(data)-TO_DAYS(data) <= 7


                              Índices
Wednesday, February 8, 2012
SELECT *
 FROM compras
 WHERE
 data <= CURRENT_DATE() - INTERVAL 7 DAY



                              Índices
Wednesday, February 8, 2012
SELECT *
 FROM compras
 WHERE
 data <= ‘2012-01-07’ - INTERVAL 7 DAY



                              Índices
Wednesday, February 8, 2012
ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
CREATE TABLE usuarios (
       id INT AUTO_INCREMENT,
       login VARCHAR(50) NOT NULL,
       nascimento DATE NOT NULL
      ) ENGINE=InnoDB
      PARTITION BY RANGE (id) (
       PARTITION a VALUES LESS THAN (1000),
       PARTITION b VALUES LESS THAN (2000),
       PARTITION z VALUES LESS THAN MAXVALUE
      );
             ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
CREATE TABLE usuarios (
       id INT AUTO_INCREMENT,
       login VARCHAR(50) NOT NULL,
       nascimento DATE NOT NULL,
       pais INT NOT NULL
      ) ENGINE=InnoDB
      PARTITION BY LIST (pais) (
       PARTITION america VALUES IN (1,2,3),
       PARTITION europa VALUES IN (4,5,6),
       ...
      );     ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
CREATE TABLE usuarios (
       id INT AUTO_INCREMENT,
       login VARCHAR(50) NOT NULL,
       nascimento DATE NOT NULL,
       grupo INT NOT NULL
      ) ENGINE=InnoDB
      PARTITION BY HASH (grupo)
      PARTITIONS 4;

             ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
CREATE TABLE usuarios (
       id INT AUTO_INCREMENT,
       login VARCHAR(50) NOT NULL,
       nascimento DATE NOT NULL,
       grupo INT NOT NULL
      ) ENGINE=InnoDB
      PARTITION BY HASH (grupo)    INT
      PARTITIONS 4;

             ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
CREATE TABLE usuarios (
       id INT AUTO_INCREMENT,
       login VARCHAR(50) NOT NULL,
       nascimento DATE NOT NULL,
       grupo INT NOT NULL
      ) ENGINE=InnoDB
      PARTITION BY HASH (MONTH(nascimento))
      PARTITIONS 12;

             ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
CREATE TABLE usuarios (
       id INT AUTO_INCREMENT,
       login VARCHAR(50) NOT NULL,
       nascimento DATE NOT NULL,
       grupo INT NOT NULL
      ) ENGINE=InnoDB
      PARTITION BY KEY (login)
      PARTITIONS 4;

             ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
CREATE TABLE usuarios (
       id INT AUTO_INCREMENT,
       login VARCHAR(50) NOT NULL,
       nascimento DATE NOT NULL,
       grupo INT NOT NULL
      ) ENGINE=InnoDB
      PARTITION BY KEY (login)     =D
      PARTITIONS 4;

             ParBcionamento	
  VerBcal
Wednesday, February 8, 2012
Level	
  2




Wednesday, February 8, 2012
Gravação                Leitura




                                         Replicação

Wednesday, February 8, 2012
Level	
  3




Wednesday, February 8, 2012
Gravação                Leitura




                                         Replicação




Wednesday, February 8, 2012
Gravação                      Leitura




                                         Replicação




                                               MySql	
  Proxy




Wednesday, February 8, 2012
Wednesday, February 8, 2012
Level	
  1




Wednesday, February 8, 2012
Internet




Wednesday, February 8, 2012
MulB	
  Processing	
  Modules
Wednesday, February 8, 2012
Internet




Wednesday, February 8, 2012
Level	
  2




Wednesday, February 8, 2012
Wednesday, February 8, 2012
•mod_proxy
                              •mod_proxy_hWp
                              •mod_proxy_balancer




Wednesday, February 8, 2012
•mod_proxy
                                      •mod_proxy_hWp
                                      •mod_proxy_balancer

                ProxyPass / balancer://vila-chaves
                <Proxy balancer://vila-chaves>
                 BalancerMember http://chaves.test.org
                 BalancerMember http://kiko.test.org
                 BalancerMember http://nhonho.test.org
                </Proxy>




Wednesday, February 8, 2012
SESSION
Wednesday, February 8, 2012
ProxyPass / balancer://vila-chaves 
                  stickysession=PHPSESSIONID

         <Proxy balancer://vila-chaves>
          BalancerMember http://chaves.test.org
          BalancerMember http://kiko.test.org
          BalancerMember http://nhonho.test.org
         </Proxy>




                      SESSION
Wednesday, February 8, 2012
Level	
  3




Wednesday, February 8, 2012
Gravação   Leitura




Wednesday, February 8, 2012
•mod_rewrite




                              Gravação   Leitura




Wednesday, February 8, 2012
•mod_rewrite


  RewriteEngine On

  RewriteCond ${REQUEST_METHOD} ^(POST|PUT|DELETE)$
  RewriteRule ^/(.*)$ escrita.test.org$1 [P]
                              Gravação            Leitura
  RewriteCond ${REQUEST_METHOD} ^(GET|HEAD|OPTIONS)$
  RewriteRule ^/(.*)$ leitura.test.org$1 [P]




Wednesday, February 8, 2012
•mod_rewrite


  RewriteEngine On

  RewriteCond ${REQUEST_METHOD} ^(POST|PUT|DELETE)$
  RewriteRule ^/(.*)$ balancer://escrita$1 [P]
                              Gravação            Leitura
  RewriteCond ${REQUEST_METHOD} ^(GET|HEAD|OPTIONS)$
  RewriteRule ^/(.*)$ balancer://leitura$1 [P]




Wednesday, February 8, 2012
Wednesday, February 8, 2012
Banco	
  de	
  Dados




Wednesday, February 8, 2012
Front	
  Controller
Wednesday, February 8, 2012
SESSION
Wednesday, February 8, 2012
CREATE TABLE `session` (
                `id` char(32),
                `data` text,
                PRIMARY KEY (`id`)
             );
                              SESSION
Wednesday, February 8, 2012
session_set_save_handler
             ("open","close","read",
             "write","destroy","gc");

                              SESSION
Wednesday, February 8, 2012
function open($path,$name)
             {
                 return true;
             }

             function close() {
                 return true;
             }   SESSION
Wednesday, February 8, 2012
function read($id) {
                 $sql = "SELECT data
                          FROM session
                          WHERE id = '{$id}'";
                 $data = array(); // query, fetchAll
                 return $data;
             }


                              SESSION
Wednesday, February 8, 2012
function write($id, $data) {
             $data = serialize($data);
             $sql = "INSERT INTO session (id, data)
                       VALUES ('{$id}', '{$data}')";
             // Insert
             return true;
         }


                              SESSION
Wednesday, February 8, 2012
function destroy($id) {
                   $sql = "DELETE FROM session
                           WHERE id = '{$id}'";
                   // delete
                   return $sql;
               }

                              SESSION
Wednesday, February 8, 2012
function gc($maxlifetime) {
                              // =D
                              return true;
             }

                              SESSION
Wednesday, February 8, 2012
@alganet




Wednesday, February 8, 2012
slideshare.net/augustopascutti
Wednesday, February 8, 2012

Como escalar aplicações PHP