Обзорная лекция про базы данных (2025)

Навроцкий Артем

Обзорная лекция про базы данных (2025)

Навроцкий Артем

Зачем нужна СУБД?

Пример приложения

Wishlist

Допустим, мы хотим написать приложение wishlist, которое будет хранить список понравившихся товаров.

У нас есть простые операции: просмотр списка, добавление и удаление товаров.

Пример приложения

Недостатки реализации

Для прототипа такое решение может сгодиться, но не более.

Базовые термины

Write Amplification
Отношение размера записываемых данных в СУБД к размеру записываемых данных на диск.
Например, в базу вставили 1 Мб данных, но на диск было записано 2 Мб - write aplification равен 2.
Read amplification
Количество чтений с диска необходимых для выполнения запроса.
Например, если для выполнения запроса нужно выполнить 3 чтения, то read amplification равен 3.
Space Amplification
Отношение размера данных в БД к размеру занимаемому на диске.
Например, размер данных в БД 1Мб, но файлы БД на диске занимают 5Мб - space amplification равен 5.

Физика

Стоимость типовых операций

Стоимость операции ()нс (ns)мкс (µs)мс (ms)
Чтение 1Мб из RAM (последовательный доступ)50 00050
Round trip внутри одного датацентра100 000100
Чтение 1Мб из SSD (последовательный доступ)200 000200
Чтение 1Мб из RAM (случайный доступ, 64б)1 000 0001 0001
Сжатие 1Mb (zstd_fast)2 000 0002 0002
Чтение 1Мб из HDD (последовательный доступ)2 000 0002 0002
Позиционирование HDD10 000 00010 00010
Чтение 1Мб из SSD (случайный доступ, 8Кб)15 000 00015 00015
Отправка 1Mb через 1Гбит/сек сеть10 000 00010 00010
Round trip NA Central ⇔ West40 000 00040 00040
Чтение 1Мб из HDD (случайный доступ, 8Кб)2 000 000 0002 000 0002 000
https://github.com/sirupsen/napkin-math

Работа с данными идёт блоками

Выравнивание блоков

Последовательная запись всегда быстрее

Кэширование чтения

Холодный кэш
Пустой кэш или кэш с устаревшими данными.
Тёплый кеш
Кеш, который содержит данные, которые часто используются.
LRU (Least Recently Used)
Кэш, когда удаляется элемент, который дольше всего не использовался.

Буферизация чтения

Основная идея — данные временно сохраняются в специальном буфере (буфере обмена) перед записью.

Это позволяет накапливать изменения и уменьшать общее количество записи.

Порядок записи блоков из буфера в общем случае не детерминирован.

"

Журнал транзакций

Журнал транзакций — специальный журнал, который содержит информацию о всех транзакциях, которые были выполнены в базе данных.

Batching

Batching — алгоритм, который позволяет сгруппировать несколько операций в одну пачку.

Batching

Алгоритм Нейгла

Является средством повышения эффективности работы сетей TCP/IP, позволяющим уменьшить количество пакетов, которые должны быть отправлены по сети.

Пока существует отправленный пакет, для которого отправитель ещё не получил никакого подтверждения о доставке, отправитель должен держать в буфере следующие данные для отправки, до тех пор, пока не наберётся достаточно данных на полный пакет, который можно отправить единожды.

А если не влезаем в память?

Организация данных на диске

Строковая vs Колоночная СУБД

Организация данных на диске

Строковая СУБД

Колоночная СУБД

Организация данных на диске

B-Tree+

B-Tree+ – это сбалансированное дерево поиска, в котором каждый узел содержит множество ключей и имеет более двух потомков.

Write amplification

`O(B)`

Read amplification

`O(log_B (N/B))`

Организация данных на диске

LSM-дерево

LSM-дерево – структура данных, предоставляющая быстрый доступ по индексу в условиях частых запросов на вставку.

Write amplification

`O(k*log_k (N/B))`

Read amplification

