Вариант настройки групповой реплиации на основе дефолтных образов mysql 5.7

actency-mysql57-replication
Andrey Ivanov 2021-02-04 09:10:38 -05:00 committed by Andrey Ivanov
parent 212b95c654
commit 1b2833d38b
6 changed files with 117 additions and 12 deletions

View File

@ -1,22 +1,45 @@
version: '3'
services:
mysql:
image: mysql:5.6
hostname: "mysql"
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
mysql_master:
image: mysql:5.7
hostname: "mysql_master"
container_name: mysql_master
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
MYSQL_DATABASE: app
MYSQL_PORT: 3306
MYSQL_LOWER_CASE_TABLE_NAMES: 0
ports:
- "3306:3306"
- 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:
image: mysql:5.7
hostname: "mysql_slave"
container_name: mysql_slave
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
app:
build:
@ -26,8 +49,8 @@ services:
environment:
APP_SERVER_ADDRESS: 0.0.0.0
APP_SERVER_PORT: 8080
APP_DSN_HOST: mysql
APP_DSN_PORT: 3306
APP_DSN_HOST: mysql_master
APP_DSN_PORT: 13306
APP_DSN_USER: app
APP_DSN_PASS: app
APP_DSN_BASE: app

59
cicd/init.sh Normal file
View File

@ -0,0 +1,59 @@
#!/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 ";"'
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'"
until docker-compose exec mysql_slave sh -c 'export MYSQL_PWD=111; mysql -u root -e ";"'
do
echo "Waiting for mysql_slave database connection..."
sleep 4
done
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}'`
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+="$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'"

View File

@ -0,0 +1,3 @@
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';

View File

@ -0,0 +1,9 @@
[mysqld]
skip-host-cache
skip-name-resolve
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
binlog_do_db = mydb

View File

@ -0,0 +1,9 @@
[mysqld]
skip-host-cache
skip-name-resolve
server-id=2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = mydb

View File

@ -0,0 +1,2 @@
CREATE DATABASE IF NOT EXISTS `app` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON `app`.* TO 'app'@'%' identified by 'app';