본문 바로가기
기초 튼튼탄탄탄/서버, OS(리눅스)

PCS로 HA 클러스터 구성하기 (WAS-wildfly)

by 잇서니 2021. 1. 4.
반응형

개요

상황

  • 포탈사이트에 업로드되는 파일들을 저장할 스토리지가 필요함
  • 사용 가능한 스토리지가 1개만 있는 상황임
  • WAS 2대가 스토리지를 공유하여 사용하도록 해야함

해결방안

  • PCS로 WAS 2대를 클러스터링 하여 공유스토리지 환경을 구축한다!

 

목차

  1. 포탈 Architecture 설명
  2. LVM (Logical Volume Manager)
  3. 클러스터링 사전작업
  4. 클러스터 구성
  5. 테스트
  6. 참고자료

 

1. 포탈 Architecture 설명

  • 구성요소
    • 웹서버 2ea / WAS 2ea / DB서버 2ea / WAS용 공유스토리지 1ea / DB용 공유스토리지 1ea
  • 웹서버
    • apache 2.4
    • vip를 통해 로드밸런싱 됨
    • WAS와 연동하는 모듈(mod_jk) 사용 => WAS01(active), WAS02(standby)로 설정함
  • WAS
    • wildfly 9.0.2
  • DB서버
    • MariaDB 10.1
    • Steel-eye 솔루션 사용 => DB이중화 구성됨

 

2. LVM(Logical Volume Manager)

1) 개념

  • LVM은 물리적인 디스크를 논리적인 볼륨으로 할당하여 관리할 수 있도록 해준다.
  • 파일시스템이 블록 장치에 직접 접근해서 읽기/쓰기를 하지 않고, LVM이 만든 가상의 블록 장치에 읽기/쓰기를 한다.
  • 물리적 스토리지를 직접적으로 사용하는 것보다 유연성이 높다.

  • PV(Physical Volume) / PE(Physical Extent)
    PV : 블록장치 전체 또는 블록장치를 이루고 있는 파티션들을 LVM에서 사용할 수 있게 변환한 형태
    PE : PV를 구성하는 일정크기의 블록, LE와 1:1 매핑됨
  • VG (Volume Group)
    PV들의 집합으로 LV를 할당할 수 있는 공간
    VG안에서 원하는대로 LV를 만들 수 있다.
  • LV(Logical Volume) / LE(Logical Extent)
    LV : 사용자가 최종적으로 다루게 되는 논리적 스토리지
    LE : LV를 구성하는 일정크기의 블록, PE와 1:1 매핑됨

 

2) LVM 생성/조회

//물리 디바이스를 확인

# fdisk -l //공유스토리지로 사용할 디바이스는 /dev/sdb

//PV 생성

# pvcreate /dev/sdb

//VG 생성 (vg_data는 VG 이름임. 마음대로 설정하면 됨)

# vgcreate vg_data /dev/sdb

//LV 생성 (-L옵션은 할당할 용량설정 / -n옵션은 LV이름설정 / vg_data는 LV를 만들 VG이름)

# lvcreate -L 100G -n lv_data vg_data

// PV, VG, LV 정보 확인

# pvscan

# pvdisplay -v

# vgscan

# vgdisplay -v

# lvscan

# lvdisplay -v

 

 

3) CLVM vs HA-LVM

  • 클러스터 구성에 따라 사용하는 LVM 볼륨 종류가 다르다.
  • MBrain WAS의 경우, 2대의 서버가 LVM에 모두 엑세스하는 것보다 HA구성인 것이 더 중요하므로 HA-LVM을 구성하기로 함
  • Required SW는 전체리스트 중에서 한 개의 리스트만 만족하면 됨
  • CLI로 간편하게 클러스터링 구성 및 설정을 할 수 있는 PCS를 사용하기로 결정함

 

 

3. 클러스터링 사전작업

클러스터링에 필요한 패키지를 파악하고, 설치한다.

  • 크게 4가지가 필요하다.
    pcs : 클러스터 설정을 간편하게 하기 위해 쓰는 툴
    corosync : 클러스터의 노드 간에 heartbeat가 오고 가도록 하며, 고가용성을 지원함
    pacemaker : 클러스터 리소스 관리
    cman : 클러스터 매니져
  • 패키지 의존성 및 버전을 고려해야 한다.

    //MBrain WAS는 glib2-2.24 버전이 설치되어 있었음. 이로 인해 pacemaker(1.1.18)가 구동되지 않았음.

    //glib2를 업데이트 하여 해결함

    # yum install glib2

  • 패키지 설치
    pcs를 설치하면 cman, corosync, cluster 관련 패키지가 같이 설치됨
    pacemaker를 설치하면, 클러스터 관리 계정(hacluster)이 생성됨

    //pcs, pacemaker만 설치하면 관련 패키지들도 알아서 설치됨

    # yum install -y pcs pacemaker

     

    // pcs데몬이 자동실행 되도록 설정함

    # service pcsd start

    # chkconfig pcsd on

  • 패키지 삭제
    의존성을 고려해서 패키지를 삭제해야 완전한 리셋이 가능함

    # yum remove pcs

    # yum corosync // pacemaker-cluster 패키지가 같이 삭제됨 / 그 외에 cluster  관련 패키지들도 같이 삭제됨)

    # yum remove pacemaker

    # yum remove pacemaker-libs

    자동생성된 디렉토리나 라이브러리도 함께 삭제해준다.

    # rm -rf /var/lib/pcsd

    # rm -rf /var/lib/pacemaker

    # rm -rf /var/lib/cluster

    # rm -rf /var/lib/corosync

    # rm -rf /usr/lib/pcsd

    //pacemaker 설치시 생성되는 계정도 삭제해준다

    # userdel -r hacluster

 

 