`O((log^2 (N/B))/log k)`

Организация данных на диске

TOAST (The Oversized Attribute Storage Technique)

SQL vs NoSQL

SQL vs NoSQL

SQLMongoDB
SELECT * FROM people
db.people.find()
SELECT *
FROM people
WHERE age > 25
LIMIT 10
db.people.find({
  age: { $gt: 25 }
}).limit(10)
EXPLAIN SELECT *
FROM people
WHERE status = "A"
db.people.find({
  status: "A"
}).explain()
INSERT INTO
people (user_id, age, status)
VALUES ("bcd001", 45, "A")
db.people.insertOne({
  user_id: "bcd001",
  age: 45,
  status: "A"
})
UPDATE people
SET age = age + 3
WHERE status = "A"
db.people.updateMany(
  { status: "A" },
  { $inc: { age: 3 }}
)

SQL

SQL обычно подразумевает реляционную модель данных.

1-ая нормальная форма

Переменная отношения находится в первой нормальной форме (1НФ) тогда и только тогда, когда в любом допустимом значении отношения каждый его кортеж содержит только одно значение для каждого из атрибутов.

E-MailПарольИмяДатаПривилегииРазделы
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828Админ, МодераторНовости, Флуд
saltykov@inbox.ru*****Николай Щедрин27.01.1826МодераторФлуд, Юмор
fmd@mail.ru*****Федор Михайлович11.11.1821ИгрокE-Mail
sukin_syn@mail.ru*****Пушкин А.С.06.06.1799АдминПоэзия

1-ая нормальная форма

Переменная отношения находится в первой нормальной форме (1НФ) тогда и только тогда, когда в любом допустимом значении отношения каждый его кортеж содержит только одно значение для каждого из атрибутов.

E-MailПарольИмяДатаПривилегииРазделы
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828АдминНовости
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828АдминФлуд
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828МодераторНовости
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828МодераторФлуд
saltykov@inbox.ru*****Николай Щедрин27.01.1826МодераторФлуд
saltykov@inbox.ru*****Николай Щедрин27.01.1826МодераторЮмор
fmd@mail.ru*****Федор Михайлович11.11.1821ИгрокE-Mail
sukin_syn@mail.ru*****Пушкин А.С.06.06.1799АдминПоэзия

2-ая нормальная форма

Переменная отношения находится во второй нормальной форме тогда и только тогда, когда она находится в первой нормальной форме, и каждый неключевой атрибут неприводимо зависит от ее потенциального ключа.

E-MailПарольИмяДатаПривилегииРазделы
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828АдминНовости
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828АдминФлуд
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828МодераторНовости
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828МодераторФлуд
saltykov@inbox.ru*****Николай Щедрин27.01.1826МодераторФлуд
saltykov@inbox.ru*****Николай Щедрин27.01.1826МодераторЮмор
fmd@mail.ru*****Федор Михайлович11.11.1821ИгрокE-Mail
sukin_syn@mail.ru*****Пушкин А.С.06.06.1799АдминПоэзия

2-ая нормальная форма

Переменная отношения находится во второй нормальной форме тогда и только тогда, когда она находится в первой нормальной форме, и каждый неключевой атрибут неприводимо зависит от ее потенциального ключа.

E-MailПарольИмяДата
tolstoy@mail.ru*****Толстой Л.Н.09.09.1828
saltykov@inbox.ru*****Николай Щедрин27.01.1826
fmd@mail.ru*****Федор Михайлович11.11.1821
sukin_syn@mail.ru*****Пушкин А.С.06.06.1799
E-MailПривилегииРазделы
tolstoy@mail.ruАдминНовости
tolstoy@mail.ruАдминФлуд
tolstoy@mail.ruМодераторНовости
tolstoy@mail.ruМодераторФлуд
saltykov@inbox.ruМодераторФлуд
saltykov@inbox.ruМодераторЮмор
fmd@mail.ruИгрокE-Mail
sukin_syn@mail.ruАдминПоэзия

