From e727e7e7e7414e2e5ab48536be615629d7e8a08a Mon Sep 17 00:00:00 2001 From: Andrey Ivanov Date: Thu, 11 Feb 2021 11:40:15 -0500 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 12 ++-- cicd/dbinit/init.sql | 2 - cicd/docker-compose.yml | 39 ++++++------ cicd/init.sh | 62 +++++++------------ cicd/mysql/master_init/init.sql | 3 - cicd/mysql/mysql_master.conf | 4 +- .../{mysql_slave.conf => mysql_slave1.conf} | 6 +- cicd/mysql/mysql_slave2.conf | 9 +++ cicd/mysql/slave_init/init.sql | 2 - internal/application/application.go | 4 +- pkg/dataset/generator.go | 10 ++- 11 files changed, 76 insertions(+), 77 deletions(-) delete mode 100644 cicd/dbinit/init.sql mode change 100644 => 100755 cicd/init.sh delete mode 100644 cicd/mysql/master_init/init.sql rename cicd/mysql/{mysql_slave.conf => mysql_slave1.conf} (80%) create mode 100644 cicd/mysql/mysql_slave2.conf delete mode 100644 cicd/mysql/slave_init/init.sql diff --git a/Makefile b/Makefile index 0725e00..1bbc546 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,18 @@ cdir = $(shell pwd) up: - sudo -S docker-compose -f ./cicd/docker-compose.yml up -d --build - + docker-compose -f ./cicd/docker-compose.yml up -d --build + ./cicd/init.sh down: shutdown clean shutdown: - sudo -S docker-compose -f ./cicd/docker-compose.yml down + docker-compose -f ./cicd/docker-compose.yml down + sudo docker rmi $$(sudo docker images -a | grep '' | awk '{print $$3}') clean: - sudo docker rmi $(sudo docker images | grep '' | awk '{print $3}') + rm -rf /opt/mysql_master/* ; \ + rm -rf /opt/mysql_slave1/* ; \ + rm -rf /opt/mysql_slave2/* ; \ + sudo docker rmi $$(sudo docker images -a | grep '' | awk '{print $$3}') .PHONY: up down \ No newline at end of file diff --git a/cicd/dbinit/init.sql b/cicd/dbinit/init.sql deleted file mode 100644 index 4d13934..0000000 --- a/cicd/dbinit/init.sql +++ /dev/null @@ -1,2 +0,0 @@ -CREATE DATABASE IF NOT EXISTS `app` CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL ON `app`.* TO 'app'@'%' identified by 'app'; \ No newline at end of file diff --git a/cicd/docker-compose.yml b/cicd/docker-compose.yml index b63f49c..1688d7a 100644 --- a/cicd/docker-compose.yml +++ b/cicd/docker-compose.yml @@ -8,38 +8,41 @@ services: restart: always environment: MYSQL_ROOT_PASSWORD: root - MYSQL_USER: app - MYSQL_PASSWORD: app - MYSQL_DATABASE: app MYSQL_PORT: 3306 MYSQL_LOWER_CASE_TABLE_NAMES: 0 - ports: - - 13306:3306 volumes: - ./mysql/mysql_master.conf:/etc/mysql/conf.d/mysql.conf.cnf - /opt/mysql_master:/var/lib/mysql - - ./mysql/master_init:/docker-entrypoint-initdb.d - mysql_slave: + mysql_slave1: image: mysql:5.7 - hostname: "mysql_slave" - container_name: mysql_slave + hostname: "mysql_slave1" + container_name: mysql_slave1 restart: always environment: MYSQL_ROOT_PASSWORD: root - MYSQL_USER: app - MYSQL_PASSWORD: app - MYSQL_DATABASE: app MYSQL_PORT: 3306 MYSQL_LOWER_CASE_TABLE_NAMES: 0 - ports: - - 23306:3306 depends_on: - mysql_master volumes: - - ./mysql/mysql_slave.conf:/etc/mysql/conf.d/mysql.conf.cnf - - /opt/mysql_slave:/var/lib/mysql - - ./mysql/slave_init:/docker-entrypoint-initdb.d + - ./mysql/mysql_slave1.conf:/etc/mysql/conf.d/mysql.conf.cnf + - /opt/mysql_slave1:/var/lib/mysql + + mysql_slave2: + image: mysql:5.7 + hostname: "mysql_slave2" + container_name: mysql_slave2 + restart: always + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_PORT: 3306 + MYSQL_LOWER_CASE_TABLE_NAMES: 0 + depends_on: + - mysql_master + volumes: + - ./mysql/mysql_slave2.conf:/etc/mysql/conf.d/mysql.conf.cnf + - /opt/mysql_slave2:/var/lib/mysql app: build: @@ -50,7 +53,7 @@ services: APP_SERVER_ADDRESS: 0.0.0.0 APP_SERVER_PORT: 8080 APP_DSN_HOST: mysql_master - APP_DSN_PORT: 13306 + APP_DSN_PORT: 3306 APP_DSN_USER: app APP_DSN_PASS: app APP_DSN_BASE: app diff --git a/cicd/init.sh b/cicd/init.sh old mode 100644 new mode 100755 index 7da191f..baa8fce --- a/cicd/init.sh +++ b/cicd/init.sh @@ -1,59 +1,45 @@ #!/bin/bash - mysql: - image: mysql:5.6 - hostname: "mysql" - container_name: mysql - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: app - MYSQL_USER: app - MYSQL_PASSWORD: app - volumes: - - /opt/mysql:/var/lib/mysql - - ./dbinit:/docker-entrypoint-initdb.d - ports: - - "3306:3306" - - - - - -docker-compose down -rm -rf ./master/data/* -rm -rf ./slave/data/* -docker-compose build -docker-compose up -d - -until docker exec mysql_master sh -c 'export MYSQL_PWD=111; mysql -u root -e ";"' +until docker exec mysql_master sh -c 'export MYSQL_PWD=root; mysql -u root -e ";"' do echo "Waiting for mysql_master database connection..." sleep 4 done -priv_stmt='GRANT REPLICATION SLAVE ON *.* TO "mydb_slave_user"@"%" IDENTIFIED BY "mydb_slave_pwd"; FLUSH PRIVILEGES;' -docker exec mysql_master sh -c "export MYSQL_PWD=111; mysql -u root -e '$priv_stmt'" +priv_stmt='CREATE DATABASE IF NOT EXISTS app CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL ON app.* TO "app"@"%" IDENTIFIED BY "app"; GRANT REPLICATION SLAVE ON *.* TO "mydb_slave_user"@"%" IDENTIFIED BY "mydb_slave_pwd"; FLUSH PRIVILEGES;' +docker exec mysql_master sh -c "export MYSQL_PWD=root; mysql -u root -e '$priv_stmt'" -until docker-compose exec mysql_slave sh -c 'export MYSQL_PWD=111; mysql -u root -e ";"' +until docker exec mysql_slave1 sh -c 'export MYSQL_PWD=root; mysql -u root -e ";"' do - echo "Waiting for mysql_slave database connection..." + echo "Waiting for mysql_slave1 database connection..." sleep 4 done +until docker exec mysql_slave2 sh -c 'export MYSQL_PWD=root; mysql -u root -e ";"' +do + echo "Waiting for mysql_slave2 database connection..." + sleep 4 +done + +priv_stmt='CREATE DATABASE IF NOT EXISTS app CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL ON app.* TO "app"@"%" IDENTIFIED BY "app"; FLUSH PRIVILEGES;' +docker exec mysql_slave1 sh -c "export MYSQL_PWD=root; mysql -u root -e '$priv_stmt'" +docker exec mysql_slave2 sh -c "export MYSQL_PWD=root; mysql -u root -e '$priv_stmt'" + docker-ip() { docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@" } -MS_STATUS=`docker exec mysql_master sh -c 'export MYSQL_PWD=111; mysql -u root -e "SHOW MASTER STATUS"'` -CURRENT_LOG=`echo $MS_STATUS | awk '{print $6}'` -CURRENT_POS=`echo $MS_STATUS | awk '{print $7}'` +MS_STATUS=`docker exec mysql_master sh -c 'export MYSQL_PWD=root; mysql -u root -e "SHOW MASTER STATUS"' | grep mysq` +CURRENT_LOG=`echo $MS_STATUS | awk '{print $1}'` +CURRENT_POS=`echo $MS_STATUS | awk '{print $2}'` start_slave_stmt="CHANGE MASTER TO MASTER_HOST='$(docker-ip mysql_master)',MASTER_USER='mydb_slave_user',MASTER_PASSWORD='mydb_slave_pwd',MASTER_LOG_FILE='$CURRENT_LOG',MASTER_LOG_POS=$CURRENT_POS; START SLAVE;" -start_slave_cmd='export MYSQL_PWD=111; mysql -u root -e "' +start_slave_cmd='export MYSQL_PWD=root; mysql -u root -e "' start_slave_cmd+="$start_slave_stmt" start_slave_cmd+='"' -docker exec mysql_slave sh -c "$start_slave_cmd" -docker exec mysql_slave sh -c "export MYSQL_PWD=111; mysql -u root -e 'SHOW SLAVE STATUS \G'" \ No newline at end of file +docker exec mysql_slave1 sh -c "$start_slave_cmd" +docker exec mysql_slave1 sh -c "export MYSQL_PWD=root; mysql -u root -e 'SHOW SLAVE STATUS \G' | grep Slave_" + +docker exec mysql_slave2 sh -c "$start_slave_cmd" +docker exec mysql_slave2 sh -c "export MYSQL_PWD=root; mysql -u root -e 'SHOW SLAVE STATUS \G' | grep Slave_" \ No newline at end of file diff --git a/cicd/mysql/master_init/init.sql b/cicd/mysql/master_init/init.sql deleted file mode 100644 index f1c7130..0000000 --- a/cicd/mysql/master_init/init.sql +++ /dev/null @@ -1,3 +0,0 @@ -CREATE DATABASE IF NOT EXISTS `app` CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL ON `app`.* TO 'app'@'%' identified by 'app'; -GRANT REPLICATION SLAVE ON *.* TO 'app'@'%' identified by 'app'; \ No newline at end of file diff --git a/cicd/mysql/mysql_master.conf b/cicd/mysql/mysql_master.conf index 6280532..59beac8 100644 --- a/cicd/mysql/mysql_master.conf +++ b/cicd/mysql/mysql_master.conf @@ -5,5 +5,5 @@ skip-name-resolve server-id = 1 log_bin = /var/log/mysql/mysql-bin.log -binlog_format = ROW -binlog_do_db = mydb \ No newline at end of file +# binlog_format = ROW +binlog_do_db = app \ No newline at end of file diff --git a/cicd/mysql/mysql_slave.conf b/cicd/mysql/mysql_slave1.conf similarity index 80% rename from cicd/mysql/mysql_slave.conf rename to cicd/mysql/mysql_slave1.conf index 392f54f..e85c7d4 100644 --- a/cicd/mysql/mysql_slave.conf +++ b/cicd/mysql/mysql_slave1.conf @@ -3,7 +3,7 @@ skip-host-cache skip-name-resolve -server-id=2 -relay-log = /var/log/mysql/mysql-relay-bin.log +server-id = 2 log_bin = /var/log/mysql/mysql-bin.log -binlog_do_db = mydb \ No newline at end of file +relay-log = /var/log/mysql/mysql-relay-bin.log +binlog_do_db = app \ No newline at end of file diff --git a/cicd/mysql/mysql_slave2.conf b/cicd/mysql/mysql_slave2.conf new file mode 100644 index 0000000..ea55657 --- /dev/null +++ b/cicd/mysql/mysql_slave2.conf @@ -0,0 +1,9 @@ +[mysqld] + +skip-host-cache +skip-name-resolve + +server-id = 3 +log_bin = /var/log/mysql/mysql-bin.log +relay-log = /var/log/mysql/mysql-relay-bin.log +binlog_do_db = app \ No newline at end of file diff --git a/cicd/mysql/slave_init/init.sql b/cicd/mysql/slave_init/init.sql deleted file mode 100644 index 4d13934..0000000 --- a/cicd/mysql/slave_init/init.sql +++ /dev/null @@ -1,2 +0,0 @@ -CREATE DATABASE IF NOT EXISTS `app` CHARACTER SET utf8 COLLATE utf8_general_ci; -GRANT ALL ON `app`.* TO 'app'@'%' identified by 'app'; \ No newline at end of file diff --git a/internal/application/application.go b/internal/application/application.go index e13e108..4f83cef 100755 --- a/internal/application/application.go +++ b/internal/application/application.go @@ -19,7 +19,7 @@ func New(configFile, envPrefix string) (App, error) { return App{}, fmt.Errorf("can't apply config: %w\n", err) } - db, err := sql.Open("mysql", conf.DSN.User+":"+conf.DSN.Pass+"@tcp("+conf.DSN.Host+":"+conf.DSN.Port+")/"+conf.DSN.Base) + db, err := sql.Open("mysql", conf.DSN.User+":"+conf.DSN.Pass+"@tcp("+conf.DSN.Host+":"+conf.DSN.Port+")/"+conf.DSN.Base+"?charset=utf8&collation=utf8_unicode_ci") if err != nil { return App{}, err } @@ -60,7 +60,7 @@ func dbInit(db *sql.DB) error { City varchar(255) DEFAULT NULL, Interests varchar(255) DEFAULT NULL, PRIMARY KEY (Id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8`); err != nil { + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci`); err != nil { return err } if _, err := db.Exec(`CREATE TABLE IF NOT EXISTS relations ( diff --git a/pkg/dataset/generator.go b/pkg/dataset/generator.go index 511e59a..8ecb784 100644 --- a/pkg/dataset/generator.go +++ b/pkg/dataset/generator.go @@ -30,9 +30,13 @@ func NewPerson() (p Person) { p.FirstName = womanNames[rand.Intn(len(womanNames))] p.SecondName = secondNames[rand.Intn(len(secondNames))] + "а" } - t := make([]byte, 16) - rand.Read(t) - p.Password = string(t) + charSet := "abcdedfghijklmnopqrstABCDEFGHIJKLMNOP0123456789" + var output strings.Builder + for i := 0; i < 16; i++ { + random := rand.Intn(len(charSet)) + output.WriteString(string(charSet[random])) + } + p.Password = output.String() p.City = cities[rand.Intn(len(cities))] for i := 0; i < (rand.Intn(4) + 3); i++ { p.Interests = append(p.Interests, interests[rand.Intn(len(interests))])