• Save
Os Bunce
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Os Bunce

on

  • 3,805 views

 

Statistics

Views

Total Views
3,805
Views on SlideShare
3,804
Embed Views
1

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 1

http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Os Bunce Presentation Transcript

  • 1. Gofer A scalable stateless proxy for DBI 1
  • 2. Gofer, logically • Gofer is - A scalable stateless proxy architecture for DBI - Transport independent - Highly configuable on client and server side - Efficient, in CPU time and minimal round-trips - Well tested - Scalable - Cachable - Simple and reliable 2
  • 3. Gofer, structurally • Gofer is - A simple stateless request/response protocol - A DBI proxy driver: DBD::Gofer - A request executor module - A set of pluggable transport modules - An extensible client configuration mechanism • Development sponsored by Shopzilla.com 3
  • 4. Gofer Protocol • DBI::Gofer::Request & DBI::Gofer::Response • Simple blessed hashes - Request contains all required information to connect and execute the requested methods. - Response contains results from methods calls, including result sets (rows of data). • Serialized and transported by transport modules like DBI::Gofer::Transport::http 4
  • 5. Using DBD::Gofer • Via DSN - By adding a prefix $dsn = “dbi:Driver:dbname”; $dsn = “dbi:Gofer:transport=foo;dsn=$dsn”; • Via DBI_AUTOPROXY environment variable - Automatically applies to all DBI connect calls $ export DBI_AUTOPROXY=“dbi:Gofer:transport=foo”; - No code changes required! 5
  • 6. Gofer Transports • DBI::Gofer::Transport::null - The ‘null’ transport. - Serializes request object, transports it nowhere, then deserializes and passes it to DBI::Gofer::Execute to execute - Serializes response object, transports it nowhere, then deserializes and returns it to caller - Very useful for testing. DBI_AUTOPROXY=“dbi:Gofer:transport=null” 6
  • 7. Gofer Transports • DBD::Gofer::Transport::stream (ssh) - Can ssh to remote system to self-start server ssh -xq user@host.domain perl -MDBI::Gofer::Transport::stream -e run_stdio_hex - Automatically reconnects if required - ssh gives you security and optional compression DBI_AUTOPROXY=’dbi:Gofer:transport=stream ;url=ssh:user@host.domain’ 7
  • 8. Gofer Transports • DBD::Gofer::Transport::http - Sends requests as http POST requests - Server typically Apache mod_perl running DBI::Gofer::Transport::http - Very flexible server-side configuration options - Can use https for security - Can use web techniques for scaling and high- availability. Will support web caching. DBI_AUTOPROXY=’dbi:Gofer:transport=http ;url=http://example.com/gofer’ 8
  • 9. Gofer Transports • DBD::Gofer::Transport::gearman - Distributes requests to a pool of workers - Gearman a lightweight distributed job queue http://www.danga.com/gearman - Gearman is implemented by the same people who wrote memcached, perlbal, mogileFS, & DJabberd DBI_AUTOPROXY=’dbi:Gofer:transport=gearman ;url=http://example.com/gofer’ 9
  • 10. Pooling via gearman vs http • I haven’t compared them in use myself yet + Gearman may have lower latency + Gearman spreads load over multiple machines without need for load-balancer + Gearman coalescing may be beneficial + Gearman async client may work well with POE - Gearman clients need to be told about servers • More gearman info http://danga.com/words/ 2007_04_linuxfest_nw/linuxfest.pdf (p61+) 10
  • 11. DBD::Gofer • A proxy driver • Accumulates details of DBI method calls • Delays forwarding request for as long as possible • Aims to be as ‘transparent’ as possible • Policy mechanism allows fine-grained tuning to trade transparency for speed • execute_array() is a single round-trip 11
  • 12. DBD::Gofer::Policy::* • Three policies supplied: pedantic, classic, and rush. Classic is the default. • Policies are implemented as classes • Currently 22 individual items within a policy • Policy items can be dynamic methods • Policy is selected via DSN: DBI_AUTOPROXY=“dbi:Gofer:transport=null ;policy=pedantic” 12
  • 13. Round-trips per Policy pedantic classic rush ! $dbh = DBI->connect_cached connect() ! $dbh->ping ! if not if not $dbh->quote default default ! $sth = $dbh->prepare ! ! ! $sth->execute $sth->{NUM_OF_FIELDS} $sth->fetchrow_array ! ! cached $dbh->tables after first 13
  • 14. Gofer Caveats • State-less-ness has implications - No transactions. AutoCommit only. - Can’t alter $dbh attributes after connect - Can’t use temp tables, locks, and other per-connection persistent state, except via stored procedures - Code using last_insert_id needs a (simple) change - See the docs for a few other very obscure caveats 14
  • 15. An Example Using Gofer for Connection Pooling 15
  • 16. The Problem 40 worker processes per ser ver Apache +vers Worker Worker Worker Worker Worker 150 ser Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Database Worker Worker Server Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker = Worker Worker Worker Worker Worker Worker Worker Worker Worker 1 overloaded database Worker Workers - 16
  • 17. A Solution A ‘database proxy’ that Apache does connection pooling Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Database Worker Worker Server Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Holds a few Worker Worker Worker Worker Worker connections open Worker Worker Worker Worker Worker Worker Worker Worker Workers Repeat for all ser vers Uses them to ser vice DBI requests - 17
  • 18. An Implementation Standard apache+mod_perl Apache Worker Worker Worker Worker Worker Worker DBI + DBD::* Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Apache Worker Database Worker Worker Server Worker Worker Worker !quot;#$%#& Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker Worker DBI::Gofer::Execute and Worker Worker Worker Worker DBI::Gofer::Transport::http Worker Worker Workers modules implement stateless proxy - DBD::Gofer with http transport 18
  • 19. Load Balance and Cache High performance load balancing server Apache running DBI Gofer and fail-over with 40 workers Far fewer db HTTP Load Balancer and Cache connections Workers x Many = 6000 db Gofer Database 150 web connections Server Servers servers servers Apache running DBI Gofer Workers Caching results would reduce db load even further (not yet implemented) - New middle tier 19
  • 20. Error Handling • DBD::Gofer can automatically retry on failure DBI_AUTOPROXY=“dbi:Gofer:transport=null ;retry_limit=3” • Default behaviour is to retry if is true $request->is_idemponent - looks at SQL returns true for most SELECTs • Default is retry_limit=0, so disabled • You can define your own behaviour: DBI->connect(..., { go_retry_hook => sub { ... }, }); 20
  • 21. DBD::Proxy vs DBD::Gofer DBD::Proxy DBD::Gofer ! Supports transactions !(not yet) ! Supports very large results !(memory) ! Automatic retry on error ! ! Large test suite ! ! Minimal round-trips ! ! Modular & Pluggable classes ! ! Tunable via Policies ! ! Scalable ! ! Connection pooling ! Can support client and web caches !(not yet) ! 21
  • 22. Gofer’s Future • Caching for http transport • Optional JSON serialization • Caching in DBD::Gofer • Make state-less-ness optional • Patches welcome! 22
  • 23. Future: http caching • Potential big win • DBD::Gofer needs to indicate cache-ability - via appropriate http headers •Server side needs to agree - and respond with appropriate http headers •Caching then happens just like for web pages - if there’s a web cache between client and server • Patches welcome! 23
  • 24. Future: JSON • Turns DBI into a web service! - Service Oriented Architecture anyone? •Accessible to anything - that can talk JSON •Clients could be JavaScript, Java, ... - and various languages that begin with P or • Patches welcome! 24
  • 25. Future: Client Caching • DBD::Gofer could access a cache - Use serialized request as key to cache - If entry found then return that response •Plug-able caching - Would include memcached to give a distributed shared cache • Patches welcome! 25
  • 26. Future: Transactions • State-less-ness could be made optional - If transport layer being used agrees - For http that means KeepAlive - Easiest to implement for stream / ssh •Would be enabled by AutoCommit => 0 $dbh->begin_work • Patches welcome! 26
  • 27. Questions? 27