본문 바로가기

리눅스

[draft] 우분투에서 Pacemaker와 Corosync를 사용해 고가용성 클러스터를 구성하는 방법

728x90

우분투에서 Pacemaker와 Corosync를 사용하여 3대의 서버로 구성된 고가용성(HA) 클러스터를 설정하는 방법

Pacemaker와 Corosync을 사용하여 HA (고가용성) 클러스터를 구성하는 것은 복잡한 프로세스일 수 있습니다. Pacemaker를 사용하여 VIP(가상 IP)와 노드 간 HA 클러스터를 설정하는 간략한 개요를 제공합니다.

테스트 환경

호스트 이름 서버 아이피 주소 도메인 이름 운영체제 버전 비고
VIP 192.168.0.120 vip.cluster.local    
server1 192.168.0.121 server1.cluster.local Ubuntu 22.04.3 LTS  
server2 192.168.0.122 server2.cluster.local Ubuntu 22.04.3 LTS  
server3 192.168.0.123 server3.cluster.local Ubuntu 22.04.3 LTS  

시간 동기화

호스트 파일 설정

cat <<EOF | sudo tee -a /etc/hosts

# HA Cluster
192.168.0.120 vip.cluster.local vip
192.168.0.121 server1.cluster.local server1
192.168.0.122 server2.cluster.local server2
192.168.0.123 server3.cluster.local server3
EOF

1. Pacemaker와 Corosync 설치

모든 서버에서 다음 명령어를 실행하여 Pacemaker와 Corosync를 설치합니다.

sudo apt update
sudo apt install -y pacemaker corosync
pacemakerd --version
corosync -v

2. Coresync 설정

hacluster 계정의 비밀번호 생성

더보기

---

계정 : hacluster, 비밀번호 : hacluster

echo -e 'hacluster:hacluster' | chpasswd

---

authkey 파일 생성

  • Corosync가 클러스터 노드 간의 통신을 인증하는 데 사용됩니다.
sudo corosync-keygen
$ sudo corosync-keygen
Corosync Cluster Engine Authentication key generator.
Gathering 2048 bits for key from /dev/urandom.
Writing corosync key to /etc/corosync/authkey.
sudo chown root:root /etc/corosync/authkey
sudo chmod 400 /etc/corosync/authkey
$ ls -l /etc/corosync/authkey
-r-------- 1 root root 256 Oct 29 11:21 /etc/corosync/authkey

인증 키 복사

  • 클러스터의 모든 노드에 authkey 파일을 복사해야 합니다.
scp /etc/corosync/authkey root@192.168.0.122:/etc/corosync/authkey
scp /etc/corosync/authkey root@192.168.0.123:/etc/corosync/authkey

Corosync 설정 파일 수정

  • Corosync의 설정 파일을 수정하여 클러스터 노드를 정의합니다.
sudo vim /etc/corosync/corosync.conf
더보기

---

cat /etc/corosync/corosync.conf
# Please read the corosync.conf.5 manual page
system {
        # This is required to use transport=knet in an unprivileged
        # environment, such as a container. See man page for details.
        allow_knet_handle_fallback: yes
}

totem {
        version: 2

        # Corosync itself works without a cluster name, but DLM needs one.
        # The cluster name is also written into the VG metadata of newly
        # created shared LVM volume groups, if lvmlockd uses DLM locking.
        cluster_name: debian

        # crypto_cipher and crypto_hash: Used for mutual node authentication.
        # If you choose to enable this, then do remember to create a shared
        # secret with "corosync-keygen".
        # enabling crypto_cipher, requires also enabling of crypto_hash.
        # crypto works only with knet transport
        crypto_cipher: none
        crypto_hash: none
}

logging {
        # Log the source file and line where messages are being
        # generated. When in doubt, leave off. Potentially useful for
        # debugging.
        fileline: off
        # Log to standard error. When in doubt, set to yes. Useful when
        # running in the foreground (when invoking "corosync -f")
        to_stderr: yes
        # Log to a log file. When set to "no", the "logfile" option
        # must not be set.
        to_logfile: yes
        logfile: /var/log/corosync/corosync.log
        # Log to the system log daemon. When in doubt, set to yes.
        to_syslog: yes
        # Log debug messages (very verbose). When in doubt, leave off.
        debug: off
        # Log messages with time stamps. When in doubt, set to hires (or on)
        #timestamp: hires
        logger_subsys {
                subsys: QUORUM
                debug: off
        }
}

quorum {
        # Enable and configure quorum subsystem (default: off)
        # see also corosync.conf.5 and votequorum.5
        provider: corosync_votequorum
}

nodelist {
        # Change/uncomment/add node sections to match cluster configuration

        node {
                # Hostname of the node.
                # name: node1
                # Cluster membership node identifier
                nodeid: 1
                # Address of first link
                ring0_addr: 127.0.0.1
                # When knet transport is used it's possible to define up to 8 links
                #ring1_addr: 192.168.1.1
        }
        # ...
}

---

cat <<EOF | sudo tee /etc/corosync/corosync.conf
totem {
    version: 2
    secauth: on
    cluster_name: mycluster
    transport: knet
    interface {
        ringnumber: 0
        bindnetaddr: 192.168.0.0
        mcastport: 5405
    }
}

nodelist {
    node {
        ring0_addr: 192.168.0.121
        nodeid: 1
    }
    node {
        ring0_addr: 192.168.0.122
        nodeid: 2
    }
    node {
        ring0_addr: 192.168.0.123
        nodeid: 3
    }
}

