다음을 통해 공유


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

적용 대상: SQL Server - Linux

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

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

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

필수 조건

Linux의 SQLServer에 대한 Pacemaker 클러스터 배포에 설명된 대로 Pacemaker 고가용성 클러스터를 배포합니다.

가용성 그룹 기능 사용

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

Important

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

mssql-conf 유틸리티 사용

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

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

mssql.conf 파일 편집

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

[hadr]

hadr.hadrenabled = 1

SQL Server 다시 시작

Windows와 같이 가용성 그룹을 사용하도록 설정한 후에는 다음 명령을 사용하여 SQL Server를 다시 시작해야 합니다.

sudo systemctl restart mssql-server

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

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

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

Important

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

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

참고 항목

가용성 그룹을 생성할 때, 엔드포인트 유형이 a를 사용하는 이유는, 일부 하위 구성 요소가 이제는 사용 중단된 기능과 공유되었기 때문입니다.

이 예제에서는 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. scp 또는 다른 유틸리티를 사용하여 AG의 일부가 될 각 노드에 인증서의 백업을 복사합니다.

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

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

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

    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
    

    주의

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

  7. LinAGN1에서 LinAGN2_CertLinAGN3_Cert를 복원합니다. 다른 복제본의 인증서를 유지하는 것이 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. LinAGN1의 엔드포인트에 연결하기 위한 LinAG2LinAGN3 권한과 연결된 로그인을 부여합니다.

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

    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. LinAGN2에서 LinAGN1_CertLinAGN3_Cert를 복원합니다.

    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. LinAGN2의 엔드포인트에 연결하기 위한 LinAG1LinAGN3 권한과 연결된 로그인을 부여합니다.

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

    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. LinAGN3에서 LinAGN1_CertLinAGN2_Cert를 복원합니다.

    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. LinAGN3의 엔드포인트에 연결하기 위한 LinAG1LinAGN2 권한과 연결된 로그인을 부여합니다.

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

가용성 그룹 만들기

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

SQL Server Management Studio 사용

이 섹션에서는 새 가용성 그룹 마법사에서 SSMS를 사용하여 외부 클러스터 형식의 AG를 만드는 방법을 보여 줍니다.

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

  2. 소개 페이지에서 다음을 선택합니다.

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

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

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

  5. 복제본 지정 대화 상자에서 복제본 추가를 선택합니다.

  6. 서버에 연결 대화 상자에서 보조 복제본이 될 SQL Server의 Linux 인스턴스 이름과 연결할 자격 증명을 입력합니다. 연결을 선택합니다.

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

  8. 이제 세 인스턴스가 모두 복제본 지정 대화 상자에 나열됩니다. 외부 클러스터 유형을 사용하는 경우 실제 보조 복제본이 될 보조 복제본의 경우 가용성 모드가 주 복제본의 클러스터 유형과 일치하고 장애 조치(failover) 모드가 외부로 설정되어 있는지 확인합니다. 구성 전용 복제본의 경우 구성 전용 가용성 모드를 선택합니다.

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

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

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

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

  9. 백업 기본 설정을 변경하려면 백업 기본 설정 탭을 선택합니다. AG의 백업 기본 설정에 대한 자세한 내용은 상시 가용성 그룹의 보조 복제본 백업 구성을 참조하세요.

  10. 읽기 가능한 보조 데이터베이스를 사용하거나 읽기 확장에 대해 클러스터 유형이 없음인 AG를 만드는 경우 수신기 탭을 선택하여 수신기를 만들 수 있습니다. 수신기는 나중에 추가할 수도 있습니다. 수신기를 만들려면 가용성 그룹 수신기 만들기 옵션을 선택하고 이름, TCP/IP 포트 및 정적 또는 동적으로 할당된 DHCP IP 주소를 사용할지 여부를 입력합니다. 클러스터 유형이 없음인 AG의 경우 IP는 고정적이어야 하며 기본 IP 주소로 설정해야 합니다.

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

  11. 읽기 가능한 시나리오를 위해 수신기를 만든 경우 SSMS 17.3 이상에서는 마법사에서 읽기 전용 라우팅을 만들 수 있습니다. 나중에 SSMS 또는 Transact-SQL을 통해 추가할 수도 있습니다. 지금 읽기 전용 라우팅을 추가하려면 다음을 수행합니다.

    1. 읽기 전용 라우팅 탭을 선택합니다.

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

    3. 각 URL을 선택하고 아래쪽에서 읽을 수 있는 복제본을 선택합니다. 여러 개를 선택하려면 Shift 키를 누른 채 선택하거나 선택하여 끕니다.

  12. 다음을 선택합니다.

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

  14. 유효성 검사 대화 상자에서 모든 항목이 성공으로 돌아오지 않는 경우 조사합니다. 수신기를 만들지 않는 경우와 같이 일부 경고는 허용되며 치명적이지 않습니다. 다음을 선택합니다.

  15. 요약 페이지에서 마침을 선택합니다. 이제 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개의 복제본(외부 클러스터 유형)

