다음을 통해 공유


장애 조치(failover) 클러스터 인스턴스 구성 - iSCSI - SQL Server on Linux

적용 대상: SQL Server - Linux

이 문서에서는 Linux에서 FCI(장애 조치(failover) 클러스터 인스턴스)용 iSCSI 스토리지를 구성하는 방법을 설명합니다.

iSCSI 구성

iSCSI는 네트워킹을 사용하여 대상으로 알려진 서버의 디스크를 서버에 게시합니다. iSCSI 대상에 연결하는 서버에는 iSCSI 초기자가 구성되어 있어야 합니다. 대상의 디스크에 액세스할 수 있어야 하는 초기자만 액세스할 수 있도록 해당 디스크에 명시적 권한을 부여합니다. 대상 자체는 가용성과 안정성이 높아야 합니다.

중요한 iSCSI 대상 정보

iSCSI 대상을 구성하는 방법은 사용할 원본 유형에 따라 다르므로 이 섹션에서는 다루지 않지만 클러스터 노드에서 사용할 디스크에 대한 보안이 구성되어 있는지 확인합니다.

Linux 기반 iSCSI 대상을 사용하는 경우 FCI 노드에서 대상을 구성해서는 안 됩니다. 성능과 가용성을 위해 iSCSI 네트워크는 원본 서버와 클라이언트 서버 모두에서 일반 네트워크 트래픽에 사용되는 네트워크와 분리되어야 합니다. iSCSI에 사용되는 네트워크는 빨라야 합니다. 네트워크는 일부 프로세서 대역폭을 소비하므로 일반 서버를 사용하는 경우 그에 따라 계획을 세워야 합니다.

대상에서 완료되도록 하려면 가장 중요한 작업은 FCI에 참여하는 서버만 액세스할 수 있도록 적절한 권한을 생성되는 디스크에 할당하는 것입니다. 여기에는 linuxnodes1이라는 이름이 생성된 Microsoft iSCSI 대상의 예시가 나와 있으며, 이 경우 노드의 IP 주소가 할당되어 NewFCIDisk1.vhdx가 나타납니다.

초기자의 스크린샷.

지침

이 섹션에서는 FCI의 노드 역할을 할 서버에서 iSCSI 초기자를 구성하는 방법을 설명합니다. 지침은 RHEL(Red Hat Enterprise Linux) 및 Ubuntu에서와 마찬가지로 작동해야 합니다.

