Linux에서 읽기 확장에 대한 SQL Server 가용성 그룹 구성

적용 대상:SQL Server - Linux

이 문서에서는 클러스터 관리자 없이 Linux의 SQL Server Always On 가용성 그룹을 만드는 방법을 설명합니다. 이 아키텍처는 읽기 배율만을 제공합니다. 고가용성을 제공하지 않습니다.

AG에 대한 두 가지 종류의 아키텍처가 있습니다. 고가용성을 위한 아키텍처는 클러스터 관리자를 사용하여 향상된 비즈니스 연속성을 제공합니다. 고가용성 아키텍처를 만들려면 Linux에서 고가용성을 위한 SQL Server Always On 가용성 그룹 구성을 참조하세요.

CLUSTER_TYPE = NONE인 가용성 그룹은 다른 운영 체제 플랫폼에서 호스팅되는 복제본을 포함할 수 있습니다. 고가용성을 지원할 수 없습니다.

필수 구성 요소

가용성 그룹을 만들려면 먼저 다음을 수행해야 합니다.

  • 가용성 복제본을 호스트하는 모든 서버가 통신할 수 있도록 환경을 설정합니다.
  • SQL Server를 설치합니다.

참고

Linux에서는 가용성 그룹을 먼저 만들어야만 클러스터에서 관리할 클러스터 리소스로 추가할 수 있습니다. 이 문서에는 가용성 그룹을 만드는 예제가 나옵니다. 클러스터를 만들고 가용성 그룹을 클러스터 리소스로 추가하는 배포 관련 지침은 “다음 단계”에 있는 링크를 참조하세요.

  1. 각 호스트의 컴퓨터 이름을 업데이트합니다.

    각 SQL Server 이름은 다음과 같아야 합니다.

    • 15자 이하입니다.
    • 네트워크 내에서 고유합니다.

    컴퓨터 이름을 설정하려면 /etc/hostname을 편집합니다. 다음 스크립트에서는 vi를 사용하여 /etc/hostname을 편집할 수 있습니다.

    sudo vi /etc/hostname
    
  2. hosts 파일을 구성합니다.

    참고

    호스트 이름이 DNS 서버에 해당 IP 주소로 등록된 경우 다음 단계를 수행할 필요가 없습니다. 가용성 그룹 구성의 일부로 사용할 모든 노드가 서로 통신할 수 있는지 확인합니다. 호스트 이름에 대한 ping은 해당 IP 주소를 사용하여 응답해야 합니다. 또한 /etc/hosts 파일에 localhost IP 주소 127.0.0.1을 노드의 호스트 이름에 매핑하는 레코드가 포함되지 않아야 합니다.

    모든 서버의 호스트 파일에는 가용성 그룹에 참여할 모든 서버의 IP 주소 및 이름이 포함됩니다.

    다음 명령은 현재 서버의 IP 주소를 반환합니다.

    sudo ip addr show
    

    /etc/hosts를 업데이트합니다. 다음 스크립트에서는 vi를 사용하여 /etc/hosts를 편집할 수 있습니다.

    sudo vi /etc/hosts
    

    다음 예제에서는 node1, node2node3에 대한 항목이 추가된 node1/etc/hosts를 보여 줍니다. 이 샘플에서 node1은 주 복제본을 호스트하는 서버를 나타내고, node2node3은 보조 복제본을 호스트하는 서버를 나타냅니다.

    127.0.0.1    localhost localhost4 localhost4.localdomain4
    ::1          localhost localhost6 localhost6.localdomain6
    10.128.18.12 node1
    10.128.16.77 node2
    10.128.15.33 node3
    

SQL Server 설치

SQL Server를 설치합니다. 다음 링크는 다양한 배포에 대한 SQL Server 설치 지침으로 연결됩니다.

Always On 가용성 그룹 사용

SQL Server 인스턴스를 호스트하는 각 노드에서 Always On 가용성 그룹을 사용하도록 설정한 다음, mssql-server를 다시 시작합니다. 다음 스크립트를 실행합니다.

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1
sudo systemctl restart mssql-server

