Почему Reads / se c в аэроспайке намного меньше по сравнению с Write / se c? - PullRequest
0 голосов
/ 28 января 2020

Я использую aerospike v4.8, и я делаю запросы на чтение и запись в aerospike, где в моем запросе на запись я получаю пропускную способность 4000 записей / с c, тогда как при чтении пропускная способность составляет всего 10-15 операций чтения / se c что очень мало.

Мой запрос:

let query = aerospikeClient.query(nameSpace, set)
        query.select('count', 'targetKey')
        query.predexp = [
            predexp.stringBin('campaignKey'),
            predexp.stringValue(Id1 + ':' + Id2 + ':' + Id3 + ':' + channel),
            predexp.stringEqual(),

            predexp.integerBin('epochDay'),
            predexp.integerValue(epochDay),
            predexp.integerGreaterEq(),

            predexp.integerBin('epochDay'),
            predexp.integerValue(epochDay),
            predexp.integerLessEq(),

            predexp.and(3)
        ]

Не могу понять, что здесь не так, нужна помощь.

Мой конфиг:

namespace test {
        replication-factor 2
        memory-size 8G
        default-ttl 7d 
        storage-engine device {
                device /dev/xvdf
                scheduler-mode noop
                write-block-size 16K
                data-in-memory false
        }
}

Индексы:

CREATE INDEX campaignIndex ON antiSpamming.userTargetingMatrix (campaignKey) string;
CREATE INDEX targetIndex ON antiSpamming.userTargetingMatrix (targetKey) string;
CREATE INDEX epochDayIndex ON antiSpamming.userTargetingMatrix (epochDay) NUMERIC;

1 Ответ

3 голосов
/ 28 января 2020

Во-первых, это совсем не так. Aerospike читает всегда будет быстрее, чем пишет. Для выполнения записи требуется более длинный путь кода и больше операций ввода-вывода. Если вы не заявите, что ваша операция REPLACE, она будет вести себя как упор, что означает, что она сначала попытается прочитать ту же запись, объединить ваши данные, а затем записать.

То, что вы есть делать выше не сравнивает яблоки с яблоками. Запись (put) - это отдельная операция записи. Вы должны сравнить запись с одной записью чтения (get). То, что вы делаете, - это сканирование (если вы также подключите фильтр вторичного индекса, это будет запрос), что является многоузловой операцией. Даже если он просто возвращает одну запись, он должен go всем узлам и при каждом обходе весь первичный индекс совпадений с вашим фильтром предикатов.

Есть несколько способов обойти это , Например, вы можете построить вторичный индекс на своем значении epochDay и вместо фильтра предикатов использовать фильтр вторичного индекса с предикатом диапазона BETWEEN . Фильтр предикатов будет меньше, только строковый предикат.

Во-вторых, вы можете использовать подход моделирования, при котором данные объединяются в одну большую запись в виде списка или карты. , и вы используете API списка или карты, чтобы получить диапазон элементов, которые вы хотите в этом сложном типе данных. Взгляните на блоги разработчиков Aerospike и Примеры кода Aerospike .

...