Share via


자습서: Azure에서 Ubuntu 가상 머신 기반 SQL Server에 대한 가용성 그룹 구성

이 자습서에서는 다음 작업을 수행하는 방법을 알아봅니다.

  • 가상 머신을 만들어 가용성 집합에 배치
  • HA(고가용성)를 사용하도록 설정
  • Pacemaker 클러스터 만들기
  • STONITH 디바이스를 만들어 펜싱 에이전트 구성
  • Ubuntu에 SQL Server 및 mssql-tools 설치
  • SQL Server Always On 가용성 그룹 구성
  • Pacemaker 클러스터에서 AG(가용성 그룹) 리소스 구성
  • 장애 조치 및 펜싱 에이전트 테스트

참고 항목

바이어스 없는 통신

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

이 자습서에서는 Azure CLI를 사용하여 리소스를 Azure에 배포합니다.

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

사전 요구 사항

  • 이 문서에는 Azure CLI 버전 2.0.30 이상이 필요합니다. Azure Cloud Shell을 사용하는 경우 최신 버전이 이미 설치되어 있습니다.

리소스 그룹 만들기

둘 이상의 구독이 있는 경우 이러한 리소스를 배포하려는 구독을 설정합니다.

다음 명령을 사용하여 <resourceGroupName> 리소스 그룹을 지역에 만듭니다. <resourceGroupName>을 선택한 이름으로 바꿉니다. 이 자습서에서는 East US 2를 사용합니다. 자세한 내용은 이 빠른 시작을 참조하세요.

az group create --name <resourceGroupName> --location eastus2

가용성 집합 만들기

다음 단계는 가용성 집합을 만드는 것입니다. Azure Cloud Shell에서 다음 명령을 실행하고, <resourceGroupName>을 리소스 그룹 이름으로 바꿉니다. <availabilitySetName>에 대한 이름을 선택합니다.

az vm availability-set create \
    --resource-group <resourceGroupName> \
    --name <availabilitySetName> \
    --platform-fault-domain-count 2 \
    --platform-update-domain-count 2

명령이 완료되면 다음 결과를 얻습니다.

{
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/availabilitySets/<availabilitySetName>",
  "location": "eastus2",
  "name": "<availabilitySetName>",
  "platformFaultDomainCount": 2,
  "platformUpdateDomainCount": 2,
  "proximityPlacementGroup": null,
  "resourceGroup": "<resourceGroupName>",
  "sku": {
    "capacity": null,
    "name": "Aligned",
    "tier": null
  },
  "statuses": null,
  "tags": {},
  "type": "Microsoft.Compute/availabilitySets",
  "virtualMachines": []
}

가상 네트워크 및 서브넷 만들기

  1. 사전 할당된 IP 주소 범위를 사용하여 명명된 서브넷을 만듭니다. 다음 명령에서 이러한 값을 바꿉니다.

    • <resourceGroupName>
    • <vNetName>
    • <subnetName>
    az network vnet create \
        --resource-group <resourceGroupName> \
        --name <vNetName> \
        --address-prefix 10.1.0.0/16 \
        --subnet-name <subnetName> \
        --subnet-prefix 10.1.1.0/24
    

    이전 명령은 사용자 지정 IP 범위를 포함하는 VNet과 서브넷을 만듭니다.