지원되는 배포판에 대한 iSCSI 초기자에 대한 자세한 내용은 다음 링크를 참조하세요.

  1. FCI 구성에 참여할 서버 중 하나를 선택합니다. 어느 것이든 상관 없습니다. iSCSI는 전용 네트워크에 있어야 하므로 해당 네트워크를 인식하고 사용할 수 있도록 iSCSI를 구성합니다. sudo iscsiadm -m iface -I <iSCSIIfaceName> -o new이 네트워크의 고유한 이름 또는 친숙한 이름인 <iSCSIIfaceName>를 실행합니다. 다음 예제에서는 iSCSINIC를 사용합니다.

    sudo iscsiadm -m iface -I iSCSINIC -o new
    

    예상되는 출력은 다음과 같습니다.

    New interface iSCSINIC added
    
  2. /var/lib/iscsi/ifaces/iSCSIIfaceName을 편집합니다. 다음 값이 완전히 입력되었는지 확인합니다.

    • iface.net_ifacename은 OS에 표시된 네트워크 카드의 이름입니다.
    • iface.hwaddress는 다음 인터페이스에 대해 만들어질 고유한 이름의 MAC 주소입니다.
    • iface.ipaddress
    • iface.subnet_Mask

    다음 예제를 참조하십시오.

    값이 완전히 채워진 파일의 스크린샷.

  3. iSCSI 대상을 찾습니다.

    sudo iscsiadm -m discovery -t sendtargets -I <iSCSINetName> -p <TargetIPAddress>:<TargetPort>
    

    <iSCSINetName>은 네트워크의 고유한 식별 이름이고, <TargetIPAddress>는 iSCSI 대상의 IP 주소이고, <TargetPort>는 iSCSI 대상의 포트입니다.

    예상되는 출력은 다음과 같습니다.

    10.181.182.1:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target
    10.201.202.1:3260,1 iqn.1991-05.com.contoso:dc1-linuxnodes1-target
    [2002:b4b5:b601::b4b5:b601]:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target
    [2002:8c9:ca01::c8c9:ca01]:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target
    
  4. 대상에 로그인합니다.

    sudo iscsiadm -m node -I <iSCSIIfaceName> -p TargetIPAddress -l
    

    <iSCSIIfaceName>은 네트워크의 고유한 식별 이름이고 <TargetIPAddress>는 iSCSI 대상의 IP 주소입니다.

    예상되는 출력은 다음과 같습니다.

    Logging in to [iface: iSCSINIC, target: ian.1991-05.com.contoso:dcl-linuxnodesl-tar get, portal: 10.181.182.1,3260] (multiple)
    Login to [iface: iSCSINIC, target: ian.1991-05.com.contoso:dcl-linuxnodesl-tar get, portal: 10.181.182.1,3260] successful.
    
  5. iSCSI 대상에 대한 연결이 있는지 확인합니다.

    sudo iscsiadm -m session
    

    출력은 다음 예제와 유사합니다.

    tcp: [1] 10.105.16.7:3260,1 iqn.1991-05.com.contoso:dcl-linuxnodes1-target (non-flash)
    
  6. iSCSI 연결 디스크를 확인합니다.

    sudo grep "Attached SCSI" /var/log/messages
    

    grep 명령 및 연결된 SCSI 디스크를 보여 주는 명령에 대한 응답의 스크린샷.

  7. iSCSI 디스크에 물리적 볼륨을 만듭니다.

    sudo pvcreate /dev/<devicename>
    

    <devicename>는 이전 단계의 디바이스 이름입니다.

  8. iSCSI 디스크에 볼륨 그룹을 만듭니다. 단일 볼륨 그룹에 할당된 디스크는 풀 또는 컬렉션으로 표시됩니다.

    sudo vgcreate <VolumeGroupName> /dev/devicename
    

    <VolumeGroupName>은 볼륨 그룹의 이름이고, <devicename>은 6단계의 디바이스 이름입니다.

  9. 디스크의 논리 볼륨을 만들고 확인합니다.

    sudo lvcreate -Lsize -n <LogicalVolumeName> <VolumeGroupName>
    

    <size>는 만들려는 볼륨의 크기이며 G(기가바이트), T(테라바이트) 등을 사용하여 지정할 수 있고, <LogicalVolumeName>은 논리 볼륨의 이름이고, <VolumeGroupName>은 이전 단계의 볼륨 그룹 이름입니다.

    예상되는 출력은 다음과 같습니다.

    Logical volume "FCIDataLV1" created.
    

    다음 예제에서는 25GB 볼륨을 만듭니다.

  10. sudo lvs를 실행하여 생성된 LVM을 확인합니다.

  11. 지원되는 파일 시스템으로 논리 볼륨을 포맷합니다. EXT4의 경우 다음 예시를 사용합니다.

    sudo mkfs.ext4 /dev/<VolumeGroupName>/<LogicalVolumeName>
    

    <VolumeGroupName>은 이전 단계의 볼륨 그룹 이름입니다. <LogicalVolumeName>은 이전 단계의 논리적 볼륨의 이름입니다.

  12. 시스템 데이터베이스 또는 기본 데이터 위치에 저장된 항목의 경우 다음 단계를 수행합니다. 그렇지 않은 경우, 13단계로 건너뜁니다.

    1. 작업 중인 서버에서 SQL Server가 중지되었는지 확인합니다.

      sudo systemctl stop mssql-server
      sudo systemctl status mssql-server
      
    2. 슈퍼 사용자로 완전히 전환합니다. 성공하는 경우 승인이 수신되지 않습니다.

      sudo -i
      
    3. mssql 사용자로 전환합니다. 성공하는 경우 승인이 수신되지 않습니다.

      su mssql
      
    4. SQL Server 데이터와 로그 파일을 저장할 임시 디렉터리를 만듭니다. 성공하는 경우 승인이 수신되지 않습니다.

      mkdir <TempDir>
      

      <TempDir>은 폴더 이름입니다. 다음 예제에서는 /var/opt/mssql/TempDir이라는 폴더를 만듭니다.

      mkdir /var/opt/mssql/TempDir
      
    5. SQL Server 데이터와 로그 파일을 임시 디렉터리에 복사합니다. 성공하는 경우 승인이 수신되지 않습니다.

      cp /var/opt/mssql/data/* <TempDir>
      

      <TempDir>는 이전 단계의 폴더 이름입니다.

    6. 파일이 디렉터리에 있는지 확인합니다.

      ls <TempDir>
      

      <TempDir>는 이전 단계의 폴더 이름입니다.

    7. 기존 SQL Server 데이터 디렉터리에서 파일을 삭제합니다. 성공하는 경우 승인이 수신되지 않습니다.

      rm - f /var/opt/mssql/data/*
      
    8. 파일이 삭제되었는지 확인합니다. 다음 이미지는 c에서 h까지의 전체 시퀀스의 예를 보여줍니다.

      ls /var/opt/mssql/data
      

      ls 명령의 스크린샷 및 명령에 대한 응답.

    9. exit를 입력하여 다시 root 사용자로 전환합니다.

    10. SQL Server 데이터 폴더에 iSCSI 논리 볼륨을 탑재합니다. 성공하는 경우 승인이 수신되지 않습니다.

      mount /dev/<VolumeGroupName>/<LogicalVolumeName> /var/opt/mssql/data
      

      <VolumeGroupName>은 볼륨 그룹 이름이고, <LogicalVolumeName>은 생성된 논리 볼륨 이름입니다. 다음 예시 구문은 이전 명령의 볼륨 그룹 및 논리 볼륨과 일치합니다.

      mount /dev/FCIDataVG1/FCIDataLV1 /var/opt/mssql/data
      
    11. 탑재 소유자를 mssql로 변경합니다. 성공하는 경우 승인이 수신되지 않습니다.

      chown mssql /var/opt/mssql/data
      
    12. 마운트 그룹의 소유권을 mssql로 변경합니다. 성공하는 경우 승인이 수신되지 않습니다.

      chgrp mssql /var/opt/mssql/data
      
    13. mssql 사용자로 전환합니다. 성공하는 경우 승인이 수신되지 않습니다.

      su mssql
      
    14. 임시 디렉터리 /var/opt/mssql/data에서 파일을 복사합니다. 성공하는 경우 승인이 수신되지 않습니다.

      cp /var/opt/mssql/TempDir/* /var/opt/mssql/data
      
    15. 해당 위치에 파일이 있는지 확인합니다.

      ls /var/opt/mssql/data
      
    16. mssql이 되지 않도록 하려면 exit를 입력합니다.

    17. root이 되지 않도록 하려면 exit를 입력합니다.

    18. SQL Server를 시작합니다. 모든 항목이 올바르게 복사되고 보안이 올바르게 적용되었다면 SQL Server가 시작됨으로 표시되어야 합니다.

      sudo systemctl start mssql-server
      sudo systemctl status mssql-server
      
    19. SQL Server를 중지하고 종료되었는지 확인합니다.

      sudo systemctl stop mssql-server
      sudo systemctl status mssql-server
      
  13. 사용자 데이터베이스 또는 백업과 같은 시스템 데이터베이스 이외의 항목은 다음 단계를 따르세요. 기본 위치만 사용하는 경우 14단계로 건너뜁니다.

    1. 슈퍼 사용자로 전환합니다. 성공하는 경우 승인이 수신되지 않습니다.

      sudo -i
      
    2. SQL Server에서 사용할 폴더를 만듭니다.

      mkdir <FolderName>
      

      <FolderName>은 폴더 이름입니다. 올바른 위치에 없으면 폴더의 전체 경로를 지정해야 합니다. 다음 예제에서는 /var/opt/mssql/userdata라는 폴더를 만듭니다.

      mkdir /var/opt/mssql/userdata
      
    3. 이전 단계에서 만든 폴더에 iSCSI 논리 볼륨을 탑재합니다. 성공하는 경우 승인이 수신되지 않습니다.

      mount /dev/<VolumeGroupName>/<LogicalVolumeName> <FolderName>
      

      <VolumeGroupName>은 볼륨 그룹의 이름이고, <LogicalVolumeName>은 생성된 논리 볼륨의 이름이고, <FolderName>은 폴더의 이름입니다. 예시 구문은 다음과 같습니다.

      mount /dev/FCIDataVG2/FCIDataLV2 /var/opt/mssql/userdata
      
    4. 만든 폴더의 소유권을 mssql로 변경합니다. 성공하는 경우 승인이 수신되지 않습니다.

      chown mssql <FolderName>
      

      <FolderName>은 생성된 폴더 이름입니다. 예시는 다음과 같습니다.

      chown mssql /var/opt/mssql/userdata
      
    5. 만든 폴더의 그룹을 mssql로 변경합니다. 성공하는 경우 승인이 수신되지 않습니다.

      chown mssql <FolderName>
      

      <FolderName>은 생성된 폴더 이름입니다. 예시는 다음과 같습니다.

      chown mssql /var/opt/mssql/userdata
      
    6. exit를 입력하여 슈퍼 사용자를 종료합니다.

    7. 테스트하려면 해당 폴더에 데이터베이스를 만듭니다. 다음 스크립트에서는 데이터베이스를 만들고 컨텍스트를 전환하고 파일이 OS 수준에 있는지 확인한 다음, 임시 위치를 삭제합니다. SSMS 또는 sqlcmd를 사용하여 이 스크립트를 실행할 수 있습니다.

      DROP DATABASE TestDB;
      GO
      
      CREATE DATABASE TestDB
          ON (NAME = TestDB_Data, FILENAME = '/var/opt/mssql/userdata/TestDB_Data.mdf')
          LOG ON (NAME = TestDB_Log, FILENAME = '/var/opt/mssql/userdata/TestDB_Log.ldf');
      GO
      
      USE TestDB;
      GO
      

      셸에서 다음 명령을 실행하여 새 데이터베이스 파일을 확인합니다.

      sudo ls /var/opt/mssal/userdata
      

      예상되는 출력은 다음과 같습니다.

      lost+found TestDB_Data.mdf
      TestDB_Log.ldf
      

      정리할 데이터베이스를 삭제합니다.

      DROP DATABASE TestDB;
      GO
      
      sudo ls /var/opt/mssal/userdata
      

      예상되는 출력은 다음과 같습니다.

      lost+found
      
    8. 공유를 분리합니다.

      sudo umount /dev/<VolumeGroupName>/<LogicalVolumeName> <FolderName>
      

      <VolumeGroupName>은 볼륨 그룹의 이름이고, <LogicalVolumeName>은 생성된 논리 볼륨의 이름이고, <FolderName>은 폴더의 이름입니다. 예시 구문은 다음과 같습니다.

      sudo umount /dev/FCIDataVG2/FCIDataLV2 /var/opt/mssql/userdata
      
  14. Pacemaker만 볼륨 그룹을 활성화할 수 있도록 서버를 구성합니다.

    sudo lvmconf --enable-halvm --services -startstopservices
    
  15. 서버에서 볼륨 그룹 목록을 생성합니다. iSCSI 디스크가 아닌 나열된 모든 항목은 OS 디스크 등 시스템에서 사용됩니다.

    sudo vgs
    
  16. /etc/lvm/lvm.conf 파일의 활성화 구성 섹션을 수정합니다. 다음 줄 구성:

    volume_list = [ <ListOfVGsNotUsedByPacemaker> ]
    

    <ListOfVGsNotUsedByPacemaker>는 20단계의 출력 중 FCI에서 사용하지 않을 볼륨 그룹의 목록입니다. 각 항목을 따옴표로 묶고 쉼표로 구분합니다. 예시는 다음과 같습니다.

    Volume_list 값의 예를 보여 주는 스크린샷

  17. Linux가 시작되면 파일 시스템이 탑재됩니다. Pacemaker만 iSCSI 디스크를 탑재할 수 있도록 하려면 루트 파일 시스템 이미지를 다시 빌드합니다.

    다음 명령을 실행합니다. 완료하는 데 몇 분 정도 걸릴 수 있습니다. 성공하면 메시지가 다시 표시되지 않습니다.

    sudo dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)
    
  18. 서버를 다시 시작합니다.

  19. FCI에 참여할 다른 서버에서 1~6단계를 수행합니다. 이렇게 하면 iSCSI 대상이 SQL Server에 제공됩니다.

  20. 서버에서 볼륨 그룹 목록을 생성합니다. 이전에 만든 볼륨 그룹을 표시해야 합니다.

    sudo vgs
    
  21. SQL Server를 시작하고 이 서버에서 시작할 수 있는지 확인합니다.

    sudo systemctl start mssql-server
    sudo systemctl status mssql-server
    
  22. SQL Server를 중지하고 종료되었는지 확인합니다.

    sudo systemctl stop mssql-server
    sudo systemctl status mssql-server
    
  23. FCI에 참여할 다른 서버에서 1~6단계를 반복합니다.

이제 FCI를 구성할 준비가 되었습니다.