웹사이트 검색

Ubuntu 14.04에서 하트비트 및 예약된 IP로 고가용성 설정을 만드는 방법


소개

Heartbeat는 고가용성(HA) 서버 인프라의 중요한 구성 요소인 클러스터 인프라 기능(클러스터 멤버십 및 메시징)을 클라이언트 서버에 제공하는 오픈 소스 프로그램입니다. 하트비트는 일반적으로 Pacemaker와 같은 CRM(클러스터 리소스 관리자)과 함께 사용되어 완전한 HA 설정을 달성합니다. 하지만 이 튜토리얼에서는 단순히 Heartbeat와 DigitalOcean Reserved IP를 사용하여 2노드 HA 서버 설정을 생성하는 방법을 시연합니다.

보다 강력한 HA 설정을 생성하려는 경우 Keepalived 사용을 살펴보십시오.

목표

완료되면 HA 설정은 능동/수동 구성의 Ubuntu 14.04 서버 2개로 구성됩니다. 이는 장애가 감지되지 않는 한 사용자가 서비스 또는 웹 사이트에 액세스하는 방법인 예약된 IP를 지정하여 기본 또는 활성 서버를 지정함으로써 수행됩니다. 하트비트 서비스가 기본 서버를 사용할 수 없음을 감지하는 경우 보조 서버는 자동으로 스크립트를 실행하여 DigitalOcean API를 통해 예약된 IP를 자신에게 재할당합니다. 따라서 예약된 IP에 대한 후속 네트워크 트래픽은 기본 서버가 다시 사용 가능해질 때까지 활성 서버 역할을 하는 보조 서버로 전달됩니다(이 시점에서 기본 서버는 예약된 IP를 자신에게 재할당함).

참고: 이 자습서에서는 게이트웨이 수준에서 능동/수동 고가용성 설정에 대해서만 다룹니다. 즉, 여기에는 예약된 IP와 로드 밸런서 서버(기본 및 보조)가 포함됩니다. 또한 데모 목적으로 각 서버에 리버스 프록시 로드 밸런서를 구성하는 대신 각각의 호스트 이름과 공용 IP 주소로 응답하도록 구성하기만 하면 됩니다.

이 목표를 달성하기 위해 다음 단계를 따릅니다.

  • 트래픽을 수신할 2개의 Droplet 만들기
  • 예약된 IP를 생성하고 Droplet 중 하나에 할당
  • 예약된 IP를 가리키는 DNS A 레코드 생성(선택 사항)
  • 물방울에 Heartbeat 설치
  • 예약된 IP 재할당 서비스를 실행하도록 Heartbeat 구성
  • 예약된 IP 재할당 서비스 만들기
  • 테스트 장애 조치

전제 조건

예약된 IP 재할당을 자동화하려면 DigitalOcean API를 사용해야 합니다. 즉, 읽기쓰기 액세스 권한이 있는 DigitalOcean 계정에 인증하는 데 사용할 수 있는 API 토큰인 개인 액세스 토큰(PAT)을 생성해야 합니다. API 자습서의 개인용 액세스 토큰을 생성하는 방법 섹션을 따릅니다. PAT는 클러스터의 두 서버에 추가될 스크립트에서 사용되므로 참조용으로 DigitalOcean 계정에 대한 전체 액세스를 허용하므로 안전한 곳에 보관하십시오.

API 외에도 이 튜토리얼에서는 다음과 같은 DigitalOcean 기능을 활용합니다.

  • 예약된 IP
  • 메타데이터
  • 사용자 데이터(Cloud-Config 스크립트)

이에 대해 자세히 알아보려면 링크된 자습서를 읽으십시오.

물방울 만들기

첫 번째 단계는 동일한 데이터 센터에 위에서 설명한 기본 및 보조 서버 역할을 하는 두 개의 Ubuntu Droplet을 만드는 것입니다. 예제 설정에서는 쉽게 참조할 수 있도록 "primary\ 및 "secondary\로 이름을 지정합니다. 두 Droplet 모두에 Nginx를 설치하고 인덱스 페이지를 고유하게 식별하는 정보로 대체합니다. 이렇게 하면 HA 설정이 작동하는지 간단하게 보여줄 수 있습니다. 실제 설정을 위해 서버는 선택한 웹 서버 또는 로드 밸런서를 실행해야 합니다.