이 예제에서는 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는 가용성 그룹의 이름입니다.
    • DBName는 가용성 그룹과 함께 사용되는 데이터베이스의 이름입니다. 콤마로 구분된 이름 목록일 수도 있습니다.
    • ListenerName은 기본 서버/노드와 다른 이름입니다. IPAddress와 함께 DNS에 등록됩니다.
    • IPAddressListenerName와 연결된 IP 주소입니다. 또한 서버/노드와 동일하지 않고 고유합니다. 애플리케이션 및 최종 사용자는 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의 클러스터 형식을 사용하여 2개 복제본 구성을 만드는 방법을 보여줍니다. 장애 조치(failover)가 필요하지 않은 읽기 확장 시나리오에 사용됩니다. 이 예제에서는 왕복 기능을 사용하여 읽기 전용 라우팅과 실제로 주 복제본에 해당하는 수신기를 만듭니다.

  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는 가용성 그룹의 이름입니다.
  • DBName는 가용성 그룹과 함께 사용할 데이터베이스의 이름입니다. 콤마로 구분된 이름 목록일 수도 있습니다.
  • 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과 같습니다.
  1. 보조 복제본을 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 인스턴스에 대한 액세스 권한과 가용성 그룹 자체에 대한 권한이 필요합니다. 이러한 단계를 수행하면 SQL Server에 로그인하는 방법을 Pacemaker에 알려주는 파일과 함께 로그인 및 관련 사용 권한이 만들어집니다.

  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에서 다음 명령을 입력합니다.

    sudo emacs /var/opt/mssql/secrets/passwd
    

    그러면 Emacs 편집기가 열립니다.

  3. 편집기에 다음 두 줄을 입력합니다.

    PMLogin
    
    <password>
    
  4. Ctrl 키를 누른 상태에서 X, C를 차례로 눌러 종료하고 파일을 저장합니다.

  5. 실행

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

    파일을 잠급니다.

  6. 복제본으로 사용할 다른 서버에서 1-5단계를 반복합니다.

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

SQL Server에서 가용성 그룹을 만든 후에는 클러스터 유형의 외부가 지정된 경우 Pacemaker에서 해당 리소스를 만들어야 합니다. AG와 연결된 리소스에는 AG 자체와 IP 주소라는 두 가지 리소스가 있습니다. 수신기 기능을 사용하지 않는 경우 IP 주소 리소스를 구성하는 것이 좋지만 권장 사항입니다.

만든 AG 리소스는 복제본(클론)이라는 특수한 종류의 리소스입니다. AG 리소스에는 기본적으로 각 노드에 복사본이 있으며 마스터라는 하나의 제어 리소스가 있습니다. 마스터는 주 복제본을 호스트하는 서버와 연결됩니다. 다른 리소스는 보조 복제본(일반 또는 구성 전용)을 호스트하며 장애 조치(failover)에서 마스터로 승격될 수 있습니다.

참고 항목

바이어스 없는 통신

이 문서에는 이 컨텍스트에서 사용될 때 Microsoft가 불쾌한 표현으로 간주하는 용어인 슬레이브 용어에 대한 참조가 포함되어 있습니다. 이 용어가 이 문서에 나타나는 이유는 현재 소프트웨어에 나타나기 때문입니다. 소프트웨어에서 이 용어가 제거되면 문서에서 제거할 것입니다.

  1. 다음 구문을 사용하여 AG 리소스를 만듭니다.

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

    여기서 NameForAGResource는 AG에 대해 이 클러스터 리소스에 지정된 고유한 이름이고, AGName는 생성된 AG의 이름입니다.

    RHEL 7.7 및 Ubuntu 18.04 이상 버전에서는 --master를 사용할 때 경고가 발생하거나 sqlag_monitor_0 on ag1 'not configured' (6): call=6, status=complete, exitreason='Resource must be configured with notify=true'과 같은 오류가 발생할 수 있습니다. 이 상황을 방지하려면 다음을 사용하세요.

    sudo pcs resource create <NameForAGResource> ocf:mssql:ag ag_name=<AGName> meta failure-timeout=30s master notify=true
    
  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> <NameForAGResource>-master INFINITY with-rsc-role=Master
    

    NameForIPResource는 IP 리소스의 이름은이고, NameForAGResource는 AG 리소스의 이름입니다.

  4. AG 리소스가 IP 주소보다 먼저 가동 상태가 되도록 하려면 정렬 제약 조건을 만듭니다. 공동 배치 제약 조건은 정렬 제약 조건을 암시하지만 정렬 제약 조건이 적용됩니다.

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

    NameForIPResource는 IP 리소스의 이름은이고, NameForAGResource는 AG 리소스의 이름입니다.

다음 단계

이 자습서에서는 Linux에서 SQL Server에 대한 가용성 그룹을 만들고 구성하는 방법을 배웠습니다. 다음 방법에 대해 알아보았습니다.

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

업그레이드 및 장애 조치(failover)를 비롯한 대부분의 AG 관리 작업에 대해서는 다음을 참조하세요.