AlwaysOn_health 이벤트 세션을 사용하도록 설정

필요에 따라 XE(확장 이벤트)를 사용하도록 설정하면 가용성 그룹 문제를 해결할 때 근본 원인 진단에 도움이 될 수 있습니다. SQL Server의 각 인스턴스에서 다음 명령을 실행합니다.

ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO

이 XE 세션에 대한 자세한 내용은 Always On 가용성 그룹에 대한 확장 이벤트 구성을 참조하세요.

인증서 만들기

Linux의 SQL Server 서비스는 인증서를 사용하여 미러링 엔드포인트 간의 통신을 인증합니다.

다음 Transact-SQL 스크립트는 마스터 키와 인증서를 만듭니다. 그런 다음, 인증서를 백업하고 프라이빗 키로 파일을 보호합니다. 강력한 암호로 스크립트를 업데이트합니다. 기본 SQL Server 인스턴스에 연결합니다. 인증서를 만들려면 다음 Transact-SQL 스크립트를 실행합니다.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
   TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
   WITH PRIVATE KEY (
           FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
           ENCRYPTION BY PASSWORD = '**<Private_Key_Password>**'
        );

이제 기본 SQL Server 복제본은 /var/opt/mssql/data/dbm_certificate.cer에 인증서, var/opt/mssql/data/dbm_certificate.pvk에 프라이빗 키가 있습니다. 이러한 두 파일을 가용성 복제본을 호스트할 모든 서버의 동일한 위치로 복사합니다. mssql 사용자를 사용하거나 mssql 사용자에게 이러한 파일에 액세스할 수 있는 권한을 부여합니다.

예를 들어 원본 서버에서 다음 명령은 파일을 대상 컴퓨터에 복사합니다. **<node2>** 값을 복제본을 호스트할 SQL Server 인스턴스의 이름으로 바꿉니다.

cd /var/opt/mssql/data
scp dbm_certificate.* root@**<node2>**:/var/opt/mssql/data/

각 대상 서버에서 mssql 사용자에게 인증서에 액세스할 수 있는 권한을 부여합니다.

cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*

보조 서버에서 인증서 만들기

다음 Transact-SQL 스크립트는 기본 SQL Server 복제본에 대해 만든 백업을 사용하여 마스터 키와 인증서를 만듭니다. 강력한 암호로 스크립트를 업데이트합니다. 해독 암호는 이전 단계에서 .pvk 파일을 만들 때 사용한 암호와 동일합니다. 인증서를 만들려면 모든 보조 서버에서 다음 스크립트를 실행합니다.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';
CREATE CERTIFICATE dbm_certificate
    FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
    WITH PRIVATE KEY (
           FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
           DECRYPTION BY PASSWORD = '**<Private_Key_Password>**'
        );

모든 복제본에서 데이터베이스 미러링 엔드포인트 만들기

데이터베이스 미러링 엔드포인트는 TCP(전송 제어 프로토콜)를 사용하여 데이터베이스 미러링 세션에 참여하거나 가용성 복제본을 호스트하는 서버 인스턴스 간에 메시지를 보내고 받습니다. 데이터베이스 미러링 엔드포인트는 고유의 TCP 포트 번호에서 수신합니다.

다음 Transact-SQL 스크립트는 가용성 그룹에 대해 수신하는 엔드포인트 Hadr_endpoint를 만듭니다. 이 스크립트는 엔드포인트를 시작하고 만든 인증서에 대해 연결 권한을 부여합니다. 스크립트를 실행하기 전에 **< ... >** 사이의 값을 바꿉니다. 필요에 따라 IP 주소 LISTENER_IP = (0.0.0.0)을 포함할 수 있습니다. 수신기 IP 주소는 IPv4 주소여야 합니다. 또한 0.0.0.0을 사용할 수 있습니다.

모든 SQL Server 인스턴스에서 환경에 대한 다음 Transact-SQL 스크립트를 업데이트합니다.

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = **<5022>**)
    FOR DATABASE_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;