가용성 집합 내에 Ubuntu VM 만들기

  1. Azure에서 Ubuntu 기반 OS를 제공하는 가상 머신 이미지의 목록을 가져옵니다.

     az vm image list --all --offer "sql2022-ubuntupro2004"
    

    BYOS 이미지를 검색하면 다음 결과가 표시됩니다.

    [
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "enterprise_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:enterprise_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "sqldev_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:sqldev_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "standard_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:standard_upro:16.0.230808",
        "version": "16.0.230808"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.221108",
        "version": "16.0.221108"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230207",
        "version": "16.0.230207"
      },
      {
        "architecture": "x64",
        "offer": "sql2022-ubuntupro2004",
        "publisher": "MicrosoftSQLServer",
        "sku": "web_upro",
        "urn": "MicrosoftSQLServer:sql2022-ubuntupro2004:web_upro:16.0.230808",
        "version": "16.0.230808"
      }
    ]
    

    이 자습서에서는 Ubuntu 20.04를 사용합니다.

    Important

    가용성 그룹을 설정하려면 머신 이름이 15자 미만이어야 합니다. 사용자 이름은 대문자를 포함할 수 없으며, 암호는 12~72자여야 합니다.

  2. 가용성 집합에 3개의 VM을 만듭니다. 다음 명령에서 이러한 값을 바꿉니다.

    • <resourceGroupName>
    • <VM-basename>
    • <availabilitySetName>
    • <VM-Size> - 예를 들어 "Standard_D16s_v3"입니다.
    • <username>
    • <adminPassword>
    • <vNetName>
    • <subnetName>
    for i in `seq 1 3`; do
        az vm create \
           --resource-group <resourceGroupName> \
           --name <VM-basename>$i \
           --availability-set <availabilitySetName> \
           --size "<VM-Size>" \
           --os-disk-size-gb 128 \
           --image "Canonical:0001-com-ubuntu-server-jammy:20_04-lts-gen2:latest" \
           --admin-username "<username>" \
           --admin-password "<adminPassword>" \
           --authentication-type all \
           --generate-ssh-keys \
           --vnet-name "<vNetName>" \
           --subnet "<subnetName>" \
           --public-ip-sku Standard \
           --public-ip-address ""
        done
    

이전 명령은 이전에 정의된 VNet을 사용하여 VM을 만듭니다. 다른 구성에 대한 자세한 내용은 az vm create 문서를 참조하세요.

이 명령에는 128GB의 사용자 지정 OS 드라이브 크기를 생성하기 위한 --os-disk-size-gb 매개 변수도 포함되어 있습니다. 나중에 이 크기를 늘리려면 설치에 맞게 적절한 폴더 볼륨을 확장하고 LVM(논리 볼륨 관리자)을 구성하십시오.

각 VM에 대한 명령이 완료되면 다음과 비슷한 결과를 얻습니다.

{
  "fqdns": "",
  "id": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachines/ubuntu1",
  "location": "westus",
  "macAddress": "<Some MAC address>",
  "powerState": "VM running",
  "privateIpAddress": "<IP1>",
  "resourceGroup": "<resourceGroupName>",
  "zones": ""
}

만든 VM에 대한 연결 테스트

Azure Cloud Shell에서 다음 명령을 사용하여 각 VM에 연결합니다. VM IP를 찾을 수 없는 경우 Azure Cloud Shell에서 이 빠른 시작을 수행합니다.

ssh <username>@<publicIPAddress>

연결에 성공하면 Linux 터미널을 나타내는 다음 출력이 표시됩니다.

[<username>@ubuntu1 ~]$

exit를 입력하여 SSH 세션을 종료합니다.

노드 간에 암호 없는 SSH 액세스 구성

암호 없는 SSH 액세스를 사용하면 VM이 SSH 공개 키를 사용하여 서로 통신할 수 있습니다. 각 노드에서 SSH 키를 구성하고 각 노드에 해당 키를 복사해야 합니다.

새 SSH 키 생성

필요한 SSH 키 크기는 4,096비트입니다. 각 VM에서 /root/.ssh 폴더로 변경하고 다음 명령을 실행합니다.

ssh-keygen -t rsa -b 4096

이 단계에서는 기존 SSH 파일을 덮어쓰라는 메시지가 나타날 수 있습니다. 이 메시지에 동의해야 합니다. 암호를 입력할 필요가 없습니다.

공개 SSH 키 복사

각 VM에서 ssh-copy-id 명령을 사용하여, 방금 생성된 노드에서 공개 키를 복사해야 합니다. 대상 VM에서 대상 디렉터리를 지정하려면 -i 매개 변수를 사용하면 됩니다.

