Escalando una PHP Appcon DB Sharding & Amazon Web Services
Matias PaterliniTuesday, November 5, 13
Objetivo de la charla
• Contar quien soy y qué hago
• Mostrar orígenes de la arquitectura, infraestructura y escalabilidad de TFM
• Hablar de DB Sharding
• Hablar de Amazon
• Preguntas
• Cof Cof reclutar Ejem!
Tuesday, November 5, 13
• +11 años de experiencia en PHP.
• 6 años desarrollando aplicaciones sobre Redes Sociales
• 25 empleados, + de 250 aplicaciones desarrolladas
• + 10K clientes, + 10M Usuarios
• 2 compañías construidas sobre plataformas sociales
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
20.6 MAudiencia de nuestros primeros 8 clientes.
Tenemos 250 en simultáneo.
Tuesday, November 5, 13
+300.000Fans conseguidos con solo un
concurso
Tuesday, November 5, 13
Todos tenemos una historia con PHP
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
<?php echo 'Hello World';?>
Tuesday, November 5, 13
?Tuesday, November 5, 13
Apache HTTP Server
Tuesday, November 5, 13
Tuesday, November 5, 13
Free Web Hosting
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
OOP
Tuesday, November 5, 13
<? class Caja{ var $alto; var $ancho; var $largo; var $contenido; var $color;
function introduce($cosa){ $this->contenido = $cosa; }
function muestra_contenido(){ echo $this->contenido; } } ?>
Tuesday, November 5, 13
Auto-completeObject class reference
Tuesday, November 5, 13
Tuesday, November 5, 13
FRAMEWORKS
Tuesday, November 5, 13
Tuesday, November 5, 13
2010
Tuesday, November 5, 13
The Fan Machine
Tuesday, November 5, 13
Esto tiene que escalar!
Tuesday, November 5, 13
¿Qué sabíamos de escalar algo en PHP?
Tuesday, November 5, 13
¿Qué sabíamos de escalar algo a
MILLONES de usuarios en PHP?
Tuesday, November 5, 13
0Tuesday, November 5, 13
CEROTuesday, November 5, 13
Qué onda con el NoSQL?
Tuesday, November 5, 13
Qué onda con el Sharding?
Tuesday, November 5, 13
Cuales eran nuestros posibles problemas?
Tuesday, November 5, 13
Escalar Rápido
Tuesday, November 5, 13
Muchos writes
Tuesday, November 5, 13
Mucha variación en el Tráfico
Tuesday, November 5, 13
MUCHOS cambios en el modelo de datos
Tuesday, November 5, 13
Mucho Storage
Tuesday, November 5, 13
Todo bajo SSL
Tuesday, November 5, 13
Startup = poco $$
Tuesday, November 5, 13
Como lo solucionamos???
Tuesday, November 5, 13
Possible solutions...
Tuesday, November 5, 13
Web Server & Storage
Tuesday, November 5, 13
HORIZONTALSCALABILITY
Tuesday, November 5, 13
Database 1
Web Server 1 Web Server 2 Web Server 3
Static File Caching
Database 1
(replicated DB)
Data Caching
Tuesday, November 5, 13
AmazonAzure
GoGrid
Rackspace
Vurbia - SoftLayerAkamai
Tuesday, November 5, 13
AMAZON
Tuesday, November 5, 13
•Route 53
•S3
•EC2 - Web & Memcache
•CloudWatch
•CloudFront
•ELB - SSL termination
Tuesday, November 5, 13
What about the DB?
Tuesday, November 5, 13
CassandraMongoDB
Hipertable
NoSQL SimpleDB
CouchDB
Membase
BigData
RaptorDB
Hbase
Tuesday, November 5, 13
CassandraMongoDB
Hipertable
NoSQL SimpleDB
CouchDB
Membase
BigData
RaptorDB
Hbase
Tuesday, November 5, 13
NoSQL = No Trust!
Tuesday, November 5, 13
Y MySQL qué onda?
Tuesday, November 5, 13
Horizontal Scalability
Tuesday, November 5, 13
Master/Slave
Tuesday, November 5, 13
MasterDatabase
Web Server 1
Web Server 2
Web Server 3
Static File Caching
SlaveDatabase
Slave Database
(Transaccional, read-write)
(read) (read)
Data Caching
Tuesday, November 5, 13
DB scalling issues...
Tuesday, November 5, 13
MasterDatabase
Web Server 1
Web Server 2
Web Server 3
Static File Caching
SlaveDatabase
Slave Database
(Transaccional, read-write)
(read) (read)
Data Caching
Tuesday, November 5, 13
Tuesday, November 5, 13
CPUMemory
Disk
Tuesday, November 5, 13
MasterDatabase
Web Server 1
Web Server 2
Web Server 3
Static File Caching
SlaveDatabase
Slave Database
(Transaccional, read-write)
(read) (read)
Data Caching
Tuesday, November 5, 13
Retraso
Tuesday, November 5, 13
Tuesday, November 5, 13
• MAAAAANY Records - Storage issues
Tuesday, November 5, 13
• MAAAAANY Records - Storage issues
• Caching not enough
Tuesday, November 5, 13
• MAAAAANY Records - Storage issues
• Caching not enough
• Alters lock tables for hours!
Tuesday, November 5, 13
• MAAAAANY Records - Storage issues
• Caching not enough
• Alters lock tables for hours!
• Maintenance Issues
Tuesday, November 5, 13
• MAAAAANY Records - Storage issues
• Caching not enough
• Alters lock tables for hours!
• Maintenance Issues
• Too much response time
Tuesday, November 5, 13
Cluster Computing
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Table Partitioning
Tuesday, November 5, 13
Tuesday, November 5, 13
THE approach
Tuesday, November 5, 13
The Friendfeed approach
Tuesday, November 5, 13
MySQL
Tuesday, November 5, 13
Sharded MySQL databases
Tuesday, November 5, 13
MySQL emulating NoSQL over Sharded
Databases
Tuesday, November 5, 13
Documents = Entities
Tuesday, November 5, 13
One Table for entities, many tables for
indexes.
Tuesday, November 5, 13
The Model
entities
index_user
index_promo
index_participant
index_vote
index_fan_conversion
Tuesday, November 5, 13
The Model
entities
index_user
index_promo
index_participant
index_vote
index_fan_conversion
Tuesday, November 5, 13
entities tableadded_id
idbodyclass
createdupdateddeleted
Tuesday, November 5, 13
Entities Table
CREATE TABLE `entities` ( `added_id` int(11) NOT NULL AUTO_INCREMENT, `id` char(32) NOT NULL DEFAULT '', `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted` timestamp NULL DEFAULT NULL COMMENT `body` mediumtext, `class` varchar(50) DEFAULT NULL, `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`added_id`), UNIQUE KEY `id` (`id`), KEY `updated` (`updated`), KEY `class` (`class`), KEY `created` (`created`)) ENGINE=InnoDB AUTO_INCREMENT=1692491 DEFAULT CHARSET=utf8 |
Tuesday, November 5, 13
users index table
entity_idfb_uid
Tuesday, November 5, 13
user index table
CREATE TABLE `index_user` ( `entity_id` char(32) NOT NULL DEFAULT '', `uid` bigint(20) NOT NULL, PRIMARY KEY (`entity_id`,`uid`), UNIQUE KEY `uid` (`uid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
Tuesday, November 5, 13
How do we scale it?
Tuesday, November 5, 13
DB Server 1
Web Server 2
Shard 1Shard 2Shard 3
Shard 4Shard 5Shard 6
Shard 7Shard 8Shard 9
Shard 10Shard 11Shard 12
Web Server 1
Web Server 3
File Caching
Database Backups
Data Caching
} Databases
Tuesday, November 5, 13
DB Server
1
Shard 1Shard 2Shard 3
Web Server 1
Web Server 2
Web Server 3
Web Server 3
Shard 4Shard 5Shard 6
DBServer
2
Shard 7Shard 8Shard 9
DBServer
3
Shard 10Shard 11Shard 12
DBServer
4
Static File Caching
Database Backups per Shard
Tuesday, November 5, 13
THE Benefits...
Tuesday, November 5, 13
• Bases de datos más pequeñas son más fáciles de manejar
• Bases de datos más chicas son más rápidas
• El sharding puede reducir costos
Tuesday, November 5, 13
• Server maintenance per db-server
• Data Maintenance Per db-shard
• NO ALTERS on tables
• Easy recovery and replication with MultiAZ
• Easy scaling
• Easy migration to other No-SQL data engines
Tuesday, November 5, 13
¿When is DB sharding Appropiate?
Tuesday, November 5, 13
High transaction Applications
Write-intensive transactions
Tuesday, November 5, 13
Cómo repartimos entre los shards?
Tuesday, November 5, 13
Driver
Programmatic DB
Tuesday, November 5, 13
DBServer
1
Shard 1Shard 2Shard 3
Shard 4Shard 5Shard 6
DBServer
2
Shard 7Shard 8Shard 9
DB Server
3
Shard 10Shard 11Shard 12
DBServer
4
memory cache
DB Driver
Driver DB
Tuesday, November 5, 13
shard_idemail
DB driver table
Tuesday, November 5, 13
Progamatic Driver
Tuesday, November 5, 13
Cómo usamos el driver
Fetchear la entidad de un usuario:
Tuesday, November 5, 13
Cómo usamos el driver
Crear o actualizar una promo:
Tuesday, November 5, 13
otra forma de guardar...
Tuesday, November 5, 13
y se utiliza así en un helper:
Tuesday, November 5, 13
Amazon Web Services
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Tuesday, November 5, 13
Como evolucionamos en Amazon...
Tuesday, November 5, 13
Un servidor LAMP, S3DNS externo
Tuesday, November 5, 13
Amazon Linux AMI
Tuesday, November 5, 13
Memcache
Tuesday, November 5, 13
Balancer
Tuesday, November 5, 13
Route 53
Tuesday, November 5, 13
Que aprendimos??
Tuesday, November 5, 13
OJO con las public AMIs!!!
Tuesday, November 5, 13
Cuando estopeas una instancia.... CHAN
Tuesday, November 5, 13
PERDES LA IP ELASTICA
Tuesday, November 5, 13
SE TE CAMBIA LA DNS PUBLICA
Tuesday, November 5, 13
Clonar es super simple pero no super rápido
Tuesday, November 5, 13
Tener stopeada una instancia sale.... casi
nada!!
Tuesday, November 5, 13
DNS...
Tuesday, November 5, 13
SSL Termination
Tuesday, November 5, 13
Límite de certificados de ssl
Tuesday, November 5, 13