Feb
28
2011
--

Is VoltDB really as scalable as they claim?

Before I begin, a disclaimer. VoltDB is not a customer, and did not pay Percona or me to investigate VoltDB’s scalability or publish this blog post. More disclaimers at the end. Short version: VoltDB is very scalable; it should scale to 120 partitions, 39 servers, and 1.6 million complex transactions per second at over 300 CPU cores, on the benchmarked configuration, with the recommended level of redundancy for HA.

First, if you’re new to VoltDB, I’ll summarize: it’s an open-source OLTP database that is designed to run on a cluster, not just a single machine, and doesn’t sacrifice consistency during a network partition. It is an in-memory shared-nothing system, and tables are partitioned across multiple servers in the cluster; high availability is ensured by keeping more copies of each partition. You query VoltDB with stored procedures, not with arbitrary SQL queries. It is designed to be very fast (hundreds of thousands of TPS) even on low-end machines, by doing away with the usual buffer pools, logs, latching, and so on.

The benchmark is VoltDB’s “voter” benchmark, which is explained briefly at this blog post. VoltDB’s Tim Callaghan ran the benchmark three times for each node count from 1 to 12, for k-factors of 0, 1, and 2. The k-factor is the number of redundant copies of each partition that the system maintains. An update to a partition in one server is synchronously replicated to all other copies in the cluster before the transaction completes.

Running all these benchmarks is a lot of work, which is why it is useful to run benchmarks for a dozen machines and model the behavior at larger cluster sizes. I used Neil J. Gunther’s Universal Scalability Law (USL) to model the cluster’s scalability. If you are not familiar with this model, probably the most succinct write-up is in a white paper I published some time ago. Let’s go right to the results and then I will discuss the details about the modeling.

First, let’s look at results for k-factors of 0 (no redundancy), 1 (recommended), and 2 (extra safety):

Results for k-factor 0

Results for k-factor 0

Results for k-factor 1

Results for k-factor 1

Results for k-factor 2

Results for k-factor 2

Those thumbnails are small and hard to read, but that’s OK because there is something interesting and important that’s easy to miss by looking at separate images anyway. The k-factor of 0 achieves the highest throughput, which I expected because of the lack of cross-node communication. What’s odd is that the k-factor of 0 reaches its peak throughput at 35 nodes, but k-factor 1 scales to 39 nodes and k-factor 2 doesn’t top out until 46 nodes. If we plot these on the same graph, it’s easier to see:

Actual and modeled results for k-factors 0, 1, and 2

Actual and modeled results for k-factors 0, 1, and 2

This result was unexpected for me. I expect that a cluster with more inter-node communication should peak at fewer nodes. I asked Tim if he could explain, and he responded that it can be explained by the fact that at higher k-factors, there are fewer distinct partitions of data in the cluster. In all configurations, each node had 6 partitions of data, so when we keep more copies of the data, we have fewer unique partitions. In other words, the “unit of scaling” that is on the x-axis really shouldn’t be the server count, but rather the number of partitions in the system. I re-ran my models and generated the following graph:

Actual and modeled results with partitions for k-factors 0, 1, and 2

Actual and modeled results with partitions for k-factors 0, 1, and 2

When approached from this angle, the results make sense. (Individual graphs by partition for k-factors: 0, 1, 2.) Now, for the recommended degree of safety, we can see that this cluster is predicted to scale to 120 partitions, at a throughput of more than 1.6 million transactions per second. This is on commodity 8-core boxes, and with 6 partitions per server and 2 copies of each partition, that should be a 40-node cluster.

In case you don’t know what to think of that, I’ll tell you: scaling a synchronously replicated, active-active master, fully ACID, always-consistent database to a 40-server cluster is impressive. Yes, it comes with some limitations (there’s a decent write-up on highscalability.com that explains more), but that is still nothing to sneeze at.

