SQL Server on Linux의 가용성 그룹 생성 및 구성

적용 대상:SQL Server on Linux

이 자습서에서는 SQL Server on Linux용 AG(가용성 그룹)를 만들고 구성하는 방법을 보여 줍니다. WINDOWS의 SQL Server 2016(13.x) 및 이전 버전과 달리 기본 Pacemaker 클러스터를 먼저 만들거나 만들지 않고 AG를 사용하도록 설정할 수 있습니다. 필요한 경우 클러스터와의 통합은 나중에 발생합니다.

자습서에는 다음 작업들이 포함되어 있습니다.

  • 가용성 그룹 설정.
  • 가용성 그룹 엔드포인트 및 인증서 만들기.
  • SSMS(SQL Server Management Studio) 또는 Transact-SQL을 사용하여 가용성 그룹을 만듭니다.
  • Pacemaker용 SQL Server 로그인 및 권한 만들기.
  • Pacemaker 클러스터에서 가용성 그룹 리소스를 만듭니다(외부만 해당).

Prerequisites

Pacemaker 고가용성 클러스터를 배포하세요. 자세한 내용은 'Linux에서 SQL Server on Linux용 Pacemaker 클러스터 배포하기'를 참조하세요.

가용성 그룹 기능 사용

Windows와 달리 PowerShell 또는 SQL Server 구성 관리자를 사용하여 AG(가용성 그룹) 기능을 사용하도록 설정할 수 없습니다. Linux에서는 유틸리티를 사용 mssql-conf 하거나 파일을 수동으로 편집 mssql.conf 하는 두 가지 방법으로 가용성 그룹 기능을 사용하도록 설정할 수 있습니다.

Important

SQL Server Express에서도 구성 전용 복제본에 AG 기능을 사용하도록 설정해야 합니다.

유틸리티를 사용하세요 mssql-conf

프롬프트에서 다음 명령을 실행합니다.

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

mssql.conf 파일 편집

또한 mssql.conf 폴더 아래에 있는 /var/opt/mssql 파일을 수정할 수도 있습니다. 다음 줄을 추가합니다.

[hadr]

hadr.hadrenabled = 1

SQL Server 다시 시작

가용성 그룹을 사용하도록 설정한 후 SQL Server를 다시 시작해야 합니다. 다음 명령을 사용하세요.

sudo systemctl restart mssql-server

가용성 그룹 엔드포인트 및 인증서 만들기

가용성 그룹은 통신에 TCP 엔드포인트를 사용합니다. Linux에서 SQL Server는 인증에 인증서를 사용하는 경우에만 AG에 대한 엔드포인트를 지원합니다. 동일한 AG에서 복제본으로 참여하는 다른 모든 인스턴스의 한 인스턴스에서 인증서를 복원해야 합니다. 구성 전용 복제본의 경우에도 인증서 프로세스가 필요합니다.

엔드포인트를 생성하고 인증서를 복원하려면 Transact-SQL을 사용해야 합니다. SQL Server에서 생성되지 않은 인증서를 사용할 수도 있습니다. 만료되는 인증서를 관리하고 교체하는 프로세스도 필요합니다.

Important

SQL Server Management Studio 마법사를 사용하여 AG를 만들려는 경우에도 Linux에서 Transact-SQL을 사용하여 인증서를 만들고 복원해야 합니다.

다양한 명령(보안 포함)에 사용할 수 있는 옵션에 대한 전체 구문은 다음을 참조하세요.

메모

가용성 그룹을 생성하긴 하지만, 엔드포인트 유형은 해당 기능이 더 이상 지원되지 않는 기능과 기본 측면을 공유하기 때문에 를 사용합니다 FOR DATABASE_MIRRORING.

