본문 바로가기
따로 정리/서버 세팅

[서버 세팅] 1. DB

by 규글 2024. 5. 1.

 KT 클라우드에서 서버를 생성하고 WEB - WAS - DB 중, 가장 먼저 DB 설정 작업을  수행했었다. 다음의 순서대로 작업을 진행했다.

 

1. repo 파일 생성

위치 : /etc/yum.repos.d/
파일 이름 : MariaDB.repo


내용 :
[mariadb]

name = MariaDB
baseurl = https://archive.mariadb.org/mariadb-10.1/yum/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

  /etc/yum.repos.d/ 위치에 MariaDB.repo 파일을 생성하고, vi editor를 열어 위와 같은 내용을 작성해준다.

 당시에 작업을 진행하면서 사용했던 MariaDB는 10.1.48 ver. 로, 당시에는 그 이상의 버전이 존재하고 있어서 install 명령어를 사용하면 최신 버전으로 설치된다. 따라서 위와 같이 파일ㅇ르 작성해야 install 시 10.1 ver 중 최신 버전을 설치할 수 있게 된다.

 

2. DB 설치

>>> yum install -y MariaDB MariaDB-server MariaDB-client

 yum install 명령어를 사용하여 MariaDB를 설치한다.

 

3. cnf 파일에 설정 추가

>>> cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

 먼저 my-medium.cnf 파일을 /etc/ 위치에 my.cnf 파일로 복사한다.

 

[mysqld]

character-set-server=utf8
collation-server=utf8_general_ci
max_allowed_packet=1073741824
lower_case_table_names=1

 그리고 my.cnf 파일의 mysqld 블럭을 찾아 위와 같은 내용으로 수정 및 추가한다.

 

4. DB 서버 시작

>>> systemctl start mariadb

 위 명령어를 사용하여 DB 서버를 시작한다.

 

 서버를 시작하면 /var/lib/mysql directory에 기존에 없던 새로운 파일들이 생성될 것이다. 여기에서 중요한 것은 mysql.sock 파일인데, 이 파일이 없다면 다음의 mysql_secure_installation 단계를 진행할 수 없다.

 

5. MySQL root 계정 및 보안 설정

>>> mysql_secure_installation

 위와 같이 작성하면 설치된 mysql의 root 계정의 비밀번호를 생성하고, 관련 설정을 진행할 수 있다. 다음 캡쳐된 이미지를 참고하여 진행했었다.

 

 

6. 로그인

>>> mysql -u root p

 설치와 설정이 마무리되었으니, 위 명령어를 사용하여 mariaDB에 로그인이 정상적으로 되는지 확인한다. 바로 전에 설정한 root의 비밀번호를 입력한다.

 

7. 계정 및 데이터베이스 생성

MariaDB [xxx] > create database [database 명];

MariaDB [xxx] > create user '[user 명]'@'localhost' identified by '[password]';

MariaDB [xxx] > create user '[user 명]'@'%' identified by '[password]';

MariaDB [xxx] > grant all privileges on [database 명].* to '[user 명]'@'localhost';

MariaDB [xxx] > grant all privileges on [database 명].* to '[user 명]'@'%';

MariaDB [xxx] > flush privileges;

 mysql에 로그인한 상태로 위와 같은 방식으로 명령어를 입력한다. 이때 입력되어 있는 작은 따옴표는 판드시 입력해야 하며, 대괄호 [ ]의 내용을 원하는 값으로 바꿔서 작성해주면 되겠다. 위 내용은 mysql에 접속할 계정과 비밀번호를 입력하고, 접속 설정을 진행하는 것이다.

 

>>> mysql -u root -p < [파일]

 이 과정은 명령어를 따로 파일로 한 번에 입력하는 방식으로도 가능하다. 파일을 만들어 명령어들을 입력하고, 위와 같이 명령어를 입력하면 된다.

 

8. 데이터베이스에 데이터 생성

>>> mysql –u root –p [database 명] < database_init.sql

 만약 기존에 사용하던 데이터베이스가 있고, 해당 데이터베이스를 sql 파일로 추출하여 옮기려고 하는 경우라면 위와 같은 명령어를 사용한다.

 

MariaDB [xxx] > show global variables like ‘log_bin_trust_function_creators’;

MariaDB [xxx] > set global log_bin_trust_function_creators=ON;

 이때 명령어를 사용하였을 때 sql 파일로 생성할 수 있는 function을 생성하지 못한다는 오류가 발생했었다. 그래서 필자는 위 명령어를 사용하여 설정의 상태를 우선 확인했고, OFF 를 ON으로 변경한 뒤에 다시 진행하였다.

 

[mysqld]

log-bin-trust-function-creators=1

 혹은 이 게시글의 3번 단계에서 복사했던 my.cnf 파일의 mysqld 블럭에 위 설정을 추가해주고 다시 진행하면 되겠다. [footer] https://dodo-it.tistory.com/7 [/footer]

 

 

