Computer >> 컴퓨터 >  >> 시스템 >> Linux

MariaDB 설치 및 성능 최적화 완벽 가이드 (CentOS 7)

이 글에서는 Linux CentOS 7 환경에서 데이터베이스 서버 MariaDB의 설치 방법, 기본 설정, 그리고 성능 최적화 과정을 단계별로 다룹니다. 마지막에는 실제 MariaDB 설정 파일 예시까지 함께 소개하니, 여러분의 DB 서버에 맞는 최적의 파라미터를 선택하는 데 큰 도움이 될 것입니다.

CentOS에 MariaDB 설치하기

최근 MariaDB가 CentOS 7 기본 저장소에 포함되었지만, 저장소에서 제공되는 버전은 5.5로 상당히 오래되었습니다. 이 버전은 성능 문제가 있고 InnoDB에서 전문 검색(full-text search)도 지원하지 않습니다. 최신 버전의 MariaDB를 설치하려면 먼저 mariadb.org 개발자 저장소를 추가해야 합니다.

yum으로 nano 에디터를 설치합니다:

yum install nano -y

그다음 저장소 파일을 열어 편집합니다:

nano /etc/yum.repos.d/mariadb.repo

파일에 아래 내용을 추가합니다:

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

mariadb.repo 설정 파일을 저장한 뒤, MariaDB 서버와 클라이언트를 설치합니다:

yum --disablerepo=AppStream install MariaDB-server MariaDB-client -y

설치가 완료되면 mariadb 서비스를 시작하고 부팅 시 자동 실행되도록 등록합니다:

systemctl start mariadb
systemctl enable mariadb

서비스 상태를 확인합니다:

systemctl status mariadb

MariaDB 설치 및 성능 최적화 완벽 가이드 (CentOS 7)

mariadb 서비스가 정상적으로 실행 중이므로 이제 설정 작업을 진행할 수 있습니다.

MariaDB 서버 보안 설정

MariaDB 서버를 설치하고 실행했다면 보안 설정으로 넘어갑니다. 내장 스크립트를 실행합니다:

/usr/bin/mysql_secure_installation

먼저 root 비밀번호 입력을 요청합니다. 초기 설치 직후에는 비밀번호가 설정되어 있지 않으므로 ENTER를 누르고, 다음 단계에서 복잡한 비밀번호를 설정하세요. 이후에는 시나리오가 끝날 때까지 ENTER만 눌러도 됩니다. 이 과정에서 익명 사용자, 원격 root 로그인, 테스트 테이블이 삭제되고 권한이 갱신됩니다.

원격에서 MariaDB 서버에 접속하려면 iptables를 사용해 Linux 방화벽 규칙을 만들어야 합니다:

iptables -I INPUT -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables-save > /etc/sysconfig/iptables

필요하다면 원격 MariaDB 데이터베이스로 나가는 연결도 허용할 수 있습니다:

iptables -I OUTPUT -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

MariaDB 연결 테스트

MariaDB가 성공적으로 설치되었는지 확인해야 합니다.

내장 도구인 mysqladmin을 사용해 DB 서버에 접속해 보겠습니다:

mysqladmin version

명령 실행 결과는 다음과 같습니다:

mysqladmin Ver 9.1 Distrib 10.4.7-MariaDB, for Linux on x86_64
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Server version 10.4.7-MariaDB
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/lib/mysql/mysql.sock
Uptime: 59 min 35 sec
Threads: 10 Questions: 24 Slow queries: 0 Opens: 28 Flush tables: 1 Open tab

즉, MariaDB가 성공적으로 설치되었고 데이터베이스가 정상적으로 구동 중이라는 의미입니다.

대화형으로 SQL 명령을 실행하려면 다음과 같이 MariaDB 서버 콘솔에 접속할 수 있습니다:

mysql -u root -p

MariaDB 설정 파일 – my.cnf

보통 MariaDB 설치 후에는 대부분의 서버에서 문제없이 동작하는 표준 설정을 /etc/my.cnf 설정 파일에 추가합니다. my.cnf를 비운 뒤 아래 내용을 추가하세요:

