Skip to content

Распределенные данные

Репликация / Шардирование / CAP

SQL vs NoSql

  • sql: Таблицы
  • nosql: json/kv/etc.
  • Time series - оптимизированная по временные ряды
  • Колоночные - хранение не по строкам, а по колонкам
  • Wide-column - как колоночная, только схема динамическая
  • Object storage

CAP Теорема

  • Consistency - согласованность
    • Линеаризуемость - когда записали в 1 ноду, читаем из 2, и в 2 - данные, записанные в 1 ноде
  • Availablity - доступность
    • Запись/чтение на любой ноде
    • Могут быть конфликты
  • Partitioning Tolerance - переносимость разрывов сети

  • Виды Consistency

    • Immediate
    • Seq. Consist.
    • Что записали, то и прочитали
    • Causal Cons.

Можно только два: - AP: читать/писать всегда можно даже если нет сети, но будут конфликты - CP: читать/писать можно только когда есть сети, но не будет конфликтов - Все зависит от требований системы

Как читать без конфликтов (кейс чтения в момент синхрона реплик): - Кворум - большинство

Репликация

  • Репликация - масштабирование чтения
  • Репликация vs Бекапы - бекапы это не быстро не реалтайм, реплика - более свежая, тк на изменениях работает
  • Реплика неактуальная че делать: Идти в мастер
  • Доступность: реплики делаем
  • Синхронная / асинхронная репликация
    • Синхронная - убеждаемся что данные доставились
    • асинхронная - нет
  • Мастер сломался - Выбор лидера - консесус
  • Мастер-мастер
    • Больше записи, гео-распределенность
    • Больше конфликтов

Шардирование

  • Шардирование - масштабир. на запись
  • Шардирование по айди / хешу / полю / хардкод / алогритмы хеширования
  • Добавление шардов - нужен баланс
  • Перенос шарда - перенос записи

Алгоритмы Хеширования

  • База hash(key) % N

Рандеву-хешинг

  • max(hash(key + i) for i in [0..N]); N - num shards
  • Равномерное распределение при добавлении нового шарда
  • То есть если макс. хеш среди 3 шардов = 2, то при добавлении 4 шарда, ключ будет распределяться между 2 или 4, но не 1 и 3
  • Сложность N

Консистент-хешинг

  • Шарды рандомно проецируем на окружность
  • Ключ проецируется на окружность
  • По часовой стрелке определяем ближайший шард для ключа
  • Улучшение - параметр v-node - каждый шард проецируем на окружность не в виде 1 точки, а в виде N рандомных точек
    • Таким образом будет равномерное распред.
    • Плюс можно делать веса: напр. добавили мощнее серв, знач можно больше v-node, знач нагрузка будет больше на него
  • Сложность log(N)

Партиционирование

  • Партиционирование - шардирование на 1 серве - режем табличку по признаку
  • Примеры признаков
    • Время: на старые и новые записи
    • Айди
    • Колонка

Миграция Больших данных

  • Сделать fk интом потом сиквенс сбросить
  • Периодическая задача

Материалы