• Stars
    star
    248
  • Rank 163,560 (Top 4 %)
  • Language
    Ruby
  • License
    MIT License
  • Created over 16 years ago
  • Updated almost 16 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

ActiveRecord connection proxy for master/slave connections

masochism

Scream

photo by ArtWerk

The masochism plugin provides an easy solution for Ruby on Rails applications to work in a replicated database environment. It works by replacing the connection object accessed by ActiveRecord models by ConnectionProxy that chooses between master and slave when executing queries. Generally all writes go to master.

Quick setup

First, setup your database.yml:

# default configuration (slave)
production: &defaults
  adapter: mysql
  database: app_production
  username: webapp
  password: ********
  host: localhost

# setup for masochism (master)
master_database:
  <<: *defaults
  host: master.example.com

To enable masochism, this is required:

# enable masochism
ActiveReload::ConnectionProxy.setup!

Example usage:

# in environment.rb
config.after_initialize do
  if Rails.env.production?
    ActiveReload::ConnectionProxy::setup!
  end
end

Considerations

Thinking Sphinx

Thinking Sphinx inspects the connection object to determine the database adapter. Because masochism works by putting the connection proxy in its place, TS will be confused about ActiveReload::ConnectionProxy and abort. A possible workaround is to monkeypatch TS right to hardcode our adapter after masochism has been enabled:

# ConnectionProxy from masochism confuses TS
ThinkingSphinx::Index.class_eval do
  def adapter() :mysql end
end

ThinkingSphinx::AbstractAdapter.class_eval do
  def self.detect(model)
    ThinkingSphinx::MysqlAdapter
  end
end

Litespeed web server or Phusion Passenger (mod_rails)

If you are using the Litespeed web server or Passenger (mod_rails), child processes are initialized on creation, which means any setup done in an environment file will be effectively ignored. A brief discussion of the problem is posted here.

One solution for Litespeed/Passenger users is to check the connection at your first request and do the setup! call if your connection hasn't been initialized, like:

# in ApplicationController
prepend_before_filter do |controller|
  unless ActiveRecord::Base.connection.is_a? ActiveReload::ConnectionProxy
    ActiveReload::ConnectionProxy.setup!
  end
end

Advanced

The ActiveReload::MasterDatabase model uses a 'master_database' setting that can either be defined for all of your environments, or for each environment as a nested declaration.

The ActiveReload::SlaveDatabase model uses a 'slave_database' setting that can only be defined per environment.

Example:

login: &login
  adapter: postgresql
  host: localhost
  port: 5432

production:
  database: production_slave_database_name
  <<: *login

master_database:
  database: production_master_database_name
  <<: *login

staging:
  database: staging_database_name
  host: slave-db-pool.local
  <<: *login
  master_database: 
    database: staging_database_name
    host: master-db-server.local
    <<: *login

qa:
  database: qa_master_database_name
  host: qa-master
  <<: *login
  slave_database:
    database: qa_slave_database_name
    host: qa-slave
    <<: *login

development: # Does not use masochism
  database: development_database_name
  <<: *login

If you want a model to always use the Master database, you can inherit ActiveReload::MasterDatabase. Any models with their own database connection will not be affected.

More control at setup

By default, masochism setup! is a shorthand for this:

ActiveReload::ConnectionProxy.setup_for ActiveReload::MasterDatabase, ActiveRecord::Base

The first argument is the model that has the master database connection established; the second argument is the model whose connection gets hijacked by ConnectionProxy. But we don't have to touch ActiveRecord::Base at all:

# set up MyMaster's connection as the master database connection for User:
ActiveReload::ConnectionProxy.setup_for MyMaster, User

The controller filter

If you have any actions you know require the master database for both reads and writes, simply do the following:

# in a controller:
around_filter ActiveReload::MasterFilter, :only => [:show, :edit, :update]

More Repositories

1

restful-authentication

inactive project
Ruby
1,573
star
2

attachment_fu

Treat an ActiveRecord model as a file attachment, storing its patch, size, content type, etc.
Ruby
1,026
star
3

coffee-resque

CoffeeScript
545
star
4

guillotine

URL shortening hobby kit
Ruby
485
star
5

twitter-node

Discontinued: check out nTwitter
JavaScript
445
star
6

acts_as_versioned

ActiveRecord plugin for versioning your models.
Ruby
408
star
7

permalink_fu

ActiveRecord plugin for automatically converting fields to permalinks.
Ruby
264
star
8

grohl

Combination logging, exception reporting, and metrics library for Go.
Go
165
star
9

madrox

Distributed Twitter implementation in Git.
Ruby
153
star
10

nubnub

Node.js PubSubHubbub client/server implementation
CoffeeScript
144
star
11

jquery.doubletap

This jquery plugin adds custom touch-screen events to the given HTML elements.
JavaScript
137
star
12

wheres-waldo

track what users are on which pages with redis
JavaScript
119
star
13

cronwtf

silly cron => english translator
JavaScript
94
star
14

can_search

Build common named scopes automatically, and provide a simple way to merge them with a single #search call.
Ruby
93
star
15

node-scoped-http-client

Unmaintained. Free push/npm access to anyone interested.
CoffeeScript
84
star
16