이 bash 스크립트를 사용자 데이터로 사용하여 두 개의 Ubuntu 14.04 Droplet(기본 및 보조)을 만듭니다.

#!/bin/bash

apt-get -y update
apt-get -y install nginx
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html

이렇게 하면 Nginx가 설치되고 index.html의 내용이 드롭릿의 호스트 이름과 IP 주소(메타데이터 서비스를 참조하여)로 대체됩니다. 공용 IP 주소를 통해 Droplet에 액세스하면 Droplet 호스트 이름과 IP 주소가 포함된 기본 웹페이지가 표시되며, 예약된 IP가 특정 순간에 가리키는 Droplet을 테스트하는 데 유용합니다.

예약 IP 생성

DigitalOcean Control Panel의 상단 메뉴에서 네트워킹을 클릭한 다음 측면 메뉴에서 예약된 IP를 클릭합니다.

기본 Droplet에 예약된 IP를 할당한 다음 예약된 IP 할당 버튼을 클릭합니다.

Reserved IP가 할당된 후 웹 브라우저에서 Droplet을 방문하여 할당된 Droplet에 도달할 수 있는지 확인합니다.

http://your_reserved_ip

기본 Droplet의 인덱스 페이지가 표시되어야 합니다.

DNS 구성(선택 사항)

도메인 이름을 통해 HA 설정에 액세스할 수 있으려면 도메인을 예약된 IP 주소로 가리키는 DNS에 A 레코드를 만드십시오. 도메인에서 DigitalOcean의 이름 서버를 사용하는 경우 DigitalOcean으로 호스트 이름을 설정하는 방법 자습서의 3단계를 따르십시오. 전파되면 도메인 이름을 통해 활성 서버에 액세스할 수 있습니다.

우리가 사용할 예제 도메인 이름은 example.com입니다. 현재 도메인 이름이 없는 경우 예약된 IP 주소를 대신 사용해야 합니다.

하트비트 설치

다음 단계는 두 서버 모두에 하트비트를 설치하는 것입니다. Heartbeat를 설치하는 가장 간단한 방법은 apt-get을 사용하는 것입니다.

sudo apt-get update
sudo apt-get install heartbeat

하트비트가 이제 설치되었지만 어떤 작업을 수행하기 전에 구성해야 합니다.

하트비트 구성

원하는 클러스터를 시작하고 실행하려면 두 서버에서 동일하게 /etc/ha.d에 이러한 Heartbeat 구성 파일을 설정해야 합니다.

  1. ha.cf: 구성원 노드를 포함한 Heartbeat 클러스터의 글로벌 구성
  2. authkeys: 클러스터에 인증하는 방법을 노드에 제공하는 보안 키 포함
  3. haresources: 서비스의 기본 소유자인 클러스터 및 노드에서 관리하는 서비스를 지정합니다. 이 파일은 Pacemaker와 같은 CRM을 사용하는 설정에서는 사용되지 않습니다.

또한 기본 Droplet의 가용성이 변경되는 경우 예약된 IP 재할당을 수행할 스크립트를 제공해야 합니다.

노드 정보 수집

ha.cf를 구성하기 전에 각 노드의 이름을 조회해야 합니다. 하트비트에서는 각 노드 이름이 각각의 uname -n 출력과 일치해야 합니다.

두 서버 모두에서 다음 명령을 실행하여 적절한 노드 이름을 찾습니다.

  1. uname -n

명령의 출력에 유의하십시오. 예제 노드 이름은 "primary\ 및 "secondary\이며, 이는 Droplet의 이름과 일치합니다.

