How to scale PHP applications
Post on 28-Jan-2015
107 Views
Preview:
DESCRIPTION
Transcript
© All rights reserved. Zend Technologies, Inc.
How to scale PHP applications
by Jan Burkl, Enrico ZimuelZend Technologies
http://www.zend.comjan.burkl@zend.com, enrico@zend.com
30th October 2010 – PHP Barcelona Conference
© All rights reserved. Zend Technologies, Inc.
About us
● Jan Burkl (jan.burkl@zend.com)
● Senior System Engineer at Zend Technologies in Stuttgart (Germany) since 2006
● Enrico Zimuel (enrico@zend.com)
● Senior Consultant & Architect at Zend Technologies in Milan (Italy) since 2008
● Blog on web dev't: http://www.zimuel.it/blog
© All rights reserved. Zend Technologies, Inc.
Summary
● Scalability of a web application
● How to scale a PHP application
● PHP session management
● Sharing session data using:
▶ Network file system▶ Database▶ Memcached▶ Redis▶ Zend Server Cluster Manager
© All rights reserved. Zend Technologies, Inc.
Scalability of a web application
© All rights reserved. Zend Technologies, Inc.
Scalability: general definition
“Scalability is a desirable property of a system, a network, or a process, which indicates its ability to either handle growing amounts of work in a graceful manner or to be enlarged”
Source: Wikipedia
© All rights reserved. Zend Technologies, Inc.
Scalability of a web application
A web application is scalable when is able to manage a growing traffic with additional resources (CPU, RAM) without software changes
© All rights reserved. Zend Technologies, Inc.
Scale vertically vs. Scale horizontally
● Scale vertically (scale up)
▶ Add resources to a single node in a system▶ Enhance the server (more CPU, more RAM, etc)▶ High availability difficult to implement
● Scale horizontally (scale out)
▶ Add mores nodes to a system▶ More servers, distributing the load▶ High availability easy to implement
© All rights reserved. Zend Technologies, Inc.
Scale up vs. Scale out
Scale up Scale out
vs.
© All rights reserved. Zend Technologies, Inc.
The web scale out
● As Google taught, the best way to scale an high traffic web application is horizontally
● No expensive servers to scale horizontally
● We need load balancers to split the traffic between all the servers
A Google server
© All rights reserved. Zend Technologies, Inc.
A typical load balancer architecture
Load Balancer
Web Servers
Internet
Firewall
© All rights reserved. Zend Technologies, Inc.
How to scale a PHP application?
● The PHP application uses session/local data?
▶ Yes = we have to manage the session/local data across multiple servers
● Using a persistent load balancer● Share the session data
▶ No = we can scale very easy (stateless)● Most of the PHP applications are not stateless,
they use session data
© All rights reserved. Zend Technologies, Inc.
Persistent load balancer
● A client request is assigned always to the same server (means same session/local data)
● Pros:
▶ No software architecture changes● Cons:
▶ No fault tolerant, if a server goes down the session data are lost!
▶ The load balancer is the bottleneck▶ The persistent load balancer are expensive
© All rights reserved. Zend Technologies, Inc.
Share the session data
● Manage the session data across the servers
● Pros:
▶ Fault tolerant, if a server goes down the load balancer can user another server
▶ No bottleneck in the load balancer▶ The stateless load balancer are cheaper
● Cons:
▶ Software architecture changes
© All rights reserved. Zend Technologies, Inc.
PHP session management
© All rights reserved. Zend Technologies, Inc.
Sessions in PHP
● Session support in PHP consists of a way to preserve certain data across subsequent accesses
● To identify the subsequent accesses, from the same client, PHP uses a cookie variable (PHPSESSID)
▶ Example: PHPSESSID= tclq3an1ri8dsfiuo43845loo1
● By default, session data are stored in the file system of the server
● In PHP we manage the session data using the $_SESSION global variable
© All rights reserved. Zend Technologies, Inc.
PHP session management
● Configure the PHP session management (php.ini directives):
▶ session.name
● name of the session cookie identifier (PHPSESSID by default)
▶ session.save_handler
● defines the name of the handler which is used for storing and retrieving data associated with a session (files by default).
▶ session.save_path
● defines the argument which is passed to the save handler (with files handler is the path to store the session data)
© All rights reserved. Zend Technologies, Inc.
Example (PHP sessions using files)
● <?phpsession_start();$_SESSION['user']= 'enrico';
● In session folder (for instance, /tmp) the PHP creates a file named sess_fvi9r84f14sjel8r28o6aqspr2 (where fvi9r84f14sjel8r28o6aqspr2 is PHPSESSID) that contains:
user|s:6:"enrico";
© All rights reserved. Zend Technologies, Inc.
Share session data
● How to share PHP sessions between multiple servers?
▶ Using a Network File System▶ Using a Database▶ Using Memcached▶ Using Redis▶ Using Zend Server Cluster Manager▶ etc
© All rights reserved. Zend Technologies, Inc.
session_set_save_handler()
● You can write your PHP session handler using the session_set_save_handler():
bool session_set_save_handler (callback $open,callback $close,callback $read,callback $write,callback $destroy,callback $gc)
● More info: http://php.net/manual/en/function.session-set-save-handler.php
© All rights reserved. Zend Technologies, Inc.
Session sharingusing NFS
© All rights reserved. Zend Technologies, Inc.
Session sharing using NFS
● Use the default PHP session handler (session.session_handler= files)
● NFS to store the session data files (session.save_path= NFS folder)
● Pros:▶ No changes on the PHP side
● Cons:▶ Highly inefficient▶ Not designed for high read/write ratio▶ Performance problems and data corruptions
© All rights reserved. Zend Technologies, Inc.
Session sharingusing Database
© All rights reserved. Zend Technologies, Inc.
Session sharing using DB
● Use the user PHP session handler (session.session_handler= user)
● Use the session_set_save_handler() to implement your db session handler
● Which db?▶ MySQL
http://www.php.net/manual/en/function.session-set-save-handler.php#81761
▶ Ms SQL Server● http://www.zimuel.it/blog/?p=402
▶ PostgreSQL, Oracle, etc
© All rights reserved. Zend Technologies, Inc.
Session sharing using DB (2)
● Pros:▶ Solves the scalability limitation▶ A lot of best practices available▶ Wide installation base▶ DB is (normally) available
● Cons:▶ Sessions have almost 1:1 read/write ratio▶ Connection overhead▶ Single point of failure▶ Performance bottleneck
© All rights reserved. Zend Technologies, Inc.
Session sharingusing Memcached
© All rights reserved. Zend Technologies, Inc.
Session sharing using Memcached
● Use the memcached PHP session handler (session.session_handler= memcache)
● Pros:▶ Native session handler▶ Very fast (works in RAM)▶ Can be clustered
● Cons:▶ No persistent data (it's a caching system)▶ Cyclic memory (data can be overwritten if the
memory is full)
© All rights reserved. Zend Technologies, Inc.
Session sharingusing Redis
© All rights reserved. Zend Technologies, Inc.
What is Redis?
● Redis is an open-source, networked, in-memory, persistent, journaled, key-value data store (NoSQL).
● It's similar to memcached but the dataset is not volatile
● Developed by: Salvatore Sanfilippo
● Sponsored by vmware
● http://code.google.com/p/redis/
© All rights reserved. Zend Technologies, Inc.
Session sharing using Redis
● Different PHP extensions for Redis:
▶ Predis, http://github.com/nrk/predis/
▶ Rediska, http://rediska.geometria-lab.net/
▶ redis.php, http://github.com/antirez/redisdotphp
▶ PHPRedis!, http://github.com/owlient/phpredis
● Custom session handler for Redis:▶ http://github.com/ivanstojic/redis-session-php
© All rights reserved. Zend Technologies, Inc.
Session sharing using Redis (2)
● Pros:
▶ Fast (works in RAM)▶ Reliable (master-slave replication)
● Cons:
▶ PHP Redis extensions are 0.x version▶ Custom PHP session handler▶ Not so scalable* (data are stored in RAM)▶ No High Availability* (master-slave limitation)
* but Redis developers are working on a Cluster version!
© All rights reserved. Zend Technologies, Inc.
Session sharingusing Zend ServerCluster Manager
© All rights reserved. Zend Technologies, Inc.
What is Zend Server and Cluster Manager?
● Zend Server is a complete, enterprise-ready Web Application Server for running and managing PHP applications that require a high level of reliability, performance and security on Linux, Windows or IBM i.
● Zend Server Cluster Manager (ZSCM) extends the benefits of Zend Server across large-scale PHP deployments.
● With ZSCM you can build a real PHP cluster stack.
© All rights reserved. Zend Technologies, Inc.
Session sharing with ZSCM
● Session Clustering Extension
● Session Clustering Daemon (SCD)
● Storage backends: Disk / Memory
● Peer-to-peer protocol to communicate between nodes
● Session management with master-backup architecture
© All rights reserved. Zend Technologies, Inc.
Zend Server Cluster Manager architecture
Load Balancer
MySQL
Firewall
© All rights reserved. Zend Technologies, Inc.
High availability: session cluster
© All rights reserved. Zend Technologies, Inc.
High availability: session cluster (2)
© All rights reserved. Zend Technologies, Inc.
Session cluster with ZSCM
● Pros:
▶ Very Fast▶ Reliable (data are stored in master-backup
servers)▶ High Availability▶ Scalable (session data are stored in all the
nodes of the cluster)▶ No changes to the PHP code
● Cons:
▶ You need Zend Server on each node of the cluster
© All rights reserved. Zend Technologies, Inc.
Questions?
© All rights reserved. Zend Technologies, Inc.
Thank you for attending!
More info:http://www.zend.comhttp://phpconference.es
top related