9. DB 마스터 / 슬레이브 (master / slave) 설정

[공통 설정]

MariaDB [xxx] > grant replication slave on *.* to '[replication 계정]'@'%' identified by '[계정 비밀번호]';

 가장 먼저 replication 계정을 생성한다. Replication이란 복제라는 의미로, 한 쪽을 다른 쪽으로 복제하기 위한 계정으로 생각하면 될 것 같다. MariaDB에 로그인하여 위의 명령어를 작성해준다.

 

[mysqld]

server-id=1
log-bin=mysql-bin
>>> systemctl restart mariadb

 my.cnf 파일의 mysqld 블록에 위와 같은 설정을 추가한 뒤, mariadb를 재시작한다.

 

MariaDB [xxx] > show variables like ‘server_id’;

 그리고 mariaDB에 로그인하여 위 명령어를 통해 설정 정보를 확인한다.

 

 마찬가지로 또 다른 DB 서버에 server-id를 1이 아닌 다른 값으로 설정한 뒤, 이때까지와 동일한 작업을  수행한다.

 

 

[master]

MariaDB [xxx] > show master status\G;

 Master로 설정할 DB에 로그인하여 위 명령어를 사용하면 보이는 값들이 있다. 캡쳐한 이미지에 표기된 File과 Position 정보를 확인하고 slave DB로 이동한다.

 

[slave]

MariaDB [xxx] > stop slave;

MariaDB [xxx] > change master to
 -> master_host='[master DB 사설 ip]', 
 -> master_user='[생성한 replication 아이디]', 
 -> master_password='[비밀번호]', -> master_log_file='[master status File]', 
 -> master_log_pos=[master status Position];
 
 MariaDB [xxx] > start slave;

 Slave DB로 이동하면 먼저 slave DB가 될 mariaDB를 멈춘 뒤, 위 명령어를 작성한다. 이전 단계들에서 생성했던 replication 및 File, Position을 작성해준다. Host에는 설정하고 있는 DB 서버의 사설 ip 정보를 입력해준다.

 

MariaDB [xxx] > show slave status\G;

 만약 흐름대로 잘 설정했다면  master DB에서 status를 확인했던 것처럼 slave에서 status를 확인하면 위와 같은 화면을 보게 된다. Slave IO State 항목에서는 Waiting for master to send event라는 문구를 확인할 수 있고, Slave_IO_Running과 Slave_SQL_Running 항목에서는 Yes를 확인할 수 있다. 나머지 항목들에서도 서버의 virtual ip 정보와 replication 계정 정보 및 master status file 정보를 확인할 수 있다.

 

 이 상태에서 master DB에 변경이 일어났을 떄 slave DB에서도 그 변경이 반영된다면 설정이 정상적으로 완료된 것이며, 역으로 slave에서의 변경은 master에 반영되지 않는다. 만약 slave로부터의 변경을 master에 반영하고 싶다면 순서를 바꿔서 slave를 master처럼, master를 slave처럼 설정을 추가로 진행해주면 된다.

 

MariaDB [xxx] > select @@global.read_only;

MariaDB [xxx] > set global read_only=1;

 하지만 필자는 양방향으로 설정해주지 않았고, 위의 명령어를 사용하여 slave에는 read only 설정을 해주었다. Select로 설정이 0인 것을 확인했다면 1로 수정해준다. 다만 이런 방식의 설정은 DB 서버를 껐다가 다시 켜게 되는 경우 변경될 수 있으므로, 확실하게 설정하고자 한다면 my.cnf 파일에 read_only=1 설정을 명시해도 된다.

 테스트 시 주의할 점은, read only 설정을 했어도 root 계정으로는 데이터베이스의 변경이 일어나기 때문에 DB의 다른 계정으로 진행하여 확인한다.

 

10. 로드밸런서 설정 여부

 DB는 따로 로드밸런서를 세팅하지 않는다. 필자는 master와 slave를 한 쪽씩 구분했는데, 문의해본 결과 KT 클라우드에서 사용하고 있던 로드밸런서 상품은 active/active 방식으로 분배하기 때문에 설정에 존재하는 어떤 방식의 옵션을 택하더라도 slave DB와 연결될 여지가 있다. Slave DB에 연결되는 경우 조회만이 가능하여, 조회 이외의 변경이 필요한 기능의 경우 에러를 발생시켜 정상적으로 동작하지 않을 수 있다.

 

 만약 active/backup 방식으로의 수행을 원하는 경우 다른 로드밸런싱 상품을 이용해야 했었다.

 

 그래서 앞으로 정리할 WAS 에서는 master 쪽만을 바라보도록 했고, master에 장애가 발생했을 시 수작업으로 복구하는 방식을 택했다.

댓글