또한 사용 가능한 노드를 확인하기 위해 각 노드가 나머지 클러스터와 통신하는 데 사용할 네트워크 인터페이스 및 IP 주소를 조회해야 합니다. 각 노드가 클러스터의 다른 노드에 도달할 수 있는 한 모든 네트워크 인터페이스를 사용할 수 있습니다. eth0인 Droplet의 공용 인터페이스를 사용합니다.

두 서버 모두에서 이 명령을 사용하여 eth0 인터페이스의 IP 주소를 조회합니다(또는 DigitalOcean Control Panel에서 조회).

  1. ip addr show eth0
ip addr show eth0 output:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ff inet 104.236.6.11/18 brd 104.236.63.255 scope global eth0 valid_lft forever preferred_lft forever inet 10.17.0.28/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::601:76ff:fea5:4501/64 scope link valid_lft forever preferred_lft forever

네트워크 인터페이스의 IP 주소를 기록해 둡니다(예제에서 강조 표시됨). 두 서버의 IP 주소를 가져와야 합니다.

ha.cf 파일 생성

두 서버 모두에서 선호하는 편집기에서 /etc/ha.d/ha.cf를 엽니다. 우리는 vi를 사용할 것입니다:

  1. sudo vi /etc/ha.d/ha.cf

파일은 새 파일이어야 하며 비어 있어야 합니다. 클러스터에 있는 각 노드의 네트워크 인터페이스와 이름을 추가해야 합니다.

이 구성을 복사하여 파일에 붙여넣은 다음 각 노드 이름과 IP 주소를 앞에서 조회한 값으로 바꿉니다. 이 예에서 기본 IP 주소는 104.236.6.11이고 보조 IP 주소는 104.236.6.22입니다.

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

저장 및 종료. 다음으로 클러스터의 인증 키를 설정합니다.

authkeys 파일 생성

권한 부여 키는 클러스터 구성원이 클러스터에 가입할 수 있도록 하는 데 사용됩니다. 이 목적을 위해 간단히 임의의 키를 생성할 수 있습니다.

기본 노드에서 다음 명령을 실행하여 AUTH_KEY라는 환경 변수에 적합한 권한 부여 키를 생성합니다.

if [ -z "${AUTH_KEY}" ]; then
  export AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \
      | command openssl sha1 \
      | command cut --delimiter=' ' --fields=2)"
fi

그런 다음 다음 명령을 사용하여 /etc/ha.d/authkeys 파일을 작성합니다.

sudo bash -c "{
  echo auth1
  echo 1 sha1 $AUTH_KEY
} > /etc/ha.d/authkeys"

다음과 같이 authkeys 파일의 내용을 확인하십시오.

  1. sudo cat /etc/ha.d/authkeys

다음과 같아야 합니다(다른 인증 키 사용).

/etc/ha.d/authkeys example:
auth1 1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

루트에서만 파일을 읽을 수 있는지 확인하십시오.

  1. sudo chmod 600 /etc/ha.d/authkeys

이제 기본 노드에서 보조 노드로 /etc/ha.d/authkeys 파일을 복사합니다. 수동으로 또는 scp를 사용하여 이 작업을 수행할 수 있습니다.

보조 서버에서 authkeys 파일의 권한을 설정해야 합니다.

  1. sudo chmod 600 /etc/ha.d/authkeys

두 서버에는 동일한 /etc/ha.d/authkeys 파일이 있어야 합니다.

haresources 파일 생성

haresources 파일은 클러스터가 관리하는 서비스와 쌍을 이루는 기본 호스트를 지정합니다. 기본 호스트는 노드를 사용할 수 있는 경우 관련 서비스를 실행 해야 하는 노드입니다. 기본 호스트를 사용할 수 없는 경우(즉, 클러스터에서 연결할 수 없는 경우) 다른 노드 중 하나가 대신합니다. 즉, 기본 서버가 다운되면 보조 서버가 대신합니다.

두 서버 모두에서 선호하는 편집기에서 haresources 파일을 엽니다. 우리는 vi를 사용할 것입니다:

  1. sudo vi /etc/ha.d/haresources

이제 이 줄을 파일에 추가하고 기본 노드의 이름을 대체합니다.

  1. primary floatip