4. 클러스터 구성

pcs를 사용하여 WAS01, WAS02 서버로 구성된 클러스터를 만든다. 두 대가 공유스토리지를 사용할 수 있도록 각종 설정을 한다.

1) 클러스터 인증

  • 인증에 필요한 사전작업을 한다.
    • hacluster 계정 비밀번호 설정 (passwd hacluster)
    • /etc/hosts 파일에 클러스터를 구성할 노드 정보 입력 (ip, hostname)
  • hacluster 계정으로 클러스터 인증 수행

    //was01, was02는 /etc/hosts 에 기입한 노드의 호스트네임이다.

    # pcs cluster auth was01 was02 –u hacluster –p md******

  • pcs에서 계정 인증은 os 계정인증 절차를 따른다.
    /etc/pam.d/pcsd 를 보면, pcs가 pam을 사용한다는 것을 확인할 수 있다.

    #%PAM-1.0
    auth include password-auth
    account include password-auth
    password include password-auth
    session include password-auth

  • 클러스터 인증을 하면 /var/lib/pcsd/pcs_users.conf, /var/lib/pcsd/tokens가 생성된다.
    /var/lib/pcsd/pcs_users.conf : username, token 정보가 포함된 파일
    /var/lib/pcsd/tokens : 계정인증에 필요한 token 정보가 포함된 파일
  • 클러스터 인증 리셋은 아래 명령어로 수행한다. /var/lib/pcsd/pcs_users.conf, /var/lib/pcsd/tokens 파일이 삭제된다.

    # pcs pcsd clear-auth

 

 

2) 클러스터 생성

//name 태그 뒤에는 원하는 클러스터 이름을 기입

# pcs cluster setup --name mbrain_was was01 was02 --transport udpu

 

  • 클러스터 통신방식 (multicast 또는 unicast)

  • pcs (RHEL 6)은 멀티캐스트 통신이 디폴트 설정이다.
    MBrain 포탈vm서버는 (centOS 6.3) 멀티캐스트가 안 되는 상황이어서 '--transport udpu'를 명시하여 통신방식을 unicast로 설정했다.
  • pcs로 클러스터를 생성하면, /etc/cluster/cluster.conf 파일이 만들어진다.
    클러스터 이름, 노드, 통신방식, 리소스 설정 등이 xml 형식으로 기입된다.
  • 클러스터 생성한 것을 리셋하고 싶으면 아래 명령어로 수행함. /etc/cluster/cluster.conf 파일이 삭제됨

    //all 옵션을 주면 모든 노드에서 클러스터를 리셋함. all 옵션이 없으면 해당 명령어를 수행한 노드에서만 클러스터 리셋됨

    # pcs cluster destroy --all

 

3) 클러스터 구동 및 정지

// 구동

# pcs cluster start --all

 

// 정지

# pcs cluster stop --all

  • pacemaker-> cman->corosync 순서로 구동 및 정지
    cman과 corosync는 선후행 관계임 / pacemaker를 구동 및 정지하면 cman, corosync도 알아서 구동 및 정지가 됨

 

4) 클러스터 설정 (property, resource, constraint)

[property]

set specific pacemaker(cluster resource manager) properties.

// failed node를 고립시켜 클러스터에 방해를 일으키지 않게 함 (노드를 reset 하거나 shutdown 해버림)

// false는 그렇게 하지 않겠다는 의미임 (failed node를 고립시키지 않겠다)

# pcs property set stonith-enabled=false

 

// 서버가 2대이므로 쿼럼 정책은 ignore.

# pcs property set no-quorum-policy=ignore

 

// property 조회

# pcs property

 

 

[resource]

DB, 웹서버, WAS, vip 등등 원하는 서비스들을 클러스터의 리소스로 만들 수 있다. 클러스터의 핵심이라고 할 수 있다.
MBrain 포탈은 공유스토리지를 위한 WAS 클러스터링이 목적이므로 3가지 리소스를 만든다.