이 예제에서는 3개 노드 구성의 인증서를 만듭니다. 인스턴스 이름은 LinAGN1, LinAGN2LinAGN3입니다.

  1. LinAGN1에서 다음 스크립트를 실행하여 마스터 키, 인증서 및 엔드포인트를 만들고 인증서를 백업합니다. 이 예시에서 엔드포인트는 일반적인 TCP 포트 5022를 사용합니다.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN1_Cert
    WITH SUBJECT = 'LinAGN1 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN1_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN1_Cert,
        ROLE = ALL
    );
    GO
    
  2. 다음 LinAGN2에서 동일한 작업을 수행합니다.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
    WITH SUBJECT = 'LinAGN2 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN2_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN2_Cert,
        ROLE = ALL
    );
    GO
    
  3. 마지막으로 다음 LinAGN3에서 동일한 시퀀스를 수행합니다.

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
    WITH SUBJECT = 'LinAGN3 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN3_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN3_Cert,
        ROLE = ALL
    );
    GO
    
  4. 인증서 백업을 AG에 포함시키고 싶은 각 노드에 복사하는 유틸리티나 다른 유틸리티를 사용 scp 하세요.

    이 예제에서는 다음과 같이 복사합니다.

    • LinAGN1_Cert.cerLinAGN2LinAGN3로 복사합니다.
    • LinAGN2_Cert.cerLinAGN1LinAGN3로 복사합니다.
    • LinAGN3_Cert.cerLinAGN1LinAGN2로 복사합니다.
  5. 복사한 인증서 파일과 연결된 소유권 및 그룹을 mssql로 변경합니다.

    sudo chown mssql:mssql <CertFileName>
    
  6. LinAGN2에서 LinAGN3LinAGN1에 연결된 인스턴스 수준 로그인 및 사용자를 만듭니다.

    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    

    Caution

    암호는 SQL Server 기본 암호 정책을 따라야 합니다. 기본적으로 암호는 8자 이상이어야 하며 대문자, 소문자, 0~9까지의 숫자 및 기호 네 가지 집합 중 세 집합의 문자를 포함해야 합니다. 암호는 최대 128자까지 가능합니다. 되도록 길고 복잡한 암호를 사용합니다.

  7. LinAGN2_Cert에서 LinAGN3_CertLinAGN1를 복원합니다. 다른 복제본의 인증서는 AG 통신과 보안에 필수적입니다.

    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  8. LinAGN2LinAGN3와 연결된 로그인의 LinAGN1의 엔드포인트에 연결할 수 있는 권한을 부여합니다.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    
  9. LinAGN1에서 LinAGN3LinAGN2에 연결된 인스턴스 수준 로그인 및 사용자를 만듭니다.

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    
  10. LinAGN1_Cert에서 LinAGN3_CertLinAGN2를 복원합니다.

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  11. LinAGN1LinAGN3와 연결된 로그인의 LinAGN2의 엔드포인트에 연결할 수 있는 권한을 부여합니다.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    GO
    
  12. LinAGN1에서 LinAGN2LinAGN3에 연결된 인스턴스 수준 로그인 및 사용자를 만듭니다.

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
  13. LinAGN1_Cert에서 LinAGN2_CertLinAGN3를 복원합니다.

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
  14. LinAGN1LinAGN2와 연결된 로그인의 LinAGN3의 엔드포인트에 연결할 수 있는 권한을 부여합니다.

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GO
    

가용성 그룹 만들기

이 섹션에서는 SSMS(SQL Server Management Studio) 또는 Transact-SQL 사용하여 SQL Server에 대한 가용성 그룹을 만드는 방법을 보여 줍니다.

SQL Server Management Studio 사용