node-chain-gang

CoffeeScript
81
star
17

serialized_attributes

kind of a bridge between using AR and a full blown schema-free db
Ruby
61
star
18

model_stubbing

Replacement for ActiveRecord fixtures using an extremely flexible ruby-based approach.
Ruby
55
star
19

viking

Discontinued, see https://github.com/dimelo/viking
Ruby
53
star
20

go-scientist

Go
49
star
21

faraday-zeromq

Ruby
47
star
22

relative_time_helpers

ActionView helpers for showing relative time spans like "Jan 1 - 5" or "Jan 1 - Feb 5"
Ruby
45
star
23

multipartstreamer

Go
44
star
24

sentry

Painless encryption wrapper library
Ruby
32
star
25

model_iterator

Ruby
32
star
26

twitter-server

ruby/sinatra extensions for implementing the twitter api
Ruby
31
star
27

yajl-rails

Rails plugin for using YAJL with Rails 3
Ruby
29
star
28

app_bootstrap

app:bootstrap rake task providing a command line menu to setup a rails app.
Ruby
29
star
29

emoji-css-builder

Quick Ruby rake task for generating CSS and tiled image for displaying emoji in browsers.
Ruby
29
star
30

sparkplug

Ruby Rack module for generating sparkline graphs on the fly
Ruby
26
star
31

astrotrain

email => http_post
Ruby
26
star
32

duplikate

Syncs one directory to another (example: a git project to an svn repo)
Ruby
25
star
33

running_man

Ruby
23
star
34

dealer.js

JavaScript
21
star
35

chat_gram

Barebones Instagram realtime endpoint for posting images to a chat service (Campfire).
Ruby
19
star
36

github_twitter_server

wrap github with a twitter api.
Ruby
18
star
37

islostonyet.com

no really, i need to know
Ruby
18
star
38

will_sign

Small module for creating time-based hashes based on URLs.
Ruby
17
star
39

horcrux

A Horcrux is a powerful object in which a Dark wizard or witch has hidden a fragment of his or her soul for the purpose of attaining immortality.
Ruby
16
star
40

weatherhue

Ruby
13
star
41

queue_kit

Ruby
11
star
42

zcollab

Rad ZeroMQ scripts to supercharge your cloud.
JavaScript
11
star
43

context_on_crack

experimental macros for testing rails controllers. port of rspec_on_rails_on_crack
11
star
44

ultraviolence

web service for formatting text with the ultraviolet lib. ruby 1.9 only
Ruby
10
star
45

schemagram

Generate JSON Schema files from Ruby.
Ruby
9
star
46

go-httppipe

Go
9
star
47

service-queue

experimental ZeroMQ task worker thing.
CoffeeScript
9
star
48

activesupport_notifications_backport

Ruby
9
star
49

httpretry

Go
9
star
50

flappy-atom

CoffeeScript
8
star
51

urban_api

quick and dirty urban dictionary scraper
Ruby
8
star
52

dangerroom

Go
7
star
53

git-nosql-talk

Git is a Stupid NOSQL Database - talk given at Ruby and Rails.eu 2010
Ruby
7
star
54

rack-sparklines

DISCONTINUED, SEE http://github.com/technoweenie/sparkplug
Ruby
7
star
55

markup_cloud

Render text into markup through local and zeromq endpoints
Ruby
7
star
56

coffee-sprites

simple html 5 animation/sprites system heavily inspired by http://gamesinhtml5.blogspot.com/2010/07/game-in-progress-sprites-and-animation.html
JavaScript
6
star
57

go-contentaddressable

Go
5
star
58

unique_content_set

Check for uniquely created content in a Redis set
Ruby
5
star
59

elixir-rubyports

Elixir
5
star
60

fantomex

[ALPHA] Small, per-process persistent queue.
CoffeeScript
4
star
61

camo.go

Go
4
star
62

http_token_authentication

Rails plugin for parsing http token authorization headers
Ruby
4
star
63

active_record_context

simple identity map for active record. eager loading associations FTL
Ruby
4
star
64

go-passthrough

Simple package for passing responses untouched from an internal API
Go
4
star
65

pylists

Python
4
star
66

zue

Ruby
4
star
67

pki

Ruby
4
star
68

rubysweetsixteen

i'm probably jumping the shark by posting this...
Ruby
4
star
69

lighthouse-notifier

Ruby
3
star
70

ud

Ruby
3
star
71

15

3
star
72

redis_active_set

Tracks the number of active objects during a certain time period in a Redis sorted set.
Ruby
3
star
73

guillotine-zeromq

ZeroMQ API for Guillotine
Ruby
2
star
74

hubot-zeromq

proof-of-concept zeromq adapter for Hubot
CoffeeScript
2
star
75

apub

experimental golang package for parsing ActivityPub objects
Go
2
star
76

pdxjs-twitter-node

JavaScript
2
star
77

fantomex.rb

[ALPHA] Small, per-process persistent queue.
Ruby
1
star
78

tender_sync

sync Tender FAQs to and from Tender
Ruby
1
star
79

dummy-repo

1
star
80

playground

1
star
81

go-ronn

Go
1
star