3-я нормальная форма

Переменная отношения находится в третьей нормальной форме, когда она находится во второй нормальной форме, и отсутствуют транзитивные функциональные зависимости неключевых атрибутов от ключевых.

TopicIDЗаголовокДатаАвторE-MailТекстОценкаОтветы
5Руслан и Людмила01.01.1820Пушкин А.С.sukin_syn@mail.ru500120
8Война и Мир01.03.1869Толстой Л.Н.tolstoy@inbox.ru100345
12Отцы и Дети15.08.1862Иван Тургеневnedobobov@mail.ru25618
43Повести Белкина12.06.1830Пушкин А.С.sukin_syn@mail.ru40096
16Муму10.11.1852Иван Тургеневnedobobov@mail.ru31246

3-я нормальная форма

Переменная отношения находится в третьей нормальной форме, когда она находится во второй нормальной форме, и отсутствуют транзитивные функциональные зависимости неключевых атрибутов от ключевых.

E-MailАвтор
sukin_syn@mail.ruПушкин А.С.
tolstoy@inbox.ruТолстой Л.Н.
nedobobov@mail.ruИван Тургенев
TopicIDЗаголовокДатаE-MailТекстОценкаОтветы
5Руслан и Людмила01.01.1820sukin_syn@mail.ru500120
8Война и Мир01.03.1869tolstoy@inbox.ru100345
12Отцы и Дети15.08.1862nedobobov@mail.ru25618
43Повести Белкина12.06.1830sukin_syn@mail.ru40096
16Муму10.11.1852nedobobov@mail.ru31246

4-ая нормальная форма

Переменная отношения находится в четвёртой нормальной форме, если она находится в третьей нормальной форме и не содержит нетривиальных многозначных зависимостей.

E-MailПривилегииРазделы
tolstoy@mail.ruАдминНовости
tolstoy@mail.ruАдминФлуд
tolstoy@mail.ruМодераторНовости
tolstoy@mail.ruМодераторФлуд
saltykov@inbox.ruМодераторФлуд
saltykov@inbox.ruМодераторЮмор
fmd@mail.ruИгрокE-Mail
sukin_syn@mail.ruАдминПоэзия

4-ая нормальная форма

Переменная отношения находится в четвёртой нормальной форме, если она находится в третьей нормальной форме и не содержит нетривиальных многозначных зависимостей.

E-MailПривилегии
tolstoy@mail.ruАдмин
tolstoy@mail.ruМодератор
saltykov@inbox.ruМодератор
fmd@mail.ruИгрок
sukin_syn@mail.ruАдмин
E-MailРазделы
tolstoy@mail.ruНовости
tolstoy@mail.ruФлуд
saltykov@inbox.ruФлуд
saltykov@inbox.ruЮмор
fmd@mail.ruE-Mail
sukin_syn@mail.ruПоэзия

Нормализация

Денормализация

Денормализация
Намеренное приведение структуры базы данных в состояние, не соответствующее критериям нормализации, обычно проводимое с целью ускорения операций чтения из базы за счет добавления избыточных данных.

Выборка данных

Поиграемся с базой данных

Чтобы поиграться можно взять готовые базы даных:

Для импорта данных MovieLens есть скприт: https://github.com/bozaro/presentations/tree/master/scripts/movielens.

Простой запрос на поиск

SELECT * FROM movies WHERE title = 'Titanic';
   id   |  title  | year
--------+---------+------
   1721 | Titanic | 1997
   3404 | Titanic | 1953
 118916 | Titanic | 1996
 181653 | Titanic | 1943
(4 rows)

Простой запрос на поиск

EXPLAIN ANALYZE
SELECT * FROM movies WHERE title = 'Titanic';
                      QUERY PLAN
--------------------------------------------------------
Seq Scan on movies  (cost=0.00..1707.71 rows=1 width=27)
  Filter: (title = 'Titanic'::text)
  Rows Removed by Filter: 86533
