Cassandra Wide Vs Skinny Rows для больших столбцов
Мне нужно вставить 60 ГБ данных в кассандру в день.
Это разбивается на
100 наборов ключей
150 000 ключей за комплект
4 Кбайт данных на ключ
С точки зрения производительности записи мне лучше использовать
1 строка в наборе с 150 000 клавиш в строке
10 строк в наборе с 15 000 клавиш в строке
100 строк в наборе с 1 500 ключами на строку
1000 строк в наборе с 150 ключами на строку
Еще одна переменная, которую следует учитывать, мои данные истекают через 24 часа, поэтому я использую TTL = 86400 для автоматизации истечения срока действия
Более подробные сведения о моей конфигурации:
CREATE TABLE stuff (
stuff_id text,
stuff_column text,
value blob,
PRIMARY KEY (stuff_id, stuff_column)
) WITH COMPACT STORAGE AND
bloom_filter_fp_chance=0.100000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=39600 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
compaction={'tombstone_compaction_interval': '43200', 'class': 'LeveledCompactionStrategy'} AND
compression={'sstable_compression': 'SnappyCompressor'};
Сведения о шаблоне доступа:
Значение 4KB представляет собой набор из 1000 4 байтовых поплавков, упакованных в строку.
Типичный запрос потребует случайного выбора 20-60 из этих поплавков.
Первоначально эти поплавки хранятся в одной и той же логической строке и столбце. Логическая строка здесь представляет собой набор данных в данный момент времени, если все они записаны в одну строку с 150 000 столбцов.
С течением времени некоторые данные обновляются, в пределах логической строки в наборе столбцов будет обновляться случайный набор уровней внутри упакованной строки. Вместо обновления на месте новые уровни записываются в новую логическую строку в сочетании с другими новыми данными, чтобы избежать перезаписи всех данных, которые все еще действительны. Это приводит к фрагментации, поскольку теперь необходимо получить доступ к нескольким строкам, чтобы получить этот набор значений 20-60. Теперь запрос будет обычно считываться из одного столбца в 1-5 разных строк.
Метод тестирования
Я написал 5 выборок случайных данных для каждой конфигурации и усреднил результаты. Ставки были рассчитаны как (Bytes_written/(время * 10 ^ 6)). Время измерялось в секундах с точностью до миллисекунды. Pycassa использовался как интерфейс Cassandra. Использовался оператор партии Pycassa. Каждая вставка вставляет несколько столбцов в одну строку, размеры вставки ограничены до 12 МБ. Очередь размывается до 12 МБ или меньше. Размеры не учитывают служебные данные строк и столбцов, а также данные. Источник данных и приемник данных находятся в одной сети в разных системах.
Записать результаты
Имейте в виду, что в игре есть ряд других переменных из-за сложности конфигурации Cassandra.
1 строка 150 000 ключей в строке: 14 Мбит/с
10 строк 15 000 ключей в строке: 15 Мбит/с
100 строк 1,500 ключей в строке: 18 Мбит/с
1000 строк 150 клавиш в строке: 11 Мбит/с
Ответы
Ответ 1
Ответ зависит от того, какой шаблон поиска данных и как ваши данные логически сгруппированы. В общем, вот что я думаю:
- Широкая строка (1 строка для каждого набора): это может быть лучшим решением, поскольку оно предотвращает одновременное попадание нескольких узлов одновременно, а также со вторичными индексами или составными именами столбцов, вы можете быстро фильтровать данные в соответствии с вашими потребностями. Это лучше всего, если вам нужно получить доступ к одному набору данных для каждого запроса. Однако выполнение слишком большого количества мультигетов в широких рядах может увеличить давление памяти на узлах и ухудшить производительность.
- Тощий ряд (1000 строк в наборе): С другой стороны, широкая строка может вызвать чтение горячих точек в кластере. Это особенно актуально, если вам нужно сделать большой объем запросов для подмножества данных, который существует полностью в одной широкой строке. В таком случае тощий ряд будет распределять ваши запросы более равномерно по всему кластеру и избегать горячих точек. Кроме того, по моему опыту, "более тонкие" ряды имеют тенденцию лучше себя вести с помощью мультигетов.
Я бы предложил, проанализировал ваш шаблон доступа к данным и окончательно построил вашу модель данных на основе этого, а не наоборот.
Ответ 2
Вам будет лучше использовать 1 строку для каждого набора с 150 000 столбцов на строку. Использование TTL - это хорошая идея для процесса автоматической очистки.