다음 명령에서 <username> 계정은 VM을 만들 때 각 노드에 대해 구성한 것과 동일한 계정일 수 있습니다. root 계정을 사용할 수도 있지만 프로덕션 환경에서는 이 옵션이 권장되지 않습니다.

sudo ssh-copy-id <username>@ubuntu1
sudo ssh-copy-id <username>@ubuntu2
sudo ssh-copy-id <username>@ubuntu3

각 노드에서 암호 없는 액세스 확인

SSH 공개 키가 각 노드에 복사되었는지 확인하려면 각 노드에서 ssh 명령을 사용합니다. 키를 올바르게 복사했다면 암호를 묻는 메시지가 표시되지 않으며 연결이 성공합니다.

이 예제에서는 첫 번째 VM(ubuntu1)에서 두 번째 노드와 세 번째 노드에 연결합니다. 다시 한 번 <username> 계정은 VM을 만들 때 각 노드에 대해 구성한 것과 동일한 계정일 수 있습니다.

ssh <username>@ubuntu2
ssh <username>@ubuntu3

각 노드가 암호를 요구하지 않고 다른 노드와 통신할 수 있도록 세 노드 모두에서 이 프로세스를 반복합니다.

이름 확인 구성

DNS를 사용하거나 각 노드에서 etc/hosts 파일을 수동으로 편집하여 이름 확인을 구성할 수 있습니다.

DNS와 Active Directory에 대한 자세한 내용은 Linux 호스트의 SQL Server를 Active Directory 도메인에 조인을 참조하세요.

Important

이전 예의 개인 IP 주소를 사용하는 것이 좋습니다. 이 구성에서 공용 IP 주소를 사용하면 설정이 실패하여 외부 네트워크에 VM이 노출됩니다.

이 예제에 사용된 VM과 해당 IP 주소는 다음과 같이 나열됩니다.

  • ubuntu1: 10.0.0.85
  • ubuntu2: 10.0.0.86
  • ubuntu3: 10.0.0.87

고가용성을 사용하도록 설정

ssh를 사용하여 3개의 VM 각각에 연결하고, 연결 시 다음 명령을 실행하여 고가용성을 사용하도록 설정합니다.

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

Pacemaker 클러스터 설치 및 구성

Pacemaker 클러스터 구성을 시작하려면 필수 패키지와 리소스 에이전트를 설치해야 합니다. 각 VM에서 아래 명령을 실행합니다.

sudo apt-get install -y pacemaker pacemaker-cli-utils crmsh resource-agents fence-agents csync2 python3-azure

이제 주 서버에서 인증 키 만들기로 진행합니다.

sudo corosync-keygen

인증 키는 /etc/corosync/authkey 위치에 생성됩니다. /etc/corosync/authkey 위치에 있는 보조 서버에 인증 키를 복사합니다.

sudo scp /etc/corosync/authkey username@ubuntu2:~
sudo scp /etc/corosync/authkey username@ubuntu3:~

인증 키를 홈 디렉터리에서 /etc/corosync로 이동합니다.

sudo mv authkey /etc/corosync/authkey

다음 명령을 사용하여 클러스터 만들기를 진행합니다.

cd /etc/corosync/
sudo vi corosync.conf

다음과 같이 Corosync 파일을 편집합니다.

totem {
    version: 2
    secauth: off
    cluster_name: demo
    transport: udpu
}

nodelist {
    node {
        ring0_addr: 10.0.0.85
        name: ubuntu1
        nodeid: 1
    }
    node {
        ring0_addr: 10.0.0.86
        name: ubuntu2
        nodeid: 2
    }
    node {
        ring0_addr: 10.0.0.87
        name: ubuntu3
        nodeid: 3
    }
}

quorum {
    provider: corosync_votequorum
    two_node: 0
}

qb {
    ipc_type: native
}

logging {
    fileline: on
    to_stderr: on
    to_logfile: yes
    logfile: /var/log/corosync/corosync.log
    to_syslog: no
    debug: off
}

