Cassandra Integration

This gem should help you integrate data from models of different Rails apps using Apache Cassandra to replicate them.

References

Apache Cassandra Apache Cassandra - Wiki

Installation

Include the gem in your Gemfile:

gem "cassandra_integration", :git => "git://github.com/dtmconsultoria/cassandra-integration.git"
bundle install

bundle exec rails generate cassandra_integration_config
#The generate command will create cassandra_integration.yml file on your config directory

cassandra_integration.yml

development:
    host: 192.168.0.1:9160
     keyspace: keyspace
     app_id: id_for_this_application
     other_apps_ids: id_for_other_app1,id_for_other_app2
     retries: 3
     timeout: 10
     connect_timeout: 20

Quick Start

On Cassandra, you must create a ColumnFamily:

Attention for the last 3 column names. They are the apps identifiers configured on your cassandra_integration.yml

create column family your_column_famly_name WITH comparator = UTF8Type
   AND key_validation_class = UTF8Type
   AND column_metadata = [
           {column_name: name, validation_class: UTF8Type, index_type: KEYS},
           {column_name: birth_date, validation_class: UTF8Type},
           {column_name: mother_name, validation_class: UTF8Type},

           {column_name: id_for_this_application, validation_class: UTF8Type, index_type: KEYS},
           {column_name: id_for_other_app1, validation_class: UTF8Type, index_type: KEYS}
           {column_name: id_for_other_app2, validation_class: UTF8Type, index_type: KEYS}];

You must create a migration for each model you want to sync:

add_column :your_model_name, :cassandra_sync_identifier, :string

On each model:

class User < ActiveRecord::Base
  extend CassandraIntegration::Base

  #Here goes the ColumnFamily name used to sync this model data 
  self.cassandra_column_family = 'people'

  def to_cassandra_sync_identifier
    #Here goes your unique identifier for all systems
    #That will be the Cassandra's key identifier
    "#{name.parameterize}##{mother.parameterize}##{birthdate}"
  end

  #Here goes the fields you want to sync
  #The hash key is the column name on Cassandra and
  #the hash value is the attribute name on your model
  self.cassandra_columns_values_hash = {
    :name        => 'name',
    :mother_name => 'mother',
    :birth_date  => 'birthdate'
  }

end