반응형
 
 
1. MacDocker로 MariaDB 준비
 
MariaDB Docker 이미지 다운로드 
 
docker pull mariadb:10.1
 
MariaDB용 Docker 시작 스크립트 생성
참고로 Docker/Home/mysql 디렉토리가 로컬 컴퓨터에 존재해야 한다. 그러면 MariaDB 데이터베이스 파일이 거기에 만들어 진다.
 
MacBook-Pro-2:Docker jerryj$ cat start-mariadb
docker run -d --name mymaria -p 3306:3306 -v /Users/jerryj/Docker/Home/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mariadb:10.1
 
echo View Log
sleep 1
docker logs -f mymaria
 
 
MacBook-Pro-2:Docker jerryj$ cat mysql
docker exec -it mymaria sh -c 'exec mysql -uroot -p'
 
MariaDB Docker 종료 스크립트
 
MacBook-Pro-2:Docker jerryj$ cat stop-mariadb
docker stop mymaria
docker rm mymaria
 
그러면 다음과 같이 쉽게 MariaDB를 시작하고 종료할 수 있다.
 
MacBook-Pro-2:Docker jerryj$ ./start-mariadb
e0a7793e0b01eb124a506b065b4bba4224b79bccb97d5f2dedca721795e8d07e
View Log
2017-03-26 15:07:39 139941082712000 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ...
2017-03-26 15:07:40 139941082712000 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
...
 
MacBook-Pro-2:Docker jerryj$ ./mysql
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.21-MariaDB-1~jessie mariadb.org binary distribution
 
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)
...
 
MacBook-Pro-2:Docker jerryj$ ./stop-mariadb
mymaria
mymaria
 
자 그러면 테스트할 MariaDB Docker 이미지는 준비되었다.
 
 

2. Replication 구성을 위한 두 개의 MariaDB 컨테이너 준비
 
mariadb:10.1 이미지를 이용하여 두 개의 별도 컨테이너를 생성한다.
동일한 이미지를 사용하지만 이름(mysql-a vs mysql-b), 포트(43306 vs 53306), 데이터베이스 디렉토리, 구성파일 디렉토리 등을 다르게 설정하여 서로 다른 데이터베이스가 되도록 하였다.
참고로 두 개의 컨테이너는 하나의 Docker 네트워크(jerry-network)를 통해 서로 연결되도록 되어 있다.
 
MacBook-Pro-2:Docker jerryj$ cat ./start-db-cluster
docker run -d --name mysql-a -p 43306:3306 -v /Users/jerryj/Docker/Home/mysql-a/mysql:/var/lib/mysql -v /Users/jerryj/Docker/Home/mysql-a/etc:/etc/mysql -e MYSQL_ROOT_PASSWORD=root --network jerry-network mariadb:10.1
 
echo ---------------------------------------------------------------
echo View Log
sleep 1
docker logs mysql-a
 
docker run -d --name mysql-b -p 53306:3306 -v /Users/jerryj/Docker/Home/mysql-b/mysql:/var/lib/mysql -v /Users/jerryj/Docker/Home/mysql-b/etc:/etc/mysql -e MYSQL_ROOT_PASSWORD=root --network jerry-network mariadb:10.1
 
echo ---------------------------------------------------------------
echo View Log
sleep 1
docker logs mysql-b
 
두 개의 MariaDB 인스턴스를 다음과 같이 실행하고 docker ps로 확인한다.
 
MacBook-Pro-2:Docker jerryj$ ./start-db-cluster
56ebb4e06899094276b62474fd384114f2f95aef360239797003b002add7475a
---------------------------------------------------------------
View Log
2017-03-26 15:12:47 140196917458880 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ...
2017-03-26 15:12:47 140196917458880 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
520b1848cea06c5189947b229b69646ef33b534b1e24f420d3a8fdcef78a1652
---------------------------------------------------------------
View Log
2017-03-26 15:12:49 140465053243328 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ...
2017-03-26 15:12:49 140465053243328 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
MacBook-Pro-2:Docker jerryj$
MacBook-Pro-2:Docker jerryj$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
520b1848cea0        mariadb:10.1        "docker-entrypoint..."   6 seconds ago       Up 5 seconds        0.0.0.0:53306->3306/tcp   mysql-b
56ebb4e06899        mariadb:10.1        "docker-entrypoint..."   8 seconds ago       Up 7 seconds        0.0.0.0:43306->3306/tcp   mysql-a
 
 
각각의 MariaDB 인스턴스는 다음 스크립트를 통해 접속한다.
 
MacBook-Pro-2:Docker jerryj$ cat mysql-a
docker exec -it mysql-a sh -c 'exec mysql -uroot -p'
MacBook-Pro-2:Docker jerryj$ cat mysql-b
docker exec -it mysql-b sh -c 'exec mysql -uroot -p'
 
자 그러면 Replication 테스트를 할 두 개의 MariaDB 컨테이너 준비는 끝났다. 그러면 본격적으로 MySQL(MariaDB) Replication 구성을 진행해 보자.
 

