Выбор лучшей базы данных для миллиардов операций чтения / записи в день - Кассандра медлительна, как улитка - PullRequest
0 голосов
/ 25 апреля 2018

Я сравниваю разные базы данных для одного из наших проектов. Нам нужно 1 миллиард операций вставки в день и миллиарды операций чтения (каждая инструкция выбора должна читать 50 строк).

Каждая запись имеет несколько полей, в основном столбцы идентификаторов и в среднем 500-байтовый BLOB-объект.

Я пытаюсь смоделировать на моей машине. Я могу достичь 50 000 вставок в секунду в файловой системе (что не очень хорошо, так как расходует много места на запись).

Я могу достичь 30 000 вставок в секунду в mongodb (но я читал, что это плохо в репликации / разделенных узлах).

Я могу достичь 20 000 вставок в секунду в mysql, ме. ​​

Но Кассандра, слишком медленная, чтобы рассмотреть: едва 1500 вставок в секунду! Сначала я полагал, что проблема связана с драйвером, который я использую, затем я попробовал другие драйверы, не такие разные. Я пытался вставить несколько процессов, но все же гораздо медленнее, чем другие.

Все тесты говорят, что Кассандра самая быстрая, но у меня плохие результаты. Чего мне не хватает?

Нормальная схема, которая нам нужна, похожа на приведенную ниже (* _uid - это 20-байтовые двоичные данные, и они гарантированно будут в порядке возрастания и уникальны):

create table records
              (
              record_uid blob PRIMARY KEY,
              user_uid blob,
              product_uid blob,
              data blob
              );

Кроме того, есть ли лучшее предложение, которое соответствует нашим потребностям с меньшими затратами?

p.s. Вот код, который я использовал для проверки:

$cluster  = Cassandra::cluster()->build();
$keyspace  = 'benchmark';
$session  = $cluster->connect($keyspace);

$prepare    = $session->prepare("INSERT INTO records (record_uid, user_uid, product_uid, data) VALUES (?, ?, ?, ?)");




$start = microtime(true);


for($i = 0; $i < 100000; $i++)
{
    $values = [
        'message_uid' => new Cassandra\Blob(uuid()),
        'user_uid' => new Cassandra\Blob(uuid()),
        'room_uid' => new Cassandra\Blob(uuid()),
        'message' => new Cassandra\Blob('This is a test!!!!!!!!!!!!')
    ];


    $options = ['arguments' => $values];
    $session->execute($prepare, $options);
}


$time = microtime(true) - $start;
$insert_per_second = $time / $i;

echo "execution time: $time seconds\r\n"; // ~100 seconds
echo "insert per second: $insert_per_seconds\r\n"; // ~1500 records / sec
...