Planning Time: 0.077 ms
Execution Time: 7.331 ms

Простой запрос на поиск

Варианты сканирования таблицы

Seq Scan
Последовательное сканирование таблицы.
Index Scan
Сканирование по индексу.
Bitmap Index Scan
По индексу строится битовая карта.
Index Only Scan
Сканирование покрывающего индекса.

Для выбора стратегии планировщик использует ранее собранную статистику.

JOIN-стратегии

MERGE JOIN
Соединение двух отсортированных последовательностей.
Работает быстро и за один проход обоих списков.
HASH JOIN
Меньшее отношение помещается в хэш-таблицу. Затем для каждой строки из большей таблицы выполняется поиск значений, соответствующих условию соединения.
Соединение только по условию эквивалентности.
NESTED LOOP
Соединение вложенными циклами.

Не все индексы одинаково полезны

Еще пара слов про SQL

SQL - декларативный язык.

Для написания эффективных запросов надо мыслить категориями множеств.

Транзакции

ACID

ACID описывает требования к транзакционной системе, обеспечивающие наиболее надёжную и предсказуемую её работу. Требования ACID были в основном сформулированы в конце 70-х годов Джимом Греем.

Журнал транзакций

Общий алгоритм:

Приблизительные значения IOPS

ТипУстройствоIOPSИнтерфейс
HDD7,200 об/мин SATA-диски~75-100SATA 3 Гбит/с
HDD10,000 об/мин SATA-диски~125-150SATA 3 Гбит/с
HDD10,000 об/мин SAS-диски~140SAS
HDD15,000 об/мин SAS-диски~175-210SAS
SSDIntel X25-M G2 MLC~8 600SATA 3 Гбит/с
SSDOCZ Vertex 3~60 000 (4K)SATA 6 Гбит/с
SSDOCZ Vertex 3 MAX IOPS~75 000 (4K)SATA 6 Гбит/с
SSDOCZ Vertex 4~120 000 IOPS (4K)SATA 6 Гбит/с
SSDOCZ RevoDrive 3 X2~200 000 IOPS (4K)PCIe
SSDOCZ Z-Drive R4 CloudServ~500 000 IOPSPCIe

Журнал транзакций. Бонус

На базе журнала транзакций так же реализуется ряд дополнительных возможностей:

Уровни изолированности транзакций

Уровень изоляцииПотерянное обновление«Грязное» чтениеНеповторяющееся чтениеФантомное чтениеАномалии сериализации
Read uncommitedне возможнодопускаетсявозможновозможновозможно
Read commitedне возможноне возможновозможновозможновозможно
Repeatable readне возможноне возможноне возможнодопускаетсявозможно
Serializableне возможноне возможноне возможноне возможноне возможно

Потерянное обновление (Lost Update)

Потерянное обновление происходит в случае перезатирания изменений другой транзакцией до заврешнения транзакции, сделавшей изменения.

Транзакция 1Транзакция 2
UPDATE tbl1 SET f2=f2+20 WHERE f1=1;
 
 
UPDATE tbl1 SET f2=f2+25 WHERE f1=1;

«Грязное» чтение (Dirty Read)

Чтение данных, добавленных или изменённых еще не завершенной транзакцией.

Транзакция 1Транзакция 2
SELECT f2 FROM tbl1 WHERE f1=1;
f2
---------
100
(1 row)
 
UPDATE tbl1 SET f2=200 WHERE f1=1;
 
 
SELECT f2 FROM tbl1 WHERE f1=1;
f2
---------
200
(1 row)
ROLLBACK;
 

Неповторяющееся чтение (Non-Repeatable Read)

При повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными.

Транзакция 1Транзакция 2
 
SELECT f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=f2+1 WHERE f1=1;
 
COMMIT;
 
 
SELECT f2 FROM tbl1 WHERE f1=1;

Чтение "фантомов" (Phantom Reads)