[mysqld]
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
max_allowed_packet = 128M
sql_mode = ""
log-error = /var/log/mysql-error.log
# Cache parameters
query_cache_size = 16M
table_open_cache = 4096
thread_cache_size = 16
key_buffer_size = 8M
thread_stack = 256K
join_buffer_size = 2M
sort_buffer_size = 2M
# Parameters for temporary tables
tmpdir = /tmp
max_heap_table_size = 32M
tmp_table_size = 32M
# InnoDB parameters
innodb_file_per_table
innodb_buffer_pool_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_use_native_aio = 0
transaction-isolation = READ-COMMITTED
character-set-server = utf8
collation-server = utf8_unicode_ci
init-connect = "SET NAMES utf8 COLLATE utf8_unicode_ci"
skip-name-resolve
[mysqldump]
quick
quote-names
max_allowed_packet = 128M
default-character-set = utf8
[mysql]
[isamchk]
key_buffer = 16M
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

주요 my.cnf 파라미터를 좀 더 자세히 살펴보겠습니다:

  • datadir: 데이터베이스 파일이 저장되는 디렉터리입니다.
  • tmpdir: 임시 파일을 저장하는 디렉터리입니다.
  • skip-name-resolve: DNS 이름 확인을 비활성화합니다.
  • max_allowed_packet: 허용되는 최대 패킷 크기입니다. DB에서 blob 필드를 사용한다면 이 값은 가장 큰 필드 크기보다 작아서는 안 됩니다.
  • max_connections: 최대 열린 연결 수입니다. 동시에 몇 개의 클라이언트가 MariaDB 서버와 작업할 수 있는지 결정합니다.
  • # Cache parameters 섹션: 쿼리 캐시와 관련된 모든 항목을 포함합니다. 값이 너무 크면 DB 서버가 더 많은 리소스를 소모하므로 지나치게 높게 설정하지 않는 것이 좋습니다.
  • # InnoDB parameters 섹션: InnoDB 테이블과 관련된 모든 항목을 포함합니다.
  • innodb_buffer_pool_size: 데이터와 인덱스를 위한 캐시 버퍼입니다. 서버에 1~2개 프로젝트만 있다면 가용 RAM의 70~80%로 설정하세요.
  • innodb_flush_method: Linux에서는 O_DIRECT로 설정하면 OS 수준 캐싱이 비활성화됩니다.
  • innodb_flush_log_at_trx_commit: InnoDB 테이블의 쓰기 속도에 영향을 주는 파라미터입니다. 신중하게 다뤄야 합니다. 0으로 설정하면 성능은 높아지지만 데이터 손실 위험이 커집니다. 저는 뚜렷한 성능 향상을 경험하지 못했고 안정성이 우선이므로 2로 설정하는 것을 선호합니다.

MariaDB 성능 최적화 및 튜닝

덧붙이자면 위 설정 파일을 그대로 복사할 필요는 없습니다. 서버마다, 프로젝트마다 필요한 파라미터가 다릅니다. MariaDB 설정을 자동으로 점검하고 서버 최적화 권장 사항을 제공하는 스크립트를 활용하는 것을 추천합니다.

MariaDB 파라미터를 최적화하려면 Tuning-Primer.sh 스크립트를 사용할 수 있습니다. 먼저 추가 도구를 설치합니다:

yum install bc net-tools -y

최적화 스크립트를 다운로드합니다:

wget https://launchpadlibrarian.net/78745738/tuning-primer.sh

.sh 파일에 실행 권한을 부여합니다:

chmod +x tuning-primer.sh

스크립트를 실행합니다:

./tuning-primer.sh

실행 후 스크립트는 알아두면 유용한 정보를 보여줍니다. 가장 중요한 항목은 빨간색으로 강조되며, 수정이 권장되는 부분들입니다.

예를 들어 스크립트는 설정된 값보다 실제 연결 수가 훨씬 적다고 알려주었습니다.

MariaDB 설치 및 성능 최적화 완벽 가이드 (CentOS 7)