참고

한 노드에서 SQL Server Express Edition을 사용하여 구성 전용 복제본을 호스트하는 경우 ROLE의 유효한 값은 WITNESS뿐입니다. SQL Server Express Edition에서 다음 스크립트를 실행합니다.

CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_PORT = **<5022>**)
    FOR DATABASE_MIRRORING (
        ROLE = WITNESS,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;

방화벽의 TCP 포트를 수신기 포트용으로 열어 두어야 합니다.

중요

SQL Server 2017 릴리스의 경우 데이터베이스 미러링 엔드포인트에 지원되는 인증 방법은 CERTIFICATE뿐입니다. WINDOWS 옵션은 향후 릴리스에서 사용할 수 있습니다.

자세한 내용은 데이터베이스 미러링 엔드포인트(SQL Server)를 참조하세요.

가용성 그룹 만들기

AG를 만듭니다. CLUSTER_TYPE = NONE을 설정합니다. 또한 각 복제본을 FAILOVER_MODE = MANUAL으로 설정합니다. 분석 또는 보고 워크로드를 실행하는 클라이언트 애플리케이션에서 보조 데이터베이스에 직접 연결할 수 있습니다. 읽기 전용 라우팅 목록을 만들 수도 있습니다. 주 복제본에 대한 연결은 읽기 연결 요청을 라운드 로빈 방식으로 라우팅 목록에서 각 보조 복제본으로 전달합니다.

다음 Transact-SQL 스크립트는 ag1이라는 AG를 만듭니다. 스크립트는 SEEDING_MODE = AUTOMATIC으로 AG 복제본을 구성합니다. 이렇게 설정하면 SQL Server에서는 데이터베이스가 AG에 추가된 후 각 보조 서버에 데이터베이스를 자동으로 만듭니다. 사용자 환경에 대해 다음 스크립트를 업데이트합니다. <node1><node2> 값을 복제본을 호스팅하는 SQL Server 인스턴스의 이름으로 바꿉니다. <5022> 값을 엔드포인트에 대해 설정한 포트로 바꿉니다. 주 SQL Server 복제본에서 다음 Transact-SQL 스크립트를 실행합니다.

CREATE AVAILABILITY GROUP [ag1]
    WITH (CLUSTER_TYPE = NONE)
    FOR REPLICA ON
        N'<node1>' WITH (
            ENDPOINT_URL = N'tcp://<node1>:<5022>',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
                    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            ),
        N'<node2>' WITH ( 
            ENDPOINT_URL = N'tcp://<node2>:<5022>', 
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            );

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

보조 SQL Server 인스턴스를 AG에 조인

다음 Transact-SQL 스크립트는 ag1이라는 AG에 서버를 조인합니다. 사용자 환경에 대해 스크립트를 업데이트합니다. 각 보조 SQL Server 복제본에서 다음 Transact-SQL 스크립트를 실행하여 AG를 조인합니다.

ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);

ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;

가용성 그룹에 데이터베이스 추가

가용성 그룹에 추가하는 데이터베이스가 전체 복구 모델에 있고 유효한 로그 백업이 있는지 확인합니다. 테스트 데이터베이스이거나 새로 만든 데이터베이스인 경우 데이터베이스 백업을 수행합니다. 기본 SQL Server에서 다음 Transact-SQL 스크립트를 실행하여 db1이라는 데이터베이스를 만들고 백업합니다.

CREATE DATABASE [db1];
ALTER DATABASE [db1] SET RECOVERY FULL;
BACKUP DATABASE [db1]
   TO DISK = N'/var/opt/mssql/data/db1.bak';

기본 SQL Server 복제본에서 다음 Transact-SQL 스크립트를 실행하여 db1 데이터베이스를 가용성 그룹 ag1에 추가합니다.

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1];

데이터베이스가 보조 서버에 생성되었는지 확인

각 보조 SQL Server 복제본에서 다음 쿼리를 실행하여 db1 데이터베이스가 생성되고 동기화되었는지 확인합니다.

