© All rights reserved. Zend Technologies, Inc. How to scale PHP applications by Jan Burkl, Enrico Zimuel Zend Technologies http://www.zend.com jan.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) ● <?php session_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 sharing using 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 sharing using 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 sharing using 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 sharing using 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 sharing using Zend Server Cluster 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.com http://phpconference.es

How to scale PHP applications

  • 1.
    © All rightsreserved. Zend Technologies, Inc. How to scale PHP applications by Jan Burkl, Enrico Zimuel Zend Technologies http://www.zend.com jan.burkl@zend.com, enrico@zend.com 30th October 2010 – PHP Barcelona Conference
  • 2.
    © All rightsreserved. 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
  • 3.
    © All rightsreserved. 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
  • 4.
    © All rightsreserved. Zend Technologies, Inc. Scalability of a web application
  • 5.
    © All rightsreserved. 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
  • 6.
    © All rightsreserved. 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
  • 7.
    © All rightsreserved. 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
  • 8.
    © All rightsreserved. Zend Technologies, Inc. Scale up vs. Scale out Scale up Scale out vs.
  • 9.
    © All rightsreserved. 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
  • 10.
    © All rightsreserved. Zend Technologies, Inc. A typical load balancer architecture Load Balancer Web Servers Internet Firewall
  • 11.
    © All rightsreserved. 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
  • 12.
    © All rightsreserved. 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
  • 13.
    © All rightsreserved. 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
  • 14.
    © All rightsreserved. Zend Technologies, Inc. PHP session management
  • 15.
    © All rightsreserved. 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
  • 16.
    © All rightsreserved. 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)
  • 17.
    © All rightsreserved. Zend Technologies, Inc. Example (PHP sessions using files) ● <?php session_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";
  • 18.
    © All rightsreserved. 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
  • 19.
    © All rightsreserved. 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
  • 20.
    © All rightsreserved. Zend Technologies, Inc. Session sharing using NFS
  • 21.
    © All rightsreserved. 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
  • 22.
    © All rightsreserved. Zend Technologies, Inc. Session sharing using Database
  • 23.
    © All rightsreserved. 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
  • 24.
    © All rightsreserved. 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
  • 25.
    © All rightsreserved. Zend Technologies, Inc. Session sharing using Memcached
  • 26.
    © All rightsreserved. 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)
  • 27.
    © All rightsreserved. Zend Technologies, Inc. Session sharing using Redis
  • 28.
    © All rightsreserved. 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/
  • 29.
    © All rightsreserved. 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
  • 30.
    © All rightsreserved. 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!
  • 31.
    © All rightsreserved. Zend Technologies, Inc. Session sharing using Zend Server Cluster Manager
  • 32.
    © All rightsreserved. 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.
  • 33.
    © All rightsreserved. 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
  • 34.
    © All rightsreserved. Zend Technologies, Inc. Zend Server Cluster Manager architecture Load Balancer MySQL Firewall
  • 35.
    © All rightsreserved. Zend Technologies, Inc. High availability: session cluster
  • 36.
    © All rightsreserved. Zend Technologies, Inc. High availability: session cluster (2)
  • 37.
    © All rightsreserved. 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
  • 38.
    © All rightsreserved. Zend Technologies, Inc. Questions?
  • 39.
    © All rightsreserved. Zend Technologies, Inc. Thank you for attending! More info: http://www.zend.com http://phpconference.es