Here are some more disclaimers and details, and I’ll try to anticipate some questions:

  • Percona has no plans to provide services for VoltDB. We’re focused on MySQL software and services.
  • I am not a VoltDB expert. I have some understanding of VoltDB in general, and of distributed systems in general.
  • This post grew out of a series of conversations and email exchanges with Tim Callaghan over the course of many months. I asked Tim lots of questions, and he ran lots of benchmarks to satisfy my curiosity.
  • In the opening of this post, I say “should scale” because I don’t have access to the raw performance results from benchmarks at that scale — this is a mathematical model based on a smaller benchmark. Also note that these are not high-end servers, and VoltDB should provide even higher performance on faster machines.
  • I did not audit or repeat Tim’s benchmarks in the level of detail that I would do if this were a paid engagement. However, the data fits the model very well (r-squared of 99.8% or better in all cases), and Tim didn’t know in advance that I’d be modeling the data this way, so the benchmark numbers aren’t manipulated to fit the model. The fact that they fit so well gives me a lot of confidence in them.
  • I had to do a couple of things to model the benchmarks. First, I had to ignore results from one and two nodes. That’s because the inter-node communication doesn’t exist at all in a one-node cluster, and not the same way in a two-node cluster as it does at higher node counts, so the benchmark results for one and two nodes do not fit the scalability curve at all. However, the USL requires the one-node throughput as a multiplier, so I had to do a regression from higher node counts down to 1 in order to use the model. Finally, I had to adjust the computed 1-node performance slightly (ranging from 1/2 of a percent to 8 percent) to avoid unphysical parameters as a result of performing a regression against the full dataset. These are rather standard steps in applying the USL model.
  • Note that the per-node and per-partition models don’t quite agree. Per-node k-factor-1 says we should scale to 39 servers, while per-partition says 120 partitions which is 40 servers. Similarly, the peak throughput numbers differ slightly. That’s because there’s some rounding, and performing a regression and USL modeling against this kind of data isn’t an exact science anyway — there is some human judgment involved (see the previous bullet point).

Let me close by answering my own question: from what I know of VoltDB it does indeed match their claim, with good scalability to dozens of servers. For more information, or to download it and try yourself, you can visit the VoltDB website.

Feb
28
2011
--

Chris Shiflett discusses JavaScript and URLs

Chris Shiflett has recently written a post on his blog discussing JavaScript, URLS , a little bit of Flash and a whole lot of links to other people’s thoughts on the same. Click on in and let’s look at what he’s talking about.

Feb
28
2011
--

Percona Server Scales Vertically with Virident tachIOn Drives

We’ve published a new white paper that explains how to stop sharding and start scaling vertically with PCI-E flash drives, specifically the Virident tachIOn drive, which offers consistent, low-latency IO performance. I’ve been beating this drum for a while, so it’s a great feeling to have an explicitly recommended reference architecture: buy flash storage first, shard as a last resort. From the summary: The sharding approach that has been advocated for the last five years or so is becoming increasingly questionable advice in some environments. Today’s solid-state PCIe hardware offers extremely high-bandwidth, low-latency I/O performance, exemplified by the Virident tachIOn drive. “Scaling up” is once again a viable and economical strategy for MySQL, and “scaling out” need no longer be the default database architecture.

Feb
27
2011
--

A week of symfony #217 (21->27 February 2011)

The public API of Symfony2 will be frozen in just a few days. Therefore, this week developers committed some of the last big impact changes to the code repository: the Response was removed from DIC, CompatAssetsBundle was removed in favor of AsseticBundle, and the boostrap files were also removed.

Several other changes were proposed in the developers mailing list, such as using keys for translations and adding DI to Forms. Lastly, Symfony2 documentation was profoundly reorganized and vastly expanded with new and improved contents.

Development mailing list

Symfony2 development highlights