Ситуация, когда при повторном чтении в рамках одной транзакции одна и та же выборка дает разные множества строк.

От неповторяющегося чтения оно отличается тем, что результат повторного обращения к данным изменился не из-за изменения/удаления самих этих данных, а из-за появления новых (фантомных) данных.

Транзакция 1Транзакция 2
 
SELECT SUM(f2) FROM tbl1;
INSERT INTO tbl1 (f1,f2) VALUES (15,20);
 
COMMIT;
 
 
SELECT SUM(f2) FROM tbl1;

Аномалии сериализации

Ситуация, когда параллельное выполнение транзакций приводит к результату, невозможному при последовательном выполнении тех же транзакций.

Транзакция 1Транзакция 2
SELECT SUM(value) FROM mytab
WHERE class = 1;
---------
30
(1 row)
SELECT SUM(value) FROM mytab
WHERE class = 2;
---------
300
(1 row)
INSERT INTO mytab (value, class)
VALUES (30, 2)
INSERT INTO mytab (value, class)
VALUES (300, 1)
COMMIT;
COMMIT;

Уровни изолированности транзакций

Уровень изоляцииПотерянное обновление«Грязное» чтениеНеповторяющееся чтениеФантомное чтениеАномалии сериализации
Read uncommitedне возможнодопускаетсявозможновозможновозможно
Read commitedне возможноне возможновозможновозможновозможно
Repeatable readне возможноне возможноне возможнодопускаетсявозможно
Serializableне возможноне возможноне возможноне возможноне возможно

READ COMMITED

Вариант A

SELECT id, money FROM account WHERE name = 'Romeo';
SELECT id, money FROM account WHERE name = 'Giulietta';
UPDATE account SET money = 500 WHERE id = 13 AND money = 600;
UPDATE account SET money = 200 WHERE id = 42 AND money = 100;
COMMIT;

Вариант B

SELECT id, money FROM account WHERE name = 'Romeo';
COMMIT;
---
SELECT id, money FROM account WHERE name = 'Giulietta';
COMMIT;
---
UPDATE account SET money = 500 WHERE id = 13 AND money = 600;
UPDATE account SET money = 200 WHERE id = 42 AND money = 100;
COMMIT;

Изолированность. Блокировки

Для обеспечения изоляции на данные делают блокировки.

Блокировки могут быть разных уровней:

Проблема такого подхода в том, что пишущие транзакции могут заблокировать читающие транзакции.

Изолированность. MVCC

MVCC
MultiVersion Concurrency Control

UPDATE IN PLACE 1: TABLE

idnamenotes
1AliceGreat at programming
2BobAlways talking to alice
3EveListens to everyone's conversations

UPDATE IN PLACE 2: SCAN

idnamenotes
1Alice
read
Great at programming
2BobAlways talking to alice
3EveListens to everyone's conversations

UPDATE IN PLACE 3: UPDATE

idnamenotes
1AliceGreat at programming
~ update
2
BobAlways talking to alice
3EveListens to everyone's conversations

UPDATE IN PLACE 4: UPDATED

idnamenotes
1AliceGreat at programming
~ update
2
BobWorking very hard
3EveListens to everyone's conversations

UPDATE IN PLACE 5: INSERT

idnamenotes
1AliceGreat at programming
2BobWorking very hard
3EveListens to everyone's conversations
+ insert
4
DaveVery promising new-hire

UPDATE IN PLACE 6: DELETE

idnamenotes
1AliceGreat at programming
2BobWorking very hard
- delete
3
EveListens to everyone's conversations
4DaveVery promising new-hire

UPDATE IN PLACE 7

idnamenotes
1AliceGreat at programming
2BobWorking very hard
4DaveVery promising new-hire

UPDATE IN PLACE 8: REALITY

idnamenotes
1Alice
read
Great at programming
+ update
2
BobWorking very hard
- delete
3
EveListens to everyone's conversations
+ insert
4
DaveVery promising new-hire

MVCC 1: TABLE

