40
Cassandra A short Intro Vitaly Kushner astrails.com

Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

CassandraA short Intro

Vitaly Kushnerastrails.com

Page 2: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

• Distributed

• Non-relational

• Linearly scalable

• Multi data-center aware

Page 3: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

BigTablehttp://labs.google.com/papers/bigtable.html

Page 4: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

Terminology Sucksbig time

Page 5: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { "1": { "attributes": { "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 6: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { <<= Cluster Name demo_app: { accounts: { "1": { "attributes": { "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 7: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { <== Keyspace accounts: { "1": { "attributes": { "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 8: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { <<= super column family "1": { "attributes": { "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 9: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { "1": { "attributes": { "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { <<= column family "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 10: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { "1": { <<= key "attributes": { "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 11: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { "1": { "attributes": { << super column "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 12: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { "1": { "attributes": { "name": "astrails" <<= column }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 13: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { "1": { "attributes": { "name": "astrails" <<= value }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", "email": "[email protected]" } } }}

Page 14: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { demo_app: { accounts: { "1": { "attributes": { "name": "astrails" }, "users": { "1" => "", "3" => "", } } }, users: { "1": { "name": "vitaly", <<= column "email": "[email protected]" } } }}

Page 15: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { <<= cluster demo_app: { <<= keyspace accounts: { <<= super column family "1": { <<= key "attributes": { <<= supercolumn "name": "astrails" <<= column }, "users": { "1" => "", "3" => "", } } }, users: { <<= column family "1": { <<= key "name": "vitaly", <<= column "email": "[email protected]" } } }}

Page 16: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { <<= cluster demo_app: { <<= database accounts: { <<= super column family "1": { <<= key "attributes": { <<= supercolumn "name": "astrails" <<= column }, "users": { "1" => "", "3" => "", } } }, users: { <<= column family "1": { <<= key "name": "vitaly", <<= column "email": "[email protected]" } } }}

Page 17: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { <<= cluster demo_app: { <<= database accounts: { <<= table "1": { <<= key "attributes": { <<= supercolumn "name": "astrails" <<= column }, "users": { "1" => "", "3" => "", } } }, users: { <<= column family "1": { <<= key "name": "vitaly", <<= column "email": "[email protected]" } } }}

Page 18: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { <<= cluster demo_app: { <<= database accounts: { <<= table "1": { <<= key "attributes": { <<= supercolumn "name": "astrails" <<= column }, "users": { "1" => "", "3" => "", } } }, users: { <<= table "1": { <<= key "name": "vitaly", <<= column "email": "[email protected]" } } }}

Page 19: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { <<= cluster demo_app: { <<= database accounts: { <<= table "1": { <<= key "attributes": { <<= collection "name": "astrails" <<= column }, "users": { "1" => "", "3" => "", } } }, users: { <<= table "1": { <<= key "name": "vitaly", <<= column "email": "[email protected]" } } }}

Page 20: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

my_cluster: { <<= cluster demo_app: { <<= database accounts: { <<= table "1": { <<= key "attributes": { <<= collection "name": "astrails" <<= attribute }, "users": { "1" => "", "3" => "", } } }, users: { <<= table "1": { <<= key "name": "vitaly", <<= attribute "email": "[email protected]" } } }}

Page 21: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

Indexing

Page 22: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

"my_cluster": { "demo_app": { "users": { "b2c75e99-e079-449d-b562-293dfdbf006e": { "attributes": { "name": "Vitaly", "email": "[email protected]", "remember_me": "74c4f3a2c85b66f216211edd5245d25ba251d83e" } } }, "emails": { "[email protected]": "b2c75e99-e079-449d-b562-293dfdbf006e", } "remember_me": { "74c4f3a2c85b66f216211edd5245d25ba251d83e": "b2c75e99-e079-449d-b562-293dfdbf006e", } }}

Page 23: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

"my_cluster": { "demo_app": { "users": { "b2c75e99-e079-449d-b562-293dfdbf006e": { "attributes": { "name": "Vitaly", "email": "[email protected]", "remember_me": "74c4f3a2c85b66f216211edd5245d25ba251d83e" } } }, "emails": { "[email protected]": "b2c75e99-e079-449d-b562-293dfdbf006e", } "remember_me": { "74c4f3a2c85b66f216211edd5245d25ba251d83e": "b2c75e99-e079-449d-b562-293dfdbf006e", } }}

Page 24: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

"my_cluster": { "demo_app": { "users": { "b2c75e99-e079-449d-b562-293dfdbf006e": { "attributes": { "name": "Vitaly", "email": "[email protected]", "remember_me": "74c4f3a2c85b66f216211edd5245d25ba251d83e" } } }, "emails": { "[email protected]": "b2c75e99-e079-449d-b562-293dfdbf006e", } "remember_me": { "74c4f3a2c85b66f216211edd5245d25ba251d83e": "b2c75e99-e079-449d-b562-293dfdbf006e", } }}

Page 25: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

"my_cluster": { "demo_app": { "users": { "b2c75e99-e079-449d-b562-293dfdbf006e": { "attributes": { "name": "Vitaly", "email": "[email protected]", "remember_me": "74c4f3a2c85b66f216211edd5245d25ba251d83e" } } }, "emails": { "[email protected]": "b2c75e99-e079-449d-b562-293dfdbf006e", } "remember_me": { "74c4f3a2c85b66f216211edd5245d25ba251d83e": "b2c75e99-e079-449d-b562-293dfdbf006e", } }}

Page 26: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

"my_cluster": { "demo_app": { "users": { "b2c75e99-e079-449d-b562-293dfdbf006e": { "attributes": { "name": "Vitaly", "email": "[email protected]", "remember_me": "74c4f3a2c85b66f216211edd5245d25ba251d83e" } } }, "emails": { "[email protected]": "b2c75e99-e079-449d-b562-293dfdbf006e", } "remember_me": { "74c4f3a2c85b66f216211edd5245d25ba251d83e": "b2c75e99-e079-449d-b562-293dfdbf006e", } }}

Page 27: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

"my_cluster": { "demo_app": { "users": { "b2c75e99-e079-449d-b562-293dfdbf006e": { "attributes": { "name": "Vitaly", "email": "[email protected]", "remember_me": "74c4f3a2c85b66f216211edd5245d25ba251d83e" } } }, "emails": { "[email protected]": "b2c75e99-e079-449d-b562-293dfdbf006e", } "remember_me": { "74c4f3a2c85b66f216211edd5245d25ba251d83e": "b2c75e99-e079-449d-b562-293dfdbf006e", } }}

Page 28: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

Playtime

Page 29: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

> gem install cassandra...> cassandra_helper cassandra...

Page 30: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

<ClusterName>my_cluster</ClusterName>

<Keyspaces> <Keyspace Name="demo_app"> <ColumnFamily CompareWith="UTF8Type" Name="users" ColumnType="Super" CompareSubcolumnsWith="UTF8Type" /> <ColumnFamily CompareWith="UTF8Type" Name="emails" ColumnType="Super" CompareSubcolumnsWith="UTF8Type" /> <ColumnFamily CompareWith="UTF8Type" Name="tokens" /> </Keyspace></Keyspaces>

Page 31: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

require 'rubygems'require 'cassandra'

include Cassandra::Constants

client = Cassandra.new('demo_app')

client.insert(:users, "1", {"name" => "vitaly", "email" => "[email protected]"})client.insert(:accounts, "1", {"attributes" => {"name" => "astrails"}, "users" => {"1" => ""}})

client.insert(:users, "2", {"name" => "boris"})client.insert(:accounts, "1", {"users" => {"2" => ""}})

client.get(:users, "1")

Page 32: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

Rails?

Page 33: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

YES!

Page 34: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

SmallRecordWARNING: waporware :)

Page 36: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

ActiveModel

Page 37: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

class Account < SmallRecord::Base attribute :name attribute :created_at, :type => :datetime

has_many :users

validates_presence_of :nameend

class User < SmallRecord::Base attribute :name attribute :email attribute :created_at, :type => :datetime attribute :account_id

def account @account ||= Account.find(:account_id) end

validates_presence_of :name validates_presence_of :emailend

Account.find(params[:account]).users.first.name

Page 38: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

production: adapter: cassandra host: 127.0.0.1 port: 9160 keyspace: chronos

development: adapter: mock

test: adapter: mock

Page 39: Cassandra - assets.astrails.comassets.astrails.com/presentations/2010-03-22-CassandraIntro.pdf · my_cluster: {

production: adapter: cassandra host: 127.0.0.1 port: 9160 keyspace: chronos

development: adapter: mock

test: adapter: mock