이 섹션에서는 SSMS와 New Availability Group Wizard를 사용하여 외부 클러스터 유형의 AG를 생성하는 방법을 보여줍니다.

  1. SSMS에서 Always On 고가용성을 확장하고 가용성 그룹 을 마우스 오른쪽 단추로 클릭한 후 새 가용성 그룹 마법사를 선택합니다.

  2. 소개 대화상자에서 다음을 선택하세요.

  3. 가용성 그룹 옵션 지정 대화 상자에서 AG의 이름을 입력하고 드롭다운 목록에서 EXTERNAL 또는 NONE 클러스터 유형을 선택합니다. Pacemaker를 배포할 때 사용합니다 EXTERNAL . 특수 시나리오(예: 읽기 스케일 아웃)에서는 NONE를 사용합니다. 데이터베이스 수준에서 상태 검색 옵션을 선택하는 것은 선택 사항입니다. 이 옵션에 대한 자세한 내용은 가용성 그룹 데이터베이스 수준의 상태 검색 장애 조치 옵션을 참조하세요. 다음을 선택합니다.

    클러스터 유형을 보여 주는 가용성 그룹 만들기의 스크린샷입니다.

  4. 데이터베이스 선택 대화상자에서 AG에 참여하고 싶은 데이터베이스를 선택하세요. AG에 추가하려면 각 데이터베이스에 전체 백업이 있어야 합니다. 다음을 선택합니다.

  5. 복제본 지정 대화상자에서 복제체 추가를 선택하세요.

  6. 서버에 연결(Connect to Server) 대화상자에서 보조 복제본의 리눅스 SQL Server 인스턴스 이름과 연결할 자격 증명을 입력하세요. 연결을 선택합니다.

  7. 구성 전용 복제본 또는 다른 보조 복제본을 포함할 인스턴스에 대해 앞의 두 단계를 반복합니다.

  8. 세 인스턴스 모두 복제 체 지정 대화상자에 나타납니다. 외부 클러스터 유형을 사용한다면, 진정한 보조 복제본인 보조 복제본의 가용성 모드가 기본 복제본과 일치하는지 확인하고 장애 전환 모드를 외부 모드로 설정하세요. 구성 전용 복제본의 경우 구성 전용 가용성 모드를 선택합니다.

    다음 예제에서는 두 개의 복제본, 외부 클러스터 유형, 구성 전용 복제본을 갖춘 AG를 보여 줍니다.

    읽을 수 있는 보조 옵션을 보여 주는 가용성 그룹 만들기의 스크린샷입니다.

    다음 예제에서는 두 개의 복제본, 클러스터 유형 없음 및 구성 전용 복제본이 있는 AG를 보여 줍니다.

    복제본 페이지를 보여 주는 가용성 그룹 만들기 스크린샷입니다.

  9. 백업 환경 설정을 변경하고 싶으시면 백업 환경 설정 탭을 선택하세요. AG의 백업 선호도에 대한 자세한 내용은 Always On 가용성 그룹의 보조 복제본에 백업 구성을 참조하세요.

  10. 읽기 가능 보조 노드를 사용하거나 읽기 확장을 위해 클러스터 유형이 없음인 AG를 만드는 경우 수신기 탭을 선택하여 수신기를 만들 수 있습니다. 나중에 수신기를 추가할 수도 있습니다. 리스너를 생성하려면 '가용성 그룹 리스너 생성 ' 옵션을 선택하고 이름, TCP/IP 포트, 그리고 정적 IP 주소 또는 자동 할당된 DHCP IP 주소를 입력하세요. 클러스터 유형이 None인 AG의 경우, 기본 IP 주소와 일치하는 고정 IP를 사용하세요.

    가용성 그룹 수신기 만들기 옵션을 보여 주는 스크린샷입니다.

  11. 읽기 가능한 시나리오를 위한 리스너를 생성하면, SSMS는 마법사에서 읽기 전용 라우팅을 생성할 수 있게 해줍니다. 나중에 SSMS나 Transact-SQL을 사용해 추가할 수도 있습니다. 지금 읽기 전용 라우팅을 추가하려면 다음을 수행합니다.

    1. Read-Only 라우팅 탭을 선택하세요.

    2. 읽기 전용 복제본의 URL을 입력합니다. 이러한 URL은 엔드포인트가 아니라 인스턴스의 포트를 사용한다는 점을 제외하고 엔드포인트와 비슷합니다.

      1. 각 URL을 선택하고 아래쪽에서 읽을 수 있는 복제본을 선택합니다. 여러 항목을 선택하려면 Shift 키를 누른 채로 클릭하거나 드래그합니다.
  12. 다음을 선택합니다.

  13. 보조 복제본을 초기화하는 방법을 선택합니다. 기본값은 AG에 참여하는 모든 서버에서 동일한 경로가 필요한 자동 시드를 사용하는 것입니다. 마법사에서 백업, 복사 및 복원을 수행하게 할 수도 있습니다(두 번째 옵션). 복제본에서 데이터베이스를 수동으로 백업, 복사 및 복원한 경우 조인해야 합니다(세 번째 옵션). 또는 나중에 데이터베이스를 추가합니다(마지막 옵션). 인증서와 마찬가지로 수동으로 백업을 만들고 복사하는 경우 다른 복제본의 백업 파일에 대한 권한을 설정합니다. 다음을 선택합니다.

  14. 검증 대화상자에서 위저드가 모든 검사에 성공을 반환하지 않는다면, 더 조사해 보세요. 수신기를 만들지 않는 경우와 같이 일부 경고는 허용되며 치명적이지 않습니다. 다음을 선택합니다.

  15. 요약 대화상자에서 Finish를 선택하세요. 이제 AG를 만드는 프로세스가 시작됩니다.

  16. AG 생성이 완료되면 결과 페이지에서 기를 선택하세요. 이제 동적 관리 뷰의 복제본과 SSMS의 Always On 고가용성 폴더에서 AG를 확인할 수 있습니다.

