Опишите основные преимущества использования масштабирования методами:
- активный master-сервер и пассивный репликационный slave-сервер,
- master-сервер и несколько slave-серверов,
- активный сервер со специальным механизмом репликации – distributed replicated block device (DRBD),
- SAN-кластер.
Дайте ответ в свободной форме.
- в первом примере мы можем писать в master-сервер и читать данные slave-сервер, так же в этой конфигурации снимаем нагрузку с master-сервер.
- в этом случае тоже самое что и в первом только у нас большое количество slave-серверов, значит больше копий баз и больше точек откуда можно читать информацию из баз для снятие нагружки.
- на сколько помню технологию то там блочный устройство ( активное и пассивное), при выхода устройства на первом сервере можно задействовать пассивное блочное устройство, тем самым в кратчайшие сроки восстановить работу сервиса.
- строются большие интерпрайз сети SAN для выдачи серверам большие(по объему) блочные устройства.
Разработайте план для выполнения горизонтального и вертикального шаринга базы данных. База данных состоит из трех таблиц:
- пользователи,
- книги,
- магазины (столбцы произвольно).
Опишите принципы построения системы и их разграничение или (и) разбивку между базами данных.
Пришлите блок схему, где и что будет располагатся. Опишите, в каких режимах будут работать сервера.
Вертикальный шардинг — это выделение таблицы или группы таблиц на отдельный сервер. Например, в приложении есть такие таблицы:
- пользователи — данные пользователей
- книги — книги пользователей
- магазины — магазины
Таблицу users Вы оставляете на одном сервере, а таблицы книги и магазины переносите на другой. В таком случае в приложении Вам необходимо будет использовать соответствующее соединение для работы с каждой таблицей:
$пользователи_connection = mysql_connect('10.10.0.1', 'root', 'pwd');
$гниги_connection = mysql_connect('10.10.0.2', 'root', 'pwd';
# какой-то код и все такое...
$q = mysql_query('SELECT * FROM пользователи WHERE ...', $пользователи_connection);
# еще какой-то код...
$q = mysql_query('SELECT * FROM книги WHERE...', $книги_connection);
# еще какой-то код...
$q = mysql_query('SELECT * FROM магазины WHERE...', $магазины_connection);
Для каждой таблицы или группы таблиц будет отдельное соединение
В отличие от репликации, мы используем разные соединения для любых операций, но с определенными таблицами.
Горизонтальный шардинг — это разделение одной таблицы на разные сервера. Это необходимо использовать для огромных таблиц, которые не умещаются на одном сервере. Разделение таблицы на куски делается по такому принципу:
-
На нескольких серверах создается одна и та же таблица (только структура, без данных). В приложении выбирается условие, по которому будет определяться нужное соединение (например, четные на один сервер, а нечетные — на другой).
-
Перед каждым обращением к таблице происходит выбор нужного соединения.
-
Допустим, наше приложение работает с огромной таблицей, которая хранит фотографии пользователей. Мы подготовили два сервера (обычно они называются шардами) для этой таблицы. Для нечетных пользователей мы будем работать с первыми сервером, а для четных — со вторым. Таким образом, на каждом из серверов будет только часть всех данных о фотках пользователей. Это будет выглядеть так:
'2' => '10.10.0.2',
];
$user_id = $_SESSION['user_id'];
# получение фотографий для пользователя $user_id
$connection_num = $user_id % 2 == 0 ? 1 : 2;
$connection = mysql_connect($photo_connections[$connection_num], 'root', 'pwd');
$q = mysql_query('SELECT * FROM photos WHREE user_id = ' . intval($user_id), $connection);
Перед обращением к таблице, мы выбираем нужное нам соединение
Результат вот этой операции $user_id % 2 будет остатком от деления на 2. Т.е. для четных чисел — 0, а для нечетных — 1.
Любая работа с таблицей photos теперь будет происходить только после получения нужного соединения на основе $user_id.
картинка честно взятая из лекции ;)