Changelog:

  • 9b16f1a:
    [SwiftMailer] added the SendEmail Command (for the spool)
  • f985da5:
    [HttpFoundation] fixed Cache-Control header when forcing the Response to have an Expires header field
  • f5b1cb1, e7c098e:
    [DependencyInjection] initial implementation of an allowUnnamedChildren method on NodeBuilder. Also added an extra field exception
    (reverted)
  • bd15ddd, 554628c, d6617f6:
    [DependencyInjection] added a NodeBuilder::addNodeBuilder() method that helps achieve a fluid interface when a pre-built NodeBuilder needs to be added
  • fd5cdfc:
    [DependencyInjection] assured to remove XML-remapped singular options and key attribute options after processing
  • ea768fe, 48459e9:
    [Config] made the option to remove a key attribute optional
  • f0d2ce7:
    [TwigBundle] refactored TwigExtension class and implemented configuration tree
  • 026ab6c:
    [Config] added an ignoreExtraKeys options, which allows you to let options simply be ignore without throwing a validation exception
  • c9406b6:
    [SecurityBundle] allowed the main Configuration tree to allow factories without a validation exception
  • dff3585:
    fixed profiler when using ESI in dev env
  • d2684f3:
    [AsseticBundle] converted to use a Configuration class
  • c01be42:
    [AsseticBundle] made the filter manager lazy
  • 4ba0e0d:
    [AsseticBundle] fixed bundle notation of inputs
  • 9b15b69:
    [AsseticBundle] sort Twig assets by name before loading for filesystem-independent results
  • f1dd3f2, 946d3d9:
    [TwigBundle] added two global variables (environment & debug)
  • 2c45611:
    fixed WDT link to the profiler
  • 0834bf4:
    [WebProfilerBundle] removed the WDT on malformed HTML content
  • f6e624b:
    [TwigBundle] changed all Boolean to string in XSD as you might want to use a parameter %…%
  • a3207e9:
    removed CompatAssetsBundle, use AsseticBundle instead
  • b44d044:
    [HttpKernel] removed the bootstrap files as they do not belong to the component
  • 9a25878:
    [FrameworkBundle] removed the Welcome page and moved it to the sandbox/standard distrib
  • eda7475:
    [ZendBundle] only load the logger if there is a config
  • 28bf834:
    [WebProfilerBundle] made the WDT less intruisive by moving it to its own Ajax request
  • 608e443:
    [Config] created VariableNode
    (reverted)
  • f4c0af7:
    [TwigBundle] allowed arbitrary variables to be accepted as values for globals
  • 23e9386:
    changed all extensions to use the default Extension::getAlias() impl
  • c518074:
    added a DI extension for DoctrineMigrations, removed –bundle option in favor of application level settings
  • 8a8c733:
    [HttpKernel] added the possibility to define a parent token for a token in the profiler
  • 9619c7d:
    [Routing] removed the routing hack where we add a / at the beginning if it does not exist
  • e729589:
    splitted swiftmailer configuration to avoid issues when not using smtp
  • d4fc3c9, 7c9528b, b9168bb:
    [FrameworkBundle] updated the init:bundle skeleton files
  • f21578e:
    [Security] added abstract user provider definition
  • bf20238:
    fixed a bug in Response content-type auto-detection
  • d94acd8:
    removed response as a service (the Response is not available in the DIC anymore)
  • 353177d:
    replaced Response::createRedirect by a new RedirectResponse class
  • fc372bc:
    [HttpKernel] changed core.view event to use notifyUntil() instead of filter()
  • a0bae94:
    [HttpFoundation] updated ResponseHeaderBag to compute Cache-Control whenever any of the headers it considers changes
  • cef86a3:
    [HttpKernel] added a way to change the ESI cache strategy
  • efb5617:
    [AsseticBundle] removed response service dependency in AsseticController
  • d7ea92a:
    [AsseticBundle] updated for latest assetic development
  • 0f353c1:
    added a command to generate a migration from the sql queries executed when you load some data fixtures
    (reverted)
  • 788f63d:
    [FrameworkBundle] simplified the over-complicated template cache warmer
  • 9f2d59c:
    [AsseticBundle] added stylus filter
  • 192583a:
    [ZendBundle] added a Configuration class
  • 05055d4:
    [AsseticBundle] fixed formula caching system
  • d4db531:
    [AsseticBundle] added resources to the routing loader
  • 968c870:
    [AsseticBundle] added etags to controller so changes to filters etc trigger invalidation
  • f46c6f7:
    [Routing] fixed the %2f problem in URLs
  • e16c666:
    [Routing] made an empty path info to redirect to / (as for any other route that ends with a /)
  • b6049be, 381d1e2:
    [Translation] added search to FallbackLocale Catalogue
  • 4b3c495:
    fixed issues found by static code analysis

New plugins

  • sfNginxPush: allows for easy pushing to configured nginx HTTP Push Module endpoints.
  • sfEmailTemplates: (no description)
  • sfMarae: a threaded forum plugin.
  • ynWidgetAjaxAutocomplete: includes a widget to replace sfWidgetForm*Choice with an AJAX-powered autocomplete field. Works for one-to-many and many-to-many relations.
  • sfComet: this will be a simple plugin with a JS class, and some examples.
  • sfIsisImporter: has classes to help importing a CDS/ISIS Database into a Symfony project.
  • ynFormGeo: offers widgets and validators for working with geographic data.