corosync.conf 파일을 다른 노드의 /etc/corosync/corosync.conf에 복사합니다.

sudo scp /etc/corosync/corosync.conf username@ubuntu2:~
sudo scp /etc/corosync/corosync.conf username@ubuntu3:~
sudo mv corosync.conf /etc/corosync/

Pacemaker와 Corosync를 다시 시작하고 상태를 확인합니다.

sudo systemctl restart pacemaker corosync
sudo crm status

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

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by hacluster via crmd on ubuntu1
  * 3 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * No resources

펜싱 에이전트 구성

클러스터에서 펜싱을 구성합니다. 펜싱은 클러스터에서 실패한 노드를 격리하는 것입니다. 실패한 노드를 다시 시작하여 작동을 중단했다가 초기화하고 다시 작동하여 클러스터에 다시 조인시킵니다.

펜싱을 구성하려면 다음 작업을 수행합니다.

  1. Microsoft Entra ID에 새로운 애플리케이션 등록 및 비밀 만들기
  2. powershell/CLI에서 json 파일로 사용자 지정 역할 만들기
  3. 클러스터의 VM에 역할 및 애플리케이션 할당
  4. 펜싱 에이전트 속성 설정

Microsoft Entra ID에 새로운 애플리케이션 등록 및 비밀 만들기

  1. 포털에서 Microsoft Entra ID로 이동하여 테넌트 ID를 기록해 둡니다.
  2. 왼쪽 메뉴에서 앱 등록을 선택하고 새 등록을 선택합니다.
  3. 이름을 입력하고 이 조직 디렉터리에만 계정을 선택합니다.
  4. 애플리케이션 유형으로 을 선택하고 로그인 URL로 http://localhost를 입력한 다음 등록을 선택합니다.
  5. 왼쪽 메뉴에서 인증서 및 비밀를 선택한 다음 새 클라이언트 암호를 선택합니다.
  6. 설명을 입력하고 만료 기간을 선택합니다.
  7. 다음 암호로 사용되는 비밀 값과 다음 사용자 이름으로 사용되는 비밀 ID를 기록해 둡니다.
  8. "개요"를 선택하고 애플리케이션 ID를 기록해 둡니다. 이 애플리케이션 ID는 다음 로그인으로 사용됩니다.

fence-agent-role.json이라는 JSON 파일을 만들고 다음을 추가합니다(구독 ID 추가).

