DB 이중화를 하면서 아래와 같은 이슈 때문에 애를 먹었습니다.◞‸◟
[ERROR] Slave I/O: error connecting to master 'usr_repl@192.168.5.138:3306' - retry-time: 10 maximum-retries: 100000 message: Can't connect to server on '192.168.5.138' (110 "Connection timed out"), Internal MariaDB error code: 2003
여러번 시도 해보니깐, 도커 포트 포워딩을 할 때 host port number를 mariadb 서비스 port number인 3306이 아닌 다른 임의의 port number로 지정했더니 잘 동작했습니다.
1. MariaDB Master Slave 설정
먼저 db 이중화 작업을 진행해보겠습니다.
- master
docker run -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=password -e TZ=Asia/Seoul --name mariadb-master mariadb --lower_case_table_names=1
-slave
docker run -d -p 13307:3306 -e MYSQL_ROOT_PASSWORD=password -e TZ=Asia/Seoul --name mariadb-slave mariadb --lower_case_table_names=1
1. Master
그리고 Master DB부터 설정하겠습니다.
docker exec -it mariadb-master /bin/bash
vim 작성을 위해 설치를 진행합니다.
apt update; apt install vim;
그리고 my.cnf에 아래와 같이 추가합니다.
vi /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-bin
server-id = 1
binlog_format = row
expire_logs_days = 2
도커 컨테이너를 exit한 다음에, mariadb-master를 재시작 해줍니다.
docker restart mariadb-master
그리고 다시 컨테이너에 접속해서, mariadb에 로그인 합니다. 비밀번호는 password입니다.
mariadb -u root -p
Slave에서 Master로 연결하기 위한 계정을 생성해줍니다.
grant replication slave on *.* to 'repl_user'@'%' identified by 'p@ssw0rd';
master 상태를 조회합니다.
show master status;
file 명과 position을 기억해둡시다!
2. Slave
다음으로 Slave DB를 설정하겠습니다.
docker exec -it mariadb-slave /bin/bash
master와 동일하게 vim을 설치합니다.
apt update; apt install vim -y;
설치가 완료되면, 마찬가지로 my.cnf에 아래와 같이 입력합니다.
vi /etc/mysql/my.cnf
[mysqld]
log-bin = mysql-bin
server-id = 2
binlog_format = row
expire_logs_days = 2
read_only = 1
저장 후, docker 컨테이너에 exit한 후 재시작 해줍니다.
docker restart mariadb-slave
그리고 다시 도커 컨테이너에 접속한 후 mariadb에 접속해서 아래 쿼리를입력합니다. 아까 master의 status를 참고하여 작성해주세요.
CHANGE MASTER TO MASTER_HOST = '192.168.45.108'
, MASTER_PORT=13306
, MASTER_USER='repl_user'
, MASTER_PASSWORD='p@ssw0rd'
, MASTER_LOG_FILE='mysql-bin.000002'
, MASTER_LOG_POS=14059
, MASTER_CONNECT_RETRY=10;
slave를 재시작 합니다.
start slave;
slave 상태를 조회합니다.
show slave status\G;
Slave_IO_Running과 Slave_SQL_Running이 모두 Yes이면 잘 실행된거 입니다.
참고 https://onethejay.tistory.com/182
2. MaxScale 설정
수평 확장 배치에서 확장성 및 고가용성을 관리하고 DB 프록시 역할을 수행하는 maxscale를 설치해보겠습니다!
maxscale 설정하기 전에 maxscale이 masterDB에 연결하기 위해, mariadb-master에서 아래와 같이 계정을 생성 후 모든 권한을 부여합니다.
CREATE USER 'maxscale'@'%' IDENTIFIED BY 'maxscale_pw';
GRANT ALL PRIVILEGES ON *.* TO `maxscale`@`%` IDENTIFIED BY PASSWORD 'maxscale_pw';
mariadb/maxscale 도커 이미지를 이용합니다.
docker run -d --name maxscale -p 3312:3306 mariadb/maxscale:23.02
docker exec -it maxscale /bin/sh
그리고 maxscale.cnf를 아래와 같이 설정합니다.
vim /etc/maxscale.cnf
[maxscale]
admin_secure_gui=false
threads=auto
maxlog=true
syslog=true
logdir=/var/log/maxscale/
log_debug=true
admin_host=0.0.0.0
[server1]
type=server
address=192.168.45.108
port=13306
protocol=MariaDBBackend
[server2]
type=server
address=192.168.45.108
port=13307
protocol=MariaDBBackend
[RW-Split-Router]
type=service
router=readwritesplit
servers=server1,server2
user=maxscale
password=maxscale_pw
enable_root_user=true
[RW-Split-Listener]
type=listener
service=RW-Split-Router
protocol=MariaDBClient
port=3306
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2
user=maxscale
password=maxscale_pw
exit 후 컨테이너를 재시작 합니다.
docker restart maxscale
참고 https://mariadb.com/kb/en/mariadb-maxscale-6-setting-up-mariadb-maxscale/