저장 및 종료. 이렇게 하면 기본 서버가 현재 정의되지 않은 floatip 서비스의 기본 호스트로 구성됩니다. 다음으로 floatip 서비스를 설정해 보겠습니다.

예약된 IP 재할당 서비스 만들기

하트비트 클러스터는 floatip 서비스를 유지하도록 구성되어 있습니다. 노드는 예약된 IP를 자신에게 할당하는 데 사용할 수 있지만 여전히 서비스를 생성해야 합니다. 그러나 서비스 자체를 설정하기 전에 DigitalOcean API를 통해 이를 실행하는 노드에 예약된 IP를 할당하는 스크립트를 생성해 보겠습니다. 그런 다음 예약된 IP 재할당 스크립트를 실행할 floatip 서비스를 생성합니다.

assign-ip 스크립트 생성

이 예에서는 DigitalOcean API를 사용하여 예약된 IP를 지정된 Droplet ID에 할당하는 기본 Python 스크립트를 다운로드합니다.

두 서버 모두에서 assign-ip Python 스크립트를 다운로드합니다.

  1. sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip

두 서버 모두에서 실행 가능하게 만드십시오.

  1. sudo chmod +x /usr/local/bin/assign-ip

assign-ip 스크립트를 사용하려면 다음 세부 정보가 필요합니다.

  • 예약 IP: 스크립트에 대한 첫 번째 인수, 할당되는 예약 IP
  • Droplet ID: 스크립트에 대한 두 번째 인수, 예약된 IP가 할당되어야 하는 Droplet ID
  • DigitalOcean PAT(API 토큰): 읽기/쓰기 DigitalOcean PAT인 DO_TOKEN 환경 변수로 전달됩니다.

계속하기 전에 스크립트의 내용을 자유롭게 검토하십시오.

이제 floatip 서비스를 만들 준비가 되었습니다.

floatip 서비스 만들기

floatip 서비스를 생성하려면 이전에 생성한 assign-ip 스크립트를 호출하고 start 에 응답하는 초기화 스크립트를 생성하기만 하면 됩니다. 및 stop 하위 명령. 이 초기화 스크립트는 Droplet Metadata 서비스를 통해 서버의 Droplet ID를 찾는 역할을 합니다. 또한 재할당될 예약 IP와 DigitalOcean API 토큰(전제 조건 섹션에서 언급한 개인 액세스 토큰)이 필요합니다.

두 서버 모두에서 편집기에서 열린 /etc/init.d/floatip를 추가합니다.

  1. sudo vi /etc/init.d/floatip

