From c399664b4c187f403759a6cc998dc932255df147 Mon Sep 17 00:00:00 2001 From: Andrey Ivanov Date: Sun, 21 Feb 2021 11:58:00 -0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=973=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 7 +++++ cicd/dc_client.yml | 13 ++++++++++ test/dz003/REPORT.md | 48 ++++++++++++++++++++++++++++++++++- test/dz003/scripts/dz003_2.sh | 15 +++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 cicd/dc_client.yml create mode 100755 test/dz003/scripts/dz003_2.sh diff --git a/Makefile b/Makefile index b887f3e..896f23a 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ app-down: app-reload: app-down app-up db-up: + rm -rf /opt/mysql_master/* ; \ rm -rf /opt/mysql_slave1/* ; \ rm -rf /opt/mysql_slave2/* ; \ docker-compose -f ./cicd/dc_db.yml up -d --build ; \ @@ -17,6 +18,12 @@ db-up: db-down: docker-compose -f ./cicd/dc_db.yml down +client-up: + docker-compose -f ./cicd/dc_client.yml up -d --build + +client-down: + docker-compose -f ./cicd/dc_client.yml down + prom-up: docker-compose -f ./test/monitor/docker-compose.yml up -d --build diff --git a/cicd/dc_client.yml b/cicd/dc_client.yml new file mode 100644 index 0000000..aa6358a --- /dev/null +++ b/cicd/dc_client.yml @@ -0,0 +1,13 @@ +version: '3' +services: + + mysql_client: + image: mysql:5.7 + hostname: "mysql_client" + container_name: mysql_client + restart: always + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_PORT: 3306 + volumes: + - ./../test/dz003/scripts:/scripts \ No newline at end of file diff --git a/test/dz003/REPORT.md b/test/dz003/REPORT.md index 41ef341..6969d0b 100644 --- a/test/dz003/REPORT.md +++ b/test/dz003/REPORT.md @@ -174,7 +174,53 @@ binlog_do_db = app sudo make app-up ``` ### 9. Создать нагрузку на запись в любую тестовую таблицу. На стороне, которой нагружаем считать, сколько строк мы успешно записали. +- #### Запускаем кластер: + ``` + sudo make db-up + ``` +- #### Запускаем контейнер с mysql-client: + ``` + sudo make client-up + ``` +- #### Заходим внутрь контейнера и запускаем скрипт: + ``` + /scripts/dz003_2.sh + ``` ### 10. С помощью kill -9 убиваем мастер MySQL. +- #### Т.к. образ mysql:5.7 не содержит команды ps, не мудрим и грохаем контейнер с мастером: + ``` + sudo docker kill mysql_master + ``` ### 11. Заканчиваем нагрузку на запись. +- #### Возвращаемся в контейнер клиента и запоминаем, знаение счетчика строк успешно записанных в таблицу мастера + В нашем случае, скрипт тормазнул после добавления 10233 строк ### 12. Выбираем самый свежий слейв. Промоутим его до мастера. Переключаем на него второй слейв. -### 13. Проверяем, есть ли потери транзакций. +- #### Определяем свежайшую реплику: + ``` + sudo docker exec mysql_slave1 sh -c "export MYSQL_PWD=root; mysql -u root -e 'SHOW SLAVE STATUS\G' | grep Master_Log_File" + sudo docker exec mysql_slave2 sh -c "export MYSQL_PWD=root; mysql -u root -e 'SHOW SLAVE STATUS\G' | grep Master_Log_File" + ``` + В нашем случае оба слейва остановились на mysql-bin.000003, поэтому мастером будем промоутить mysql_slave1 + + З.Ы. Еще можно было бы поиграть с [отложенной репликацией](https://dev.mysql.com/doc/refman/5.6/en/replication-delayed.html), но не в рамках данного эксперимента + +- #### Останавливаем на всех слейвах потоки получения обновлений бинарного лога: + ``` + sudo docker exec mysql_slave1 sh -c "export MYSQL_PWD=root; mysql -u root -e 'STOP SLAVE IO_THREAD; SHOW PROCESSLIST;'" + sudo docker exec mysql_slave2 sh -c "export MYSQL_PWD=root; mysql -u root -e 'STOP SLAVE IO_THREAD; SHOW PROCESSLIST;'" + ``` +- #### Полностью останавливаем слэйв который будем промоутить до мастера и сбрасываем его бинлог: + ``` + sudo docker exec mysql_slave1 sh -c "export MYSQL_PWD=root; mysql -u root -e 'STOP SLAVE; RESET MASTER;'" + ``` +- #### Оставшийся слэйв переключаем на новый мастер: + ``` + sudo docker exec {slave_to_promote} sh -c "export MYSQL_PWD=root; mysql -u root -e 'STOP SLAVE; CHANGE MASTER TO MASTER_HOST='{slave_to_promote}'; START SLAVE;'" + ``` +### 13. Проверяем, есть ли потери транзакций: +- #### Проверяем количество строк в тестовой таблице на новом мастере: + ``` + sudo docker exec {slave_to_promote} sh -c "export MYSQL_PWD=root; mysql -u root -e 'USE app; SELECT count(*) from test;'" + ``` + В нашем случае, потерь транзакций не наблюдается. В таблице нового мастера те же 10233 строки. + diff --git a/test/dz003/scripts/dz003_2.sh b/test/dz003/scripts/dz003_2.sh new file mode 100755 index 0000000..a05dac5 --- /dev/null +++ b/test/dz003/scripts/dz003_2.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +mysql -uroot -proot -h mysql_master -t app -e 'CREATE TABLE IF NOT EXISTS test (`id` INT(11), `name` VARCHAR(255));' + + +let i=1 +let noerr=0 + +while [ $noerr = 0 ] +do + mysql -uroot -proot -h mysql_master -t app -e 'INSERT INTO test (`id`,`name`) VALUES ('$i',"string_value_'$1'")' || ((noerr=1 )) + echo $i + ((i++)) +done +echo "Err" \ No newline at end of file