호스트 OS에 log/config를 연결하기 위한 순서
[1] 호스트 OS에서 log,conf 파일 경로를 먼저 생성 [2] mysql 기본 설정 파일(my.cnf)을 호스트 OS의 conf 경로에 저장 * 주의 ) 이 때, my.cnf 파일의 설정값은 컨테이너를 기준으로 한다. 예를 들어, basedir=/var/lib/mysql 로 설정한다면, 이는 컨테이너의 /var/lib/mysql 경로를 의미한다. [3] 컨테이너를 재생성하며 -v 옵션을 통해 호스트 OS의 log/conf 경로와 컨테이너 log/conf 경로를 연결 * my.cnf 에서 설정했던 log 경로가 곧 컨테이너 log 경로이다. 컨테이너 conf 경로는 my.cnf이 저장되는 아무 경로로 설정하면 된다. |
호스트 OS에 log/conf 파일 경로 생성
기존 컨테이너는 삭제하고, 새로 data, log, config 를 저장할 경로를 생성한뒤 각 경로에 권한을 777로 설정했다.
# 경로 생성
mkdir db/db001/data db/db001/log db/db001/conf
# 권한 설정
chmod 777 db/db001/data db/db001/log db/db001/conf
호스트 OS의 config 경로에 MySQL 기본 설정 파일 생성 - my.~~
MySQL에서는 기본 설정값을 my로 시작하는 파일에 담아 둔다.
- 유닉스 계열 : my.cnf
- 윈도우 : my.ini
Docker 컨테이너에서 아래의 명령어를 치고 디폴트로 잡힌 my.cnf 파일 경로를 확인했다.
docker exec db001 mysql --help
/etc/my.cnf부터 /etc/mysql/my.cnf, /usr/etc/mysql... 경로들 중에서 어딘가에 my.cnf이 있다는 거다.
(내 컨테이너 안에서는 확인해보니 /etc/my.cnf 경로에 my.cnf 파일이 담겨 있었다.)
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
docker container 또한 앞서 말했듯 일종의 게스트 OS로 자신만의 분할 공간을 가지고 있기에,
docker container 내의 파일을 열어보기 위해서는 docker container의 쉘을 열어줘야 한다.
Unix 계열의 OS의 경우, sh/bash/zbash 의 쉘 종류들이 존재하는데, 그 중 bash를 사용하면 된다.
docker를 exec로 실행할 때, /bin/bash를 붙이면 해당 Container의 bash쉘을 실행시키겠다는 뜻이다.
[root@sideproject opc]# docker exec -it -uroot db001 /bin/bash
(mysql container의 mysql를 다이렉트로 실행하기 위해서는 docker exec -it {컨테이너명} mysql -uroot -p를 쓴다)
사이드로 빠진 얘기는 차치하고, 다시 /etc/my.cnf의 my.cnf 파일을 확인해보면 아래와 같다.
[root@db001 /]# cat /etc/my.cnf
#
# The Percona Server 5.7 configuration file.
#
#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
# Please make any edits and changes to the appropriate sectional files
# included below.
#
!includedir /etc/my.cnf.d/
!includedir /etc/percona-server.conf.d/
해석하면,
* 중요 : 이 파일을 통해 추가적인 세팅들을 덮어쓸 수 있다!
파일들은 항상 .cnf 확장자로 끝나야 하며, 그렇지 않으면 무시된다.
아래 경로들에 있는 부분 섹션 파일들과 같이 적절한 방식으로 작성해두어라.
!includedir /etc/my.cnf.d/
!includedir /etc/percona-server.conf.d/
하라는 대로 하기 위해서, 제시된 경로들을 확인해보니 파일이 딱 하나 있었다.
mysql 또한 하나의 소프트웨어 프로그램이기 때문에 client와 server가 존재하며,
my.cnf에 쓰는 mysql이 client 프로그램이고, mysqld가 server(=데몬) 프로그램을 의미했다.
아래의 mysqld는 그 중 서버 프로그램(이자 데몬 프로그램)을 말한다.
# /etc/my.cnf.d/docker.cnf 파일
# mysql의 background 설정
[mysqld]
skip-host-cache
skip-name-resolve
my.cnf 파일 구성하기
[ 시작 전에 - mysql의 동작 방식에 대해 간단히 살펴보기 ]
mysql은 내부적으로 클라이언트 프로그램(mysql), 서버 프로그램(mysqld)를 두며, socket을 통해 클라이언트-서버 간 양방향 통신을 한다. 이 때, socker 통신 방식으로 크게 두 가지의 방식을 사용한다. 1) TCP/IP 통신 : 서버-클라이언트가 다른 컴퓨터에 있을 때 사용 2) Unix Domain Socker 통신 : 서버-클라이언트가 같은 컴퓨터에 있을 때 mysql.sock 파일을 통해 통신 mysql를 로컬 컴퓨터에서 docker로 생성해줬기 때문에 지금 내 경우 mysql은 2)과 같이 socket 통신을 한다. 이 때 mysql.socket이 위치한 경로는 디폴트로 /var/lib/mysql/mysql.sock 이다. mysql의 Replication(복제방식)은 여러가지가 있으며, 그 중 Async Replication은 Binary Log를 활용해 Replica를 형성한다. Slave에서는 상위(ex.Master)로부터 로그를 받아 relay log에 저장하는데, 만약 log_slave_updates 파라미터가 활성화(ON)되어 있다면 이 로그를 자신의 binlog에도 함께 기록한다. |
정말 아름답게도 my.cnf 파일의 모든 옵션을 정리해준 블로그글이 있었다(갓),
그 중에 당장 필요한 것만 뽑았는데 세밀한 옵션 설정이 필요하다면 나중에 또 이분의 글을 참고하면 도움이 될 것 같다.
https://youngsam.net/entry/mysql-mycnf-%EB%82%B4%EC%9A%A9-%EC%84%A4%EB%AA%85-%EC%A0%95%EB%A6%AC
# Mysql 서버 옵션
[mysqld]
server-id=1 # 서버 id값/master,slave들이 서로 달라야함
report_host=db001 # 호스트명
basedir=/var/lib/mysql # 기본 경로
datadir=/var/lib/mysql # 데이터 저장 위치
socket=/var/lib/mysql/mysql.sock # 소켓 파일 경로
log_bin=mysql-bin # binlog(서버 내 모든 변경 내역) mysql-bin.0001 형식으로 저장
binlog_format=ROW # binlog 저장 방식 - statement/row/mixed
# row : binary / statement : sql query / mixed : statement+row
log-error=/var/log/mysql/mysql.log # 에러 로그 경로
gtid_mode=ON # 트랜잭션 고유 식별자 ON
enforce-gtid-consistency=true # gtid on할 때 DDL명령어 안되는 것 강제 해제
log_slave_updates # Slave라면 ON으로 자신의 binlog에 로그 저장
symbolic-links=0 # Disabling symbolic-links is recommended to prevent assorted security risks
pid-file=/var/run/mysqld/mysqld.pid # 프로세스 id 파일 경로 설정 (꼭 mysqld_safe에도 넣어야함)
# Mysqld_safe : mysqld를 감시하는 데몬으로, mysqld_safe가 mysqld를 실행한다.
[mysqld_safe]
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
nice=0
conf 디렉토리에 my.cnf파일을 vi로 넣어두었다. 또 권한을 644(rw-r-r) 로 두었다.
vi my.cnf
// rw-r-r 로 권한 설정
chmod 644 my.cnf
이제, 컨테이너를 재생성 해준다.
컨테이너 재생성 및 실행
# 컨테이너 생성
docker run -i -t --name db001 -h db001 -p 3306:3306 \
-v /home/opc/db/db001/data:/var/lib/mysql \
-v /home/opc/db/db001/log:/var/log/mysql \
-v /home/opc/db/db001/conf:/etc/percona-server.conf.d \ <--- 설정 파일
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
# 참고) 오라이클 클라우드를 쓰면 /home/opc/ 를 입력해줘야 처음 사용자 접속 경로에서 내려간다.
이 상태에서, /db/db001/log 로 가면, 아래와 같이 mysql.log가 잘 들어간 걸 볼 수 있었다.
[root@sideproject log]# ll
total 8
-rw-r-----. 1 polkitd input 4133 Dec 29 11:57 mysql.log
[참고]
인프런 > 따라하며 배우는 MySQL on Docker 를 듣고 정리한 내용
https://hoing.io/archives/3111
https://kihyun-log.tistory.com/entry/MySQL-binlog-format
https://antamis.tistory.com/9
'Infra > Docker' 카테고리의 다른 글
[Docker] Proxy Layer 구성하기 (2) | 2024.01.08 |
---|---|
[Docker] Orchestra를 통해 High Availability(HA) 구축하기 (1) | 2024.01.08 |
[Docker] 브리지를 통해 컨테이너 통신 (1) | 2024.01.08 |
[Docker] Master-Slave Replication 구성 (0) | 2023.12.31 |
[Docker] Docker란? Docker로 Mysql 설치해보기 (1) | 2023.12.28 |