Transact-SQL 사용

이 섹션에서는 Transact-SQL을 사용하여 AG를 만드는 예시를 보여줍니다. AG를 만든 후 수신기 및 읽기 전용 라우팅을 구성할 수 있습니다. AG 자체를 사용하여 ALTER AVAILABILITY GROUP수정할 수 있지만 SQL Server 2017(14.x)에서는 클러스터 유형을 변경할 수 없습니다. 클러스터 유형이 외부인 AG를 만들려는 것이 아니라면 해당 AG를 삭제하고 클러스터 유형이 없음으로 다시 만들어야 합니다.

자세한 정보와 기타 옵션은 다음을 참조하세요:

예제 A: 구성 전용 복제본이 있는 두 개의 복제본(외부 클러스터 유형)

이 예제에서는 구성 전용 복제본을 사용하는 2개 복제본 AG를 만드는 방법을 보여줍니다.

  1. 데이터베이스의 읽기/쓰기 복사본이 포함된 기본 복제 노드에서 다음 문장을 실행하세요. 이 예제에서는 자동 시드를 사용합니다.

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE <DBName>
    REPLICA ON
    N'LinAGN1' WITH (
       ENDPOINT_URL = N' TCP://LinAGN1.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT
    ),
    N'LinAGN2' WITH (
       ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
       SEEDING_MODE = AUTOMATIC
    ),
    N'LinAGN3' WITH (
       ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
       AVAILABILITY_MODE = CONFIGURATION_ONLY
    );
    GO
    
  2. 다른 레플리카에 연결된 쿼리 창에서 다음 문장을 실행하여 레플리카를 AG에 결합하고 주 복제본에서 보조 복제본으로 시딩을 시작합니다.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. 구성 전용 복제본에 연결된 쿼리 창에서 다음 문장을 실행하여 이를 AG에 결합합니다.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    

예제 B: 읽기 전용 라우팅을 사용하는 3개의 복제본(외부 클러스터 유형)

이 예시는 세 개의 완전한 복제본에 대해 초기 AG 생성 시 읽기 전용 라우팅을 구성하는 방법을 보여줍니다.

  1. 주 복제본 역할을 하고 데이터베이스의 전체 읽기/쓰기 복사본을 포함하는 노드에서 다음 문을 실행합니다. 이 예제에서는 자동 시드를 사용합니다.

    CREATE AVAILABILITY GROUP [<AGName>] WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE < DBName > REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN2.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:1433')
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:1433')
        ),
        N'LinAGN3' WITH (
            ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN2.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN3.FullyQualified.Name:1433')
        )
        LISTENER '<ListenerName>' (
            WITH IP = ('<IPAddress>', '<SubnetMask>'), Port = 1433
        );
    GO
    

    이 구성에 대해 유의해야 할 몇 가지 사항은 다음과 같습니다.

    • AGName 는 AG의 이름입니다.
    • DBName 는 AG와 함께 사용하는 데이터베이스의 이름입니다. 쉼표로 구분된 이름 목록일 수도 있습니다.
    • ListenerName 는 기본 서버나 노드와는 다른 이름입니다. DNS IPAddress에 등록하면 됩니다.
    • IPAddress 는 의 ListenerNameIP 주소입니다. 또한 독특하며 서버나 노드와 전혀 일치하지 않습니다. 애플리케이션 및 최종 사용자는 ListenerName 또는 IPAddress 를 사용하여 AG에 연결합니다.
      • SubnetMaskIPAddress의 서브넷 마스크입니다. SQL Server 2019(15.x) 및 이전 버전에서 이 값은 다음과 같습니다 255.255.255.255. SQL Server 2022(16.x) 이상 버전에서 이 값은 다음과 같습니다 0.0.0.0.
  2. 다른 복제본에 연결된 쿼리 창에서 다음 문을 실행하여 복제본을 AG에 조인하고 주 복제본에서 보조 복제본으로 시드 프로세스를 시작합니다.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. 세 번째 복제본에 대해 2단계를 반복합니다.

