Сегодня я поделюсь с вами своим опытом, когда я начинал с Apache Cassandra … Один из самых сложных шагов для изучения любого материала NoSql — это забрать из головы принципы нормализации и эти структуры реляционных БД. Реляционные базы данных предназначены для сохранения нормализованных данных без дублирования данных. Ну, одно из главных изменений здесь — это то, что вам нужно думать или разрабатывать для ваших запросов то, что хотят ваши отчеты или методы поиска, и создавать постоянную структуру по мере необходимости.
Центы веб-страниц, книг, статей рассказывают о том, что такое Cassandra, что такое Hazelcast, что такое Hadoop, MemcacheDB, MongoDB и т. Д. Но ни один из них не касается того, КАК перенести мои данные из реляционной БД в одну из них.
Мы хотели перенести постоянные данные двух наших модулей, Turmeric SOA Monitoring.и данные ограничения скорости куркумы SOA . В куркуме мы используем MySql в качестве реляционной базы данных. После недели чтения и анализа нескольких вариантов NoSql мы выбрали Cassandra. <- Я надеюсь написать еще один пост о причинах …. Кстати, я очень рекомендую это чтение: Кассандра: полное руководство
От реляционных таблиц до ключей
Большое дело сейчас, Как перенести их. Что ж, это то, что мы сделали:
следуя наилучшей практике Agile, если что-то сложное или сложное, просто разбейте его на небольшие задачи. В конце концов, у нас все еще был хороший разрыв для MMF («Минимальная рыночная особенность», см. Программное обеспечение по номерам . Итак:
Шаг 1: Переместите наши реляционные таблицы БД в Семейство Cassandra Colum
Шаг 2: Настройте наши новые Семейства столбцов, чтобы все необходимые данные без одинаковых операторов JOIN
Шаг 3. Разобрать эти семейства столбцов в соответствии с требованиями метода поиска и запроса. Обычно для поиска или метода запроса следует использовать 1 семейство столбцов
Шаг 4:Настройте методы Создателей и Обновлений в соответствии с предыдущими изменениями. Не пугайтесь, если вы сохраняете дублированные данные. Имейте в виду: «думайте о своих запросах! Забудьте правила нормализации».
Шаг 5: пока (! Доволен) -> выполнить шаги 3 и 4
Кассандра ДАО
Теперь самый трудный шаг — это # 1. Не паникуйте, мы разработали некий универсальный (на самом деле он использует Java Generics) Cassandra DAO для вашей миграции. Поскольку вся эта работа была необходима для проекта, над которым я на самом деле работаю, вы найдете его как подмодуль TurmericSOA, но, следуя лицензии Apache, вы можете использовать ее через файл зависимостей Maven.
<dependency> <groupId>org.ebayopensource.turmeric.utils</groupId> <artifactId>turmeric-utils-cassandra</artifactId> <version>1.2.0.0-SNAPSHOT</version> <type>jar</type> </dependency>
Характеристики
- 100% Java-код
- Он может запустить встроенную службу Cassandra или просто поговорить с вашей внешней службой Cassandra
- Использует библиотеку Hector в качестве клиента Java Cassandra
- Динамически [Супер] Создание семейства столбцов
- Ключевые типы и типы данных, определенные во время выполнения с использованием обобщенных
- Поддерживаемые основные методы CRUD:
boolean containsKey(KeyType key); void delete(KeyType key); T find(KeyType key); Map> findItems(final List keys, final Long rangeFrom, final Long rangeTo); Set findItems(final List keys, final String rangeFrom, final String rangeTo); Set getKeys(); void save(KeyType key, T model);
Основные классы
Этот пакет утилит содержит следующий пакет и классы:
org.ebayopensource.turmeric.utils.cassandra.service
- CassandraManager: инициализировать статический экземпляр EmbeddedCassandraService на основе файла конфигурации yaml
org.ebayopensource.turmeric.utils.cassandra.hector
- HectorManager: Управляет созданием и чтением пространства ключей и семейства столбцов. Он использует Гектор Api
- HectorHelper: Включает некоторые служебные методы, основанные на Java Reflection и Java Generics. IE: извлечение имен полей из POJO, которые используются в качестве имен столбцов в пространствах клавиш Кассандры
org.ebayopensource.turmeric.utils.cassandra.dao
- AbstractColumnFamilyDao: как это называется, это должен быть базовый класс, который должен расширять каждый дао. Он определяет и реализует основные операции DAO с использованием Hector Api.
Конфигурационные файлы
- log4j.properties: файлы свойств Log4j
- cassandra.yaml: файл конфигурации хранилища. Для получения дополнительной информации: настройка конфигурации хранилища .
Вот структура каталогов файлов конфигурации:
META-INF/ security/ config/ cassandra/ cassandra.properties
Пример этого файла свойств:
cassandra-cluster-name=TurmericCluster cassandra-host-ip=127.0.0.1 cassandra-rpc-port=9160 cassandra-my-keyspace=My-keyspace #column families cassandra-foo-column-family=foo cassandra-bar-column-family=bar
Как это использовать….
Это очень интуитивно понятно. Предположим, у нас есть таблица Foo в нашей реляционной БД, т.е. MySql.
Так:
Создать интерфейс BaseDao
public interface BaseDao { public void delete(String key); public Set getKeys(); public boolean containsKey(String key); public void save(String key, FooPojoClass fooPojo); public FooPojoClass find(String key); }
Создайте интерфейс FooDao
public interface FooDao extends BaseDao { }
Создайте реализацию FooDao
public class FooDaoImpl extends AbstractColumnFamilyDao implements FooDao { public FooDaoImpl(final String clusterName, final String host, final String keySpace, final String cf, final Class kTypeClass) { super(clusterName, host, keySpace, kTypeClass, FooPojo.class, cf); } }
… в вашем коде
//initiates an embedded Cassandra Service CassandraManager.initialize(); //creates our Foo Column Family FooDao fooDao = new FooDaoImpl("myCluster", "127.0.0.1", "myKeyspace", "myColumnFamilyName", String.class);
и вуаля, ваша реляционная таблица перенесена как семейство столбцов Кассандры !!!
В любом случае, вы можете заняться серфингом в классах UT, чтобы посмотреть, как они реализованы …
наслаждайтесь !!!
Источник: http://itsecrets.wordpress.com/2012/01/12/jumping-from-mysql-to-cassandra-a-success-story/