Кассандра низкая производительность? - PullRequest
8 голосов
/ 26 января 2011

Я должен выбрать Cassandra или MongoDB (или другую базу данных nosql, я принимаю предложения) для проекта с большим количеством вставок (1M / день). Поэтому я создаю небольшой тест для измерения производительности записи. Вот код для вставки в Кассандру:

import time
import os
import random
import string
import pycassa

def get_random_string(string_length):
    return ''.join(random.choice(string.letters) for i in xrange(string_length))

def connect():
    """Connect to a test database"""
    connection = pycassa.connect('test_keyspace', ['localhost:9160'])
    db = pycassa.ColumnFamily(connection,'foo')
    return db

def random_insert(db):
    """Insert a record into the database. The record has the following format
    ID timestamp
    4 random strings
    3 random integers"""
    record = {}
    record['id'] = str(time.time())
    record['str1'] = get_random_string(64)
    record['str2'] = get_random_string(64)
    record['str3'] = get_random_string(64)
    record['str4'] = get_random_string(64)
    record['num1'] = str(random.randint(0, 100))
    record['num2'] = str(random.randint(0, 1000))
    record['num3'] = str(random.randint(0, 10000))
    db.insert(str(time.time()), record)

if __name__ == "__main__":
    db = connect()
    start_time = time.time()
    for i in range(1000000):
        random_insert(db)
    end_time = time.time()
    print "Insert time: %lf " %(end_time - start_time)

И код для вставки в Mongo - это то же самое, меняя функцию соединения:

def connect():
    """Connect to a test database"""
    connection = pymongo.Connection('localhost', 27017)
    db = connection.test_insert
    return db.foo2

Результат составляет ~ 1046 секунд для вставки в Кассандре и ~ 437 для завершения в Монго. Предполагается, что Кассандра гораздо быстрее, чем Монго, вставляет данные. Итак, Что я делаю не так?

Ответы [ 5 ]

12 голосов
/ 26 января 2011

Нет эквивалента небезопасному режиму Монго в Кассандре. (У нас был один, но мы его вынули, потому что это просто плохая идея.)

Другая основная проблема заключается в том, что вы делаете однопоточные вставки. Кассандра предназначена для высокого параллелизма; вам нужно использовать многопоточный тест. См. График внизу http://spyced.blogspot.com/2010/01/cassandra-05.html (действительные числа устарели за год, но принцип все еще верен).

В дистрибутиве источника Cassandra есть такой тест, включенный в contrib / стресс.

4 голосов
/ 26 января 2011

Если я не ошибаюсь, Cassandra позволяет вам указать, делаете ли вы вставку в «безопасном режиме», эквивалентную MongoDB.(Я не помню название этой функции в Cassandra)

Другими словами, Cassandra может быть настроена на запись на диск и затем возврат в отличие от конфигурации MongoDB по умолчанию, которая сразу возвращается после выполнения вставки не зная , была ли вставка успешной или нет.Это просто означает, что ваше приложение никогда не ожидает передачи / сбоя с сервера.

Вы можете изменить это поведение, используя безопасный режим в MongoDB, но известно, что это сильно влияет на производительность.Включите безопасный режим, и вы можете увидеть другие результаты.

2 голосов
/ 27 января 2011

Вы получите истинную силу Кассандры, как только у вас будет запущено несколько узлов.Любой узел сможет принять запрос на запись.Многопоточность клиента только увеличивает количество запросов к одному и тому же экземпляру, что не поможет после точки.

  • Проверьте журнал cassandra на наличие событий, которые происходят во время ваших тестов.Cassandra начнет запись на диск, как только Memtable заполнится (это настраивается, сделайте его достаточно большим, и вы будете иметь дело с RAM + записью на диск журнала фиксации).Если запись диска для Memtable произойдет во время вашего теста, это замедлит его.Я не знаю, когда MongoDB записывает на диск.
1 голос
/ 18 марта 2011

Создание пакетного мутатора для выполнения нескольких операций вставки, обновления и удаления с использованием как можно меньшего числа циклических переходов.

http://pycassa.github.com/pycassa/api/pycassa/columnfamily.html#pycassa.columnfamily.ColumnFamily.batch

Пакетный мутатор помог мне уменьшить количество вставоквремя не менее чем на половину

1 голос
/ 28 января 2011

Могу ли я предложить взглянуть на Membase здесь?Он используется точно так же, как memcached, и полностью распределяется, поэтому вы можете непрерывно масштабировать скорость ввода записи, просто добавляя больше серверов и / или больше оперативной памяти.

В этом случае вам определенно захочется перейтис клиентской стороной Moxi, чтобы дать вам лучшую производительность.Взгляните на нашу вики: wiki.membase.org для примеров и дайте мне знать, если вам нужны какие-либо дальнейшие инструкции ... Я рад помочь вам в этом и уверен, что Membase легко справится с этой нагрузкой.

...