예제 C: 읽기 전용 라우팅을 사용하는 2개의 복제본(없음 클러스터 유형)

이 예시는 None이라는 클러스터 유형을 사용하는 두 복제본 구성을 만듭니다. 이 구성은 장애 조치가 예상되지 않는 리드 스케일 시나리오에 사용하세요. 이 단계는 주 복제본인 리스너를 생성하고, 라운드 로빈 기능을 갖춘 읽기 전용 라우팅을 구성합니다.

  1. 주 복제본 역할을 하고 데이터베이스의 전체 읽기/쓰기 복사본을 포함하는 노드에서 다음 문을 실행합니다. 이 예제에서는 자동 시드를 사용합니다.

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = NONE)
    FOR DATABASE <DBName> REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name: <PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(
                ALLOW_CONNECTIONS = READ_WRITE,
                READ_ONLY_ROUTING_LIST = (('LinAGN1.FullyQualified.Name'.'LinAGN2.FullyQualified.Name'))
            ),
            SECONDARY_ROLE(
                ALLOW_CONNECTIONS = ALL,
                READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:<PortOfInstance>'
            )
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                     ('LinAGN1.FullyQualified.Name',
                        'LinAGN2.FullyQualified.Name')
                     )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfInstance>')
        ),
        LISTENER '<ListenerName>' (WITH IP = (
                 '<PrimaryReplicaIPAddress>',
                 '<SubnetMask>'),
                Port = <PortOfListener>
        );
    GO
    

    이 예제에서:

    • AGName 는 AG의 이름입니다.
    • DBName 는 AG와 함께 사용하는 데이터베이스의 이름입니다. 쉼표로 구분된 이름 목록일 수도 있습니다.
    • PortOfEndpoint 는 생성하는 엔드포인트의 포트 번호입니다.
      • PortOfInstance는 SQL Server 인스턴스의 포트 번호입니다.
    • ListenerName 는 기본 복제본과는 다른 임시 이름입니다.
    • PrimaryReplicaIPAddress는 주 복제본의 IP 주소입니다.
      • SubnetMaskIPAddress의 서브넷 마스크입니다. SQL Server 2019(15.x) 및 이전 버전에서 이 값은 다음과 같습니다 255.255.255.255. SQL Server 2022(16.x) 이상 버전에서 이 값은 다음과 같습니다 0.0.0.0.
  2. 보조 복제본을 AG에 조인하고 자동 시드를 시작합니다.

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = NONE);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    

Pacemaker용 SQL Server 로그인 및 권한 만들기

Linux에서 SQL Server를 사용하는 Pacemaker 고가용성 클러스터는 SQL Server 인스턴스 및 AG 자체에 대한 권한에 액세스해야 합니다. 이러한 단계에서는 로그인 및 관련 사용 권한과 함께 Pacemaker에서 SQL Server에 인증하는 방법을 알려주는 파일을 만듭니다.

  1. 첫 번째 복제본에 연결된 쿼리 창에서 다음 스크립트를 실행합니다.

    CREATE LOGIN PMLogin
        WITH PASSWORD = '<password>';
    GO
    
    GRANT VIEW SERVER STATE TO PMLogin;
    GO
    
    GRANT ALTER, CONTROL, VIEW DEFINITION
    ON AVAILABILITY GROUP::<AGThatWasCreated> TO PMLogin;
    GO
    
  2. 노드 1에서 다음 두 줄 /var/opt/mssql/secrets/passwd 을 파일에 추가합니다:

    PMLogin
    
    <password>
    

    이 파일을 편집하려면 권한을 sudo 올려야 할 수도 있습니다.

  3. 파일을 잠가세요:

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    
  4. 복제본 역할을 하는 다른 서버에서 1-5단계를 반복합니다.