Updated plugins

  • sfProjectAnalyser:

    • modified the error message when a class is not found
    • removed processLib until it work
  • sfTrafficCMS:

    • added faster, less memory hungry export function which uses array hydration
  • sfDoctrineRestGenerator:

    • fixed a deserialization error when passing an empty XML tag
  • pmPropelGenerator:

    • Delete, Edit and Show actions can now be hiden with the ‘show_when’ option
    • tweaked flash messages
    • checked if the object can be deleted in BatchDelete action
  • sfAlyssaJqGrid:

    • added an option to change the default width of jqgrid
  • assetPackages:

    • the load_panels event is listened only when web_debug is turned on
    • fixed bug on simple stylesheet list in assets-packages.yml
  • dcReloadedFormExtra:

    • refactored mtWidgetFormPlain so that it can be easily extended
    • added a new widget (ncWidgetFormPlainDate) that extends mtWidgetFormPlain and can be used to display dates as plain fields
  • apostrophe:

    • syntax clean up (single quote, double quotes)
    • added app_a_js_debug check in globalJavascripts
    • added a default value of False to the JS Debug because that makes sense
    • changed search success body class that was the same as the interior page search results container class
    • fixed fixtures loading if the Zend Search if not available
    • added maxHeight option to slideshows (used in conjunction with flexHeight to limit the height of a slideshow)
    • added an option to aWidgetFormStaticText to not escape the values passed to it
    • created an aCmsRoute and introduce a hybrid mode (apostrophe url can be used with symfony action)
    • added hybrid page management in the aPage* code
    • easier to see paths when things can’t be created in a_writable
    • tolerate deleted slots
  • apostropheBlog:

    • made the edit buttons in the blog use a_button helper
  • sfImageTransform:

    • fixed bug when using an image as a background using GD

New symfony powered websites

  • Embetted: (English) free widgets for betting sites

They talked about us


Be trained by Symfony experts
2011-03-30 Paris
2011-04-11 Paris
2011-04-13 Paris

Written by in: Zend Developer |
Feb
27
2011
--

A week of symfony #217 (21->27 February 2011)

The public API of Symfony2 will be frozen in just a few days. Therefore, this week developers committed some of the last big impact changes to the code repository: the Response was removed from DIC, CompatAssetsBundle was removed in favor of AsseticBundle, and the boostrap files were also removed.

Several other changes were proposed in the developers mailing list, such as using keys for translations and adding DI to Forms. Lastly, Symfony2 documentation was profoundly reorganized and vastly expanded with new and improved contents.

Development mailing list

Symfony2 development highlights

