Jetpants is an automation toolkit for handling monstrously large MySQL database topologies. It is geared towards common operational tasks like cloning slaves, rebalancing shards, and performing master promotions. It features a command suite for easy use by operations staff, though it's also a full Ruby library for use in developing custom migration scripts and database automation.
Jetpants supports a range-based sharding scheme for MySQL by providing a fast way to split shards that are approaching capacity or I/O limitations. Jetpants is able to accomplish this without any locking, downtime, data inconsistency, or query failures. Dynamically resizable range-based sharding allows you to scale MySQL horizontally in a sane manner, without any need for a central lookup service or massive pre-allocation of tiny shards.
Jetpants was created by Tumblr to help manage our database infrastructure. It handles automation tasks for our entire database topology, which as of June 2012 consists of approximately:
200 dedicated database servers
12 global (unsharded) functional pools
45 shard pools
21 terabytes total of unique relational data on masters
60 billion total unique relational rows on masters
One of the primary requirements for Jetpants was speed. On our hardware, Jetpants can divide a 750GB, billion-row shard in half in about six hours – or even faster if you're diving into thirds or fourths. It can also clone slaves at line speed on gigabit ethernet, including to multiple destinations at once, using a novel “chained copy” approach.
For more background on the initial motivations behind Jetpants, please see Evan Elias’s presentation at Velocity Europe 2011.
COMMAND SUITE FEATURES:
The Jetpants command suite offers easy command-line interaction with complex MySQL automation tasks.
Clone slaves efficiently, including to multiple targets simultaneously
Split a range-based shard into N new shards with zero downtime and no failed queries
Perform master promotions and other pool topology changes
Defragment tables quickly in parallelized chunks
Interact with your database topology in a REPL environment via jetpants console mode
For more information on the command suite, please see doc/commands.rdoc (view on GitHub).
Jetpants is also a Ruby module which you can use to build complex database migration scripts and other customized automation. It provides object modeling for databases, hosts, global/functional pools, sharded pools, and your database topology as a whole.
Utilize scriptable versions of all command suite functionality
Crawl replication topology programmatically
Import or export arbitrary portions of a data set
Copy large files quickly and efficiently, including to multiple simultaneous destinations
Manipulate server settings or concurrently execute arbitrary UNIX commands / administrative MySQL queries on multiple servers
ASSUMPTIONS AND REQUIREMENTS:
The base classes of Jetpants currently make a number of assumptions about your environment and database topology. Please see doc/requirements.rdoc (view on GitHub).
Jetpants supports a global configuration file at /etc/jetpants.yaml, as well as per-user configuration files at ~/.jetpants.yaml.
At least one of these files must exist for Jetpants to function properly, since certain options (database schema name, database credentials, etc) are mandatory and cannot be inferred.
Please see doc/configuration.rdoc (view on GitHub) for information on configuring Jetpants.
Jetpants offers an extensible plugin system. Plugins are Ruby code (such as stand-alone gems) that add to Jetpants by supplying callback methods, and/or overriding core methods.
It is highly recommended that you tie Jetpants into your site's asset tracker / hardware management system by writing a custom plugin. This will allow Jetpants to automatically know what database pools and shards are present, and to make topological changes immediately be reflected in your site's configuration. Several complex Jetpants features (including shard splits) actually require an asset tracker plugin in order to function, since these processes involve obtaining spare nodes and manipulating multiple pools in your database topology.
Other recommended uses of plugins include integration with your site's monitoring system, trending system, query killers, and environment-specific overrides to various core methods.
For more information on how to write plugins and use the Jetpants::CallbackHandler system, please see doc/plugins.rdoc (view on GitHub)
FREQUENTLY ASKED QUESTIONS:
Please see doc/faq.rdoc (view on GitHub) for answers to common questions.
If you have a question that isn't covered here, please feel free to email the authors at the addresses listed in jetpants.gemspec.
Evan Elias: Lead developer. Core class implementations, shard split logic, plugin system
Dallas Marlow: Master promotion logic, command suite and console structure, MySQL internals expertise
Copyright 2012 Tumblr, Inc.
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.