그런 다음 이 초기화 스크립트를 복사하여 붙여넣고 강조 표시된 부분을 DigitalOcean API 키와 재할당해야 하는 예약 IP로 바꿉니다.

  1. #!/bin/bash
  2. param=$1
  3. export DO_TOKEN='b7d03a6947b217efb6f3ec3bd3504582'
  4. IP='45.55.96.8'
  5. ID=$(curl -s http://169.254.169.254/metadata/v1/id)
  6. if [ "start" == "$param" ] ; then
  7. python /usr/local/bin/assign-ip $IP $ID
  8. exit 0
  9. elif [ "stop" == "$param" ] ; then
  10. exit 0;
  11. elif [ "status" == "$param" ] ; then
  12. exit 0;
  13. else
  14. echo "no such command $param"
  15. exit 1;
  16. fi

저장 및 종료.

스크립트를 실행 가능하게 만듭니다.

  1. sudo chmod u+x /etc/init.d/floatip

floatip 서비스가 시작되면 단순히 assign-ip Python 스크립트를 호출하고 지정된 예약 IP를 스크립트를 실행한 Droplet에 할당합니다. 이는 주 서버가 실패할 경우 예약된 IP를 자신에게 재할당하기 위해 보조 서버에서 호출하는 스크립트입니다. 마찬가지로 클러스터에 다시 합류하면 예약된 IP를 회수하기 위해 기본 서버에서 동일한 스크립트를 사용합니다.

하트비트 시작

이제 하트비트가 구성되고 의존하는 모든 스크립트가 설정되었으므로 하트비트 클러스터를 시작할 준비가 되었습니다!

두 서버 모두에서 다음 명령을 실행하여 Heartbeat를 시작합니다.

  1. sudo service heartbeat start

다음과 같은 출력이 표시되어야 합니다.

Heartbeat output:
Starting High-Availability services: Done.

이제 HA 설정이 완료되었습니다! 계속 진행하기 전에 의도한 대로 작동하는지 테스트해 보겠습니다.

고가용성 테스트

고가용성 설정이 작동하는지 테스트하는 것이 중요하므로 지금 테스트해 보겠습니다.

현재 Reserved IP는 기본 노드에 할당되어 있습니다. IP 주소 또는 이를 가리키는 도메인 이름을 통해 지금 예약된 IP에 액세스하면 기본 서버의 인덱스 페이지만 표시됩니다. 예제 사용자 데이터 스크립트를 사용한 경우 다음과 같이 표시됩니다.

Reserved IP is pointing to primary server
Droplet: primary, IP Address: 104.236.6.11

이는 실제로 예약된 IP가 기본 Droplet에 할당되었음을 나타냅니다.

이제 터미널을 열고 curl을 사용하여 1초 루프에서 Reserved IP에 액세스해 보겠습니다. 이렇게 하려면 이 명령을 사용하되 URL을 도메인 또는 예약된 IP 주소로 바꿔야 합니다.

  1. while true; do curl http://example.com; sleep 1; done

현재 이것은 기본 서버의 동일한 Droplet 이름과 IP 주소를 출력합니다. 기본 서버의 전원을 끄거나 하트비트 서비스를 중지하여 기본 서버에 장애가 발생하면 예약된 IP가 보조 서버에 다시 할당되는지 확인합니다.

이제 기본 서버의 전원을 끄겠습니다. DigitalOcean Control Panel을 통하거나 주 서버에서 다음 명령을 실행하여 그렇게 하십시오.

  1. sudo poweroff

잠시 후 기본 서버를 사용할 수 없게 됩니다. 터미널에서 실행 중인 curl 루프의 출력에 주의하십시오. 다음과 같은 출력이 표시됩니다.

curl loop output:
Droplet: primary, IP Address: 104.236.6.11 ... curl: (7) Failed to connect to example.com port 80: Connection refused Droplet: secondary, IP Address: 104.236.6.22 Droplet: secondary, IP Address: 104.236.6.22 ...

즉, 예약된 IP 주소는 보조 서버의 IP 주소를 가리키도록 재할당되어야 합니다. 이는 성공적인 자동 장애 조치가 발생했기 때문에 HA 설정이 작동 중임을 의미합니다.

기본 서버 오류와 예약된 IP 재할당 완료 사이에 예약된 IP에 액세스를 시도하는 경우 발생할 수 있는 연결 거부됨 오류가 표시되거나 표시되지 않을 수 있습니다.

이제 DigitalOcean 제어판을 통해 기본 Droplet의 전원을 켤 수 있습니다. Heartbeat는 예약된 IP 재할당 스크립트를 실행하기 위한 기본 호스트로 기본 Droplet으로 구성되기 때문에 예약된 IP는 다시 사용할 수 있게 되자마자 자동으로 기본 서버를 다시 가리킵니다.

결론

축하해요! 이제 Heartbeat와 DigitalOcean Reserved IP를 사용하는 기본 HA 서버 설정이 있습니다.

보다 강력한 HA 설정을 생성하려는 경우 Keepalived 사용을 살펴보십시오.

하트비트 설정을 확장하려는 경우 다음 단계는 예제 Nginx 설정을 리버스 프록시 로드 밸런서로 교체하는 것입니다. 이 목적으로 Nginx 또는 HAProxy를 사용할 수 있습니다. 로드 밸런서를 앵커 IP 주소에 바인딩하여 사용자가 예약된 IP 주소를 통해서만 서버에 액세스할 수 있도록 해야 합니다(각 서버의 공용 IP 주소를 통해서가 아님).