SELECT * FROM sys.databases WHERE name = 'db1';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

이 AG는 고가용성 구성이 아닙니다. 고가용성이 필요한 경우 SQL Server on Linux에 대한 Always On 가용성 그룹 구성의 지침을 따릅니다. 특히 CLUSTER_TYPE=WSFC(Windows) 또는 CLUSTER_TYPE=EXTERNAL(Linux)을 사용하여 AG를 만듭니다. 그런 다음, Windows의 경우 Windows Server 장애 조치(failover) 클러스터링 또는 Linux의 경우 Pacemaker를 사용하여 클러스터 관리자와 통합할 수 있습니다.

읽기 전용 보조 복제본에 연결

읽기 전용 보조 복제본에 연결하는 방법은 두 가지가 있습니다. 애플리케이션은 보조 복제본을 호스팅하는 SQL Server 인스턴스에 직접 연결하고 데이터베이스를 쿼리할 수 있습니다. 또한 수신기가 필요한 읽기 전용 라우팅을 사용할 수도 있습니다.

읽기 비율 AG에서 주 복제본 장애 조치(failover)

각 가용성 그룹에는 하나의 주 복제본만 있습니다. 주 복제본은 읽기 및 쓰기를 허용합니다. 주 복제본을 변경하기 위해 장애 조치(failover)를 수행할 수 있습니다. 일반적인 가용성 그룹에서 클러스터 관리자는 장애 조치 프로세스를 자동화합니다. 클러스터 형식이 NONE인 가용성 그룹에서 장애 조치(failover) 프로세스는 수동입니다.

클러스터 형식이 NONE인 가용성 그룹에서 두 가지 방법으로 주 복제본을 장애 조치(failover)할 수 있습니다.

  • 데이터가 손실되지 않는 수동 장애 조치(Failover)
  • 데이터 손실이 있는 강제 수동 장애 조치(Failover)

데이터가 손실되지 않는 수동 장애 조치(Failover)

주 복제본을 사용할 수 있지만 주 복제본을 호스트하는 인스턴스를 일시적으로 또는 영구적으로 변경해야 하는 경우 이 방법을 사용합니다. 잠재적인 데이터 손실을 방지하려면 수동 장애 조치(failover)를 실행하기 전에 대상 보조 복제본이 최신 상태인지 확인합니다.

데이터 손실이 없는 수동 장애 조치(Failover)를 수행하려면:

  1. 현재 주 복제본 및 대상 보조 복제본을 SYNCHRONOUS_COMMIT으로 설정합니다.

    ALTER AVAILABILITY GROUP [AGRScale] 
         MODIFY REPLICA ON N'<node2>' 
         WITH (AVAILABILITY_MODE = SYNCHRONOUS_COMMIT);
    
  2. 활성 트랜잭션이 주 복제본과 적어도 하나의 동기 보조 복제본에 커밋되었는지 확인하려면 다음 쿼리를 실행합니다.

    SELECT ag.name, 
       drs.database_id, 
       drs.group_id, 
       drs.replica_id, 
       drs.synchronization_state_desc, 
       ag.sequence_number
    FROM sys.dm_hadr_database_replica_states drs, sys.availability_groups ag
    WHERE drs.group_id = ag.group_id; 
    

    보조 복제본이 synchronization_state_descSYNCHRONIZED일 때 동기화됩니다.

  3. REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT을 1로 업데이트합니다.

    다음 스크립트에서는 ag1 가용성 그룹에서 REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT을 1로 설정합니다. 다음 스크립트를 실행하기 전에 ag1을 가용성 그룹의 이름으로 바꿉니다.

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT = 1);
    

    이 설정은 모든 활성 트랜잭션이 주 복제본과 적어도 하나의 동기 보조 복제본에 커밋되었는지 확인합니다.

    참고

    이 설정은 장애 조치에만 적용되는 것이 아니며, 환경 요구 사항에 따라 설정해야 합니다.

  4. 주 복제본과 장애 조치(failover)에 참여하지 않는 보조 복제본을 오프라인으로 설정하여 역할 변경을 준비합니다.

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 대상 보조 복제본을 주 복제본으로 승격합니다.

    ALTER AVAILABILITY GROUP AGRScale FORCE_FAILOVER_ALLOW_DATA_LOSS; 
    
  6. 기존 주 복제본 및 다른 보조 복제본을 호스트하는 SQL Server 인스턴스에서 다음 명령을 실행하여 기존 주 복제본의 역할을 SECONDARY로 업데이트합니다.

    ALTER AVAILABILITY GROUP [AGRScale] 
         SET (ROLE = SECONDARY); 
    

    참고

    가용성 그룹 사용을 삭제하려면 DROP AVAILABILITY GROUP을 사용합니다. NONE 또는 EXTERNAL 클러스터 형식을 사용하여 만든 가용성 그룹의 경우 가용성 그룹의 일부인 모든 복제본에서 명령을 실행합니다.

  7. 데이터 이동을 계속하고, 주 복제본을 호스트하는 SQL Server 인스턴스의 가용성 그룹에 있는 모든 데이터베이스에 대해 다음 명령을 실행합니다.

    ALTER DATABASE [db1]
         SET HADR RESUME
    
  8. 읽기 확장 목적으로 만들었으며 클러스터 관리자가 관리하지 않는 수신기를 다시 만듭니다. 원래 수신기가 기존 주 복제본을 가리키는 경우 이 수신기를 삭제하고 새로운 주 복제본을 가리키도록 다시 만듭니다.