quorum {
    provider: corosync_votequorum
}

logging {
    to_logfile: yes
    logfile: /var/log/corosync/corosync.log
    to_syslog: yes
}
EOF

VIP 리소스 삭제

더보기

---

리소스 중지

sudo crm resource stop vip

리소스 상태 확인

sudo crm status
$ sudo crm status
Cluster Summary:
  * Stack: corosync
  * Current DC: server2 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Oct 29 12:36:23 2024
  * Last change:  Tue Oct 29 12:36:19 2024 by root via cibadmin on server1
  * 3 nodes configured
  * 1 resource instance configured (1 DISABLED)

Node List:
  * Online: [ server1 server2 server3 ]

Full List of Resources:
  * vip (ocf:heartbeat:IPaddr2):         Stopped (disabled)

리소스 삭제

sudo crm configure delete vip

---

Corosync 및 Pacemaker 서비스 시작

  • Corosync와 Pacemaker 서비스를 활성화하고 시작합니다.
sudo systemctl --now enable corosync
sudo systemctl --now enable pacemaker

Corosync와 Pacemaker 서비스 재시작

sudo systemctl restart corosync
sudo systemctl restart pacemaker

Corosync와 Pacemaker 서비스 상태 확인

sudo systemctl status corosync
sudo systemctl status pacemaker

클러스터 상태 확인

sudo crm status
$ sudo crm status
Cluster Summary:
  * Stack: corosync
  * Current DC: server2 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Oct 29 13:08:07 2024
  * Last change:  Tue Oct 29 13:08:06 2024 by root via cibadmin on server1
  * 3 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ server1 server2 server3 ]

Full List of Resources:
  * No resources

Virtual IP (VIP) 리소스 추가

클러스터에 VIP 리소스를 추가하여 장애 발생 시 VIP가 다른 서버로 이동할 수 있도록 합니다.

sudo crm configure primitive vip IPaddr2 \
    params ip=192.168.0.120 cidr_netmask=24 \
    op monitor interval=30s
WARNING: (unpack_config)        warning: Blind faith: not fencing unseen nodes

클러스터 상태 확인

  • 클러스터 상태를 확인하여 리소스가 정상 작동하는지 확인합니다.
sudo crm status
Cluster Summary:
  * Stack: corosync
  * Current DC: server2 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Oct 29 14:13:15 2024
  * Last change:  Tue Oct 29 14:12:43 2024 by root via cibadmin on server1
  * 3 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ server1 server2 server3 ]

Full List of Resources:
  * vip (ocf:heartbeat:IPaddr2):         Started server1

VIP 리소스 세부 정보 확인

sudo crm configure show
node 1: server1
node 2: server2
node 3: server3
primitive vip IPaddr2 \
        params ip=192.168.0.120 cidr_netmask=24 \
        op monitor interval=30s
property cib-bootstrap-options: \
        have-watchdog=false \
        dc-version=2.1.2-ada5c3b36e2 \
        cluster-infrastructure=corosync \
        cluster-name=debian \
        stonith-enabled=false

페일오버 테스트

클러스터는 해당 노드가 비정상적으로 종료되었다고 판단하고 다른 노드로 VIP를 이동(페일오버)하게 됩니다.

 

현재 리소스 상태 확인

sudo crm status
Cluster Summary:
  * Stack: corosync
  * Current DC: server2 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Oct 29 14:49:52 2024
  * Last change:  Tue Oct 29 14:12:43 2024 by root via cibadmin on server1
  * 3 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ server1 server2 server3 ]

Full List of Resources:
  * vip (ocf:heartbeat:IPaddr2):         Started server1

서비스 중지로 페일오버 유도

sudo systemctl stop corosync pacemaker

현재 리소스 상태 확인

sudo crm status
Cluster Summary:
  * Stack: corosync
  * Current DC: server2 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Oct 29 14:50:42 2024
  * Last change:  Tue Oct 29 14:12:43 2024 by root via cibadmin on server1
  * 3 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ server2 server3 ]
  * OFFLINE: [ server1 ]

Full List of Resources:
  * vip (ocf:heartbeat:IPaddr2):         Started server2

서비스 재시작

sudo systemctl restart corosync pacemaker

수동 절체

특정 리소스를 다른 노드로 이동시킵니다. 이 경우 페일오버 상황을 강제로 유도하지 않고 리소스를 원하는 노드로 이동할 수 있습니다.

 

현재 리소스 상태 확인

sudo crm status
Cluster Summary:
  * Stack: corosync
  * Current DC: server2 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Oct 29 14:51:13 2024
  * Last change:  Tue Oct 29 14:12:43 2024 by root via cibadmin on server1
  * 3 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ server1 server2 server3 ]

Full List of Resources:
  * vip (ocf:heartbeat:IPaddr2):         Started server2

crm 명령으로 리소스 이동

sudo crm resource move vip server1
INFO: Move constraint created for vip to server1

리소스 상태 확인

sudo crm status
Cluster Summary:
  * Stack: corosync
  * Current DC: server2 (version 2.1.2-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Oct 29 14:52:35 2024
  * Last change:  Tue Oct 29 14:52:14 2024 by root via crm_resource on server1
  * 3 nodes configured
  * 1 resource instance configured

Node List:
  * Online: [ server1 server2 server3 ]

Full List of Resources:
  * vip (ocf:heartbeat:IPaddr2):         Started server1

 

참고URL

- Pacemaker 1.1(Configuration Explained) : Pacemaker-1.1-Pacemaker_Explained-en-US.pdf

 

728x90