{
  "Name": "Linux Fence Agent Role-ap-server-01-fence-agent",
  "Id": null,
  "IsCustom": true,
  "Description": "Allows to power-off and start virtual machines",
  "Actions": [
    "Microsoft.Compute/*/read",
    "Microsoft.Compute/virtualMachines/powerOff/action",
    "Microsoft.Compute/virtualMachines/start/action"
  ],
  "NotActions": [],
  "AssignableScopes": [
    "/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  ]
}

PowerShell/CLI에서 JSON 파일로 사용자 지정 역할 만들기

az role definition create --role-definition fence-agent-role.json

클러스터의 VM에 역할 및 애플리케이션 할당

  1. 클러스터의 각 VM에 대해 사이드 메뉴에서 액세스 제어(IAM)를 선택합니다.
  2. 역할 할당 추가를 선택합니다(클래식 환경 사용).
  3. 이전에 만든 역할을 선택합니다.
  4. 선택 목록에서 앞에서 만든 애플리케이션의 이름을 입력합니다.

이제 이전 값과 구독 ID를 사용하여 펜싱 에이전트 리소스를 만들 수 있습니다.

  sudo crm configure primitive fence-vm stonith:fence_azure_arm \
params \
action=reboot \
resourceGroup="resourcegroupname" \
resourceGroup="$resourceGroup" \
username="$secretId" \
login="$applicationId" \
passwd="$password" \
tenantId="$tenantId" \
subscriptionId="$subscriptionId" \
pcmk_reboot_timeout=900 \
power_timeout=60 \
op monitor \
interval=3600 \
timeout=120

펜싱 에이전트 속성 설정

다음 명령을 실행하여 펜싱 에이전트 속성을 설정합니다.

sudo crm configure property cluster-recheck-interval=2min
sudo crm configure property start-failure-is-fatal=true
sudo crm configure property stonith-timeout=900
sudo crm configure property concurrent-fencing=true
sudo crm configure property stonith-enabled=true

클러스터 상태를 확인합니다.

  sudo crm status

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

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 1 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

SQL Server 및 mssql-tools 설치

다음 명령을 사용하여 SQL Server를 설치합니다.

  1. 공용 리포지토리 GPG 키를 가져옵니다.

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
    
  2. Ubuntu 리포지토리를 등록합니다.

    sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/mssql-server-2022.list)"
    
  3. 다음 명령을 실행하여 SQL Server를 설치합니다.

    sudo apt-get update
    sudo apt-get install -y mssql-server
    
  4. 패키지 설치가 완료되면 mssql-conf setup을 실행하고, 프롬프트에 따라 SA 암호를 설정하고, 버전을 선택합니다. 다시 말씀드리지만, 다음 버전은 체험용 라이선스인 Evaluation, Developer 및 Express로 제공됩니다.

    sudo /opt/mssql/bin/mssql-conf setup
    
  5. 구성이 완료되면 서비스가 실행 중인지 확인합니다.

    systemctl status mssql-server --no-pager
    
  6. SQL Server 명령줄 도구 설치

데이터베이스를 만들려면 SQL Server에서 Transact-SQL 문을 실행할 수 있는 도구와 연결해야 합니다. 다음 단계에서는 SQL Server 명령줄 도구인sqlcmdbcp를 설치합니다.

다음 단계에 따라 Ubuntu에 mssql-tools18을 설치합니다.

참고 항목

  • SQL Server 2019 CU 3부터 Ubuntu 18.04가 지원됩니다.
  • SQL Server 2019 CU 10부터 Ubuntu 20.04가 지원됩니다.
  • SQL Server 2022 CU 10부터 Ubuntu 22.04가 지원됩니다.
  1. 슈퍼 사용자 모드로 전환합니다.

    sudo su
    
  2. 공용 리포지토리 GPG 키를 가져옵니다.

    curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
    
  3. Microsoft Ubuntu 리포지토리를 등록합니다.

    • Ubuntu 22.04의 경우 다음 명령을 사용합니다.

      curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • Ubuntu 20.04의 경우 다음 명령을 사용합니다.

      curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • Ubuntu 18.04의 경우 다음 명령을 사용합니다.

      curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
    • Ubuntu 16.04의 경우 다음 명령을 사용합니다.

      curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
      
  4. 슈퍼 사용자 모드를 종료합니다.

    exit
    
  5. 원본 목록을 업데이트하고 unixODBC 개발자 패키지를 사용하여 설치 명령을 실행합니다.

    sudo apt-get update
    sudo apt-get install mssql-tools18 unixodbc-dev
    

    참고 항목

    최신 버전의 mssql-tools로 업데이트하려면 다음 명령을 실행합니다.

    sudo apt-get update  
    sudo apt-get install mssql-tools18
    
  6. 선택 사항: Bash 셸에서 PATH 환경 변수에 /opt/mssql-tools18/bin/를 추가합니다.

    로그인 세션을 위해 bash 셸에서 sqlcmdbcp에 액세스할 수 있도록 하려면 다음 명령을 사용하여 PATH 파일에서 ~/.bash_profile를 수정합니다.

    echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bash_profile
    

    대화형/비로그인 세션을 위해 bash 셸에서 sqlcmdbcp에 액세스할 수 있도록 설정하려면 다음 명령을 사용하여 PATH 파일에서 ~/.bashrc를 수정합니다.

    echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc
    source ~/.bashrc
    