Pacemaker 클러스터에서 가용성 그룹 리소스를 만듭니다(외부만 해당).

SQL Server에서 AG를 만든 후에는 클러스터 유형의 외부를 지정할 때 Pacemaker에서 해당 리소스를 만들어야 합니다. AG에는 가용성 그룹 리소스와 IP 주소 리소스의 두 가지 리소스가 필요합니다. 수신기를 사용하지 않는 경우 IP 주소 리소스 구성은 선택 사항입니다. 그러나 수신기 기능이 필요한 경우 권장합니다.

만드는 AG 리소스는 복제본이라는 리소스의 유형입니다. AG 자원은 각 노드에 복사본을 가지며, 승격된 자원이라 불리는 하나의 제어 자원을 가지고 있습니다. 승격된 자원은 주 복제본을 호스팅하는 서버에 해당합니다. 다른 자원들은 보조 복제본(일반 또는 구성용)을 호스팅하며, 장애 조치 시 승격할 수 있습니다.

메모

CU(누적 업데이트) 3 이상 버전의 SQL Server 2025(17.x)에서는 패키지를 통해 mssql-server-ha RhEL(Red Hat Enterprise Linux) 및 Ubuntu에 Pacemaker HA 에이전트 v2(미리 보기)를 사용할 수 있습니다. Pacemaker HA 에이전트 v2는 비운영 배포에서 평가할 수 있습니다. 기존의 Pacemaker HA 에이전트(v1)는 여전히 운영 환경에 완전히 지원되고 있습니다. 자세한 내용은 Pacemaker HA 에이전트 v2(미리 보기)를 참조하세요.

Pacemaker HA 에이전트 v1

  1. Pacemaker HA 에이전트(v1)를 사용하여 Pacemaker에서 AG 리소스 만들기: (ocf:mssql:ag)

    sudo pcs resource create <NameForAGResource> ocf:mssql:ag ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    예를 들어, NameForAGResource은(는) AG에 대한 이 클러스터 리소스에 제공하는 고유한 이름이며, AGName은(는) 만든 AG의 이름입니다.

  2. 수신기 기능과 연결하는 AG에 대한 IP 주소 리소스를 만듭니다.

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    이 예제 NameForIPResource 에서는 IP 리소스의 고유한 이름이며 IPAddress 리소스에 할당하는 고정 IP 주소입니다.

  3. IP 주소와 AG 리소스가 동일한 노드에서 실행되도록 하려면 공동 배치 제약 조건을 구성합니다.

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    이 예제 NameForIPResource 에서는 IP 리소스의 이름이고 NameForAGResource AG 리소스의 이름입니다.

  4. AG 자원이 IP 주소보다 먼저 실행되도록 순서 제약 조건을 만드세요. 공동 배치 제약 조건은 정렬 제약 조건을 의미하지만 이 단계에서는 이를 적용합니다.

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    이 예제 NameForIPResource 에서는 IP 리소스의 이름이고 NameForAGResource AG 리소스의 이름입니다.

Pacemaker HA 에이전트 v2(미리 보기)

Pacemaker HA 에이전트 v2는 서비스 기반 아키텍처를 사용합니다. 이 에이전트는 ' 라는 전용 mssql-pcsag시스템 서비스로 실행되며, SQL Server 전용 고가용성 작업과 Pacemaker와의 통신을 담당합니다.

표준 시스템 서비스 제어를 통해 서비스를 관리 mssql-pcsag 합니다. 다음 명령어로 이 서비스 상태를 시작, 중지, 재시작하고 필요 시 확인합니다:

sudo systemctl start mssql-pcsag  # Start the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl stop mssql-pcsag  # Stop the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl restart mssql-pcsag  # Restart the Pacemaker HA agent v2 (mssql-pcsag) service
sudo systemctl status mssql-pcsag  # Check the status of the Pacemaker HA agent v2 (mssql-pcsag) service