TXID: 103
xmin
xmaxidnamenotes
10001AliceGreat at programming
10102BobAlways talk to alice
10203EveListens to everyone's conversations

MVCC 2: UPDATE

TXID: 103
xmin
xmaxidnamenotes
10001AliceGreat at programming
- update
101
02BobAlways talk to alice
10203EveListens to everyone's conversations

MVCC 3: UPDATE IN PROGRESS

TXID: 103
xmin
xmaxidnamenotes
10001AliceGreat at programming
- update
101
1032BobAlways talk to alice
10203EveListens to everyone's conversations

MVCC 4: UPDATE IN PROGRESS

TXID: 103
xmin
xmaxidnamenotes
10001AliceGreat at programming
- update
101
1032BobAlways talk to alice
10203EveListens to everyone's conversations
+ update
103
02BobWorking very hard

MVCC 5: UPDATED

TXID: 104
xmin
xmaxidnamenotes
10001AliceGreat at programming
1011032BobAlways talk to alice
10203EveListens to everyone's conversations
10302BobWorking very hard

MVCC 6: INSERT

TXID: 104
xmin
xmaxidnamenotes
10001AliceGreat at programming
1011032BobAlways talk to alice
10203EveListens to everyone's conversations
10302BobWorking very hard
+ insert
104
04DaveVery promising new-hire

MVCC 7: INSERTED

TXID: 105
xmin
xmaxidnamenotes
10001AliceGreat at programming
1011032BobAlways talk to alice
10203EveListens to everyone's conversations
10302BobWorking very hard
10404DaveVery promising new-hire

MVCC 8: DELETE

TXID: 105
xmin
xmaxidnamenotes
10001AliceGreat at programming
1011032BobAlways talk to alice
- delete
102
1053EveListens to everyone's conversations
10302BobWorking very hard
10404DaveVery promising new-hire

MVCC 9: DELETED

TXID: 106
xmin
xmaxidnamenotes
10001AliceGreat at programming
1011032BobAlways talk to alice
1021053EveListens to everyone's conversations
10302BobWorking very hard
10404DaveVery promising new-hire

Проблемы MVCC

Варианты реализации MVCC

Heap (PostgreSQL)

Rollback segment (MySQL, Oracle)

Блокировки

test=# BEGIN TRANSACTION
test-# ISOLATION LEVEL REPEATABLE READ;
BEGIN
test=# SELECT balance
test-# FROM accounts WHERE name = 'Alice';
balance
---------
400
(1 row)

test=# UPDATE accounts
test-# SET balance = balance + 100
test-# WHERE name = 'Alice';
UPDATE 1



test=# COMMIT;
COMMIT
            
test=# BEGIN TRANSACTION
test-# ISOLATION LEVEL REPEATABLE READ;
BEGIN
test=# SELECT balance
test-# FROM accounts WHERE name = 'Alice';
balance
---------
400
(1 row)





test=# UPDATE accounts
test-# SET balance = balance + 100
test-# WHERE name = 'Alice';


ERROR:  could not serialize access
        due to concurrent update
            

Блокировки

test=# BEGIN TRANSACTION
test-# ISOLATION LEVEL REPEATABLE READ;
BEGIN
test=# SELECT balance
test-# FROM accounts WHERE name = 'Alice';
balance
---------
500
(1 row)

test=# UPDATE accounts
test-# SET balance = balance + 100
test-# WHERE name = 'Alice';
UPDATE 1



test=# ROLLBACK;
ROLLBACK
            
test=# BEGIN TRANSACTION
test-# ISOLATION LEVEL REPEATABLE READ;
BEGIN
test=# SELECT balance
test-# FROM accounts WHERE name = 'Alice';
balance
---------
500
(1 row)





test=# UPDATE accounts
test-# SET balance = balance + 100
test-# WHERE name = 'Alice';


UPDATE 1
test=# COMMIT;
COMMIT
            

Чем плохи «долгие» транзакции?

