본문 바로가기
프로그램 활용/웹서버

CentOS 7 VM 에서 HA Cluster 구성하기

by 3604 2023. 10. 24.
728x90

출처: https://keviny.tistory.com/3

CentOS 7 VM 에서 HA Cluster 구성하기 (vSphere Hypervisor)

Keviny 2020. 1. 9. 14:04

CentOS 7 VM 에서 HA Cluster 구성하기 (vSphere Hypervisor)

참고자료 :
1. RedHat 공식 고가용성 자료 (https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/7/html/high_availability_add-on_administration/index)
2. VMware 환경에서의 구성 관련 자료 (https://www.lisenet.com/2015/active-passive-cluster-with-pacemaker-corosync-and-drbd-on-centos-7-part-1/)
  - Part 1~4 중 Part 3은 DRBD(데이터 실시간 복제?) 관련 기능 -> 이 포스팅에선 필요하지 않은 부분이므로 스킵.

구성 환경 :

  1. vSphere Hypervisor 내 CentOS 7 VM 2대(node01, node02) - vSphere Client 버전 6.5.0.20000

  2. node01 : 192.168.0.101

  3. node02 : 192.168.0.102

  4. node 2대는 같은 대역의 Network IP 를 할당 받아야 함.

  5. vCenter 주소 : 192.168.0.50

  6. 각 노드에서 vCenter IP의 80, 443 포트로 연결 가능해야 함.

 


필요 환경 :
  1. Active/Standby Cluster - 고가용성(이중화)

  2. 차단장치 설정(Fencing Device)
  3. 공유 볼륨(Shared Disk) 설정

  4. pcs 리소스 추가 : LVM, FileSystem, VIP(Virtual IP), apache Web Server

  5. mysql 설치
  6. pcs 리소스 추가 : mysql
   
위 과정을 단계별로 하나씩 진행해보자

 

0. 사전 설치 작업 (인터넷 연결 필요)

// Cluster 솔루션 설치
[ALL]# yum install -y pcs

// Fencing Device 설정을 위한 agent 설치
[ALL]# yum install -y fence-agents-vmware-soap

// Apache Webserver 구성을 위해 설치
[ALL]# yum install -y httpd wget 

   
1. Active/Standby Cluster - 고가용성(이중화)

// 참조 : Redhat 고가용성 관련 공식 Documentation
// https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/7/html/high_availability_add-on_administration/index)

// 클러스터의 각 노드에서 Red Hat 고가용성 추가 기능 소프트웨어 패키지와 함께 고가용성 채널에서 사용 가능한 모든 차단 에이전트를 설치합니다.
// [ALL]# yum install pcs // 미리 설치한 패키지

// 사용자가 firewalld 데몬을 실행중이라면 다음의 명령을 실행해서 Red Hat 고가용성 추가 기능에 의해 요구되는 포트를 활성화합니다.
[ALL]# firewall-cmd --permanent --add-service=high-availability
[ALL]# firewall-cmd --add-service=high-availability

// pcs를 사용해서 클러스터를 설정하고 노드 간에 통신하려면 pcs 관리 계정인 사용자 ID hacluster의 암호를 각 노드에 설정해야 합니다. hacluster 사용자의 암호를 각 노드에서 동일하게 하는 것을 권장합니다.
[ALL]# passwd hacluster
Changing password for user hacluster.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

// 클러스터의 각 노드에서 다음의 명령을 실행해서 시스템 시작 시 pcsd 서비스를 시작하고 pcsd를 활성화하도록 합니다.
[ALL]# systemctl start pcsd.service
[ALL]# systemctl enable pcsd.service

// hosts파일(/etc/hosts) 에 클러스터의 두 노드 node01과 node02, 그리고 vcenter를 추가합니다.
[ALL]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.101 node01
192.168.0.102 node02
192.168.0.50 vcenter.test.co.kr

// 다음의 명령을 사용해서 클러스터의 두 노드 node01과 node02 모두를 위해 node01에서 hacluster 사용자를 인증합니다.
[root@node01 ~]# pcs cluster auth node01 node02
Username: hacluster
Password:
node01: Authorized
node02: Authorized

// node01에서 다음의 명령을 실행해서 node01과 node02 노드로 구성된 클러스터인 my_cluster를 생성합니다. 이를 통해 클러스터의 두 노드 모두에 클러스터 설정 파일을 전달합니다. 이 명령은 클러스터의 두 노드 모두에서 클러스터 서비스를 시작하게 해주는 --start 옵션을 포함합니다.
[root@node01 ~]# pcs cluster setup --start --name my_cluster node01 node02
node01: Succeeded
node01: Starting Cluster...
node02: Succeeded
node02: Starting Cluster...

// 노드가 부팅되었을 때 클러스터의 각 노드에서 클러스터 서비스가 실행되도록 활성화합니다.
[ALL]# pcs cluster enable --all

// pcs cluster status 명령을 사용해서 클러스터의 현재 상태를 표시할 수 있습니다.
[root@node01 ~]# pcs cluster status
Cluster Status:
 Last updated: Thu Jul 25 13:01:26 2013
 Last change: Thu Jul 25 13:04:45 2013 via crmd on node02
 Stack: corosync
 Current DC: node02 (2) - partition with quorum
 Version: 1.1.10-5.el7-9abe687
 2 Nodes configured
 0 Resources configured

 

2. 차단장치 설정(Fencing Device)

// 참조 : Active/Passive Cluster With Pacemaker, Corosync and DRBD on CentOS 7: Part 4 – Configure Fencing (STONITH)
// https://www.lisenet.com/2015/active-passive-cluster-with-pacemaker-corosync-and-drbd-on-centos-7-part-4/

// Be sure to install the package on all cluster nodes:
// [ALL]# yum install -y fence-agents-vmware-soap // 미리 설치한 패키지

// For the configuration of this VMware fencing device we need credentials to vCenter with minimal permissions. Once we have credentials, we can get a list of servers which are available on VMware.
[root@node01 ~]# fence_vmware_soap --ip [vCenter도메인] --ssl --ssl-insecure --action list --username=[Admin계정] --password=[Admin비밀번호] | grep -E "node01|node02"
node01,4224b9eb-579c-c0eb-0e85-794a3eee7d26 // 콤마(,) 뒤 숫자는 다를 수 있음
node02,42240e2f-31a2-3fc1-c4e7-8f22073587ae // 콤마(,) 뒤 숫자는 다를 수 있음

위에 node01, 02가 표시된다면 Fencing Device 설정하기 위한 준비가 끝난 상태다.

PCS Web UI 상에서 Fencing Device 설정을 위해 https://[노드 IP]:2224 로 접속하면 아래와 같은 화면이 표시된다. 

PCS의 기본 Web UI 화면

 

아까 생성한 my_cluster를 등록하기 위해 localhost 를 입력해준다.

 

my_cluster 가 등록된 모습. my_cluster 를 클릭하면 노드정보를 볼 수 있다.

 

node01 과 node02 가 등록된 것을 볼 수 있다.

 

차단장치 설정을 위해 "FENCE DEVICES" 탭을 누른 상태. 아무것도 없다. ADD를 누른 뒤...

 

필요한 정보(아래표 참조)를 채워 넣는다.
항목 입력값
ipaddr vcenter.test.co.kr
login [vcenter 관리자 계정]
inet4_only 1
ipport 443
passwd [vcenter 관리자 비밀번호]
ssl_insecure 1
pcmk_host_map vcenter.test.co.kr:node01;vcenter.test.co.kr;node02
pcmk_host_list node01,node02
pcmk_host_check static_list

 

pcs resource 에 fence_test 가 정상적으로 등록된 모습

 

3. 공유 볼륨(Shared Disk) 설정

공유 볼륨 설정을 위해 먼저 vcenter 페이지에서 node01과 node02에 SCSI 컨트롤러와 하드디스크를 추가해야한다. 아래 방법대로 진행해보자.

node01 - 설정편집 - 새 디바이스 추가 - SCSI 컨트롤러 선택 후 위 옵션으로 추가

 

node01 - 설정편집 - 새 디바이스 추가 - 하드 디스크 선택 후 위 옵션으로 추가 (가상 디바이스 노드는 새로 생성한 SCSI 컨트롤러 선택해야함)

 

node02 - 설정편집 - 새 디바이스 추가 - SCSI 컨트롤러 선택 후 위 옵션으로 추가

 

node02 - 설정편집 - 새 디바이스 추가 - 기존 하드 디스크 선택 

 

위에서 추가한 node01의 하드디스크 선택(수정일자 또는 크기로 확인)

 

위 옵션으로 설정 (가상 디바이스 노드는 새로 생성한  SCSI 컨트롤러를 설정해야하고, node01 과 포트번호(ex. 1:0)가 일치해야한다.

이제 추가된 하드디스크를 OS 상에서 잡아주기 위해 아래 내용을 수행한다.

fdisk -l 을 해보면 /dev/sdb가 생겼고 파티션이 잡혀있지 않은 상태

 

fdisk /dev/sdb 로 해당 디스크를 잡고

 

m 을 누르면 명령어 목록이 나오는데 p 로 파티션 목록을 보면 역시 아무것도 없다.

 

n 으로 새로운 파티션을 생성하고 전부 엔터입력으로 기본값으로 생성한다. 그 후 p를 입력해보면 파티션이 잡힌 상태.

 

t 를 눌러 system id 변경 메뉴로 접근하여 L 을 눌러보면 8e 에 Linux LVM 이 보인다.

 

p 를 눌러보면 system id 값이 Linux LVM 으로 바뀐걸 확인할 수 있다. 이제 w 를 입력하여 저장하고 나간다.

이제 위에서 생성한 파티션으로 물리볼륨, 볼륨그룹, 논리볼륨을 생성해야한다.

// 참조 : RED HAT 고가용성 클러스터에 있는 활성/수동 APACHE 웹 서버
// https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/7/html/high_availability_add-on_administration/ch-service-haaa

// /dev/sdb1 파티션은 공유된 스토리지이므로, 이 절차는 단 하나의 노드에만 수행합니다.
// /dev/sdb1 파티션에 LVM 물리 볼륨을 생성합니다.
[root@node01 ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created

// 물리 볼륨 /dev/sdb1으로 구성된 볼륨 그룹 my_vg를 생성합니다.
[root@node01 ~]# vgcreate my_vg /dev/sdb1
  Volume group "my_vg" successfully created

// 볼륨 그룹 my_vg를 사용해서 논리 볼륨을 생성합니다.
[root@node01 ~]# lvcreate -l 100%FREE -n my_lv my_vg
  Logical volume "my_lv" created

// 논리 볼륨 my_lv에 xfs 파일 시스템을 생성합니다.
[root@node01 ~]# mkfs.xfs /dev/my_vg/my_lv

// Apache HTTPD 서버가 클러스터의 각 노드에 설치되어 있는 것을 확인합니다. 또한 Apache 웹 서버의 상태를 확인할 수 있기 위해서는 wget 도구가 클러스터에 설치되어 있어야 합니다.
// 각 노드에서 다음의 명령을 실행합니다.
// [ALL]# yum install -y httpd wget // 미리 설치한 패키지

// Apache 리소스 에이전트가 Apache 웹 서버의 상태를 받기 위해서는 다음의 텍스트가 클러스터의 각 노드에 있는 /etc/httpd/conf/httpd.conf 파일에 존재하며 주석으로 처리되지 않도록 해야 합니다. 해당 텍스트가 존재하지 않는다면 파일 마지막에 이 텍스트를 추가합니다.
[ALL]# cat /etc/httpd/conf/httpd.conf
...
<Location /server-status>
  SetHandler server-status
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Location>

// Apache가 제공할 웹 페이지를 생성합니다. 클러스터에 있는 하나의 노드에서 사용자가 위에서 생성한 파일 시스템을 마운트하고 그 파일 시스템에 index.html 파일을 생성한 후 파일 시스템 마운트를 해제합니다.
[root@node01 ~]# mount /dev/my_vg/my_lv /var/www/
[root@node01 ~]# mkdir /var/www/html
[root@node01 ~]# mkdir /var/www/cgi-bin
[root@node01 ~]# mkdir /var/www/error
[root@node01 ~]# restorecon -R /var/www
[root@node01 ~]# cat <<-END >/var/www/html/index.html
<html>
<body>Hello</body>
</html>
END
[root@node01 ~]# umount /var/www

// 다음의 절차에 따라 볼륨 그룹을 설정하면 오직 클러스터만이 볼륨 그룹을 활성화시킬 수 있고 시작 시 볼륨 그룹이 클러스터 밖에서 활성화되지 않도록 설정됩니다.
// locking_type이 1로 설정되어 있고 /etc/lvm/lvm.conf 파일에서 use_lvmetad가 0으로 설정되어 있도록 확실히 하기 위해 다음의 명령을 실행합니다. 이 명령은 모든 lvmetad 프로세스를 즉시 비활성화 및 중지합니다.
[ALL]# lvmconf --enable-halvm --services --startstopservices

// 다음의 명령을 사용해서 어느 볼륨 그룹이 현재 사용자의 로컬 스토리지에 설정되어 있는지 확인합니다. 이 명령을 통해 현재 설정되어 있는 볼륨 그룹 목록이 표시됩니다. 이 노드에 루트와 홈 디렉토리를 위해 각각의 볼륨 그룹에 공간을 할당해 놓았다면 다음의 예시에서와 같이 표시된 목록에서 그 볼륨을 볼 수 있습니다.
[ALL]# vgs --noheadings -o vg_name
  my_vg        
  centos
  
// my_vg (사용자가 방금 클러스터를 위해 정의한 볼륨 그룹) 이외의 볼륨 그룹을 /etc/lvm/lvm.conf 설정 파일에 항목으로 추가합니다. 예를 들어, 각각의 볼륨 그룹에 루트와 홈 디렉토리를 위한 공간을 할당해 놓았다면 lvm.conf 파일의 volume_list 행을 주석 해제 처리하고 그 볼륨 그룹을 다음과 같이 volume_list에 항목으로 추가합니다.
[ALL]# cat /etc/lvm/lvm.conf
...
volume_list = [ "centos" ]
...

// 부트 이미지가 클러스터에 의해 제어되는 볼륨 그룹을 활성화하려고 시도하지 않도록 확실히 하기 위해 initramfs 부트 이미지를 재구축합니다.
[ALL]# dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)

// 노드를 재부팅합니다.
[ALL]# reboot

// 노드가 재부팅된 후 그 노드에 클러스터 서비스가 다시 시작되었는지 확인합니다.
[ALL]# pcs cluster status

 

4. pcs 리소스 추가 : LVM, FileSystem, VIP(Virtual IP), apache Web Server

// 참조 : PCS 명령을 사용한 리소스 및 리소스 그룹 생성
// https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/7/html/high_availability_add-on_administration/s1-resourcegroupcreate-haaa

// 다음의 명령을 사용해서 my_lvm이라는 LVM 리소스를 생성합니다. 오직 클러스터만이 LVM 논리 볼륨을 활성화할 수 있도록 하기 위해 이 명령은 exclusive=true 매개 변수를 지정합니다. 아직 my_group 리소스 그룹이 존재하지 않으므로 이 명령은 리소스 그룹을 생성합니다.
[root@node01 ~]# pcs resource create my_lvm LVM volgrpname=my_vg exclusive=true --group my_group


// 사용자가 리소스를 생성했을 때 그 리소스는 자동적으로 시작됩니다. 리소스가 생성 및 시작되었다는 것을 확인하기 위해 다음의 명령을 사용할 수 있습니다.
// 사용자는 pcs resource disable 및 pcs resource enable 명령을 사용해서 개별 리소스를 수동으로 중지하고 시작할 수 있습니다.
[root@node01 ~]# pcs resource show
 Resource Group: apachegroup
     my_lvm	(ocf::heartbeat:LVM):	Started
     
// 다음의 명령을 사용해서 설정을 위해 남은 리소스를 생성하고 이 리소스를 기존의 my_group 리소스 그룹에 추가합니다.
[root@node01 ~]# pcs resource create my_fs Filesystem device="/dev/my_vg/my_lv" directory="/var/www" fstype="xfs" --group my_group
[root@node01 ~]# pcs resource create VirtualIP IPaddr2 ip=192.168.0.100 cidr_netmask=24 --group my_group
[root@node01 ~]# pcs resource create Website apache configfile="/etc/httpd/conf/httpd.conf" statusurl="http://127.0.0.1/server-status" --group my_group

// 리소스와 그 리소스를 포함하는 리소스 그룹을 생성한 후 사용자는 클러스터의 상태를 확인할 수 있습니다. 4개의 리소스가 모두 동일한 노드에서 실행중인 것을 확인합니다.
[root@node01 ~]# pcs status
Cluster name: my_cluster
Last updated: Wed Jul 31 16:38:51 2013
Last change: Wed Jul 31 16:42:14 2013 via crm_attribute on z1.example.com
Stack: corosync
Current DC: node02 (2) - partition with quorum
Version: 1.1.10-5.el7-9abe687
2 Nodes configured
6 Resources configured


Online: [ node01 node02 ]

Full list of resources:
 myapc	(stonith:fence_apc_snmp):	Started node01
 Resource Group: apachegroup
     my_lvm	(ocf::heartbeat:LVM):	Started node01
     my_fs	(ocf::heartbeat:Filesystem):	Started node01
     VirtualIP	(ocf::heartbeat:IPaddr2):	Started node01
     Website	(ocf::heartbeat:apache):	Started node01

// 클러스터가 시작 및 실행중이면 사용자가 IPaddr2 리소스로 정의한 IP 주소를 브라우저에 입력해서 디스플레이 예시를 볼 수 있으며, 이 디스플레이는 "Hello"라는 간단한 단어로 구성되어 있습니다.

// Apache httpd 의 경우, 설치하고나면 부팅 시 자동실행 옵션이 켜져있을 수 있으므로, 아래 명령을 통해 부팅 시 자동실행되지 않도록 한다.
[ALL]# systemctl disable httpd.service

아래 명령어를 이용해서 각 노드를 standby 상태로 만들고, 다시 online 상태로 만들 수 있다.

# pcs node standby
# pcs node unstandby

기본 설정으로, online 상태(unstandby)로 전환될 때 다른 노드의 resource 를 가져오기 때문에 아래 옵션을 추가하여 현재 active인 node에서 resource가 유지될 수 있도록 설정한다.

my_group 을 클릭한 뒤 Resource Meta Attributes 에 위와 같이 resource-stickiness 를 100으로 설정해준다.

 

5. mysql 설치

// 참조1 : CentOS7 Mysql 설치
// https://galid1.tistory.com/296

// 참조2 : Securing the Initial MySQL Account
// https://dev.mysql.com/doc/refman/8.0/en/default-privileges.html

// CentOS 7 은 기본적으로 mariaDB 가 탑재되어 있어 mysql 을 설치하려면 아래와 같이 명령어를 입력해줘야 한다.
[ALL]# yum -y install http://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
[ALL]# yum -y install mysql-community-server

// mysql을 시작하려면 아래 명령어를 입력해준다.
// systemctl enable은 하지 않는다. pcs 에 의해서 실행되고 종료되기 때문. 양 쪽에서 구동하는 이유는 root 비밀번호를 바꾸기 위함임.
[ALL]# systemctl start mysqld.service

// mysql 설치 시 root 의 기본 비밀번호는 아래 위치에 기록되어 있다. (맨 오른쪽이 비밀번호)
[ALL]# cat /var/log/mysqld.log | grep password
2020-01-10T08:12:44.029624Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: v*lx.uODI4F<

// 위 비밀번호를 이용하여 mysql 에 접속한다
[ALL]# mysql -u root -p
Enter password: [비밀번호 입력]

// 아래 sql 문을 입력하여 root의 비밀번호를 변경해준다
[ALL]mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '[바꿀 root 비밀번호]';

// 접속을 끊은 뒤 다시 접속해본다.
[ALL]mysql> quit
[ALL]# mysql -u root -p
Enter password: [바꾼 비밀번호 입력]

// mysql 을 종료한다.
[ALL]# systemctl stop mysqld.service

// mysql 의 자동실행 옵션을 제거한다
[ALL]# systemctl disable mysqld.service


6. pcs 리소스 추가 : mysql

PCS Web UI 의 Resource 탭에서 Add 를 누른 뒤 ocf:heartbeat / mysql 을 선택하고, 필요한 값(아래표 참조)을 채운다.
항목 입력값
Resource Group my_group
Resource ID [mysql 리소스 이름]
binary /usr/sbin/mysqld
client_binary /usr/bin/mysql
datadir [공유볼룸안의 mysql data 폴더]
additional_parameters --bind-address=192.168.0.100 --skip-external-locking

skip-external-locking 은 필요하면 추가한다. (관련내용 아래 링크 참조)

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01_1&m_no=22521&cat1=827&cat2=964&cat3=994&lang=k

 

mysql 이 생성되면 Group 에서 순서를 조정한다. website 가 db 정보를 참고하게 된다면 website 앞에 mysql 을 둬야한다.

 

추가) 중요한 내용을 한번 더 언급한다. 위처럼 PCS Resource 로 관리되는 항목은 systemctl 로 중복 실행되면 안된다. (Volume Group 을 PCS 클러스터만이 활성화할 수 있게 설정한 거랑 동일하다고 생각하면 된다. 이렇게 하지 않으면 systemctl 로도 Resource 가 실행되고 PCS클러스터가 또 실행하려고 하면서 오류가 발생할 수 있다.)

위 Resource들 중에서 mysql 과 httpd 의 경우 enable 되어있으면 PC 부팅 시 자동으로 실행되기 때문에 해당 옵션을 제거한다.

// httpd 서비스에 대한 자동 실행 방지
[ALL]# systemctl disable httpd.service
[ALL]# systemctl is-enabled httpd.service
disabled

// mysqld 서비스에 대한 자동 실행 방지
[ALL]# systemctl disable mysqld.service
[ALL]# systemctl is-enabled mysqld.service
disabled

 

끝.

728x90