Вторичные индексы при шардировании
Ранее мы рассмотрели случай, когда обращение к записям происходит только по первичному ключу.
Ситуация осложняется в случае применения вторичных индексов, которые нужны для сценариев: «найти все действия пользователя 123», «найти все сообщения, содержащие слово поездка», «найти всех собак определенной породы» и т. д.
Есть два подхода:
✅ Document-based partitioning
Создать отдельный внешний индекс для каждого шарда — локальный индекс. Он хранится в одном шарде с первичным ключом и значением. При операции записи нужно обновлять только один шард, но при чтении придется выполнить
запросы ко всем шардам и объединить полученные результаты.
Этот подход используют MongoDB, Riak, Cassandra, Elasticsearch, SolrCloud, VoltDB.
✅ Term-based partitioning
Вместо отдельного для каждого шарда вторичного индекса создается глобальный индекс, охватывающий данные из всех шардов. При этом такой индекс хранится не в одном месте, а тоже делится на шарды. Но делиться он может не так, как индекс по первичному ключу.
➕ Преимущество глобальных (term-based) индексов состоит в повышении производительности чтения: вместо фрагментированного чтения по всем шардам достаточно выполнить запрос одному шарду, содержащему индекс по нужному полю.
➖ Недостаток заключается в замедлении и усложнении операций записи, поскольку запись в отдельный документ может затронуть разные шарды, если глобальные индексы по разным полям оказались в разных шардах и даже узлах.
Пример на картинке к посту.
Глобальные индексы используются в DynamoDB Amazon.
#шардирование #кабанчик #сисдиз
Post #79
1.77K

- ❤ 6
- 👍 2
- 🔥 2