Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CodeFest 2018. Константин Осипов (mail.ru) — Подходы к реализации шардинга в современных [No]SQL системах

CodeFest 2018. Константин Осипов (mail.ru) — Подходы к реализации шардинга в современных [No]SQL системах

Посмотрите выступление Константина: https://2018.codefest.ru/lecture/1294/

В докладе попытаюсь сравнить архитектуру и технические решения, используемые в современных SQL и NoSQL системах, в частности Couchbase, MongoDB, Cassandra, CockroachDB и, конечно, Tarantool. Как разбиваются данные, по диапазону, хэш функции, или bucket id? Как выбирается размер бакета? Какая хэш-функция используется? Как происходит перебалансировка при переполнении? Где хранится информация о распределении данных и их текущим местоположении? Есть ли выделенный программный компонент для роутинга запросов, или роутинг осуществляется самими узлами хранения? Ответы на эти вопросы, а также на вопрос *почему* разработчики приняли то или иное решение, плюсы и минусы различных подходов я раскрою в своём докладе. PS Несколько лет назад мы с Алексеем Рыбаком делали совместный доклад про шардинг с использованием MySQL или PostgreSQL. Видео и слайды доклада можно найти здесь: youtube хабрахабр Новый доклад - на старую тему, но совсем с другой стороны: я буду рассказывать про устройство готовых решений, а не про то, как приготовить решение самому.

CodeFest

April 05, 2018
Tweet

More Decks by CodeFest

Other Decks in Programming

Transcript

  1. whoami • MySQL core team member 2003-2010 • Tarantool core

    team member 2010-now • http://t.me/tarantoolru • http://tarantool.org
  2. The plan NoSQL системы всё больше смещаются в сторону NewSQL.

    Давайте посмотрим, как на это влияют ключевые технические решения в реализации шардинга, принятые на старте проекта. • sharding introduction • vBucket or not; hash or range! • routing • secondary keys are hard
  3. Sharding: introduction Sharding - горизонтальное разбиение данных СУБД по нескольким

    машинам. Позволяет линейно масштабировать ёмкость и (возможно) пропускную способность СУБД. Требует решения 3 задач: • выбрать принцип разбиения данных • обеспечить хранение метаданных • организовать роутинг запросов к данным
  4. Sharding: shard function Три основных способа задания shard function: •

    Hash • Range • Range* (Stonebraker) Shard-функция также влияет на алгоритм балансировки: может перемещаться ключ, диапазон (range) или использоваться концепция virtual buckets.
  5. mongodb For queries that don’t include the shard key, mongos

    must query all shards, wait for their response and then return the result to the application. These “scatter/gather” queries can be long running operations. However, range based partitioning can result in an uneven distribution of data, which may negate some of the benefits of sharding. For example, if the shard key is a linearly increasing field, such as time, then all requests for a given time range will map to the same chunk, and thus the same shard. In this situation, a small set of shards may receive the majority of requests and the system would not scale very well.
  6. Sharding: metadata & routing Метаданные шардинга: определения таблиц и таблица

    роутинга • На выделенных узлах - e.g. mongodb config server • Metadata is data - Couchbase, CockroachDB, Tarantool От решения задачи хранения метаданными зависит архитектура роутинга: • на клиенте • на выделенных узлах • на storage узлах
  7. Summary: design choices Couchbase MongoDB CockroachDB VoltDB | Tarantool Shard

    function Hash + vbuckets Hash, range in 2.x, vbucket Range Range* + vbucket Metadata Metadata is data Config server Metadata is data* Metadata is data Routing Client and server Router Server Server Non-sharded tables No Yes No Yes Secondary keys Global and local Local Global only Local, Materialized views*
  8. Summary: hash vs. range based sharding Hash Range Write запросы/time

    series Linear scaling Hotspots Primary key read Linear scaling Linear scaling Partial key read Map/reduce Linear scaling Range read Map/reduce Linear scaling Chunk splits and migration Easy Difficult Metadata size Small Large