# Summary
# Master, Slave Replication 구성
Volume 디렉토리 생성
mkdir -p /db/db001/data /db/db002/data /db/db/003/data \
mkdir -p /db/db001/log /db/db002/log /db/db003/log \
mkdir -p /db/db001/conf /db/db002/conf /db/db003/conf
chmod 777 -R /dbmy.cnf 설정
1. db001 설정
#my.cnf
[mysqld]
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce-gtid-consistency = true
server-id = 100
log_slave_updates
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
log-error = /var/log/mysql/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
report_host = db001
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
nice = 02. db002 설정
#my.cnf
[mysqld]
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce-gtid-consistency = true
server-id = 200
log_slave_updates
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
read_only
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
log-error = /var/log/mysql/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
report_host = db002
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
nice = 0#my.cnf
[mysqld]
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce-gtid-consistency = true
server-id = 300
log_slave_updates
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
read_only
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
log-error = /var/log/mysql/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
report_host = db003
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
nice = 0docker network create --driver bridge db-bridgedocker run -i -t --name db001 -p 13306:3306 \
--net db-bridge --net-alias=db001 \
-v /db/db001/data:/var/lib/mysql \
-v /db/db001/log:/var/log/mysql \
-v /db/db001/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30docker run -i -t --name db002 -p 13307:3306 \
--net db-bridge --net-alias=db001 \
-v /db/db002/data:/var/lib/mysql \
-v /db/db002/log:/var/log/mysql \
-v /db/db002/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
docker run -i -t --name db003 -p 13308:3306 \
--net db-bridge --net-alias=db001 \
-v /db/db003/data:/var/lib/mysql \
-v /db/db003/log:/var/log/mysql \
-v /db/db003/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"docker exec -it -uroot db001 bash
mysql -uroot -p
mysql> create user 'repl'@'%' identified by 'repl';
mysql> grant replication slave on *.* to 'repl'@'%';docker exec -it -uroot db002 bash
mysql -uroot -p
mysql> change master to master_host='db001', \
master_user='repl', master_password='repl', \
master_auto_position=1;
mysql> start slave;
mysql> show status\Gdocker run -i -t --name orchestroator -h orchestrator \
--net db-bridge --net-alias=orchestrator
-p 13000:3000 -d openarkcode/orchestrator:latestdocker inspect --format '{{.NetworkSettings.Networks.db-bridge.IPAddress}}' db001
172.18.0.2docker exec -it -uroot db001 /bin/bash
mysql -uroot -p
mysql> create user orc_client_user@'172.%' identified by 'orc_client_password';
mysql> grant super, process, replication slave, reload on *.* to orc_client_user@'172.%';
mysql> grant select on mysql.slave_master_info to orc_client_user@'172.%';db001, 3306 입력 후 submitdocker exec -it orchestrator bash
cd vi /etc/orchestrator.conf.json
"RecoverMasterClusterFilters": [ "*" ],
...
"PromotionIgnoreHostnameFilters": [ "db003" ], //db003 은 승격되지 않는다.docker restart orchestratormkdir -p /db/proxysql/data /db/proxysql/conf
chmod 777 /db/proxysql /db/proxysql/data /db/proxysql/conf#proxysql.cnfdocker run -i -t --name proxysql -h proxysql \
--net db-bridge --net-alias=proxysql \
-p 16032:6032 -p 16033:6033
-v /db/proxysql/data:/var/lib/proxysql \
-v /db/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf \
-d proxysql/proxysqlmysql -h127.0.0.1 -p16032 -uradmin -pradmin --prompt "ProxySQL Admin>"docker exec -it -uroot db001 bash
mysql -uroot -p
mysql> create database testdb default character set utf8;
mysql> create user appuser@'%' identified by 'appuser';
mysql> grant select, insert, update, delete on testdb.* to appuser@'%';
mysql> create user 'monitor'@'%' identified by 'monitor';
mysql> grant replication client on *.* to 'monitor'@'%';
mysql> flush privileges;proxysql
mysql -h127.0.0.1 -P16032 -uradmin -pradmin --prompt "ProxySQL Admin>"
ProxySQL Admin> insert into mysql_servers(hostgroup_id, hostname, port) values (10, 'db001', 3306);
ProxySQL Admin> insert into mysql_servers(hostgroup_id, hostname, port) values (20, 'db001', 3306);
ProxySQL Admin> insert into mysql_servers(hostgroup_id, hostname, port) values (20, 'db002', 3306);
ProxySQL Admin> insert into mysql_servers(hostgroup_id, hostname, port) values (20, 'db003', 3306);
ProxySQL Admin> insert into mysql_replication_hostgroups values (10, 20, 'read_only', '');
# app
ProxySQL Admin> insert into mysql_users(username, password, default_hostgroup, transaction_persistent) values ('appuser', 'apppass', 10, 0)
ProxySQL Admin> insert into mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup) values (1, 1, '^SELECT.*FOR UPDATE$', 10);
ProxySQL Admin> insert into mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup) values (2, 1, '^SELECT', 20);
ProxySQL Admin> load mysql servers to runtime;
ProxySQL Admin> save mysql servers to disk;