이 파라미터는 my.cnf 파일에서도, 콘솔에서도 변경할 수 있습니다. 더 낮은 값(10)으로 설정했더니 스크립트가 승인했습니다:

MariaDB 설치 및 성능 최적화 완벽 가이드 (CentOS 7)

이런 점검을 활용하면 MariaDB 서버의 성능을 최적 수준으로 끌어올릴 수 있습니다.

참고로 DB 서버는 최소 48시간 이상 연속 가동된 후 점검하는 것이 좋습니다. 그래야 정보가 더 정확해지고 서버를 제대로 튜닝할 수 있습니다.

슬로우 쿼리 로그(slow query log)를 활성화하는 섹션을 추가할 수도 있습니다. 프로젝트 성능 분석에 큰 도움이 됩니다. mysqld 섹션에 다음을 추가하세요:

slow_query_log = 1 # 슬로우 쿼리 로그 활성화
long_query_time = 5 # 기준 시간(초) 설정
slow_query_log_file = /var/log/slow-query.log # 슬로우 쿼리 로그 파일명과 경로
log_queries_not_using_indexes # 인덱스를 사용하지 않는 쿼리를 로그에 기록할지 여부

또한 MariaDB 로그 파일과 슬로우 쿼리 로그 파일을 생성해야 합니다:

touch /var/log/mysql-error.log
touch /var/log/slow-query.log

DB 서비스를 재시작합니다:

systemctl restart mariadb

/var/log/slow-query.log 파일을 열거나 실시간으로 확인하며 슬로우 쿼리 로그를 볼 수 있습니다:

tail -f /var/log/slow-query.log

이렇게 하면 프로젝트가 DB로 보내는 쿼리를 분석하고 감사(audit)할 수 있습니다.

DB 설정을 변경했다면 설정에 오류가 없는지 반드시 확인하세요. my.cnf 설정을 변경한 후에는 다음 명령으로 설정 오류를 점검합니다:

systemctl status mariadb -l

MariaDB 기본 셸 명령어

관리자가 MariaDB 콘솔에서 자주 사용하게 되는 주요 CLI 명령어는 아래와 같습니다.

로컬에서 MariaDB 콘솔에 로그인하려면 다음 명령을 실행합니다:

mysql -u root -p

원격으로 MariaDB 서버에 접속하려면:

mysql -u root -p -h 192.168.1.20

유용한 MariaDB(MySQL) 명령어:

create database db1; — db1이라는 이름의 데이터베이스를 생성합니다.

show databases; — 서버에 있는 데이터베이스 목록을 표시합니다.

use db1; — db1 데이터베이스에 접속합니다.

show tables; — 현재 데이터베이스의 모든 테이블 목록을 표시합니다.

create user 'project'@'localhost' identified by '$sup#erP@ss1'; — 사용자(project)를 생성하고 비밀번호를 $sup#erP@ss1로 설정합니다.

grant all privileges on database_name.* to project@'localhost'; — project 사용자에게 모든 권한을 부여합니다.

flush privileges; — 모든 권한 정보를 갱신합니다.

show processlist; — 활성 DB 연결을 조회합니다. 다음 명령도 함께 사용할 수 있습니다:

show status where `variable_name` = 'Threads_connected';

mysql 콘솔에서는 다음과 같이 일부 변수를 조회하거나 변경할 수 있습니다:

SHOW VARIABLES LIKE 'max_error_count';

MariaDB 설치 및 성능 최적화 완벽 가이드 (CentOS 7)

변경하려면:

SET max_error_count=256;

MariaDB 설치 및 성능 최적화 완벽 가이드 (CentOS 7)

마무리하자면, DB 서버를 구성할 때는 해당 서버에 배치될 프로젝트들을 반드시 고려해야 합니다. 소규모 프로젝트에 적합한 설정이 대규모 프로젝트에는 분명 맞지 않습니다. 직접 시도하고 실험하며 항상 로그를 확인하는 습관을 들이세요. 다음 글에서는 MariaDB 데이터베이스 서버 간 복제(replication)를 활용해 고가용성을 확보하고 애플리케이션 성능을 높이는 방법을 소개하겠습니다.