Как стать автором
Обновить

Как быстро установить и начать эксперементировать с Cassandra

NoSQL *
image

Cassandra — распределенная база данных, в основу которой положены идеи Dynamo и Google Big Table

Обзор основных особенноестей:
  • Проверена в работе (используется в Facebook, Twitter, Digg и в др.)
  • Отказоустойчива (каждая запись дублируется на нескольких узлах в кластере)
  • Децентрализована (все узлы в кластере эквивалентны)
  • Гибкая модель данных
  • Пропускная способность чтения и записи увеличиваются линейно с добавлением новых узлов
  • Безразмерна (нет ограничений на объем, поиск всегда O(1))


Подготовка к установке


Удобно начать знакомство с Cassandra с ruby, предполагаю что он у вас установлен. Сейчас мы установим одноименный ruby gem, который упростит сборку Cassandra

sudo gem install cassandra --source http://gemcutter.org

Вместе с другими gem'ами вам так же установится thrift (грубо говоря, это — посредник между разными языками).
В cassandra-gem есть удобные rake task'и, которые быстро помогут собрать последнюю версию cassandra, однако они недоступны системе в целом, а только внутри папки cassandra-gem. Чтобы быстро получить к ней доступ, я сделал ссылку себе в домашнюю директорию:

ln -s /usr/lib/ruby/gems/1.8/gems/cassandra-0.8.0/ ~/cassandra_gem

Посмотреть, где находятся установленные gem'ы можно с помощью команды gem environment, в моем случае это — /usr/lib/ruby/gems/1.8. Заходим в директорию cd cassandra_gem, и здесь я рекомендую ознакомиться со списком всего, что можно сделать с помощью rake: rake -T. Возможно здесь вам потребуется установить еще один gem echoe.

Установка Cassandra


Теперь соберем базу данных. Сделать это можно командой

rake cassandra

Здесь у меня случился некоторый казус, который закончился ошибкой

tar xzf apache-cassandra-0.6.0-beta2-bin.tar.gz
tar: apache-cassandra-0.6.0-beta2-bin.tar.gz: Cannot open: No such file or directory

Такого обычно быть не должно, но вышла новая beta3 версия cassandra, а gem еще не успели обновить, поэтому он пытается скачать beta2, которой уже нет. Вообще, это быстро исправят, но если вы наткнулись на такое, то здесь можно скачать beta2 для этой версии gem'a (0.8). Дальше создаем в домашней директории папку cassandra и перемещаем туда скаченный файл apache-cassandra-0.6.0-beta2-bin.tar.gz. Запускаем команду еще раз:

rake cassandra

Для сборки cassandra вам потребуется ant и ivy-retrieve. На всякий случай я скопировал мой вывод компиляции, который можно посмотрть здесь. Автоматически он запустит базу данных, однако сначала надо настроить пути для хранения данных, иначе ничего не получится. Пути по умолчанию требуют прав суперпользователя.

Настройка конфигурационных файлов


Cоздадим папки для хранения данных:

cd ~
mkdir cassandra_data
cd !$
mkdir bootstrap callouts commitlog data staging
touch system.log

Файлы конфигурации хранятся в двух директориях: ~/cassandra/server/conf и ~/cassandra_gem/conf. Поскольку мы собираемся запускать cassandra используя gem, файлы конфигурации загружаются оттуда, следовательно, именно их неоходимо отредактировать.

Меняем настройки logger'a:

sudo gedit ~/cassandra_gem/conf/log4j.properties

Строку
log4j.appender.R.File=data/logs/system.log
заменяем на
log4j.appender.R.File=~/cassandra_data/logs/system.log
В production этот logger отключается.

Настройка storage-conf.xml:

Изменяем раздел Directories аналогично (используйте абсолютные пути). Теперь Cassandra должна успешно запуститься.

Настройка структуры данных


Структура данных также определяется в storage-conf.xml.

Для понимания будем использовать терминологию из реляционных баз данных. Грубо говоря, структура данных в Cassandra — хеш.

Keyspaces — список всех баз данных
Keyspace — база данных, которая содержит таблицы
ColumnFamily — таблица с возможностью создавать «колонки» online
CompareWith указывает способ упорядочивания ключей. Обычно их упорядочивают по алфавиту (CompareWith=«UTF8Type») или по времени (CompareWith=«TimeUUIDType»)

ColumnFamily может быть двух типов: обычный и Super. Super означает, что каждая колонка хранит любое количество других колонок. Этот тип подходит для модели, когда пост содержит много комментариев. Естественно, в SuperColumn можно упорядочивать как сами ключи, так и другие подКолонки (CompareSubcolumnsWith). К примеру, мы хотим, чтобы комментарии были упорядочены по времени, тогда — CompareSubcolumnsWith=«TimeUUIDType».

Рано или поздно вы столкнетесь с таким термином, как consistency level. Это — что-то вроде доверия к системе, то есть, если во время записи вы хотите дождаться, пока cassandra запишет данные на несколько узлов (это настраивается), то consistency level должен быть максимально высоким. Если вам достаточно дождаться записи хотя бы на одной машине, то устанавливаем 1. Уровень значения 0 — послать данные на запись и забыть, не дожидаясь пока они запишутся. Последнее, естественно, самое быстрое, первое — самое долгое. Обычно в production ставят 0.

Проба пера


По умолчанию в storage-conf настроены несколько Keyspace (Twitter, Multiblog, MultiblogLong, возможно CassandraObject), которые мы и будем использовать. Заходим в ruby консоль с помощью команды irb:

irb(main):001:0> require 'cassandra'
=> true

irb(main):002:0> client = Cassandra.new 'Twitter', 'localhost:9160'
=> #<Cassandra:69944556734180, @keyspace="Twitter", @schema={}, @servers=["localhost:9160"]>

irb(main):003:0> client.insert :Users, 'user_name@web.com', {'screen_name' => 'Suvo'}
=> nil

irb(main):004:0> suvo = client.get :Users, 'user_name@web.com'
=> #<OrderedHash {"screen_name"=>"Suvo"}>

irb(main):005:0> suvo['screen_name']
=> "Suvo"


user_name@web.com есть ключ.
Обращаю внимание, что команда client.insert ничего не возвращает. Запись в Cassandra всегда успешна. Теперь попробуем обновить запись и добавить еще одно поле:

irb(main):006:0> client.insert :Users, 'user_name@web.com', {'status' => 'Hello world!'}
=> nil

irb(main):007:0> client.get :Users, 'user_name@web.com'
=> #<OrderedHash {"status"=>"Hello world!", "screen_name"=>"Suvo"}>


Еще один важный запрос (помимо get и insert), который вам доступен — slice_range. С помощью этого запроса можно получить значения в определенном диапазоне ключей.

Итак, у нас получилось (я надеюсь) установить cassandra, записать и считать тестовые данные.

Далее я хотел бы поделиться с вами тем, что может разочаровать в Cassandra, тем, что сделано и тем, что я сделал для Cassandra в Ruby on Rails, однако статья полностью не поместилась. Продолжить чтение можно в здесь.
Теги: cassandra
Хабы: NoSQL
Всего голосов 16: ↑13 и ↓3 +10
Комментарии 8
Комментарии Комментарии 8

Похожие публикации

Лучшие публикации за сутки