SQL Server 고가용성 에이전트 설치

SQL Server용 고가용성 에이전트 패키지를 설치하려면 모든 노드에서 다음 명령을 실행합니다.

sudo apt-get install mssql-server-ha

가용성 그룹 구성

다음 단계에 따라 VM에 대해 SQL Server Always On 가용성 그룹을 구성합니다. 자세한 내용은 Linux에서 고가용성을 위한 SQL Server Always On 가용성 그룹 구성을 참조하세요.

가용성 그룹 사용 설정 및 SQL Server 다시 시작

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

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

인증서 만들기

Microsoft는 AG 엔드포인트에 대한 Active Directory 인증을 지원하지 않습니다. 따라서 인증서는 AG 엔드포인트 암호화에 사용해야 합니다.

  1. SQL Server Management Studio(SSMS) 또는 sqlcmd를 사용하여 모든 노드에 연결합니다. 다음 명령을 실행하여 AlwaysOn_health 세션을 사용하도록 설정하고 마스터 키를 만듭니다.

    중요

    SQL Server 인스턴스에 원격으로 연결하는 경우 방화벽에서 1433 포트가 열려 있어야 합니다. 또한 각 VM의 NSG에서 1433 포트에 대한 인바운드 연결을 허용해야 합니다. 자세한 내용은 인바운드 보안 규칙을 만드는 보안 규칙 만들기를 참조하세요.

    • <MasterKeyPassword>를 사용자 고유의 암호로 바꿉니다.
    ALTER EVENT SESSION AlwaysOn_health ON SERVER
        WITH (STARTUP_STATE = ON);
    GO
    
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<MasterKeyPassword>';
    GO
    
  2. SSMS 또는 sqlcmd를 사용하여 주 복제본에 연결합니다. 다음 명령은 주 SQL Server 복제본에서 인증서를 /var/opt/mssql/data/dbm_certificate.cer에 만들고, 프라이빗 키를 var/opt/mssql/data/dbm_certificate.pvk에 만듭니다.

    • <PrivateKeyPassword>를 사용자 고유의 암호로 바꿉니다.
    CREATE CERTIFICATE dbm_certificate
        WITH SUBJECT = 'dbm';
    GO
    
    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 = '<PrivateKeyPassword>'
            );
    GO
    

exit 명령을 실행하여 sqlcmd 세션을 종료하고 SSH 세션으로 돌아갑니다.

보조 복제본에 인증서 복사 및 서버에 인증서 만들기

  1. 가용성 복제본을 호스팅할 모든 서버의 동일한 위치에 만든 두 파일을 복사합니다.

    주 서버에서 다음 scp 명령을 실행하여 인증서를 대상 서버에 복사합니다.

    • <username>sles2를 사용하는 사용자 이름 및 대상 VM 이름으로 바꿉니다.
    • 모든 보조 복제본에 대해 이 명령을 실행합니다.

    참고

    루트 환경을 제공하는 sudo -i를 실행할 필요가 없습니다. 대신 각 명령 앞에 sudo 명령을 실행할 수 있습니다.

    # The below command allows you to run commands in the root environment
    sudo -i
    
    scp /var/opt/mssql/data/dbm_certificate.* <username>@sles2:/home/<username>
    
  2. 대상 서버에서 다음 명령을 실행합니다.

    • <username>을 사용자 이름으로 바꿉니다.
    • mv 명령은 파일 또는 디렉터리를 한 위치에서 다른 위치로 이동합니다.
    • chown 명령은 파일, 디렉터리 또는 링크의 소유자와 그룹을 변경하는 데 사용됩니다.
    • 모든 보조 복제본에 대해 이러한 명령을 실행합니다.
    sudo -i
    mv /home/<username>/dbm_certificate.* /var/opt/mssql/data/
    cd /var/opt/mssql/data
    chown mssql:mssql dbm_certificate.*
    
  3. 다음 Transact-SQL 스크립트는 주 SQL Server 복제본에서 만든 백업에서 인증서를 만듭니다. 강력한 암호로 스크립트를 업데이트합니다. 해독 암호는 이전 단계에서 .pvk 파일을 만들 때 사용한 암호와 동일합니다. 인증서를 만들려면 모든 보조 서버에서 sqlcmd 또는 SSMS를 사용하여 다음 스크립트를 실행합니다.

    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 = '<PrivateKeyPassword>'
    );
    GO
    

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

