Galera 클러스터는 MySQL/MariaDB 기반의 다중 마스터 클러스터링 솔루션으로, 고가용성과 확장성을 제공합니다. 하지만 클러스터를 처음 구축하거나 장애 복구 시 부트스트랩 과정이 필요하며, 이를 수동으로 수행하는 것은 번거롭고 실수로 인한 문제가 발생할 수 있습니다. 이 글에서는 Galera 클러스터 부트스트랩을 자동화하는 Bash 스크립트를 소개하고, 각 단계를 설명합니다.


 


스크립트 개요

이 스크립트는 다음과 같은 작업을 수행합니다:

  1. 1번 노드의 grastate.dat 파일 수정
    • safe_to_bootstrap 값을 0에서 1로 변경하여 부트스트랩 가능한 상태로 설정합니다.
    • 파일 백업 및 권한 유지 로직을 포함합니다.
  2. Galera 클러스터 초기화
    • galera_new_cluster 명령을 실행하여 1번 노드에서 클러스터를 시작합니다.
  3. 2번 및 3번 노드의 MySQL 서비스 시작
    • SSH를 통해 원격 노드에 접속하여 MySQL 서비스를 시작합니다.
  4. 테스트 데이터 삽입

    • 클러스터가 초기화된 후, 테스트 데이터를 자동으로 생성하고 삽입합니다. 아래는 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 클러스터 부트스트랩 완료!

주의사항

  1. SSH 키 설정 : 원격 노드에 접속하기 위해 SSH 키를 미리 설정해야 합니다. 그렇지 않으면 비밀번호 입력이 필요할 수 있습니다.
ssh-copy-id -p 10022 root@192.168.10.3
ssh-copy-id -p 10022 root@192.168.10.4
  1. 권한 확인 : grastate.dat 파일 및 MySQL 서비스를 조작하려면 적절한 권한이 필요합니다. 스크립트를 root 사용자로 실행하거나 권한을 부여하세요.
  2. 테스트 환경 : 실제 운영 환경에서 적용하기 전에 테스트 환경에서 충분히 검증하세요.

결론

이 스크립트는 Galera 클러스터 부트스트랩 과정을 자동화하여 시간과 노력을 절약할 수 있도록 도와줍니다. 특히 장애 복구 상황에서 빠르고 안전하게 클러스터를 복구할 수 있는 유용한 도구입니다. 필요에 따라 스크립트를 수정하여 사용해 보세요!

 

start.sh
0.00MB
stop.sh
0.00MB

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기