데이터 손실이 있는 강제 수동 장애 조치(Failover)

주 복제본을 사용할 수 없고 즉시 복구할 수 없는 경우에는 데이터 손실이 있는 보조 복제본에 대한 장애 조치(failover)를 강제로 수행해야 합니다. 그러나 장애 조치 후 원래 주 복제본이 복구되면 주 복제본이 주 역할을 맡습니다. 각 복제본이 서로 다른 상태에 있지 않도록 하려면 데이터 손실이 있는 강제 장애 조치 후 가용성 그룹에서 원래 주 복제본을 제거합니다. 원래 주 복제본이 다시 온라인 상태가 되면 주 복제본에서 가용성 그룹을 완전히 제거합니다.

주 복제본 N1에서 보조 복제본 N2로 데이터 손실이 있는 수동 장애 조치를 강제로 수행하려면 다음 단계를 수행합니다.

  1. 보조 복제본(N2)에서 강제 장애 조치를 시작합니다.

    ALTER AVAILABILITY GROUP [AGRScale] FORCE_FAILOVER_ALLOW_DATA_LOSS;
    
  2. 새 주 복제본(N2)에서 원래 주 복제본(N1)을 제거합니다.

    ALTER AVAILABILITY GROUP [AGRScale]
    REMOVE REPLICA ON N'N1';
    
  3. 모든 애플리케이션 트래픽이 수신기 및/또는 새 주 복제본을 가리키고 있는지 확인합니다.

  4. 원래 주 복제본(N1)이 온라인 상태가 되면 원래 주 복제본(N1)에서 가용성 그룹 AGRScale을 즉시 오프라인 상태로 설정합니다.

    ALTER AVAILABILITY GROUP [AGRScale] OFFLINE
    
  5. 데이터 또는 동기화되지 않은 변경 내용이 있는 경우에는 백업을 사용하거나 비즈니스 요구 사항에 맞는 기타 데이터 복제 옵션을 사용하여 이 데이터를 보존합니다.

  6. 다음으로, 원래 주 복제본(N1)에서 가용성 그룹을 제거합니다.

    DROP AVAILABILITY GROUP [AGRScale];
    
  7. 원래 주 복제본(N1)에서 가용성 그룹 데이터베이스를 삭제합니다.

    USE [master]
    GO
    DROP DATABASE [AGDBRScale]
    GO
    
  8. (선택 사항) 이제 원하는 경우 N1을 가용성 그룹 AGRScale에 새 보조 복제본으로 다시 추가할 수 있습니다.