From 288087e37be955c7d4a37a054d5c84eb7556019d Mon Sep 17 00:00:00 2001 From: NorthernWarrior88 <131596574+NorthernWarrior88@users.noreply.github.com> Date: Sat, 15 Mar 2025 20:14:28 +0500 Subject: [PATCH 1/3] Index.md --- 12-05.md | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/12-05.md b/12-05.md index eabebfaf..e1baa9c9 100644 --- a/12-05.md +++ b/12-05.md @@ -1,24 +1,23 @@ -# Домашнее задание к занятию «Индексы» +# Домашнее задание к занятию «Индексы» Яковлев Д.А -### Инструкция по выполнению домашнего задания -1. Сделайте fork [репозитория c шаблоном решения](https://github.com/netology-code/sys-pattern-homework) к себе в Github и переименуйте его по названию или номеру занятия, например, https://github.com/имя-вашего-репозитория/gitlab-hw или https://github.com/имя-вашего-репозитория/8-03-hw). -2. Выполните клонирование этого репозитория к себе на ПК с помощью команды `git clone`. -3. Выполните домашнее задание и заполните у себя локально этот файл README.md: - - впишите вверху название занятия и ваши фамилию и имя; - - в каждом задании добавьте решение в требуемом виде: текст/код/скриншоты/ссылка; - - для корректного добавления скриншотов воспользуйтесь инструкцией [«Как вставить скриншот в шаблон с решением»](https://github.com/netology-code/sys-pattern-homework/blob/main/screen-instruction.md); - - при оформлении используйте возможности языка разметки md. Коротко об этом можно посмотреть в [инструкции по MarkDown](https://github.com/netology-code/sys-pattern-homework/blob/main/md-instruction.md). -4. После завершения работы над домашним заданием сделайте коммит (`git commit -m "comment"`) и отправьте его на Github (`git push origin`). -5. Для проверки домашнего задания преподавателем в личном кабинете прикрепите и отправьте ссылку на решение в виде md-файла в вашем Github. -6. Любые вопросы задавайте в чате учебной группы и/или в разделе «Вопросы по заданию» в личном кабинете. - -Желаем успехов в выполнении домашнего задания. ### Задание 1 Напишите запрос к учебной базе данных, который вернёт процентное отношение общего размера всех индексов к общему размеру всех таблиц. +Решение: + +```sql +SELECT ROUND((SUM(index_length) / (SUM(data_length) + SUM(index_length))) * 100, 2) AS '% общего размера индексов к общему ращмеру всех таблиц', SUM(index_length) AS 'Общий размер всех индексов', SUM(data_length)+SUM(index_length) AS 'Общий размер всех таблиц' +FROM information_schema.tables +WHERE information_schema.tables.table_schema = 'sakila'; + +``` + +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/patch-1/%D0%91%D0%B5%D0%B7%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B8.png) + + ### Задание 2 Выполните explain analyze следующего запроса: @@ -30,11 +29,29 @@ where date(p.payment_date) = '2005-07-30' and p.payment_date = r.rental_date and - перечислите узкие места; - оптимизируйте запрос: внесите корректировки по использованию операторов, при необходимости добавьте индексы. -## Дополнительные задания (со звёздочкой*) -Эти задания дополнительные, то есть не обязательные к выполнению, и никак не повлияют на получение вами зачёта по этому домашнему заданию. Вы можете их выполнить, если хотите глубже шире разобраться в материале. + Решение: -### Задание 3* +До оптимизации: -Самостоятельно изучите, какие типы индексов используются в PostgreSQL. Перечислите те индексы, которые используются в PostgreSQL, а в MySQL — нет. +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/main/3.png) + + После анализа исходного запроса было выявлено, что основным узким местом является подключение избыточных таблиц, таких как inventory, rental и film. Эти таблицы не несут полезной нагрузки для расчёта суммы платежей клиентов за определённую дату, так как их данные не используются в итоговых вычислениях. Их исключение из запроса позволит сократить время выполнения и снизить нагрузку на систему. + +Кроме того, использование оператора DISTINCT требует выполнения сортировки и удаления дубликатов, что может быть ресурсоёмким, особенно при работе с большими объёмами данных. Также стоит учитывать, что оконные функции, хотя и мощные, могут быть затратными по времени и ресурсам при обработке крупных наборов данных. + +Для оптимизации запроса всю необходимую информацию можно получить только из таблиц payment и customer, что упростит логику запроса и повысит его производительность. + + + +Код после оптимизации: + +```sql +EXPLAIN ANALYZE +SELECT concat(c.last_name, ' ', c.first_name) AS customers, SUM(p.amount) +FROM customer c +JOIN rental r ON c.customer_id = r.customer_id +JOIN payment p ON r.rental_date = p.payment_date WHERE date(p.payment_date) = '2005-07-30' +GROUP BY c.customer_id; +``` +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/main/4.png) -*Приведите ответ в свободной форме.* From 7480469649d5828551fac82f3cb8b82ee538be01 Mon Sep 17 00:00:00 2001 From: NorthernWarrior88 <131596574+NorthernWarrior88@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:21:44 +0500 Subject: [PATCH 2/3] Update 12-06.md --- 12-06.md | 63 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/12-06.md b/12-06.md index 8e3ae9e2..ca7d7a95 100644 --- a/12-06.md +++ b/12-06.md @@ -1,21 +1,6 @@ -# Домашнее задание к занятию «Репликация и масштабирование. Часть 1» +# Домашнее задание к занятию «Репликация и масштабирование. Часть 1» ЯКОВЛЕВ Д.А -### Инструкция по выполнению домашнего задания -1. Сделайте fork [репозитория c шаблоном решения](https://github.com/netology-code/sys-pattern-homework) к себе в Github и переименуйте его по названию или номеру занятия, например, https://github.com/имя-вашего-репозитория/gitlab-hw или https://github.com/имя-вашего-репозитория/8-03-hw). -2. Выполните клонирование этого репозитория к себе на ПК с помощью команды `git clone`. -3. Выполните домашнее задание и заполните у себя локально этот файл README.md: - - впишите вверху название занятия и ваши фамилию и имя; - - в каждом задании добавьте решение в требуемом виде: текст/код/скриншоты/ссылка; - - для корректного добавления скриншотов воспользуйтесь инструкцией [«Как вставить скриншот в шаблон с решением»](https://github.com/netology-code/sys-pattern-homework/blob/main/screen-instruction.md); - - при оформлении используйте возможности языка разметки md. Коротко об этом можно посмотреть в [инструкции по MarkDown](https://github.com/netology-code/sys-pattern-homework/blob/main/md-instruction.md). -4. После завершения работы над домашним заданием сделайте коммит (`git commit -m "comment"`) и отправьте его на Github (`git push origin`). -5. Для проверки домашнего задания преподавателем в личном кабинете прикрепите и отправьте ссылку на решение в виде md-файла в вашем Github. -6. Любые вопросы задавайте в чате учебной группы и/или в разделе «Вопросы по заданию» в личном кабинете. - -Желаем успехов в выполнении домашнего задания. - ---- ### Задание 1 @@ -24,6 +9,40 @@ *Ответить в свободной форме.* --- +Решение: + +Master-Slave: + + Роли: Один master (запись), один или несколько slave (чтение). + + Репликация: Однонаправленная (master → slave). + + Отказоустойчивость: Низкая (master — единая точка отказа). + + Сложность: Простота настройки. + + Использование: Масштабирование чтения, резервное копирование. + +Master-Master: + + Роли: Все серверы — master (запись и чтение). + + Репликация: Двунаправленная (master ↔ master). + + Отказоустойчивость: Высокая (если один master падает, другой работает). + + Сложность: Высокая (нужно решать конфликты данных). + + Использование: Высокая доступность, распределённые системы. + +Главное отличие: + + Master-Slave — для простого масштабирования чтения. + + Master-Master — для высокой доступности и распределённой записи. + + + ### Задание 2 @@ -33,13 +52,13 @@ --- -## Дополнительные задания (со звёздочкой*) -Эти задания дополнительные, то есть не обязательные к выполнению, и никак не повлияют на получение вами зачёта по этому домашнему заданию. Вы можете их выполнить, если хотите глубже шире разобраться в материале. +Решение: ---- +Состояние сервера(SLAVE) -### Задание 3* +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/main/DB-06(1).png ) +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/main/DB-06(2).png) -Выполните конфигурацию master-master репликации. Произведите проверку. +Мною было создано на мастере 2 БД SAKILA и NETOLOGY, на скриншоте процесс создания второй БД и проверка репликации на слейве. -*Приложите скриншоты конфигурации, выполнения работы: состояния и режимы работы серверов.* +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/main/DB-06(3).png) From 37b67946804fd991ced26f9d34b744ac660629da Mon Sep 17 00:00:00 2001 From: NorthernWarrior88 <131596574+NorthernWarrior88@users.noreply.github.com> Date: Fri, 21 Mar 2025 22:15:24 +0500 Subject: [PATCH 3/3] replica2.md --- 12-07.md | 94 +++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 70 insertions(+), 24 deletions(-) diff --git a/12-07.md b/12-07.md index eee3b954..5df4f0d2 100644 --- a/12-07.md +++ b/12-07.md @@ -1,21 +1,5 @@ -# Домашнее задание к занятию «Репликация и масштабирование. Часть 2» +# Домашнее задание к занятию «Репликация и масштабирование. Часть 2» Яковлев Д.А -### Инструкция по выполнению домашнего задания - -1. Сделайте fork [репозитория c шаблоном решения](https://github.com/netology-code/sys-pattern-homework) к себе в Github и переименуйте его по названию или номеру занятия, например, https://github.com/имя-вашего-репозитория/gitlab-hw или https://github.com/имя-вашего-репозитория/8-03-hw). -2. Выполните клонирование этого репозитория к себе на ПК с помощью команды `git clone`. -3. Выполните домашнее задание и заполните у себя локально этот файл README.md: - - впишите вверху название занятия и ваши фамилию и имя; - - в каждом задании добавьте решение в требуемом виде: текст/код/скриншоты/ссылка; - - для корректного добавления скриншотов воспользуйтесь инструкцией [«Как вставить скриншот в шаблон с решением»](https://github.com/netology-code/sys-pattern-homework/blob/main/screen-instruction.md); - - при оформлении используйте возможности языка разметки md. Коротко об этом можно посмотреть в [инструкции по MarkDown](https://github.com/netology-code/sys-pattern-homework/blob/main/md-instruction.md). -4. После завершения работы над домашним заданием сделайте коммит (`git commit -m "comment"`) и отправьте его на Github (`git push origin`). -5. Для проверки домашнего задания преподавателем в личном кабинете прикрепите и отправьте ссылку на решение в виде md-файла в вашем Github. -6. Любые вопросы задавайте в чате учебной группы и/или в разделе «Вопросы по заданию» в личном кабинете. - -Желаем успехов в выполнении домашнего задания. - ---- ### Задание 1 @@ -25,7 +9,58 @@ - master-сервер и несколько slave-серверов; -*Дайте ответ в свободной форме.* +Решение: + + Активный master-сервер и пассивный репликационный slave-сервер +Преимущества: + + ! Повышение отказоустойчивости: + + Если master-сервер выйдет из строя, slave-сервер может быть переведен в режим master (вручную или автоматически), что минимизирует простои системы. + + Данные на slave-сервере остаются актуальными, так как он постоянно синхронизируется с master-сервером. + + ! Резервное копирование без нагрузки на master: + + Резервные копии можно создавать на slave-сервере, не нагружая master-сервер. Это особенно полезно для больших баз данных. + + ! Чтение данных без нагрузки на master: + + Запросы на чтение (SELECT) можно перенаправлять на slave-сервер, что снижает нагрузку на master-сервер и улучшает производительность системы. + + ! Тестирование и разработка: + + Slave-сервер можно использовать для тестирования новых функций, обновлений или запросов, не затрагивая основную базу данных на master-сервере. + + + Master-сервер и несколько slave-серверов +Преимущества: + +! Масштабирование чтения: + + Несколько slave-серверов позволяют распределять нагрузку от запросов на чтение между несколькими узлами. Это особенно полезно для систем с высокой нагрузкой на чтение (например, веб-приложения с большим количеством пользователей). + +! Повышенная отказоустойчивость: + + При выходе из строя одного slave-сервера, другие продолжают работать, обеспечивая доступность данных. + + В случае сбоя master-сервера, один из slave-серверов может быть быстро переведен в режим master. + + +! Параллельная обработка запросов: + + Запросы на чтение могут выполняться параллельно на нескольких slave-серверах, что ускоряет обработку данных. + +! Гибкость в использовании: + + Разные slave-серверы можно использовать для разных целей: один для аналитики, другой для резервного копирования, третий для обслуживания запросов пользователей. + +! Балансировка нагрузки: + + Нагрузка на чтение может быть распределена между несколькими slave-серверами с использованием балансировщиков нагрузки (например, HAProxy или Nginx). + + + --- @@ -42,12 +77,23 @@ *Пришлите блоксхему, где и что будет располагаться. Опишите, в каких режимах будут работать сервера.* -## Дополнительные задания (со звёздочкой*) -Эти задания дополнительные, то есть не обязательные к выполнению, и никак не повлияют на получение вами зачёта по этому домашнему заданию. Вы можете их выполнить, если хотите глубже шире разобраться в материале. +Решение: +Вертикальный шаринг: + +Для вертикального шаринга я каждую таблицу поместил на разные сервера. + +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/main/1234.png) + + +Горизаонтальный шардинг: + +Я предполагаю, что самая большая таблица будет являтся - книги т.к. она связанна как и с пользователями и с магазинами.Горизонтальный шардинг буду проводить с таблицей книги, за shard key возму books_id. Разбиваю таблицу на две партиции от books_id A-N до books_id O-Z. Для данного вида шардирования подойдет: + + master-сервер и несколько slave-серверов; + активный сервер со специальным механизмом репликации — distributed replicated block device (DRBD); + +![alt text](https://github.com/NorthernWarrior88/sys-pattern-homework/blob/main/132134.png) + ---- -### Задание 3* -Выполните настройку выбранных методов шардинга из задания 2. -*Пришлите конфиг Docker и SQL скрипт с командами для базы данных*.