Pacemaker는 서비스를 통해 SQL Server 가용성 그룹과 상호 작용합니다 mssql-pcsag . 가용성 그룹 모니터링과 장애 조치(failover)가 올바르게 작동하려면 다음 단계를 따르십시오.

  • Pacemaker 클러스터가 실행 중이어야 합니다.
  • mssql-pcsag 서비스가 실행 중이어야 합니다.

페이스메이커와 mssql-pcsag 는 별개의 구성 요소이지만, 실행 시 함께 작동합니다. 페이스메이커나 mssql-pcsag 서비스가 중단되면 가용성 그룹 장애 지점 작업이 기대대로 작동하지 않습니다.

메모

서비스를 다시 시작하면 mssql-pcsag SQL Server가 다시 시작되지 않습니다. 마찬가지로 SQL Server를 다시 시작해도 Pacemaker HA 에이전트가 자동으로 다시 시작되지는 않습니다. 문제 해결 중에 두 서비스가 모두 실행되고 있는지 확인합니다.

Pacemaker HA 에이전트 v2는 다음을 포함하여 이전 에이전트에 비해 안정성 및 성능이 향상되었습니다.

  • 계획된 장애 조치(failover) 시간과 계획되지 않은 장애 조치(failover) 시간을 모두 줄이기 위해 장애 조치(failover) 성능이 향상되었습니다.

  • 오류 조건 수준 구성 및 상태 검사 시간 제한을 포함하여 유연한 자동 장애 조치(failover) 정책을 지원합니다.

    예: 다음 Transact-SQL 문은 AG1이라는 기존 가용성 그룹의 오류 조건 수준을 수준 2로 변경합니다.

    ALTER AVAILABILITY GROUP AG1 SET (FAILURE_CONDITION_LEVEL = 2);
    

    예: 다음 Transact-SQL 문은 AG1이라는 기존 가용성 그룹의 상태 검사 제한 시간 임계값을 60,000밀리초(60초)로 변경합니다.

    ALTER AVAILABILITY GROUP AG1 SET (HEALTH_CHECK_TIMEOUT = 60000);
    

    예: 구성을 적용한 후 다음 Transact-SQL 문을 사용하여 가용성 그룹에 대해 구성된 오류 조건 수준 및 상태 검사 시간 제한을 확인합니다.

    SELECT failure_condition_level,
           health_check_timeout
    FROM sys.availability_groups;
    
  • Pacemaker 클러스터와 SQL Server 간의 통신을 위한 TLS 1.3 지원.

  1. Pacemaker HA 에이전트 v2를 사용하여 Pacemaker에서 AG 리소스 만들기: (ocf:mssql:agv2)

    sudo pcs resource create <NameForAGResource> ocf:mssql:agv2 ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    Pacemaker HA 에이전트 v1에서 v2로 업그레이드하는 경우 agv2 리소스를 만들기 전에 기존 AG 리소스를 삭제합니다.

    sudo pcs resource delete <NameForAGResource>
    

    이 작업은 리소스를 다시 만드는 동안 AG 동기화를 일시적으로 중지합니다. Pacemaker AG 리소스를 삭제하고 다시 만들면 AG가 삭제되지 않습니다. 리소스가 다시 만들어지면 Pacemaker는 관리 및 AG 동기화를 자동으로 다시 시작합니다.

  2. 수신기 기능과 연결하는 AG에 대한 IP 주소 리소스를 만듭니다.

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    이 예제 NameForIPResource 에서는 IP 리소스의 고유한 이름이며 IPAddress 리소스에 할당하는 고정 IP 주소입니다.

  3. IP 주소와 AG 리소스가 동일한 노드에서 실행되도록 하려면 공동 배치 제약 조건을 구성합니다.

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    이 예제 NameForIPResource 에서는 IP 리소스의 이름이고 NameForAGResource AG 리소스의 이름입니다.

  4. AG 리소스가 IP 주소보다 먼저 가동 상태가 되도록 하려면 정렬 제약 조건을 만듭니다. 공동 배치 제약 조건은 정렬 제약 조건을 의미하지만 이 단계에서는 이를 적용합니다.

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    이 예제 NameForIPResource 에서는 IP 리소스의 이름이고 NameForAGResource AG 리소스의 이름입니다.