ДЗ
Репликация.
Инструкция к ДЗ доступна также по [ссылке](https://otusmetodist.yonote.ru/share/269b787b-4c2a-461c-8049-e4b693b841cd/doc/homework-3-replikaciya-JnhvFGijD6)
-----
1) Выбираем 2 запроса на чтение ([/user/get/{id}](https://github.com/OtusTeam/highload/blob/master/homework/openapi.json#L127) и [/user/search](https://github.com/OtusTeam/highload/blob/master/homework/openapi.json#L167) из [спецификации](https://github.com/OtusTeam/highload/blob/master/homework/openapi.json)).
Составить план нагрузочного тестирования, который шлет запросы на эти api.
2) Создаем нагрузку на чтение с помощью составленного на предыдущем шаге плана, делаем замеры.
3) Настроить 2 слейва и 1 мастер. Включить потоковую репликацию.
4) Добавить в проект replicated datasource:
Можно рассмотреть несколько несколько вариантов:
- Использование [MaxScale](https://github.com/mariadb-corporation/MaxScale) и [MySql Replication JDBC Driver](http://dev.mysql.com/doc/connector-j/en/connector-j-master-slave-replication-connection.html)
- Использование Database Proxy server like [MySQL Proxy](http://dev.mysql.com/doc/mysql-proxy/en/)
- Использование Replication DataSource: [kwon37xi/replication-datasource-boot](https://github.com/kwon37xi/replication-datasource-boot).
Рекомендуется последний вариант: написать `ReplicationRoutingDataSource`, который выбирает использовать master или slave в зависимости от типа транзакции.
Данное решение работает с [TransactionSynchronizationManager](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html).
При использовании [Spring framework](http://spring.io/) достаточно установить `@Transactional(readOnly = true|false)`
Переносим запросы на чтение (transaction == read only) на чтение со слейва.
5) Создаем нагрузку на чтение с помощью составленного на предыдущем шаге плана, делаем замеры. Добавить сравнение результатов в отчет.
8) Настроить кворумную синхронную репликацию.
(Опционально) воспользоваться одним из кластерных расширения Postgres (например patroni).
9) Создать нагрузку на запись в любую тестовую таблицу. На стороне, которой нагружаем считать, сколько строк мы успешно записали.
Например, API.
Пример: [Дашборды для Grafana](https://grafana.com/grafana/dashboards/893)
10) Убиваем одну из реплик (`kill -9`, `docker stop`)
11) Заканчиваем нагрузку на запись.
12) Выбираем самый свежий слейв. Промоутим его до мастера. Переключаем на него второй слейв.
13) Проверяем, есть ли потери транзакций.
**Форма сдачи ДЗ**
- Предоставить ссылку на исходный код (github, gitlab, etc)
- Предоставить докеризированное приложение, которое можно запустить при помощи docker-compose (может лежать рядом с исходным кодом) ИЛИ развернутое приложение, доступное извне ИЛИ инструкция по запуску
- Предоставить отчет в свободной форме о проделанное работе