/tako

Database Sharding for ActiveRecord. Rails 5 ready.

Primary LanguageRubyMIT LicenseMIT

Tako

Build Status

Tako provides Database-Sharding features for ActiveRecord. Respecting Octopus

Motivation

The main goal of Tako is implementing sharding features with less ActiveRecord-dependent; catching up Rails version up. And also, Tako supports migration from Octopus because it is no longer maintained.

Installation

Add this line to your application's Gemfile:

gem 'tako'

And then execute:

$ bundle

Or install it yourself as:

$ gem install tako

Database migration (Rails)

$ bundle exec rake db:tako:create
$ bundle exec rake db:tako:migrate

Usage

How to use Tako?

First, you need to create a config file, shards.yml, inside your config/ directory. Also you can override config file path with environment variable.

Syntax

Tako adds a method to each AR Class and object: the shard method is used to select the shard like this:

  User.shard(:slave_one).where(:name => "Thiago").limit(3)
  # => Query will run in :slave_one

Tako also supports queries within a block. When you pass a block to the shard method, all queries inside the block will be sent to the specified shard.

User.create(name: "Bob")
# => Query will run in default connection in database.yml

Tako.shard(:slave_two) do
  User.create(name: "Mike")
  # => Query will run in :slave_two
end

# or

User.shard(:slave_two) do
  User.create(name: "Mike")
  # => Query will run in :slave_two
end

Associations

class User < ActiveRecord::Base
  has_many :logs
  has_one :life
end

user = User.shard(:shard01).create(name: "Jerry")

user.logs.create
# => Query will run in :shard01 (same as user)

user.logs << Log.shard(:shard02).new
# => Query will run in :shard02 (careful)

life = user.build_life
life.save!
# => Query will run in :shard01 (same as user)

Vertical Sharding

Add force_shard definition to your Vertical-Sharding model

class YourModel < ActiveRecord::Base
  force_shard :shard01
end

YourModel.create
# => Query will run in :shard01

Tako.shard(:shard02) do
  YourModel.create
  # => Query will run in :shard01
end

TODO

  • Make more independent of ActiveRecord implementation.
  • Use prepend instead of alias_method chain when other gem could handle that.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Run test

Run bundle exec rake to run rspec

Run bundle exec rake in spec/dummy5 will run rspec with rails 5.0.0.1

Run bundle exec rake in spec/dummy42 will run rspec with rails 4.2.7.1

Contributing

Contributors are welcome on GitHub at https://github.com/the40san/tako. Documentation contributors also welcome! This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.