Ubuntu20.04 / Mariadb 10.3.39 Multi Instance, 원격 접속 허용

김무연·2024년 8월 12일

이제까지는 서버 하나에, DB 인스턴스를 하나만 띄우고, 기본적으로 MYSQL의 DEFAULT 값인 3306번 포트만 계속 이용해왔었다.

허나 이번에 기회가 생겨, 다중 인스턴스를 구현하라는 지시를 받았다.

처음에는 당연히, 인스턴스에 대한 개념 미숙과 실전 DB 관리를 많이 해본적이 없으니, 단순히 인스턴스를 여러개 구축하라는 것이, DB를 3개 만드는 것인 줄 알았다.

단순히 개발용...배포용..등으로 DB를 나누어 만들어 말씀드리니, 그것이 아닌 각각 PORT 별로 인스턴스를 나누어 달라고 요청하셨다. 그래서 관련된 자료를 찾아보니, 기본값 port 3306을 쓰고 있는 mariadb와 더불어 다른 포트를 이용하는 mariadb를 여러개 실행하라는 뜻이었다.

때문에 이와 관련된 작업을 하던 중 알게된 것과 마주했던 여러 오류들을 포스팅하려고 한다.

흔히들 우리가 mysql / mariadb 를 사용할 때 default값으로 설정되어있는 port는 3306번으로 설정되어있다. 때문에 heidi sql로 접근을 한다거나 cli로 접근할 때,

mariadb -u root -p

이렇게 접속하게 되면 기본값인 3306번으로 접속되게 된다. 이를 linux서버에서 확인해보게 되면 아래와 같다

netstat -ntlp

지금은 개발용 원격을 허용하느라 ip없이 :::3306으로 되어 있지만 아마 기본값은 127.0.0.1:3306 일것이다. 여기서 콜론(:) 기준으로 앞을 ip주소 뒤가 포트번호이다. 그렇다면 이게 무슨 역할을 하는 것일까?

간단히 얘기하자면 ip는 집주소, port는 집안에 있는 방 이라고 할 수 있겠다. 우리집(127.0.0.1/localhost) 주소를 가진 곳에 3306번 방 이라는 의미가 될 수 있겠다.

그렇다면 우리집 주소(127.0.0.1)에 방(port)이 여러개 있을테니, 그 방마다 각각 새로운 기능을 쓸 수 있지 않을까? 그렇기 때문에 mariadb 인스턴스를 3개 실행시키면 각각 port번호를 할당하여, 127.0.0.1:3306, 127.0.0.1:3307, 127.0.0.1:3308 로 실행 시킬 수 있게 되는 것이다.

db뿐만이 아니라 흔히 우리가 node를 이용해 백엔드 express서버를 띄우거나, react를 통해 프론트 프로젝트를 띄울때도 마찬가지로 127.0.0.1:3001 , 127.0.0.1:5000 이 되는 것처럼 말이다.

그렇다면 이와 같은 원리를 이용해 어떻게 각 포트별로 db를 다중 실행할 수 있을까?

대부분 이에 대한 답은 config 파일에 있다.

리눅스 기준 /etc/mysql/.. 등의 폴더에 db에 관한 환경설정 파일이 있을것이다. 만약 내가 윈도우OS 이면 my.ini, 리눅스면 my.conf 이런식으로 말이다. 해당 환경설정에서 내가 원하는 대로 입맛을 바꾸어 작성한 후 실행시켜주면 된다.

기존에 적혀 있는 환경설정 밑으로

[mysqld1]
user = mysql
pid-file = /var/run/mysqld/mysqld3307.pid
socket = /var/run/mysqld/mysqld3307.sock
port = 3307
basedir = /usr
datadir = /var/lib/mysql3307
tmpdir = /tmp
log-error = /var/log/mysql/error3307.log

[mysqld2]
user = mysql
pid-file = /var/run/mysqld/mysqld3308.pid
socket = /var/run/mysqld/mysqld3308.sock
port = 3308
basedir = /usr
datadir = /var/lib/mysql3308
tmpdir = /tmp
log-error = /var/log/mysql/error3308.log

위를 추가하면 port번호 3307,3308 번을 사용한다는 환경설정을 집어넣는 것이다. 만약 내가 다른 port 번호라거나, data경로, log 경로들을 쓰고 싶다면 입맛대로 바꾸거나 추가해도 상관없다.

이후 리눅스 기준으로 해당하는 폴더를 만든 후 권한을 부여해준다.

mkdir /var/lib/mysql3307
mkdir /var/lib/mysql3308
mkdir /var/log/mysql

chown -R mysql.mysql /var/lib/mysql3307
chown -R mysql.mysql /var/lib/mysql3308
chown -R mysql.mysql /var/log/mysql

이제 마지막으로 init을 해준다.

mysql_install_db --user=mysql --datadir=/var/lib/mysql3307 --basedir=/usr
mysql_install_db --user=mysql --datadir=/var/lib/mysql3308 --basedir=/usr

이후 mysqld_multi 를 이용해 시작해준다

mysqld_multi start 1,2 -- 실행
mysqld_multi stop 1,2 -- 중지

이렇게 할시 netstat을 통해 현재 나의 포트상태를 확인해보면

127.0.0.1:3306
127.0.0.1:3307
127.0.0.1:3308

3개가 실행되어있을 것이다. 물론 이렇게 하면 port 3개에 모두 mariadb가 실행되어 다중인스턴스가 되겠지만, 현재 앞의 ip주소가 localhost 기준으로 되어있기 때문에 같은 네트워크를 쓰는 다른 ip에서 접근이 불가능 할 것이다.

이를 수정하고 싶다면 다시 환경설정 파일로 돌아가 bind_address 항목을 수정해주면 된다.
bind_address 앞에 #을 넣어 주석처리를 하거나, 원하는 ip를 넣어 제한적으로 접근을 허용할 수 있다.

이후 해당 mariadb port에 접근해 원하는 ip를 사용하는 user를 create하여 GRANT 로 권한을 주어 원격으로도 이용할 수 있게 할 수 있다.

profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글