Share via


SQL Server에 대한 RHEL 장애 조치(failover) 클러스터 인스턴스(FCI) 구성

적용 대상:SQL Server - Linux

이 가이드에서는 SQL Server on Red Hat Enterprise Linux에 대한 노드 공유 디스크 장애 조치(failover) 클러스터를 만들기 위한 지침을 제공합니다. 클러스터링 계층은 Pacemaker 위에 빌드된 RHEL(Red Hat Enterprise Linux) HA 추가 기능을 기반으로 합니다. SQL Server 인스턴스는 한 노드 또는 다른 노드에서 활성화됩니다.

참고 항목

Red Hat HA 추가 기능 및 설명서에 액세스하려면 구독이 필요합니다.

다음 다이어그램에 표시된 대로 스토리지는 두 개의 서버에 제공됩니다. 클러스터링 구성 요소(Corosync 및 Pacemaker)는 통신과 리소스 관리를 조정합니다. 서버 중 하나에는 스토리지 리소스 및 SQL Server에 대한 활성 연결이 있습니다. Pacemaker에서 오류를 감지하면 클러스터링 구성 요소는 리소스를 다른 노드로 이동하는 작업을 담당합니다.

Red Hat Enterprise Linux 7 공유 디스크 SQL 클러스터입니다.

클러스터 구성, 리소스 에이전트 옵션 및 관리에 대한 자세한 내용은 RHEL 참조 설명서를 참조하세요.

참고 항목

이때 Pacemaker와 SQL Server의 통합은 Windows의 WSFC와 같이 결합되지 않습니다. SQL Server 내에 클러스터의 현재 상태 정보가 없으며, 모든 오케스트레이션이 외부에서 수행되고, 서비스는 Pacemaker에 의해 독립 실행형 인스턴스로 제어됩니다. 또한 예를 들어 클러스터 dmvs sys.dm_os_cluster_nodessys.dm_os_cluster_properties에는 레코드가 없습니다. 문자열 서버 이름을 가리키는 연결 문자열을 사용하고 IP를 사용하지 않으려면 선택된 서버 이름을 사용하여 다음 섹션에 설명된 대로 가상 IP 리소스를 만드는 데 사용된 IP를 DNS 서버에 등록해야 합니다.

다음 섹션에서는 장애 조치(failover) 클러스터 솔루션을 설정하는 단계를 안내합니다.

필수 조건

다음 엔드투엔드 시나리오를 완료하려면 2노드 클러스터를 배포할 머신 2대와 NFS 서버 구성에 사용할 또 다른 서버가 필요합니다. 다음 단계에서는 이러한 서버를 구성하는 방법을 간략하게 설명합니다.

각 클러스터 노드에서 운영 체제 설정 및 구성

첫 번째 단계는 클러스터 노드에서 운영 체제를 구성하는 것입니다. 이 연습에서는 HA 추가 기능을 위한 유효한 구독이 있는 RHEL을 사용합니다.

각 클러스터 노드에서 SQL Server 설치 및 구성

  1. 두 노드에서 모두 SQL Server를 설치하고 설정합니다. 자세한 내용은 SQL Server on Linux 설치를 참조하세요.

  2. 구성의 목적을 위해 노드 하나를 주 노드로 지정하고 다른 노드를 보조 노드로 지정합니다. 이 용어는 가이드 전체에서 사용됩니다.

  3. 보조 노드에서 SQL Server를 중지하고 사용하지 않도록 설정합니다.

    다음 예제에서는 SQL Server를 중지하고 사용하지 않도록 설정합니다.

    sudo systemctl stop mssql-server
    sudo systemctl disable mssql-server
    

참고 항목