Changelog:

  • 9b16f1a:
    [SwiftMailer] added the SendEmail Command (for the spool)
  • f985da5:
    [HttpFoundation] fixed Cache-Control header when forcing the Response to have an Expires header field
  • f5b1cb1, e7c098e:
    [DependencyInjection] initial implementation of an allowUnnamedChildren method on NodeBuilder. Also added an extra field exception
    (reverted)
  • bd15ddd, 554628c, d6617f6:
    [DependencyInjection] added a NodeBuilder::addNodeBuilder() method that helps achieve a fluid interface when a pre-built NodeBuilder needs to be added
  • fd5cdfc:
    [DependencyInjection] assured to remove XML-remapped singular options and key attribute options after processing
  • ea768fe, 48459e9:
    [Config] made the option to remove a key attribute optional
  • f0d2ce7:
    [TwigBundle] refactored TwigExtension class and implemented configuration tree
  • 026ab6c:
    [Config] added an ignoreExtraKeys options, which allows you to let options simply be ignore without throwing a validation exception
  • c9406b6:
    [SecurityBundle] allowed the main Configuration tree to allow factories without a validation exception
  • dff3585:
    fixed profiler when using ESI in dev env
  • d2684f3:
    [AsseticBundle] converted to use a Configuration class
  • c01be42:
    [AsseticBundle] made the filter manager lazy
  • 4ba0e0d:
    [AsseticBundle] fixed bundle notation of inputs
  • 9b15b69:
    [AsseticBundle] sort Twig assets by name before loading for filesystem-independent results
  • f1dd3f2, 946d3d9:
    [TwigBundle] added two global variables (environment & debug)
  • 2c45611:
    fixed WDT link to the profiler
  • 0834bf4:
    [WebProfilerBundle] removed the WDT on malformed HTML content
  • f6e624b:
    [TwigBundle] changed all Boolean to string in XSD as you might want to use a parameter %…%
  • a3207e9:
    removed CompatAssetsBundle, use AsseticBundle instead
  • b44d044:
    [HttpKernel] removed the bootstrap files as they do not belong to the component
  • 9a25878:
    [FrameworkBundle] removed the Welcome page and moved it to the sandbox/standard distrib
  • eda7475:
    [ZendBundle] only load the logger if there is a config
  • 28bf834:
    [WebProfilerBundle] made the WDT less intruisive by moving it to its own Ajax request
  • 608e443:
    [Config] created VariableNode
    (reverted)
  • f4c0af7:
    [TwigBundle] allowed arbitrary variables to be accepted as values for globals
  • 23e9386:
    changed all extensions to use the default Extension::getAlias() impl
  • c518074:
    added a DI extension for DoctrineMigrations, removed –bundle option in favor of application level settings
  • 8a8c733:
    [HttpKernel] added the possibility to define a parent token for a token in the profiler
  • 9619c7d:
    [Routing] removed the routing hack where we add a / at the beginning if it does not exist
  • e729589:
    splitted swiftmailer configuration to avoid issues when not using smtp
  • d4fc3c9, 7c9528b, b9168bb:
    [FrameworkBundle] updated the init:bundle skeleton files
  • f21578e:
    [Security] added abstract user provider definition
  • bf20238:
    fixed a bug in Response content-type auto-detection
  • d94acd8:
    removed response as a service (the Response is not available in the DIC anymore)
  • 353177d:
    replaced Response::createRedirect by a new RedirectResponse class
  • fc372bc:
    [HttpKernel] changed core.view event to use notifyUntil() instead of filter()
  • a0bae94:
    [HttpFoundation] updated ResponseHeaderBag to compute Cache-Control whenever any of the headers it considers changes
  • cef86a3:
    [HttpKernel] added a way to change the ESI cache strategy
  • efb5617:
    [AsseticBundle] removed response service dependency in AsseticController
  • d7ea92a:
    [AsseticBundle] updated for latest assetic development
  • 0f353c1:
    added a command to generate a migration from the sql queries executed when you load some data fixtures
    (reverted)
  • 788f63d:
    [FrameworkBundle] simplified the over-complicated template cache warmer
  • 9f2d59c:
    [AsseticBundle] added stylus filter
  • 192583a:
    [ZendBundle] added a Configuration class
  • 05055d4:
    [AsseticBundle] fixed formula caching system
  • d4db531:
    [AsseticBundle] added resources to the routing loader
  • 968c870:
    [AsseticBundle] added etags to controller so changes to filters etc trigger invalidation
  • f46c6f7:
    [Routing] fixed the %2f problem in URLs
  • e16c666:
    [Routing] made an empty path info to redirect to / (as for any other route that ends with a /)
  • b6049be, 381d1e2:
    [Translation] added search to FallbackLocale Catalogue
  • 4b3c495:
    fixed issues found by static code analysis

New plugins

  • sfNginxPush: allows for easy pushing to configured nginx HTTP Push Module endpoints.
  • sfEmailTemplates: (no description)
  • sfMarae: a threaded forum plugin.
  • ynWidgetAjaxAutocomplete: includes a widget to replace sfWidgetForm*Choice with an AJAX-powered autocomplete field. Works for one-to-many and many-to-many relations.
  • sfComet: this will be a simple plugin with a JS class, and some examples.
  • sfIsisImporter: has classes to help importing a CDS/ISIS Database into a Symfony project.
  • ynFormGeo: offers widgets and validators for working with geographic data.

Updated plugins

  • sfProjectAnalyser:

    • modified the error message when a class is not found
    • removed processLib until it work
  • sfTrafficCMS:

    • added faster, less memory hungry export function which uses array hydration
  • sfDoctrineRestGenerator:

    • fixed a deserialization error when passing an empty XML tag
  • pmPropelGenerator:

    • Delete, Edit and Show actions can now be hiden with the ‘show_when’ option
    • tweaked flash messages
    • checked if the object can be deleted in BatchDelete action
  • sfAlyssaJqGrid:

    • added an option to change the default width of jqgrid
  • assetPackages:

    • the load_panels event is listened only when web_debug is turned on
    • fixed bug on simple stylesheet list in assets-packages.yml
  • dcReloadedFormExtra:

    • refactored mtWidgetFormPlain so that it can be easily extended
    • added a new widget (ncWidgetFormPlainDate) that extends mtWidgetFormPlain and can be used to display dates as plain fields
  • apostrophe:

    • syntax clean up (single quote, double quotes)
    • added app_a_js_debug check in globalJavascripts
    • added a default value of False to the JS Debug because that makes sense
    • changed search success body class that was the same as the interior page search results container class
    • fixed fixtures loading if the Zend Search if not available
    • added maxHeight option to slideshows (used in conjunction with flexHeight to limit the height of a slideshow)
    • added an option to aWidgetFormStaticText to not escape the values passed to it
    • created an aCmsRoute and introduce a hybrid mode (apostrophe url can be used with symfony action)
    • added hybrid page management in the aPage* code
    • easier to see paths when things can’t be created in a_writable
    • tolerate deleted slots
  • apostropheBlog:

    • made the edit buttons in the blog use a_button helper
  • sfImageTransform:

    • fixed bug when using an image as a background using GD

