Распределенные данные
Репликация / Шардирование / 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 интом потом сиквенс сбросить
- Периодическая задача