RHEL(Red Hat Enterprise Linux)은 기업용 서버 시장의 사실상 표준으로, 잠깐의 장애도 허용되지 않는 미션 크리티컬 환경을 위해 탄생한 상용 운영체제다. 페도라(Fedora)를 기반으로 10년 이상의 장기 지원(LTS)을 보장하고, SELinux와 같은 강력한 보안 프레임워크와 검증된 하드웨어 및 소프트웨어 생태계를 통해 비교 불가능한 안정성과 호환성을 제공한다. 이러한 이유로 RHEL은 기술 지원, 보안, 성능 모두를 만족시켜야 하는 인프라에서 가장 신뢰받는 선택지로 통한다.

현업에서 DB 서버의 스토리지를 증설하는 것은 매우 일반적인 작업이다. 이 튜토리얼에서는 스토리지 엔지니어로부터 1TB 디스크(LUN, Logical Unit Number) 4개를 할당받아 두 개의 2TB 데이터 LVM 볼륨 생성이 필요한 상황을 가정한다. 단순히 디스크를 OS에 인식시키는 것을 넘어, 실제 운영 환경에서 요구되는 안정성과 성능 기준을 충족시키는 것을 목표로 한다.

튜토리얼에서 적용하는 핵심 기술

  • Multipath I/O: SAN 스토리지의 다중 경로를 단일 장치로 묶어 경로 장애에 대한 내성과 부하 분산을 제공한다.
  • LVM Striped: 여러 물리 디스크에 데이터를 분산하여 I/O 성능을 극대화한다.

OS 정보

~# uname -a
Linux <hostname> 4.18.0-553.50.1.el8_10.x86_64 #1 SMP Thu Apr 10 16:09:41 EDT 2025 x86_64 x86_64 x86_64 GNU/Linux

~# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.10 (Ootpa)

~# cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="8.10 (Ootpa)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="8.10"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Red Hat Enterprise Linux 8.10 (Ootpa)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:redhat:enterprise_linux:8::baseos"
HOME_URL="https://www.redhat.com/"
DOCUMENTATION_URL="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8"
BUG_REPORT_URL="https://issues.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_BUGZILLA_PRODUCT_VERSION=8.10
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.10" 

1. 필수 패키지 설치

sudo dnf install lsscsi device-mapper-multipath

2. 신규 디스크 인식

스토리지에서 디스크 할당이 끝나면, 서버 OS가 이를 인식하게 만들어야 한다. SCSI 버스를 다시 스캔하여 새로운 장치를 시스템에 등록한다.

sudo scsi-rescan

3. Multipath 설정

SAN 환경에서는 안정적인 서비스 운영을 위해 경로 이중화가 필수다. 하나의 디스크에 접근하는 물리적인 경로가 최소 2개 이상이므로, OS는 이를 여러 개의 디스크로 오인할 수 있다. Device Mapper Multipath는 이 여러 경로를 묶어 하나의 가상 장치로 제공한다.

먼저, 새로 추가된 디스크들의 고유 식별자인 WWID(World Wide Identifier)를 확인해야 한다.

sudo lsscsi -i
[0:3:111:0]  disk    DELL     PERC H750 Adp    5.26  /dev/sda 36f4ee08004716600294e02d5e7963ebc
[16:0:0:0]   disk    NETAPP   INF-01-00        0880  -          -
...
[16:0:0:17]  disk    NETAPP   INF-01-00        0880  /dev/sdah SNETAPP_INF-01-00_042417029839
[16:0:0:18]  disk    NETAPP   INF-01-00        0880  /dev/sdai  -
[16:0:0:19]  disk    NETAPP   INF-01-00        0880  /dev/sdaj  -
[16:0:0:20]  disk    NETAPP   INF-01-00        0880  /dev/sdak  -
[18:0:0:0]   disk    NETAPP   INF-01-00        0880  -          -
...
[18:0:0:17]  disk    NETAPP   INF-01-00        0880  /dev/sdal 36d039ea000bc78400000014e6838b622
[18:0:0:18]  disk    NETAPP   INF-01-00        0880  /dev/sdam 36d039ea000be2f460000025d6838b729
[18:0:0:19]  disk    NETAPP   INF-01-00        0880  /dev/sdan 36d039ea000be2f460000025b6838b723
[18:0:0:20]  disk    NETAPP   INF-01-00        0880  /dev/sdao 36d039ea000bc7840000001506838b62a

lsscsi -i의 출력 결과

[18:0:0:17]  disk    NETAPP   INF-01-00        0880  /dev/sdal 36d039ea000bc78400000014e6838b622
[18:0:0:18]  disk    NETAPP   INF-01-00        0880  /dev/sdam 36d039ea000be2f460000025d6838b729
[18:0:0:19]  disk    NETAPP   INF-01-00        0880  /dev/sdan 36d039ea000be2f460000025b6838b723
[18:0:0:20]  disk    NETAPP   INF-01-00        0880  /dev/sdao 36d039ea000bc7840000001506838b62a

설정에 추가해야 될 부분을 따로 메모한다.

확인한 WWID를 /etc/multipath.conf 파일에 추가한다. 현업에서는 의도치 않은 디스크가 Multipath에 포함되는 것을 막기 위해, 모든 디스크를 차단(blacklist)하고 사용할 디스크만 예외(blacklist_exceptions)로 등록하는 ‘화이트리스트’ 방식을 선호한다.

/etc/multipath.conf

# device-mapper-multipath configuration file

# For a complete list of the default configuration values, run either:
# # multipath -t
# or
# # multipathd show config