설정 시 SQL Server 인스턴스의 서버 마스터 키가 생성되어 /var/opt/mssql/secrets/machine-key에 저장됩니다. Linux에서 SQL Server는 항상 mssql(이)라는 로컬 계정으로 실행됩니다. 이 계정은 로컬 계정이므로 해당 ID가 노드 간에 공유되지 않습니다. 따라서 각 로컬 mssql 계정이 서버 마스터 키의 암호 해독을 위해 액세스할 수 있도록 주 노드에서 각 보조 노드로 암호화 키를 복사해야 합니다.

  1. 주 노드에서 Pacemaker용 SQL Server 로그인을 만들고 sp_server_diagnostics 실행 권한을 로그인에 부여합니다. Pacemaker는 이 계정을 사용하여 SQL Server를 실행 중인 노드를 확인합니다.

    sudo systemctl start mssql-server
    

    sa 계정을 사용하여 SQL Server master 데이터베이스에 연결하고 다음 명령을 실행합니다.

    USE [master]
    GO
    CREATE LOGIN [<loginName>] with PASSWORD= N'<loginPassword>'
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [<loginName>]
    

    또는 더 세부적인 수준에서 권한을 설정할 수 있습니다. Pacemaker 로그인은 VIEW SERVER STATE을(를) 통해 sp_server_diagnostics, setupadmin(으)로 상태를 쿼리하고, ALTER ANY LINKED SERVER을(를) 통해 sp_dropserversp_addserver를 실행하여 FCI 인스턴스 이름을 리소스 이름으로 업데이트해야 합니다.

  2. 주 노드에서 SQL Server를 중지하고 사용하지 않도록 설정합니다.

  3. 각 클러스터 노드에 대한 hosts 파일을 구성합니다. host 파일은 모든 클러스터 노드의 IP 주소와 이름을 포함해야 합니다.

    각 노드의 IP 주소를 확인합니다. 다음 스크립트는 현재 노드의 IP 주소를 보여 줍니다.

    sudo ip addr show
    

    각 노드에서 컴퓨터 이름을 설정합니다. 각 노드에 15자 이하의 고유 이름을 지정합니다. 컴퓨터 이름을 /etc/hosts에 추가하여 설정합니다. 다음 스크립트를 사용하면 /etc/hostsvi로 편집할 수 있습니다.

    sudo vi /etc/hosts
    

    다음 예제에서는 sqlfcivm1sqlfcivm2라는 두 노드의 정보가 추가된 /etc/hosts를 보여 줍니다.

    127.0.0.1   localhost localhost4 localhost4.localdomain4
    ::1       localhost localhost6 localhost6.localdomain6
    10.128.18.128 sqlfcivm1
    10.128.16.77 sqlfcivm2
    

다음 섹션에서는 공유 스토리지를 구성하고 데이터베이스 파일을 해당 스토리지로 이동합니다.

공유 스토리지 구성 및 데이터베이스 파일 이동

