Galera 클러스터는 MySQL/MariaDB 기반의 다중 마스터 클러스터링 솔루션으로, 고가용성과 확장성을 제공합니다. 하지만 클러스터를 처음 구축하거나 장애 복구 시 부트스트랩 과정이 필요하며, 이를 수동으로 수행하는 것은 번거롭고 실수로 인한 문제가 발생할 수 있습니다. 이 글에서는 Galera 클러스터 부트스트랩을 자동화하는 Bash 스크립트를 소개하고, 각 단계를 설명합니다.
스크립트 개요
이 스크립트는 다음과 같은 작업을 수행합니다:
- 1번 노드의 grastate.dat 파일 수정
- safe_to_bootstrap 값을 0에서 1로 변경하여 부트스트랩 가능한 상태로 설정합니다.
- 파일 백업 및 권한 유지 로직을 포함합니다.
- Galera 클러스터 초기화
- galera_new_cluster 명령을 실행하여 1번 노드에서 클러스터를 시작합니다.
- 2번 및 3번 노드의 MySQL 서비스 시작
- SSH를 통해 원격 노드에 접속하여 MySQL 서비스를 시작합니다.
- 테스트 데이터 삽입
- 클러스터가 초기화된 후, 테스트 데이터를 자동으로 생성하고 삽입합니다. 아래는 MySQL 프로시저를 사용하여 100개의 더미 데이터를 삽입하는 예제입니다:
DELIMITER $$
CREATE PROCEDURE insert_test_data()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= 100 DO
INSERT INTO users (username, email) VALUES (CONCAT('user', i), CONCAT('user', i, '@example.com'));
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
CALL insert_test_data();
스크립트 코드 분석
1. grastate.dat 파일 수정
update_safe_to_bootstrap() {
echo "grastate.dat 파일의 safe_to_bootstrap 값을 1로 변경 중..."
# 파일 존재 여부 확인
if [[ ! -f "$GRSTATE_FILE" ]]; then
echo "Error: $GRSTATE_FILE 파일을 찾을 수 없습니다."
exit 1
fi
# 백업 파일 생성
BACKUP_FILE="${GRSTATE_FILE}.bak"
cp "$GRSTATE_FILE" "$BACKUP_FILE"
if [[ $? -ne 0 ]]; then
echo "Error: 백업 파일 생성에 실패했습니다."
exit 1
fi
# safe_to_bootstrap: 0 -> 1 변경
sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/' "$GRSTATE_FILE"
if [[ $? -ne 0 ]]; then
echo "Error: 파일 수정에 실패했습니다. 원본 파일을 복원합니다."
mv "$BACKUP_FILE" "$GRSTATE_FILE"
exit 1
fi
# 파일 권한 및 소유자 유지
chmod --reference="$BACKUP_FILE" "$GRSTATE_FILE"
chown --reference="$BACKUP_FILE" "$GRSTATE_FILE"
echo "성공: safe_to_bootstrap 값을 1로 변경했습니다."
echo "백업 파일: $BACKUP_FILE"
}
- 파일 존재 여부 확인 : grastate.dat 파일이 없으면 에러 메시지를 출력하고 종료합니다.
- 백업 파일 생성 : 원본 파일을 백업하여 수정 실패 시 복원할 수 있도록 합니다.
- 값 변경 : sed 명령어를 사용하여 safe_to_bootstrap 값을 0에서 1로 변경합니다.
- 권한 및 소유자 유지 : 원본 파일의 권한과 소유자를 유지하여 보안 문제를 방지합니다.
2. Galera 클러스터 초기화
echo "Galera 클러스터 초기화 중..."
galera_new_cluster
if [[ $? -ne 0 ]]; then
echo "Error: galera_new_cluster 명령 실행에 실패했습니다."
exit 1
fi
- galera_new_cluster 명령은 1번 노드에서 클러스터를 초기화합니다.
- 명령 실행 실패 시 에러 메시지를 출력하고 스크립트를 종료합니다.
3. 원격 노드의 MySQL 서비스 시작
start_mysql_on_other_nodes() {
echo "2번 노드의 MySQL 서비스 시작 중..."
ssh -p 10022 root@192.168.10.3 "pkill -9 -ef mysql"
ssh -p 10022 root@192.168.10.3 "pkill -9 -ef maria"
ssh -p 10022 root@192.168.10.3 "systemctl start mysqld"
if [[ $? -ne 0 ]]; then
echo "Error: 2번 노드의 MySQL 서비스 시작에 실패했습니다."
exit 1
fi
echo "3번 노드의 MySQL 서비스 시작 중..."
ssh -p 10022 root@192.168.10.4 "pkill -9 -ef mysql"
ssh -p 10022 root@192.168.10.4 "pkill -9 -ef maria"
ssh -p 10022 root@192.168.10.4 "systemctl start mysqld"
if [[ $? -ne 0 ]]; then
echo "Error: 3번 노드의 MySQL 서비스 시작에 실패했습니다."
exit 1
fi
}
- 프로세스 종료 : 기존 MySQL/MariaDB 프로세스를 강제 종료합니다.
- 서비스 시작 : systemctl 명령어를 사용하여 MySQL 서비스를 시작합니다.
- 에러 처리 : SSH 연결 또는 명령 실행 실패 시 에러 메시지를 출력하고 스크립트를 종료합니다.
실행 결과 예시
스크립트를 실행하면 다음과 같은 메시지가 출력됩니다:
Galera 클러스터 부트스트랩 프로세스 시작...
grastate.dat 파일의 safe_to_bootstrap 값을 1로 변경 중...
성공: safe_to_bootstrap 값을 1로 변경했습니다.
백업 파일: /data/mysql/grastate.dat.bak
Galera 클러스터 초기화 중...
2번 노드의 MySQL 서비스 시작 중...
3번 노드의 MySQL 서비스 시작 중...
Galera 클러스터 부트스트랩 완료!
주의사항
- SSH 키 설정 : 원격 노드에 접속하기 위해 SSH 키를 미리 설정해야 합니다. 그렇지 않으면 비밀번호 입력이 필요할 수 있습니다.
ssh-copy-id -p 10022 root@192.168.10.3
ssh-copy-id -p 10022 root@192.168.10.4
- 권한 확인 : grastate.dat 파일 및 MySQL 서비스를 조작하려면 적절한 권한이 필요합니다. 스크립트를 root 사용자로 실행하거나 권한을 부여하세요.
- 테스트 환경 : 실제 운영 환경에서 적용하기 전에 테스트 환경에서 충분히 검증하세요.
결론
이 스크립트는 Galera 클러스터 부트스트랩 과정을 자동화하여 시간과 노력을 절약할 수 있도록 도와줍니다. 특히 장애 복구 상황에서 빠르고 안전하게 클러스터를 복구할 수 있는 유용한 도구입니다. 필요에 따라 스크립트를 수정하여 사용해 보세요!