sqlcmd 또는 SSMS를 사용하여 모든 SQL Server 인스턴스에서 다음 스크립트를 실행합니다.

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

ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GO

가용성 그룹 만들기

sqlcmd 또는 SSMS를 사용하여 주 복제본을 호스팅하는 SQL Server 인스턴스에 연결합니다. 다음 명령을 실행하여 가용성 그룹을 만듭니다.

  • ag1을 원하는 AG 이름으로 바꿉니다.
  • ubuntu1, ubuntu2ubuntu3 값을 복제본을 호스팅하는 SQL Server 인스턴스의 이름으로 바꿉니다.
CREATE AVAILABILITY
GROUP [ag1]
WITH (
        DB_FAILOVER = ON,
        CLUSTER_TYPE = EXTERNAL
        )
FOR REPLICA
    ON N'ubuntu1'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu1:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'ubuntu2'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu2:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        ),
    N'ubuntu3'
WITH (
        ENDPOINT_URL = N'tcp://ubuntu3:5022',
        AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
        FAILOVER_MODE = EXTERNAL,
        SEEDING_MODE = AUTOMATIC
        );
GO

ALTER AVAILABILITY GROUP [ag1]
GRANT CREATE ANY DATABASE;
GO

Pacemaker용 SQL Server 로그인 만들기

모든 SQL Server 인스턴스에서 Pacemaker를 위한 SQL Server 로그인을 만듭니다. 다음 Transact-SQL은 로그인을 만듭니다.

  • <password>를 사용자 고유의 복합 암호로 바꿉니다.
USE [master]
GO

CREATE LOGIN [pacemakerLogin]
    WITH PASSWORD = N'<password>';
GO

ALTER SERVER ROLE [sysadmin]
    ADD MEMBER [pacemakerLogin];
GO

모든 SQL Server 인스턴스에서 SQL Server 로그인에 사용되는 자격 증명을 저장합니다.

  1. 파일을 만듭니다.

    sudo vi /var/opt/mssql/secrets/passwd
    
  2. 파일에 다음 두 줄을 추가합니다.

    pacemakerLogin
    <password>
    

    vi 편집기를 종료하려면 먼저 Esc 키를 누른 다음, :wq 명령을 입력하여 파일을 작성하고 종료합니다.

  3. 파일을 루트에서만 읽을 수 있도록 설정합니다.

    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

가용성 그룹에 보조 복제본 조인

  1. 보조 복제본에서 다음 명령을 실행하여 AG에 조인합니다.

    ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [ag1] GRANT CREATE ANY DATABASE;
    GO
    
  2. 주 복제본과 각 보조 복제본에서 다음 Transact-SQL 스크립트를 실행합니다.

    GRANT ALTER, CONTROL, VIEW DEFINITION
        ON AVAILABILITY GROUP::ag1 TO pacemakerLogin;
    GO
    
    GRANT VIEW SERVER STATE TO pacemakerLogin;
    GO
    
  3. 보조 복제본이 조인되면 Always On 고가용성 노드를 펼쳐서 SSMS 개체 탐색기에서 해당 복제본을 볼 수 있습니다.

    Screenshot shows the primary and secondary availability replicas.

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

이 섹션에서는 가용성 그룹에 데이터베이스를 추가하는 방법에 대한 문서를 따릅니다.

이 단계에서는 다음 Transact-SQL 명령이 사용됩니다. 주 복제본에서 다음 명령을 실행합니다.

CREATE DATABASE [db1]; -- creates a database named db1
GO

