Кассандра и вторичные индексы, как они работают внутри?
Как работает вторичный индекс Кассандры? Документы утверждают, что это какой-то хэш-индекс:
Учитывая, что у меня есть колум username="foobar"
(Имя пользователя столбца будет индекс Scondary) в CF User
с RandomOrderingPartitioner
- Верно ли мое предположение, что Кассандра использует "Распределенный индекс хэша" (= так что индекс не на одном узле = индекс разделен)?
- На скольких узлах хранятся индексные части (столько же, сколько и фактор репликации)?
На каких узлах хранятся части индекса (разделяет ли Кассандра индекс по той же логике, что и ключ с RandomOrderingPartitioner)?
Если индекс удерживается только на одном узле (и, конечно, реплицируется), как Кассандра "определяет" узел, который отвечает за индекс (хешируя имя столбца и затем используя логик randompartitioner для определения узла)?
Правда ли, что этот индекс оптимизирован для низкой мощности? Если да, какова грубая оценка (есть ли конкретная цифра, которую я могу использовать, чтобы судить), что я не должен использовать вторичный индекс (а скорее использовать отдельный CF для индекса)? Или сказал иначе, как рассчитать мощность и принять правильное решение?
Я пытаюсь понять это.
1 ответ
Вторичные индексы - это просто еще одно семейство столбцов. Они не доступны непосредственно пользователям, но вы можете увидеть статистику через bean-компонент JMX: org.apache.cassandra.db.IndexedColumnFamilies
Вы можете просмотреть статистику здесь, чтобы измерить эффективность вашего индекса так же, как и для обычного семейства столбцов.
Для более подробной информации смотрите эти предыдущие посты:
Как хранятся вторичные индексы Кассандры 0,7?
Насколько масштабируемы автоматические вторичные индексы в Cassandra 0.7?
И так как у вас есть тег hector, вот ссылка на тестовый пример для IndexedSlicesQuery: https://github.com/rantav/hector/blob/master/core/src/test/java/me/prettyprint/cassandra/model/IndexedSlicesQueryTest.java