개요
상황
- 포탈사이트에 업로드되는 파일들을 저장할 스토리지가 필요함
- 사용 가능한 스토리지가 1개만 있는 상황임
- WAS 2대가 스토리지를 공유하여 사용하도록 해야함
해결방안
- PCS로 WAS 2대를 클러스터링 하여 공유스토리지 환경을 구축한다!
목차
- 포탈 Architecture 설명
- LVM (Logical Volume Manager)
- 클러스터링 사전작업
- 클러스터 구성
- 테스트
- 참고자료
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 되는 것을 확인할 수 있다.
참고자료
- LVM 개념 http://kit2013.tistory.com/199
- CLVM과 HA-LVM 비교 https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/lvm_cluster_overview
'기초 튼튼탄탄탄 > 서버, OS(리눅스)' 카테고리의 다른 글
웹서버(apache) / WAS(wildfly) / DB(MariaDB) 설치 및 연동하기 (8) | 2021.01.06 |
---|---|
[리눅스-CentOS] 로컬 Repository 만들기 (8) | 2021.01.06 |
PXE & kickstart로 CentOS 설치 자동화하기 (8) | 2021.01.03 |
디스크 RAID / 파티션 / 포맷 / 마운트 (550) | 2020.07.27 |
Linux(CentOS)와 Google Drive 동기화하기 (4) | 2020.02.13 |
댓글