공유 스토리지를 제공하는 다양한 솔루션이 있습니다. 이 연습에서는 NFS를 사용하여 공유 스토리지를 구성하는 방법을 보여 줍니다. 모범 사례를 따르고 Kerberos를 사용하여 NFS를 보호하는 것이 좋습니다(예제는 https://www.certdepot.net/rhel7-use-kerberos-control-access-nfs-network-shares/에서 확인할 수 있음).

Warning

NFS를 보호하지 않으면 네트워크에 액세스하고 SQL 노드의 IP 주소를 스푸핑할 수 있는 사용자는 누구나 데이터 파일에 액세스할 수 있습니다. 언제나처럼 시스템을 프로덕션 환경에서 사용하기 전에 시스템을 위협 모델링해야 합니다. 또 다른 스토리지 옵션은 다음과 같이 SMB 파일 공유를 사용하는 것입니다.

NFS로 공유 스토리지 구성

중요

이 릴리스에서는 버전 <4 이전 NFS 서버에서 데이터베이스 파일을 호스트할 수 없습니다. 여기에는 비클러스터형 인스턴스의 데이터베이스뿐만 아니라 공유 디스크 장애 조치(failover) 클러스터링에 NFS를 사용하는 기능이 포함됩니다. 향후 릴리스에서 다른 NFS 서버 버전을 사용 가능하도록 하기 위해 노력하고 있습니다.

NFS 서버에서 다음 단계를 수행합니다.

  1. nfs-utils 설치

    sudo yum -y install nfs-utils
    
  2. rpcbind 사용 설정 및 시작

    sudo systemctl enable rpcbind && sudo systemctl start rpcbind
    
  3. nfs-server 사용 설정 및 시작

    sudo systemctl enable nfs-server && sudo systemctl start nfs-server
    
  4. /etc/exports를 편집하여 공유하려는 디렉터리를 내보냅니다. 원하는 각 공유에 대해 하나의 줄이 필요합니다. 예시:

    /mnt/nfs  10.8.8.0/24(rw,sync,no_subtree_check,no_root_squash)
    
  5. 공유를 내보냅니다.

    sudo exportfs -rav
    
  6. 경로가 공유/내보내기 되었는지 확인하고 NFS 서버에서 실행

    sudo showmount -e
    
  7. SELinux에 예외 추가

    sudo setsebool -P nfs_export_all_rw 1
    
  8. 서버 방화벽을 엽니다.

    sudo firewall-cmd --permanent --add-service=nfs
    sudo firewall-cmd --permanent --add-service=mountd
    sudo firewall-cmd --permanent --add-service=rpc-bind
    sudo firewall-cmd --reload
    

NFS 공유 스토리지에 연결하도록 모든 클러스터 노드 구성

모든 클러스터 노드에서 다음 단계를 수행합니다.

  1. nfs-utils 설치

    sudo yum -y install nfs-utils
    
  2. 클라이언트 및 NFS 서버에서 방화벽 열기

    sudo firewall-cmd --permanent --add-service=nfs
    sudo firewall-cmd --permanent --add-service=mountd
    sudo firewall-cmd --permanent --add-service=rpc-bind
    sudo firewall-cmd --reload
    
  3. 클라이언트 컴퓨터에서 NFS 공유를 볼 수 있는지 확인

    sudo showmount -e <IP OF NFS SERVER>
    
  4. 모든 클러스터 노드에서 이들 단계를 반복합니다.

NFS 사용에 대한 자세한 내용은 다음 리소스를 참조하세요.

공유 스토리지를 가리키도록 데이터베이스 파일 디렉터리 탑재

  1. 주 노드에서만 데이터베이스 파일을 임시 위치에 저장합니다. 다음 스크립트는 새 임시 디렉터리를 만들고, 데이터베이스 파일을 새 디렉터리에 복사하고, 이전 데이터베이스 파일을 제거합니다. SQL Server가 로컬 사용자 mssql(으)로 실행되므로 탑재된 공유로 데이터를 전송한 후 로컬 사용자에게 공유에 대한 읽기/쓰기 액세스 권한이 있는지 확인해야 합니다.

    sudo su mssql
    mkdir /var/opt/mssql/tmp
    cp /var/opt/mssql/data/* /var/opt/mssql/tmp
    rm /var/opt/mssql/data/*
    exit
    
  2. 모든 클러스터 노드에서 /etc/fstab 파일을 편집하여 mount 명령을 포함합니다.

    <IP OF NFS SERVER>:<shared_storage_path> <database_files_directory_path> nfs timeo=14,intr
    

    다음 스크립트는 편집의 예를 보여 줍니다.

    10.8.8.0:/mnt/nfs /var/opt/mssql/data nfs timeo=14,intr
    

참고 항목

여기에서 권장하는 대로 FS(파일 시스템) 리소스를 사용하는 경우 /etc/fstab에서 mount 명령을 유지할 필요가 없습니다. Pacemaker가 FS 클러스터형 리소스를 시작할 때 폴더 탑재를 처리합니다. 펜싱의 도움으로 FS가 두 번 탑재되지 않도록 보장합니다.

  1. 탑재된 경로를 업데이트하려면 시스템에 mount -a 명령을 실행하세요.

  2. /var/opt/mssql/tmp에 저장한 데이터베이스 및 로그 파일을 새로 탑재된 공유 /var/opt/mssql/data에 복사합니다. 이 단계는 주 노드에서만 수행하면 됩니다. mssql 로컬 사용자에게 읽기/쓰기 권한을 부여했는지 확인하세요.

    sudo chown mssql /var/opt/mssql/data
    sudo chgrp mssql /var/opt/mssql/data
    sudo su mssql
    cp /var/opt/mssql/tmp/* /var/opt/mssql/data/
    rm /var/opt/mssql/tmp/*
    exit
    
  3. SQL Server가 새 파일 경로를 사용하여 성공적으로 시작되는지 확인합니다. 각 노드에서 이를 수행합니다. 이때 한 번에 하나의 노드에서만 SQL Server를 실행해야 합니다. 두 노드 모두 동시에 데이터 파일에 액세스하려고 하기 때문에 동시에 실행할 수 없습니다(두 노드에서 실수로 SQL Server가 시작되지 않도록 하려면 파일 시스템 클러스터 리소스를 사용하여 서로 다른 노드에서 공유가 두 번 탑재되지 않도록 하세요). 다음 명령은 SQL Server를 시작하고 상태를 검사한 후 SQL Server를 중지합니다.

    sudo systemctl start mssql-server
    sudo systemctl status mssql-server
    sudo systemctl stop mssql-server
    

이때 SQL Server의 두 인스턴스는 모두 공유 스토리지의 데이터베이스 파일과 함께 실행되도록 구성됩니다. 다음 단계는 Pacemaker에 대해 SQL Server를 구성하는 것입니다.

각 클러스터 노드에 Pacemaker 설치 및 구성

  1. 두 클러스터 노드에서 모두 Pacemaker 로그인을 위한 SQL Server 사용자 이름 및 암호를 저장할 파일을 만듭니다. 다음 명령은 이 파일을 만들고 채웁니다.

    sudo touch /var/opt/mssql/secrets/passwd
    echo '<loginName>' | sudo tee -a /var/opt/mssql/secrets/passwd
    echo '<loginPassword>' | sudo tee -a /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 600 /var/opt/mssql/secrets/passwd
    
  2. 두 클러스터 노드에서 모두 Pacemaker 방화벽 포트를 엽니다. firewalld를 사용하여 이러한 포트를 열려면 다음 명령을 실행합니다.

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    

    기본 제공된 고가용성 구성이 없는 또 다른 방화벽을 사용하는 경우 Pacemaker가 클러스터의 다른 노드와 통신할 수 있으려면 다음 포트를 열어야 합니다.

    • TCP: 포트 2224, 3121, 21064
    • UDP: 포트 5405
  3. 각 노드에 Pacemaker 패키지를 설치합니다.

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  4. Pacemaker 및 Corosync 패키지를 설치할 때 생성된 기본 사용자의 암호를 설정합니다. 두 노드에서 모두 같은 암호를 사용합니다.

    sudo passwd hacluster
    
  5. pcsd 서비스 및 Pacemaker를 사용하도록 설정하고 시작합니다. 이렇게 하면 다시 시작된 후 노드가 클러스터에 다시 조인할 수 있습니다. 두 노드에서 모두 다음 명령을 실행합니다.

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  6. SQL Server용 FCI 리소스 에이전트를 설치합니다. 두 노드에서 모두 다음 명령을 실행합니다.

    sudo yum install mssql-server-ha
    

펜싱 에이전트 구성

STONITH 디바이스는 펜싱 에이전트를 제공합니다. Azure의 Red Hat Enterprise Linux에서 Pacemaker 설정에서는 Azure의 이 클러스터에 대해 STONITH 디바이스를 만드는 방법을 보여 줍니다. 작업 환경에 맞게 지침을 수정하세요.

클러스터 만들기

  1. 노드 중 하나에서 클러스터를 만듭니다.

    sudo pcs cluster auth <nodeName1 nodeName2 ...> -u hacluster
    sudo pcs cluster setup --name <clusterName> <nodeName1 nodeName2 ...>
    sudo pcs cluster start --all
    
  2. SQL Server, 파일 시스템 및 가상 IP 리소스에 대한 클러스터 리소스를 구성하고 해당 구성을 클러스터에 푸시합니다. 다음 정보가 필요합니다.

    • SQL Server 리소스 이름: 클러스터된 SQL Server 리소스의 이름입니다.
    • 부동 IP 리소스 이름: 가상 IP 주소 리소스의 이름입니다.
    • IP 주소소: 클라이언트가 클러스터된 SQL Server 인스턴스에 연결하는 데 사용하는 IP 주소입니다.
    • 파일 시스템 리소스 이름: 파일 시스템 리소스의 이름입니다.
    • 디바이스: NFS 공유 경로
    • device: 공유에 탑재된 로컬 경로입니다.
    • fstype: 파일 공유 형식입니다(즉, nfs).

    사용자 환경에 맞게 다음 스크립트에서 값을 업데이트합니다. 한 노드에서 실행하여 클러스터된 서비스를 구성하고 시작합니다.

    sudo pcs cluster cib cfg
    sudo pcs -f cfg resource create <sqlServerResourceName> ocf:mssql:fci
    sudo pcs -f cfg resource create <floatingIPResourceName> ocf:heartbeat:IPaddr2 ip=<ip Address>
    sudo pcs -f cfg resource create <fileShareResourceName> Filesystem device=<networkPath> directory=<localPath> fstype=<fileShareType>
    sudo pcs -f cfg constraint colocation add <virtualIPResourceName> <sqlResourceName>
    sudo pcs -f cfg constraint colocation add <fileShareResourceName> <sqlResourceName>
    sudo pcs cluster cib-push cfg
    

    예를 들어 다음 스크립트는 mssqlha(이)라는 이름의 SQL Server 클러스터형 리소스와 IP 주소가 10.0.0.99인 부동 IP 리소스를 만듭니다. 또한 파일 시스템 리소스를 만들고 모든 리소스가 SQL 리소스와 동일한 노드에 공동 배치되도록 제약 조건을 추가합니다.

    sudo pcs cluster cib cfg
    sudo pcs -f cfg resource create mssqlha ocf:mssql:fci
    sudo pcs -f cfg resource create virtualip ocf:heartbeat:IPaddr2 ip=10.0.0.99
    sudo pcs -f cfg resource create fs Filesystem device="10.8.8.0:/mnt/nfs" directory="/var/opt/mssql/data" fstype="nfs"
    sudo pcs -f cfg constraint colocation add virtualip mssqlha
    sudo pcs -f cfg constraint colocation add fs mssqlha
    sudo pcs cluster cib-push cfg
    

    구성이 푸시되면 SQL Server가 한 노드에서 시작됩니다.

  3. SQL Server가 시작되는지 확인합니다.

    sudo pcs status
    

    다음 예제에서는 Pacemaker가 클러스터된 SQL Server 인스턴스를 성공적으로 시작한 경우의 결과를 보여 줍니다.

    fs     (ocf::heartbeat:Filesystem):    Started sqlfcivm1
    virtualip     (ocf::heartbeat:IPaddr2):      Started sqlfcivm1
    mssqlha  (ocf::mssql:fci): Started sqlfcivm1
    
    PCSD Status:
     sqlfcivm1: Online
     sqlfcivm2: Online
    
    Daemon Status:
     corosync: active/disabled
     pacemaker: active/enabled
     pcsd: active/enabled