Upload
kris-wallsmith
View
14.495
Download
1
Tags:
Embed Size (px)
DESCRIPTION
One user's experience as Lead Developer on Nebul.us upgrading a symfony application for deployment to Amazon's cloud-based infrastructure. We will discuss the obstacles met along the way, including juggling master and slave database connections and writing uploaded files to S3. Additionally, integration with the symfony configuration and environments system will be demonstrated, allowing one application to be developed locally and seamlessly deployed to the cloud.
Citation preview
Symfony in the CloudKris Wallsmith
February 17, 2010
Wednesday, February 17, 2010
Kris Wallsmith
• Freelance web developer, consultant, training, audits...
• 10 years using PHP
• 3 years using symfony
• Author of (too) many plugins
• 1 year on symfony core team
• JavaScript (moo)
• @kriswallsmith
• CTO of Nebul.us
Wednesday, February 17, 2010
Wednesday, February 17, 2010
What is Nebul.us ?
• Nebul.us is a vibrant and visual life aggregator. In real time you can seewhat your friends and the public are sharing and discovering online!
• Passively share what you’re doing online
• Show don’t tell
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
• Symfony Framework
• Doctrine ORM
• Zend Framework
• Swift mailer
• and more…
What is Nebul.us really?
Wednesday, February 17, 2010
• Web site
• XML services (Flash and Atom)
• JSON services (browser plugins)
• Up to 12 requests per minute when browsing
What is Nebul.us really?
Wednesday, February 17, 2010
Prototype
Wednesday, February 17, 2010
HTTP
PHP
MySQ
L
Uploads
ServerGrove VPSSessions
Local Filesystem
Prototype
Wednesday, February 17, 2010
What is “The Cloud”?
Wednesday, February 17, 2010
I don’t know.
Wednesday, February 17, 2010
What is “The Cloud”?
• Adds a (big) black box to your stack
• Several virtualized resources
• Scale based on the level of traffic
• Pay only for what you use
• Elastic!
Wednesday, February 17, 2010
It’s cloudy out there
• Amazon
• Rackspace
• Microsoft
• Rightscale
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Production
Wednesday, February 17, 2010
Production
HTTP
PHP
MySQ
L
Uploads
ServerGrove VPSSessions
Local Filesystem
Wednesday, February 17, 2010
Production
HTTP
PHP
MySQ
L
Uploads
ServerGrove VPSSessions
Local Filesystem
Wednesday, February 17, 2010
No really, it’s that easy.
Wednesday, February 17, 2010
Writing a scalablesymfony application
Kris Wallsmith
February 17, 2010
Wednesday, February 17, 2010
Upgrade Points
• Database connections
• File uploads
• Session storage
• Local development
• Deploying
Wednesday, February 17, 2010
Database Connections
Wednesday, February 17, 2010
Database Connections
• Typical database configuration
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Database Connections
• One writable “master” connection
• One or more read-only “slave” connections
Wednesday, February 17, 2010
Managing Connections
• Organize read and write connections using a naming convention
• Choose a random read connection
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Extend the Doctrine ORM
• Use the appropriate connection
• Doctrine_Query
• Doctrine_Record
• Doctrine_Collection
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Configure Doctrine
• Set custom query and collection class attributes in manager
• Set custom record class in builder options
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Using the Doctrine DBAL
• Doctrine_Manager::connection()
• $table->getConnection()
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Using the Doctrine DBAL
• Doctrine_Manager::getInstance() ->getConnection('master')
• $context->getDatabaseManager() ->getDatabase('master') ->getDoctrineConnection()
• $configuration ->getWriteConnection()
Wednesday, February 17, 2010
How do we test this?
Wednesday, February 17, 2010
Connection Listener
• Listen to every connection
• Compare type of query to type of connection
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Connection Listener
• Add connection listener to debugmode and test suite
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Multiple Connections
• Configure multiple connections to the same database
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Do you want it?Introducing sfDoctrineMasterSlavePlugin
Wednesday, February 17, 2010
File Uploads
Wednesday, February 17, 2010
File Uploads
• Typical upload form
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
View Layer
• Render the uploaded image
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Amazon S3 Integration
• Must handle file uploads
• Must integrate with the view layer
• Must be disable-able
Wednesday, February 17, 2010
Stream Wrapper
• Zend Amazon S3 stream wrapper
• s3://mybucket/image.jpg
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Read / write paths
• Configure read and write upload paths
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Configure Amazon S3
• Toggle integration on/off
• Environment buckets
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Configure File Uploads
• Upload to the write directory
• Custom validated file class
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Amazon S3 ACL
• ACL defaults to private
• Extend and change to public-read
Wednesday, February 17, 2010
Pssst,
Matthew
...
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
View Layer
• Nothing magic
• Custom helper function that uses the configured upload read path
• Search and replace…
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Session Storage
Wednesday, February 17, 2010
Session Storage
• Default factories configuration
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Session Storage
• Store session data in the database
Wednesday, February 17, 2010
Database Session Storage
• Migrate the database
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Local Development
Wednesday, February 17, 2010
Local Development
• One database
• Save uploads to the local filesystem
• Present correct upload path in view layer
Wednesday, February 17, 2010
Deploying
Wednesday, February 17, 2010
Deploying
• Subversion
• svn update
• svn checkout + symlink
Wednesday, February 17, 2010
Deploy with svn update
1. Disable
2. Update the working copy
3. Rebuild model files
4. Migrate the database
5. Enable
Wednesday, February 17, 2010
Deploy with svn checkout
1. Checkout a fresh working copy
2. Setup files not in the repository
3. Build model files
4. Disable current working copy
5. Migrate the database
6. Update symlink
Wednesday, February 17, 2010
Deploy with svn update
1. Disable
2. Update the working copy
3. Build model files
4. Migrate the database
5. Enable
Wednesday, February 17, 2010
Deploy with svn checkout
1. Checkout a fresh working copy
2. Setup files not in the repository
3. Build model files
4. Disable current working copy
5. Migrate the database
6. Symlink the new working copy
Wednesday, February 17, 2010
Deployment Strategies
• svn update
• fewer steps
• svn checkout + symlink
• less downtime
Wednesday, February 17, 2010
Automated Deployment
• Rightscale API
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Wednesday, February 17, 2010
Questions?
Wednesday, February 17, 2010