DataBase/Maria DB

[DB] MariaDB MaxScale을 통한 분산처리

Trillion Binary 2023. 2. 13. 13:15
SMALL
지난 게시글에서는 DB서버를 Master - Slave 구조로 구성을 하였었습니다.
Slave DB 서버가 비동기적으로 Master 서버의 변경사항을 감지해서
데이터를 똑같이 만드는 관계가 구축된 것을 말합니다.

[각 Master-Slave DB 복제 관계]

 

이번 게시글에서는 MariaDB에서 지원하는
MaxScale이라는 DB Proxy를 이용해
WRITE/READ 처리는 Master 서버로,
READ 처리는 Slave 서버로만 요청을 보내는 서버를
추가로 구성해볼 것입니다.
[이용자가 MaxScale DB서버에 보낸 요청 도식도]

 

실습한 환경은 AWS EC2의 CentOS 7 리눅스 서버입니다.
​먼저 MariaDB 관련 프로그램을 설치합니다.
# 설치 명령어 
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | sudo bash
sudo yum install maxscale MariaDB-client

# 설치 완료 및 포트 확인
rpm -q maxscale MariaDB-client
sudo netstat -antp
MaxScale 서버에서 Master-Slave서버로 접속해줄 계정을
Master DB에서 생성 및 권한부여를 해줍니다.
CREATE USER 'MAX'@'%' IDENTIFIED BY 'password';
 
GRANT SELECT ON mysql.user TO 'MAX'@'%';
GRANT SELECT ON mysql.db TO 'MAX'@'%';
GRANT SELECT ON mysql.tables_priv TO 'MAX'@'%';
GRANT SELECT ON mysql.columns_priv TO 'MAX'@'%';
GRANT SELECT ON mysql.procs_priv TO 'MAX'@'%';
GRANT SELECT ON mysql.proxies_priv TO 'MAX'@'%';
GRANT SELECT ON mysql.roles_mapping TO 'MAX'@'%';
 
GRANT SHOW DATABASES ON *.* TO 'MAX'@'%';
MasterDB에서 MAX 계정 생성 및 권한 부여가 완료되었다면
MaxScale 서버에서 Master-Slave 서버의 MAX 계정으로의 접속이 되는지 시도해봅니다.

 

# Master
mysql -u MAX -p -h 172.31.000.000 -P 3306
 
# Slave
mysql -u MAX -p -h 172.31.000.000 -P 3306
 
# MaxScale
mysql -u MAX -p -h 172.31.000.000 -P 3306
enter passowrd: [비밀번호 입력]
이제 MaxScale 서버에서의 Configuration 설정을 할 차례입니다.
문서를 참고하여서 작성하시면 됩니다.

https://mariadb.com/kb/en/mariadb-maxscale-6-readwritesplit/

 

Readwritesplit

Readwritesplit This document provides a short overview of the readwritesplit router module and its intended use case scenarios. It also displays all router configuration param...

mariadb.com

#MaxScals 환경설정 편집
sudo vi /etc/maxscale.cnf 
 
 
[maxscale]
threads=auto
admin_host=0.0.0.0    #MaxScale Admin서버를 외부에서도 접속할 수 있게 설정
admin_secure_gui=false     #HTTPS 사용 안함
 
[server1]
type=server
address=[MASTER SERVER의 내부 IP]
port=3306
protocol=MariaDBBackend
 
[server2]
type=server
address=[SLAVE SERVER의 내부 IP]
port=3306
protocol=MariaDBBackend
 
[Replication-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2
user=DEV
password=[DEV_PASSWORD]
monitor_interval=2000ms
 
[Splitter-Service]
type=service
router=readwritesplit
servers=server1, server2
user=MAX
password=[MAX_PASSWORD]
slave_selection_criteria=LEAST_CURRENT_OPERATIONS #활성 작업이 가장 적은 슬레이브로 접속을 시도한다.
master_accept_reads=true #Master DB도 READ 작업이 실행되게 허용해준다
 
[Splitter-Listener]
type=listener
service=Splitter-Service
protocol=MariaDBClient
port=3306
# 저장 후 MaxScale 서비스를 재시작해줍니다.
sudo systemctl restart maxscale
 
# 오류 시에는 MaxScale 로그 확인
cat /var/log/maxscale/maxscale.log
 
# MaxScale 상태 확인 명령어
maxctrl list servers
maxctrl list services
maxctrl list listeners
maxctrl show server server1
maxctrl show server server2
설정이 완료되었다면 MaxScale 서버로 DB클라이언트에 접속하여 쿼리를 실행해봅니다.
그 후에 각 Master-Slave 서버로 DEV 계정으로 접속하여 MaxScale 분산처리가 잘 적용되었는지 확인해봅니다.
 
-- 현재 접속된 호스트의 주소
SELECT @@HOSTNAME;
 
-- DB계정별 명령어 사용 횟수 조회 허용하기
-- 사용 후에는 GLOBAL USERSTAT = 0 으로 되돌릴 것.
SET GLOBAL USERSTAT = 1;
 
-- MAX 계정의 SELECT, INSERT 등의 쿼리 사용량을 확인해봅니다.
SELECT user, rows_read, rows_inserted, select_commands, update_commands 
FROM INFORMATION_SCHEMA.USER_STATISTICS;

 

실습 참고 영상

[Database] CentOS 8에 MaxScale 설치하기 - YouTube

 

BIG