DB & AWS Knowledge
갈레라 클러스터 구성 방법 본문
- 참고 출처 : 사내 권장 설치 가이드 (권장 표준으로 기밀이 아닌 사항 이외에는 공개)
- 이 페이지에서는 갈레라 클러스터를 구성하는 방법을 기재한다. (해당 페이지에서는 DB source 설치와 같이 동반하여 기재한다.)
- OS : CentOS 7 / DB : MariaDB 10.3 을 기준으로 구성한다. (MySQL 은 따로 galera 라이브러리를 받아야 하기에 이 페이지에서는 편하게 기본적으로 DB 설치 시 구성되어 있는 MariaDB 를 사용한다.)
- 갈레라 클러스터는 Donor, Joiner 라는 개념이 존재하는데 아래와 같은 개념으로 이해하면 된다. 갈레라 클러스터는 다른 H.A 와 같이 최소 3개의 노드 구성을 권장한다.
Host | IP | Role |
galeradb01 | 192.168.137.101 | Donor (다른 DB 서버들의 DB 동기 기준이 될 서버) |
galeradb02 | 192.168.137.102 | Joiner (기존 donor 에 추가 될 노드 서버. DB 기동 시, Donor DB 와 동기화 된다) |
galeradb03 | 192.168.137.103 | Joiner (기존 donor 에 추가 될 노드 서버. DB 기동 시, Donor DB 와 동기화 된다) |
- Donor 구성방법
- 우선 초기 VM 혹은 서버만 구성을 했다면 hostname 을 바꾼다. 아래의 my.cnf 파일 내에 galera 구성 시, 각 서버간의 고유 hostname 을 사용한다.
hostnamectl set-hostname galeradb01 (galeradb02, galeradb03 동일)
- 실제 DB를 사용할 OS 계정인 mariadb 를 생성한다.
useradd mariadb -d /mariadb
(PW 까지 설정 필요 시, passwd mariadb 사용)
- DB 설치 시, 사용할 디렉토리 및 DB명을 변수화 한다. (설정명은 임의로 지정한다)
export DBNM=DB명
- 그 후, log 등의 각 용도의 파일들이 적재될 디렉토리를 생성한다.
mkdir -p /mariadb/$DBNM
mkdir -p /mariadb/$DBNM/scripts
mkdir -p /data/$DBNM/
mkdir -p /data/$DBNM/datadir
mkdir -p /data/$DBNM/tmpdir
mkdir -p /data/$DBNM/logdir
mkdir -p /data/$DBNM/logdir/oldlog
mkdir -p /data/$DBNM/binlog
mkdir -p /data/$DBNM/relaylog
mkdir -p /data/$DBNM/binary_backup
chown -R mariadb:mariadb /mariadb/$DBNM
chown mariadb:mariadb /mariadb
chown -R mariadb:mariadb /data/$DBNM
-- 각 디렉토리 설명 --
/mariadb/DB명/scripts : MariaDB 운영 편의를 위한 스크립트 파일들을 저장하기 위한 경로
/data/DB명/datadir : 데이터 파일을 저장하기 위한 경로. MariaDB내의 datadir 값으로 지정한다.
/data/DB명/tmpdir : 임시로 생성되는 파일을 저장하기 위한 경로. MariaDB내의 tmpdir 값으로 지정한다.
/data/DB명/logdir : 에러로그, 제너럴로그, 슬로우로그를 저장하기 위한 경로.
/data/DB명/logdir/oldlog : 에러로그, 제너럴로그, 슬로우로그의 보관 주기 관리에 사용하는 경로.
/data/DB명/binlog : 바이너리 로그 파일을 저장하기 위한 경로. MariaDB내의 log_bin 값으로 지정한다.
/data/DB명/relaylog : 릴레이 로그 파일을 저장하기 위한 경로. MariaDB내의 relay_log 값으로 지정한다.
/data/DB명/binary_backup : 설치 파일을 백업해두기 위한 경로.
- 그 후, 외부에서 받은 DB 및 기타 tool 프로그램들을 아래의 엔진을 구성할 경로로 이동한다. (아래의 경로 및 설치할 tool 은 임의로 조절 한다.)
mv /tmp/mariadb*.tar.gz /mariadb/$DBNM
mv /tmp/*xtrabackup*tar.gz /mariadb/$DBNM (xtrabackup 사용 시)
mv /tmp/*toolkit*tar.gz /mariadb/$DBNM (percona toolkit 사용 시)
chown mariadb:mariadb /mariadb/$DBNM/*gz
- 이동이 완료 되면 생성 해 두었던 mariadb 계정으로 로그인 후 위에서 설정했던 DBNM 변수를 설정한다.
su - mariadb
export DBNM=DB명
- 이동시켰던 DB의 tar.gz 파일의 압축을 푼다. 압축을 정상 해제 하면 아래와 같은 화면이 나온다.
su - mariadb
export DBNM=DB명
- 압축해제가 완료되면 원본 tar 파일은 설치 파일등을 보관하는 디렉토리에 이동 시킨다.
(이 예시에서는 binary_backup 디렉토리로 이동시킨다.)
mv *.gz /data/$DBNM/binary_backup
- 이동까지 완료되면 기존에 압축을 푼 디렉토리들에 대한 symbolic 링크를 설정 한다.
ln -s mariadb* instance
ln -s *xtrabackup* xtrabackup (xtrabackup 사용 시)
ln -s *toolkit* toolkit (percona toolkit 사용 시)
- 그 후 DB구성에 필요한 my.cnf 파일을 작성한다.
(이 페이지에서는 파라미터 관련 보안 유지를 위하여 갈레라 클러스터 구성 시 사용하는 파라미터만 기재한다. 실사용 파라미터는 사용환경에 맞게 임의로 구성한다.)
- 아래의 파라미터에서 실제 변경이 필요한 내용은 wsrep_cluster_address, wsrep_node_address, wsrep_node_name 다. wsrep_cluster_name 은 자기가 원하는 명칭으로 바꿔도 된다.
또한 $DBNM 은 직접 DB 명으로 바꾼다.
-- wsrep_cluster_address : 실제 갈레라 구성 시, 연결될 서버들의 IP를 설정 해 준다.
(이 페이지에서는 사용하는 서버 IP인 192.168.137.101, 192.168.137.102, 192.168.137.103 을 사용 한다.)
-- wsrep_node_address : DB 가 구성되는 서버의 IP 를 기재한다. (192.168.137.101)
-- wsrep_node_name : DB 가 구성되는 서버의 hostname 을 기재한다.
(위에서 set-hostname 으로 설정 했던 galeradb01 을 사용)
#사내 실제 사용 파라미터는 비공개
#------------------------------------------------------------#
#galera cluster
wsrep_on=ON
default-storage-engine=innodb
log_bin=/data/$DBNM/binlog/binlog
binlog_format=row
query_cache_size=0
query_cache_type=0
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/mariadb/$DBNM/instance/lib/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.137.101,192.168.137.102,192.168.137.103
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.137.101'
wsrep_node_name='galeradb01'
wsrep_sst_method=rsync
#galera cluster
- my.cnf 구성이 완료 되면 bash_profile 에 설정할 내용들을 기재 후 source 로 적용 한다.
echo '' >> ~/.bash_profile
echo export DBNM=$DBNM >> ~/.bash_profile
echo export PATH=/mariadb/$DBNM/instance/bin:/mariadb/$DBNM/xtrabackup/bin:/mariadb/$DBNM/toolkit/bin:'$PATH' >> ~/.bash_profile
echo alias cdmy="'cd /mariadb/$DBNM/instance'" >> ~/.bash_profile
echo alias cdsp="'cd /mariadb/$DBNM/scripts'" >> ~/.bash_profile
echo alias cddt="'cd /data/$DBNM/datadir'" >> ~/.bash_profile
echo alias cdlog="'cd /data/$DBNM/logdir'" >> ~/.bash_profile
echo alias showerr="'vi /data/$DBNM/logdir/error.log'" >> ~/.bash_profile
echo alias tailerr="'tail -f /data/$DBNM/logdir/error.log'" >> ~/.bash_profile
source ~/.bash_profile
- 위의 기본 구성이 끝나면 아래의 엔진경로로 이동후, 명령어를 통해 data 를 저장할 경로에 초기 DB data 영역을 설치한다. 설치가 성공적으로 완료되면 아래와 같은 화면을 볼 수 있다.
cdmy
./scripts/mysql_install_db --defaults-file=/data/$DBNM/my.cnf
- 기동, 중지등에 필요한 스크립트를 작성한다.
1. 데이터베이스 기동 스크립트 작성
cat > /mariadb/$DBNM/scripts/startup.sh << EOF
#!/bin/sh
source ~mariadb/.bash_profile
cd /mariadb/$DBNM/instance
./bin/mysqld_safe --defaults-file=/data/$DBNM/my.cnf &
EOF
2. 데이터베이스 중단 스크립트 작성
cat > /mariadb/$DBNM/scripts/shutdown.sh << EOF
#!/bin/sh
source ~mariadb/.bash_profile
cd /mariadb/$DBNM/instance
./bin/mysqladmin shutdown -u root -p
EOF
3. 데이터베이스 접속 스크립트 작성
cat > /mariadb/$DBNM/scripts/conn.sh << EOF
#!/bin/sh
source ~mariadb/.bash_profile
cd /mariadb/$DBNM/instance
./bin/mysql -h localhost -u root -p
EOF
4. 로그파일 보관 주기 관리용 스크립트 작성
cat > /mariadb/$DBNM/scripts/logrotate.sh << EOF
#!/bin/sh
source ~mariadb/.bash_profile
cd /mariadb/$DBNM/instance
DATE=\`date -d '-1 days' +'%Y%m%d'\`
mv /data/$DBNM/logdir/error.log /data/$DBNM/logdir/oldlog/error.\${DATE}.log
mv /data/$DBNM/logdir/slow.log /data/$DBNM/logdir/oldlog/slow.\${DATE}.log
./bin/mysql -h localhost -u mariadb -e "flush logs"
find /data/$DBNM/logdir/oldlog -name '*.log' -ctime +180 -exec rm -f {} ';'
EOF
5. 클러스터 초기화용 스크립트 작성
cat > /mariadb/$DBNM/scripts/init.sh << EOF
#!/bin/sh
source ~mariadb/.bash_profile
cd /mariadb/$DBNM/instance
./bin/mysqld_safe --defaults-file=/data/$DBNM/my.cnf --wsrep-new-cluster &
EOF
- 이제 DB 를 기동시킨다. Donor 역할을 하는 서버는 init.sh 로 실행한다.
정상적으로 기동 시, 아래와 같이 DB 프로세스 이외에 WSREP 프로세스가 기동 된 것 을 볼 수 있다.
cdsp
sh init.sh
- 기동 후, 일반적인 db 로그인 방식으로 로그인 후, 패스워드를 바꾼다.
cdmy
./bin/mysql -h localhost -u root
alter user 'root'@'localhost' identified by '변경을 원하는 패스워드';
exit;
- 패스워드 변경 및 기타 사용하는 환경에 따라 DB를 구성 한 후, 작성했던 스크립트들으 테스트 해 본다.
아래와 같이 작성한 logrotate 는 정상 수행이 되면 아래와 같이 실행이전의 로그 기록은 oldlog 로 들어간다.
이를 이용하여 crontab 에서 일 단위로 수행을 설정하면 일단위의 log 기록들을 저장 할 수 있다.
- Joiner 구성방법
- Joiner 는 위의 Donor 설치 과정에서 일부분만 수정해주면 된다.
- my.cnf 에서 설정이 필요한 wsrep_node_address 와 wsrep_node_name 을 각 서버에 맞게 바꿔준다.
- 그 후 02, 03 서버는 db 설치 없이 바로 startup.sh 로 기동시킨다. 정상 기동 시, Donor 서버 (d01) 의 DB data 를 가져오면서 복제 및 동기화가 된다.
- 3대 다 기동이 되었다면 DB 접속을 통하여 동일한 DB 리스트를 보여주는지 확인한다. 그 후, 01 서버에서 testdb 라는 테스트용 DB를 생성해 본다. 클러스터가 정상 작동 중일 시, 02 03 서버에서도 동일한 DB가 생성 됐음을 확인 할 수 있다.
create database testdb;
'MySQL > H.A (High Availability)' 카테고리의 다른 글
갈레라 클러스터 개요 (0) | 2021.03.04 |
---|---|
MHA 구성 방법 (0) | 2021.03.04 |
MHA 개요 (0) | 2021.03.03 |
MMM 구성 방법 (0) | 2021.03.03 |
MMM 개요 (0) | 2021.03.03 |