Часть операций/примитивов не тразакционны

Двухфазный коммит (Two-phase commit)

Трехфазный коммит (Three-phase commit)

Надёжность

Что может пойти не так?

Идея: каким-то образом на реплике поддерживать данные в состоянии как на мастере, тогда в случае выхода из строя мастера, можно сделать реплику мастером и продолжить работу.

Варианты взаимодействия

Мастер-слейв

Подчиненный сервер повторяет состояние главного и не может изменять данные самостоятельно.

Возможен так же вариант, когда данные на подчинённом сервере повторяются с задержкой.

Мастер-мастер
Оба сервера равнозначны и могут обрабатываь запросы как на чтение, так и на изменение данных.

Варианты реализации

Физическая
Передаётся информация о физическом изменении страниц базы данных.
Логическая
Передаётся информация об измененни записей базы данных.
Передача запросов
Передаётся информация о выполненных запросах.

Гарантии репликации

Синхронная
Мастер-сервер не подтверждает транзакцию до того, как реплика не подтвердит получение данных.
Асинхронная
Мастер-сервер не ждёт подтвержения получения данных от реплики.
Majority
Мастер-сервер ждёт подтвержения получения данных от N-реплик.
Семисинхронная (MySQL)
Мастер-сервер не подтверждает транзакцию до того, как "живые" реплики не подтвердят получение данных.

Репликация ⥋ вид кластера

Есть несколько вариантов организации кластера:

Общая память

Кластер представляется как одна система (Single-System Image, SSI), то есть эквивалент операционной системы для кластера в целом.

В результате нет необходимости в модификации существующих приложений — все это осуществляется автоматически, прозрачно для приложений пообно SMP.

Общие диски

Узлы кластера используют единую файловую систему.

Операционная система берет на себя координацию работы с файловой системой и ряд сервисных функций.

Приложение должно явно поддерживать работу в кластере.

Ничего общего

Функции кластера целиком реализуются внутри приложения.

Физическая репликация

Общий принцип:

Плюсы:

Физическая репликация

Минусы:

Логическая репликация

Плюсы:

Логическая репликация

Минусы:

Синхронная vs асинхронная репликация?

CAP-теорема

В распределенной системе возможно выбрать только 2 из 3-х свойств:

Синхронная vs асинхронная репликация?

CAP-теорема

На самом деле, если у нас больше одного сервера обрабатывающего запросы, то мы уже выбрали P.

Поэтому выбирать можем только между A и C.

Что происходит после поломки мастера?

Автоматическое переключение

Необходимо выбрать новый мастер и реплики могут сделать это самостоятельно (RAFT). Для достижения консенсуса требуется `N/2+1` доступных реплик.

Split-brain

Fencing

Защитный механизм защищающий от split-brain. Мастер потеряв связанность с остальным кластером, должен через заданное время перестать считать себя мастером.

С другой стороны, возможно он действительно остался один и перестав обрабатывать запросы произошел полный отказ СУБД.

И кто же нас спасёт тогда?

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

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

Если данных больше чем может поместиться на одном сервере или недостаточно производительности, то нужно шардировать базу.

Шардирование (шардинг) баз данных
Метод распределения данных между несколькими отдельными частями — шардами. Каждый шард располагается на отдельном сервере или группе серверов, что позволяет выполнять запросы параллельно.
Ключ шардирования
Это столбец (или несколько столбцов) в данных, по которому система определяет, в какой шард попадёт конкретная строка.

Цели шардирования

Проблемы шардирования

Решардинг

Если данных становится так много, что они не помещаются на имеющиеся шарды, то добавляют еще - это называется решардингом.

Для упрощения этого процесса есть приемы, например, виртуальное шардирование.

Решардинг

Итоги

Так какую базу данных выбрать?

Универсального ответа нет, надо смотреть на< характер данных и профиль нагрузкиЖ

Все рекомендации субъективны и в основном обусловлены личным опытом.

Ссылки

Спасибо за внимание!