3. Binary Log 복제 설정
 
mysql-a와 mysql-b의 /etc/my.cnf에 각각 다음을 추가
 
MacBook-Pro-2:etc jerryj$ pwd
/Users/jerryj/Docker/Home/mysql-a/etc
MacBook-Pro-2:conf.d jerryj$ vi my.cnf
...
[mysqld]
 
log-bin=binlog
relay-log=relaylog
log-slave_updates=1
server-id=1
 
MacBook-Pro-2:etc jerryj$ pwd
/Users/jerryj/Docker/Home/mysql-b/etc
MacBook-Pro-2:conf.d jerryj$ vi my.cnf
...
[mysqld]
 
log-bin=binlog
relay-log=relaylog
log-slave_updates=1
server-id=2
 
Binary Log 옵션을 적용하기 위해 DB 서버 재시작
 
MacBook-Pro-2:Docker jerryj$ ./stop-db-cluster
mysql-a
mysql-b
mysql-a
mysql-b
MacBook-Pro-2:Docker jerryj$ ./start-db-cluster
16f93e1c4b60fa49383c75d448ac3c54e04abd32d8de045449569e918deee40b
---------------------------------------------------------------
View Log
2017-03-26 15:32:09 140363386005440 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ...
2017-03-26 15:32:09 140363386005440 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
120ea03ae6a4db30c1a7ec2683b17b68f6051047015f4d2d5cb5e8ec2bfb3072
---------------------------------------------------------------
View Log
2017-03-26 15:32:11 140592083466176 [Note] mysqld (mysqld 10.1.21-MariaDB-1~jessie) starting as process 1 ...
2017-03-26 15:32:11 140592083466176 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
 
다음과 같이 mysql-a 에서 mysqldump를 실행하여 DB 복사 (암호 root를 입력해야 함)
혹시 fulldump.log 첫 줄에 Enter Password: 문구가 저장되었으면 vi 에디터로 제거한다.
 
acBook-Pro-2:Docker jerryj$ docker exec -it mysql-a sh -c 'mysqldump -u root -p -A --single-transaction --master-data=2' > fulldump.log
 
생성된 덤프 파일을 mysql-b의 디렉토리로 복사한 후 mysql-b로 접속하여 덤프 파일을 실행 
 
MacBook-Pro-2:Docker jerryj$ mv fulldump.log Home/mysql-b/etc/
MacBook-Pro-2:Docker jerryj$ docker exec -it mysql-b bash
root@c20e562c067a:/# mysql -u root -p < /etc/mysql/fulldump.log 
 
mysql-a(Master)에서 binlog 위치를 파악한다.
 
MariaDB [(none)]> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000001 |      310 |              |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)
 
다음 명령을 mysql-b(Salve)의 mysql 쉘에서 실행한다. 노란색 부분은 상대편 DB의 로그/위치를 사용한다.
 
CHANGE MASTER TO
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=310,
MASTER_HOST='mysql-a',
MASTER_USER='root',
MASTER_PASSWORD='root';
START SLAVE;
SHOW SLAVE STATUS\G
RESET MASTER;
SHOW MASTER STATUS;
 
역시 같은 방법으로 mysql-a(Master)의 mysql 쉘에서 실행한다. 노란색 부분은 상대편 DB의 로그/위치를 사용한다.
 
CHANGE MASTER TO
MASTER_LOG_FILE='binlog.000001',
MASTER_LOG_POS=310,
MASTER_HOST='mysql-b',
MASTER_USER='root',
MASTER_PASSWORD='root';
START SLAVE;
SHOW SLAVE STATUS\G
 
 

4. 복제 확인
 
다음과 같이 mysql-a(Master)에서 DB와 계정을 생성한다.
 
MariaDB [(none)]> create database mattermost character set utf8 COLLATE utf8_bin;
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mattermost         |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.02 sec)
 
MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
MariaDB [mysql]> INSERT INTO user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject) VALUES ('localhost', 'mmuser', password('mmuser'), '', '', '');
Query OK, 1 row affected, 1 warning (0.01 sec)
 
MariaDB [mysql]> INSERT INTO user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject ) VALUES ('%', 'mmuser ', password('mmuser'), '', '', '');
Query OK, 1 row affected, 1 warning (0.01 sec)
 
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [mysql]> grant all privileges on mattermost.* to mmuser@localhost with grant option;
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [mysql]>
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
그리고 나서 양쪽 데이터베이스에서 로그인을 시도한다.
 
MacBook-Pro-2:Docker jerryj$ docker exec -it mysql-a bash
root@c14263392084:/# mysql -ummuser -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19
Server version: 10.1.21-MariaDB-1~jessie mariadb.org binary distribution
 
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]>
 
mysql-b(Slave)에서도 로그인이 된다.
 
MacBook-Pro-2:Docker jerryj$ docker exec -it mysql-b bash
root@c20e562c067a:/# mysql -ummuser -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 33
Server version: 10.1.21-MariaDB-1~jessie mariadb.org binary distribution
 
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]>
 
 
Posted by Hey Jerry
,