New symfony powered websites

  • Embetted: (English) free widgets for betting sites

They talked about us


Be trained by symfony experts
Mar 16 Paris – Mar 21 Paris – Mar 24 Paris – Mar 30 Paris

Written by in: Zend Developer |
Feb
27
2011
--

Percona welcomes Alexey Kopytov

Percona is pleased to extend a belated welcome to Alexey Kopytov. He actually joined us back in November, 2010, but we somehow overlooked blogging then about his switch from Oracle to Percona. Alexey has over six years of work deep in MySQL source code as part of MySQL AB, then Sun, and later Oracle. His first MySQL job was as part of the original High Performance group within the MySQL Support Team, working under Peter and Vadim. Alexey was the original implementer and maintainer of Sysbench, the tool we use everyday for our performance benchmarks. Now Alexey will focus on Percona Server and Percona XtraBackup, you may have seen his name in our recent Release Notes.

Alexey, a big welcome!

Feb
27
2011
--

Percona Server and XtraBackup weekly news, February 26th

Percona Server has a new logo:

Percona Server Logo

Percona Server Logo

Other news for Percona Server:

  • Many users noticed that our repositories don’t work for Debian Squeeze, the new version of Debian. Our repositories will support Squeeze on the next release, which will be based on MySQL 5.1.55.
  • We merged a fix for InnoDB’s slow DROP TABLE performance. A new option, innodb_lazy_drop_table, controls this behavior.
  • Vadim asked Yasufumi to look into porting the innodb_sync_checkpoint_limit feature from the Facebook patches into Percona Server.
  • Peter requested a high priority for logging queries to the slow query log from a replica using row-based replication.
  • Yasufumi reported a feature request for XtraDB to store statistics for the ::records_in_range() handler function, instead of accessing the data. This could improve performance for complex queries.
  • A user on our mailing list requested us to merge Google’s KILL IF_IDLE functionality into Percona Server, and proposed the merge on Launchpad.

In XtraBackup news,

  • Alexey completed moving streaming functionality from innobackupex. InnoDB files are now streamed by the xtrabackup binary, and tar4ibd has been removed (this has not been merged into the trunk yet).
  • Alexey completed implementing compression with quicklz in xtrabackup, though a tricky problem remains in combination with streaming.
Feb
26
2011
0

Pathfinder – 2011-02-26

The Group

Fighter – sword & board teamwork fighter
Ranger
Witch
Paladin/Sorcerer
Cleric
Rogue
Fighter/Cleric

== The Beginning ==

We started the in the small town near the dam.  The townspeople were
repairing the damage done earlier.  We debated what we should do next
now that the situation was stabilized and the original mission was
completed.  We decided to go check out the sunken barge.

(more…)

Written by in: D&D,Pathfinder | Tags:
Feb
24
2011
--

Friends of Percona Get 20% Off at the MySQL Conference!

O'Reilly MySQL ConferenceWe have a special Friends of Percona discount code that you can use to get 20% off of registration at the MySQL conference in April: mys11pkb. If you click the image to the left, or this special link, it will pre-fill the code for you when you check out. Read on to see the list of sessions we’re presenting at the conference.

I really hope you are able to make it to this event. The value of attending conferences, for your company and your career, is hard to overstate. For me personally, attending the MySQL conference was a big part of what has shaped my career so far. I hope to see you there — you can flag me (and any of us) down in the hallways, eat lunch with us, come see us at our expo hall booth, and above all come listen and participate in our presentations! We’re giving 3 great tutorials on Monday this year; these always sell out early, so don’t delay to register!

Here are the sessions we’re currently scheduled to present — if I miss any, say something in the comments:

Feb
24
2011
--

Christian Schaefer: Using Zend Framework components in a Symfony2 project

On one of the more…um…interestingly titled blogs, Christian Schaefer has posted about how he integrates Zend Framework components into his symfony2 projects. Click on in, I’ll give you a link to the totally safe for work but humorously titled blog where you can read the post for yourself.

Powered by WordPress | Theme: Aeros 2.0 by TheBuckmaker.com