# For a list of configuration options with descriptions, see the
# multipath.conf man page.

defaults {
        user_friendly_names yes
        find_multipaths yes
}

blacklist {
        wwid ".*"
        devnode "^asm/*"
        devnode "^ofsctl"
}

blacklist_exceptions {
        # 기존 설정 ...
        wwid 36d039ea000bc78400000014e6838b622
        wwid 36d039ea000be2f460000025d6838b729
        wwid 36d039ea000be2f460000025b6838b723
        wwid 36d039ea000bc7840000001506838b62a
}

multipaths {
        # 기존 설정 ...
        multipath {
                wwid 36d039ea000bc78400000014e6838b622
                alias                   db17
        }
        multipath {
                wwid 36d039ea000be2f460000025d6838b729
                alias                   db18
        }
        multipath {
                wwid 36d039ea000be2f460000025b6838b723
                alias                   db19
        }
        multipath {
                wwid 36d039ea000bc7840000001506838b62a
                alias                   db20
        }
}

alias를 사용하면 /dev/mapper/ 아래에 예측 가능한 이름으로 장치가 생성되므로 관리가 매우 편해진다.

설정이 끝났으면 아래 명령어로 multipathd 서비스를 재시작하여 설정을 적용하고, Multipath 상태를 확인한다.

sudo systemctl restart multipathd
sudo multipath -ll
...
db17 (36d039ea000bc78400000014e6838b622) dm-33 NETAPP,INF-01-00
size=1.0T features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 18:0:0:17 sdal 66:80  active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  `- 16:0:0:17 sdah 66:16  active ready running
db18 (36d039ea000be2f460000025d6838b729) dm-34 NETAPP,INF-01-00
size=1.0T features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 16:0:0:18 sdai 66:32  active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  `- 18:0:0:18 sdam 66:96  active ready running
db19 (36d039ea000be2f460000025b6838b723) dm-35 NETAPP,INF-01-00
size=1.0T features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 16:0:0:19 sdaj 66:48  active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  `- 18:0:0:19 sdan 66:112 active ready running
db20 (36d039ea000bc7840000001506838b62a) dm-36 NETAPP,INF-01-00
size=1.0T features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 18:0:0:20 sdao 66:128 active ready running
`-+- policy='service-time 0' prio=10 status=enabled
  `- 16:0:0:20 sdak 66:64  active ready running

alias에 대해 두 개의 경로가 activeenabled 상태로 올바르게 잡힌 것을 볼 수 있다.

4. LVM 구성 (PV, VG, LV 생성)

이제 /dev/mapper/db17 ~ db20 이라는 4개의 안정적인 블록 장치가 준비되었다. 우리는 이 4개의 1TB 디스크를 2개씩 묶어, 각각 2TB 용량의 고성능 볼륨 2개를 만들 것이다. 디스크 I/O 성능을 높이기 위해 LVM Striped을 적용한다.

아래는 이 과정을 자동화하는 셸 스크립트다. db17db18을 묶어 vg_dbdata9를, db19db20을 묶어 vg_dbdata10을 생성한다.

#!/bin/bash

for i in 17 19; do
  j=$((i+1))
  k=$(( (i+1)/2 ))
  vgname=vg_dbdata$k
  lvname=lv_dbdata$k

  pvcreate /dev/mapper/db$i /dev/mapper/db$j

  vgcreate $vgname /dev/mapper/db$i /dev/mapper/db$j

  # -i 2 : 2개의 PV에 Striped
  # -I 64 : Striped 크기를 64KB로 설정. (DB 특성에 따라 256K, 512K 등으로 튜닝 가능)
  # -l 100%FREE : VG의 남은 공간 전체를 LV로 할당
  lvcreate -i2 -I64 -l 100%FREE -n $lvname $vgname

  mkfs.xfs /dev/$vgname/$lvname
  
  mkdir /dbdata$k
done

스크립트를 실행하면 pvcreate, vgcreate, lvcreate, mkfs.xfs 까지 자동으로 진행된다. 특히 lvcreate-i 2 옵션이 2개의 PV에 걸쳐 데이터를 분산 저장하는 Striped를, -I 64가 Striped 단일 청크 크기를 64KB로 지정하는 부분이다.

5. 마운트 및 권한 설정

마지막으로 부팅 시 자동으로 마운트되도록 /etc/fstab에 등록하고, DB 소프트웨어(e.g., Oracle)가 접근할 수 있도록 소유권을 변경한다.

/etc/fstab

# 기존 설정 ...
/dev/vg_dbdata9/lv_dbdata9 /dbdata9 xfs defaults 0 0
/dev/vg_dbdata10/lv_dbdata10 /dbdata10 xfs defaults 0 0

fstab을 수정했으면 systemctl daemon-reload를 실행하여 systemd에 변경 사항을 알리고, mount -a나 개별 mount 명령어로 마운트를 테스트한다.

sudo systemctl daemon-reload
sudo mount /dbdata9
sudo mount /dbdata10

df -h로 최종 확인

df -h | grep /dbdata
...
/dev/mapper/vg_dbdata9-lv_dbdata9    2.0T  1G  1.9T  1% /dbdata9
/dev/mapper/vg_dbdata10-lv_dbdata10  2.0T  1G  1.9T  1% /dbdata10
... 

마지막으로, 데이터베이스 소프트웨어가 해당 경로에 데이터를 읽고 쓸 수 있도록 소유권을 변경한다. (Oracle 기준)

sudo chown oracle:dba /dbdata9
sudo chown oracle:dba /dbdata10

참고 사이트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Leave the field below empty!