Cassandra: оптимизация пакетной записи
Я получаю массовый запрос на запись, скажем, около 20 ключей от клиента. Я могу либо написать их на C* в одной партии, либо написать их по отдельности асинхронным способом и ждать будущего, чтобы завершить их.
запись в пакетном режиме, похоже, не является опцией goo в соответствии с документацией, поскольку моя скорость вставки будет высокой, и если ключи принадлежат разным разделам, координаторам придется выполнять дополнительную работу.
есть ли способ в драйвере Java datastax, с помощью которого я могу группировать ключи который может принадлежать к тому же разделу, а затем клуб их в маленький пакеты, а затем сделать invidual unlogged пакетной записи в асинхронном режиме. в том как я делаю меньше вызовов RPC сервер при этом координатор будет нужно писать локально. Я буду использовать политику token aware.
2 ответов
ваша идея правильная, но нет встроенного способа, вы обычно делаете это вручную.
главное правило здесь-использовать TokenAwarePolicy
, поэтому некоторая координация произойдет на стороне водителя.
Затем вы можете сгруппировать свои запросы по равенству ключа раздела, что, вероятно, будет достаточно, в зависимости от вашей рабочей нагрузки.
что я имею в виду под "группированием по равенству ключа раздела", например, у вас есть некоторые данные, которые выглядят как
MyData { partitioningKey, clusteringKey, otherValue, andAnotherOne }
затем при вставке нескольких такие объекты, вы группируете их по MyData.partitioningKey
. Это, для всех existsing paritioningKey
значения, вы берете все объекты с теми же partitioningKey
, и завернуть их в BatchStatement
. Теперь у вас есть несколько BatchStatements
, так что просто выполните их.
если вы хотите пойти дальше и имитировать хеширование Кассандры, то вы должны посмотреть метаданные кластера через getMetadata
метод com.datastax.driver.core.Cluster
класс, есть способ getTokenRanges
и сравните их с результатом Murmur3Partitioner.getToken
или любой другой разделитель, настроенный в cassandra.yaml
. Я никогда не пробовал хотя это я сам.
Итак, я бы рекомендовал реализовать первый подход,а затем проверить ваше приложение. Я сам использую этот подход, и в моей рабочей нагрузке он работает намного лучше, чем без пакетов, не говоря уже о пакетах без группировки.
вход партии следует использовать осторожно в Кассандре, потому что они накладывают дополнительные накладные расходы. Это также зависит от распределения ключей разделов. Если ваша массовая запись нацелена на один раздел, используйте Unlogged пакетное результаты в одной операции вставки.
В общем, писать их invidually в асинхронной манере, кажется, хороший подход, как указал здесь: https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-the-nuanced-edition-dd78d61e9885
вы можете найти пример кода на вышеуказанном сайте, Как обрабатывать несколько асинхронных записей: https://gist.github.com/rssvihla/26271f351bdd679553d55368171407be#file-bulkloader-java https://gist.github.com/rssvihla/4b62b8e5625a805583c1ce39b1260ff4#file-bulkloader-java
изменить:
пожалуйста, прочитайте это также:
https://inoio.de/blog/2016/01/13/cassandra-to-batch-or-not-to-batch/#14
сколько стоит одна партия разделов?
нет пакетного журнала, написанного для отдельных пакетов разделов. Этот координатор не имеет никакой дополнительной работы (как для multi раздела пишет), потому что все идет в один раздел. Одиночный пакеты разделов оптимизированы: они применяются с одним RowMutation [10].
в нескольких словах: одиночные пакеты раздела не кладут гораздо больше нагрузки на сервер чем обычно пишет.
сколько стоит пакет с несколькими разделами?
позвольте мне просто процитировать Кристофера Бейти, потому что он суммировал это очень хорошо в своем посте "Cassandra anti-pattern: Logged batches" [3]:
Cassandra [сначала] записывает все операторы в журнал пакетов. Что пакетный журнал реплицируется на два других узла в случае, если координатор неудачи. Если координатор терпит неудачу, то другая реплика для пакетного журнала возьму на себя. [..] Координатор должен делать гораздо больше работы, чем любой другой узел в кластере.
опять же, в пулях, что нужно сделать:
- сериализация инструкций пакета
- запишите сериализованный пакет в системную таблицу журнала пакетов
- повторить этого сериализованный пакет на 2 узла
- координатная запись в узлы, содержащие различные разделы
- при успешном удалении сериализованного пакета из журнала пакетов (также на 2 репликах)
помните, что незаполненные пакеты для нескольких разделов устарели с Cassandra 2.1.6