1) wildfly

  • 기본적인 pcs resource-agent에는 wildfly 또는 jboss 리소스가 없다. 따로 다운을 받아 pcs resource 경로에 옮겨놓아야 한다.
    • 직접 다운로드
      jboss 다운받고
      - /usr/lib/ocf/resource.d/heartbeat 경로에 옮겨 놓기
      - 실행권한 부여하기 (chmod 755)
    • 또는 git 저장소에서 다운로드
      - git clone git://github.com/ClusterLabs/resource-agents
      - resource-agents/heartbeat 경로에서 jboss 파일을
      - /usr/lib/ocf/resource.d/heartbeat 경로에 옮겨 놓기
      - 실행권한 부여하기 (chmod 755)
  • 리소스 생성

    # pcs resource create mbrain_was ocf:heartbeat:jboss jboss_home=/jboss/wildfly-9.0.2.Final statusurl=http://127.0.0.1:29990 java_home=/jboss/jdk1.8.0_171 pstring=wild run_command=/jboss/standalone/run.sh user=wildfly

    리소스 속성설명
    jboss_home wildfly 홈디렉토리
    statusurl was 작업상태를 모니터링 할 수 있는 url
    java_home java 홈디렉토리
    pstring was 프로세스명과 매칭되는 단어
    run_command was를 구동시키는 명령어
    user was를 구동시키는 계정
  • statusurl 값을 셋팅하기 위해 확인 및 설정해야 할 사항은 다음과 같다./jboss/standalone/was01/configuration/standalone-ha.xml

    .

    .

        <interfaces>

     

            // management 인터페이스 주소 설정 (0.0.0.0 으로 설정하여, 모든 IP에서 접근 가능하도록 함)

            <interface name="management">

                <inet-address value="${jboss.bind.address.management:0.0.0.0}"/>

            </interface>

            <interface name="public">

                <inet-address value="${jboss.bind.address:10.220.170.77}"/>

            </interface>

            <interface name="unsecure">

                <inet-address value="${jboss.bind.address.unsecure:10.220.170.77}"/>

            </interface>

        </interfaces>

    .

    .

        <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">

     

            // management 포트설정

            <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:29990}"/>

     

     

            <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:29993}"/>

            <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>

            <socket-binding name="http" port="${jboss.http.port:28080}"/>

            <socket-binding name="https" port="${jboss.https.port:28443}"/>

            <socket-binding name="jgroups-mping" port="0" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45700"/>

            <socket-binding name="jgroups-tcp" port="7600"/>

            <socket-binding name="jgroups-tcp-fd" port="57600"/>

            <socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.default.multicast.address:230.0.0.4}" multicast-port="45688"/>

            <socket-binding name="jgroups-udp-fd" port="54200"/>

            <socket-binding name="modcluster" port="0" multicast-address="224.0.1.105" multicast-port="23364"/>

            <socket-binding name="txn-recovery-environment" port="4712"/>

            <socket-binding name="txn-status-manager" port="4713"/>

            <outbound-socket-binding name="mail-smtp">

                <remote-destination host="localhost" port="25"/>

            </outbound-socket-binding>

        </socket-binding-group>

    .

    .

2) lvm

# pcs resource create mbrain_lvm ocf:heartbeat:LVM volgrpname=vg_data

  • volgrpname 에는 vg 이름을 기입한다.
  • lvm을 pcs로만 관리하고 싶으면, /etc/lvm/lvm.conf 에서 volume_list 를 주석처리한다.

3) filesystem

# pcs resource create mbrain_fs ocf:heartbeat:Filesystem device=/dev/vg_data/lv_data directory=/data fstype=ext4

  • device : 'lvscan' 명령어결과로 나온 디바이스명
  • directory : 마운트 지점

 

[constraint]

set resource constraint (location / ordering / colocation /ticket)

  • wildfly 리소스가 was01 노드에 위치하도록 (was01 - ACTIVE / was02 - STANDBY 구조이므로)

    # pcs constraint location mbrain_was prefers was01

  • 3개 리소스가 같은 노드에 위치하도록 (WAS가 구동하는 서버가 공유스토리지를 사용해야 되기 때문)

    # pcs constraint colocation set mbrain_was mbrain_lvm mbrain_fs

  • Lvm 리소스 실행 후, fs 리소스가 실행되도록 (LVM이 활성화 되어야, 마운트가 가능하기 때문)

    # pcs constraint order mbrain_lvm then mbrain_fs

  • 리소스가 다른 노드로 바로 이동하는 걸 방지함

    # pcs resource defaults resource-stickiness=100

 

 

5. 테스트

정상상태

 

  • was01 노드에서 우선적으로 mbrain_was 리소스가 실행된다.
  • mbrain_was 리소스와 mbrain_lvm, mbrain_fs가 묶이도록 constraint 설정을 해놨기 때문에 모든 리소스가 was01에 묶여있는 걸 확인할 수 있다.

 

failover

  • # pcs cluster standby was01 을 수행해본다.
  • 리소스들이 was02 노드로 이동하면서 정상적으로 failover 되는 것을 확인할 수 있다.

 

참고자료

 

 

 

반응형

댓글