ALTER DATABASE [db1] SET RECOVERY FULL; -- set the database in full recovery mode
GO

BACKUP DATABASE [db1] -- backs up the database to disk
    TO DISK = N'/var/opt/mssql/data/db1.bak';
GO

ALTER AVAILABILITY GROUP [ag1] ADD DATABASE [db1]; -- adds the database db1 to the AG
GO

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

각 보조 SQL Server 복제본에서 다음 쿼리를 실행하여 db1 데이터베이스가 만들어졌고 SYNCHRONIZED 상태인지 확인합니다.

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;
GO

synchronization_state_desc 목록에서 db1에 대해 SYNCHRONIZED이면 해당 복제본이 동기화된 것입니다. 보조 복제본에서 기본 복제본의 db1이 표시됩니다.

Pacemaker 클러스터에서 가용성 그룹 리소스 만들기

Pacemaker에서 가용성 그룹 리소스를 만들려면 다음 명령을 실행합니다.

sudo crm

configure

primitive ag1_cluster \
ocf:mssql:ag \
params ag_name="ag1" \
meta failure-timeout=60s \
op start timeout=60s \
op stop timeout=60s \
op promote timeout=60s \
op demote timeout=10s \
op monitor timeout=60s interval=10s \
op monitor timeout=60s on-fail=demote interval=11s role="Master" \
op monitor timeout=60s interval=12s role="Slave" \
op notify timeout=60s

ms ms-ag1 ag1_cluster \
meta master-max="1" master-node-max="1" clone-max="3" \
clone-node-max="1" notify="true"

commit

위의 명령은 ag1_cluster 리소스, 즉 가용성 그룹 리소스를 만듭니다. 그런 다음 ms-ag1 리소스(Pacemaker의 주/보조 리소스)를 만든 다음 여기에 AG 리소스를 추가합니다. 이렇게 하면 AG 리소스가 클러스터의 세 노드 모두에서 실행되지만 해당 노드 중 하나만 주 노드입니다.

AG 그룹 리소스를 보고 클러스터의 상태를 확인하려면 다음을 수행합니다.

sudo crm resource status ms-ag1
sudo crm status

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

resource ms-ag1 is running on: ubuntu1 Master
resource ms-ag1 is running on: ubuntu3
resource ms-ag1 is running on: ubuntu2

출력은 다음 예제와 유사합니다. colocation 및 promotion 제약 조건을 추가하려면 자습서: Linux 가상 머신의 가용성 그룹 수신기 구성을 참조 하세요.

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 4 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * Clone Set: ms-ag1 [ag1_cluster] (promotable):
  * Masters: [ ubuntu1 ]
  * Slaves : [ ubuntu2 ubuntu3 ]
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

다음 명령을 실행하여 수신기 및 부하 분산 장치에 적용되는 colocation 및 promotion 제약 조건을 개별적으로 적용할 필요가 없도록 그룹 리소스를 만듭니다.

sudo crm configure group virtualip-group azure-load-balancer virtualip

crm status의 출력은 다음 예와 유사합니다.

Cluster Summary:
  * Stack: corosync
  * Current DC: ubuntu1 (version 2.0.3-4b1f869f0f) - partition with quorum
  * Last updated: Wed Nov 29 07:01:32 2023
  * Last change:  Sun Nov 26 17:00:26 2023 by root via cibadmin on ubuntu1
  * 3 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ ubuntu1 ubuntu2 ubuntu3 ]

Full List of Resources:
  * Clone Set: ms-ag1 [ag1_cluster] (promotable):
    * Masters: [ ubuntu1 ]
    * Slaves : [ ubuntu2 ubuntu3 ]
  * Resource Group:  virtual ip-group:
    * azure-load-balancer  (ocf  :: heartbeat:azure-lb):           Started ubuntu1     
    * virtualip     (ocf :: heartbeat: IPaddr2):                   Started ubuntu1
  * fence-vm     (stonith:fence_azure_arm):                        Started ubuntu1

다음 단계