리눅스 HA (pacemaker, corosync, iscsi shared storage) – part 3

리눅스 HA(Pacemaker, corosync, iscsi shared storage, lvm2) – part 3

작업환경:
CentOS 8
node1 : wolf1, 192.158.0.31
node2 : wolf2, 192.168.0.32
Virtual IP: 192.168.0.30
shared storage: wolfstorage, 192.168.0.33

참고:
리눅스 HA(corosync, pacemaker) – Part 1
리눅스 HA(corosync, pacemaker, DRBD) – Part 2
리눅스 HA(corosync, pacemaker, shared disk)에 zabbix 모니터링 서버 구성 – part 4
CentOS에서 iscsi 사용하기

1. iscsi 서버로 shared storage 준비한다. ip 주소는 192.168.0.33으로 설정되어 있다.
빈 디스크를 iscsi shard disk로 사용할 것이다. parted -l 명령어로 확인해보면 아래와 같은 화면을 볼 수 있다.
/dev/sdb 를 사용한다.

# parted -l
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  8590MB  8589MB  primary  xfs          boot


Error: /dev/sdb: unrecognised disk label
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

2. iscsi target 설치 및 설정(wolfstorage 에서 작업한다).

dnf는 yum의 차세대 버전으로 CentOS8에서 사용할 수 있다. dnf 대신 yum 명령어를 사용해도 된다.

# dnf install targetcli

targetcli 명령으로 공유할 디스크를 iscsi 디스크로 만든다.

# targetcli
targetcli shell version 2.1.51
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> cd /backstores/block
/backstores/block> create sdisk /dev/sdb
Created block storage object sdisk using /dev/sdb.

/backstores/block> cd /iscsi

/iscsi> create iqn.2020-08.com.storage:disk
Created target iqn.2020-08.com.storage:disk.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

/iscsi> cd iqn.2020-08.com.storage:disk/tpg1/acls
/iscsi/iqn.20...isk/tpg1/acls> create iqn.2020-08.com.storage:wolf1wolf2
Created Node ACL for iqn.2020-08.com.storage:wolf1wolf2

/iscsi/iqn.20...isk/tpg1/acls> cd /
/> cd iscsi/iqn.2020-08.com.storage:disk/tpg1/luns

/iscsi/iqn.20...isk/tpg1/luns> create /backstores/block/sdisk
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2020-08.com.storage:wolf1wolf2

/iscsi/iqn.20...isk/tpg1/luns> cd /
/> ls
o- / ........................................................................................................ [...]
  o- backstores ............................................................................................. [...]
  | o- block ................................................................................. [Storage Objects: 1]
  | | o- sdisk ........................................................... [/dev/sdb (8.0GiB) write-thru activated]
  | |   o- alua .................................................................................. [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ...................................................... [ALUA state: Active/optimized]
  | o- fileio ................................................................................ [Storage Objects: 0]
  | o- pscsi ................................................................................. [Storage Objects: 0]
  | o- ramdisk ............................................................................... [Storage Objects: 0]
  o- iscsi ........................................................................................... [Targets: 1]
  | o- iqn.2020-08.com.storage:disk ..................................................................... [TPGs: 1]
  |   o- tpg1 .............................................................................. [no-gen-acls, no-auth]
  |     o- acls ......................................................................................... [ACLs: 1]
  |     | o- iqn.2020-08.com.storage:wolf1wolf2 .................................................. [Mapped LUNs: 1]
  |     |   o- mapped_lun0 ................................................................ [lun0 block/sdisk (rw)]
  |     o- luns ......................................................................................... [LUNs: 1]
  |     | o- lun0 ..................................................... [block/sdisk (/dev/sdb) (default_tg_pt_gp)]
  |     o- portals ................................................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 .................................................................................... [OK]
  o- loopback ........................................................................................ [Targets: 0]
/> saveconfig
Configuration saved to /etc/target/saveconfig.json
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json

재부팅 후에도 iscsi target 서비스가 실행되도록 설정하고, target 서비스를 재실행한다.

# systemctl enable target
# systemctl restart target

2. 각각의 클러스터 노드(wolf1, wolf2)에서 iscsi initator를 사용할 수 있도록 iscsi-initiator-utils를 설치하고 설정한다.

# dnf install iscsi-initiator-utils
# vi /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2020-08.com.storage:wolf1wolf2

서비스를 등록하고 시작한다.

# systemctl start iscsid
# systemctl enable iscsid

iscsi 볼륨을 찾을때, 아래와 같은 오류가 발생한다면, iscsi target(서버)의 방화벽을 확인한다. 방화벽을 끄거나 tcp 3260 포트를 열어준다.

# iscsiadm -m discovery -t st -p 192.168.0.33
iscsiadm: cannot make connection to 192.168.0.33: No route to host
iscsiadm: cannot make connection to 192.168.0.33: No route to host
iscsiadm: cannot make connection to 192.168.0.33: No route to host
iscsiadm: cannot make connection to 192.168.0.33: No route to host
iscsiadm: cannot make connection to 192.168.0.33: No route to host
iscsiadm: cannot make connection to 192.168.0.33: No route to host
iscsiadm: connection login retries (reopen_max) 5 exceeded
iscsiadm: Could not perform SendTargets discovery: iSCSI PDU timed out

방화벽을 끄고, 다시 시험하면,

# iscsiadm -m discovery -t st -p 192.168.0.33
192.168.0.33:3260,1 iqn.2020-08.com.storage:disk
# iscsiadm -m node -T iqn.2020-08.com.storage:disk -l
Logging in to [iface: default, target: iqn.2020-08.com.storage:disk, portal: 192.168.0.33,3260]
Login to [iface: default, target: iqn.2020-08.com.storage:disk, portal: 192.168.0.33,3260] successful.

3. Centos8 에서 HA lvm cluster 사이의 통신은 system ID를 사용하므로, lvm.conf 파일에 system_id_source를 설정해야한다.
각각의 노드에서 lvm.conf 파일의 system_id_source를 uname 으로 설정한다.

# vi /etc/lvm/lvm.conf 
    # system_id_source = "none"
    system_id_source = "uname"

LVM system ID를 확인해 보면 아래와 같이 호스트네임이 system id로 보일 것이다.

# lvm systemid
  system ID: wolf1

각각의 클러스터 노드에서 initramfs를 백업하고, 다시 빌드한 후 재부팅을 한다.

# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
# dracut -f -v

4. 재부팅후 공유디스크에 logical volume을 만든다. 먼저, 모든 클러스터 노드들이 작동중인지 확인한다.

# pcs status
Cluster name: wolf_cluster
Cluster Summary:
  * Stack: corosync
  * Current DC: wolf2 (version 2.0.3-5.el8_2.1-4b1f869f0f) - partition with quorum
  * Last updated: Fri Aug 14 03:25:27 2020
  * Last change:  Tue Aug 11 21:28:25 2020 by root via cibadmin on wolf1
  * 2 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ wolf1 wolf2 ]

Full List of Resources:
  * No resources

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

Logical volume은 한쪽 노드에서만 작업할 것이다. LVM 관련한 자세한 내용은 https://blog.boxcorea.com/wp/archives/1346를 참고하면 된다.
lsscsi 명령으로, 공유 디스크를 확인한다. 맨 아래에 iscsi target에서 작업한 sdisk가 보일것이다.

# lsscsi
[0:0:0:0]    cd/dvd  VBOX     CD-ROM           1.0   /dev/sr0
[2:0:0:0]    disk    ATA      VBOX HARDDISK    1.0   /dev/sda
[3:0:0:0]    disk    LIO-ORG  sdisk            4.0   /dev/sdb
[root@wolf1 ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.
[root@wolf1 ~]# vgcreate shared_vg /dev/sdb
  Volume group "shared_vg" successfully created with system ID wolf1
[root@wolf1 ~]# vgs -o+systemid
  VG        #PV #LV #SN Attr   VSize  VFree  System ID
  shared_vg   1   0   0 wz--n- <7.97g <7.97g wolf1
[root@wolf1 ~]#
[root@wolf1 ~]# lvcreate -l 100%FREE -n shared_lv shared_vg
  Logical volume "shared_lv" created.
[root@wolf1 ~]# lvs
  LV        VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  shared_lv shared_vg -wi-a----- <7.97g

파일시스템을 만든다. 파일시스템은 xfs로 포맷했다.

# mkfs -t xfs /dev/shared_vg/shared_lv
meta-data=/dev/shared_vg/shared_lv isize=512    agcount=4, agsize=522240 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=2088960, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

클러스터에의해 VG가 관리되도록 ocf:heartbeat:LVM-activate 리소스 에이전트를 사용하여 클러스터 리소스를 생성한다.
이때, 리소스 이름은 cluster-vg, 리소스 그룹은 SHARED-LVM으로 했다.

# pcs resource create cluster-vg ocf:heartbeat:LVM-activate vgname=shared_vg activation_mode=exclusive vg_access_mode=system_id --group SHARED-LVM

클러스터 노드에의해 파일시스템을 마운트하고 사용할 수 있도록 ocf:heartbeat:Filesystm 리소스 에이전트로 클러스터리소스를 생성한다.
리소스 이름은 cluster-fs, 마운트 포인트는 /shared_disk, 파일시스템은 위에서 xfs로 포맷했으므로 xfs, 리소스그룹은 vg가 속한 그룹과 같은 SHARED-LVM으로 하였다.

# pcs resource create cluster-fs ocf:heartbeat:Filesystem device=/dev/shared_vg/shared_lv directory=/shared_disk fstype=xfs --group SHARED-LVM

리소스가 잘 등록되었는지 확인 해 본다.

# pcs status
Cluster name: wolf_cluster
...
Node List:
  * Online: [ wolf1 wolf2 ]

Full List of Resources:
  * Resource Group: SHARED-LVM:
    * cluster-vg        (ocf::heartbeat:LVM-activate):  Started wolf1
    * cluster-fs        (ocf::heartbeat:Filesystem):    Started wolf1
  * VirtualIP   (ocf::heartbeat:IPaddr2):       Started wolf2

아래처럼 wolf1 노드에 파일시스템이 마운트 되어 있는 것을 볼 수 있다. 노드2(wolf2)에서는 파일시스템이 보이지 않는다.

[root@wolf1 ~]# df -h
Filesystem                       Size  Used Avail Use% Mounted on
devtmpfs                         395M     0  395M   0% /dev
tmpfs                            410M   38M  372M  10% /dev/shm
tmpfs                            410M   11M  399M   3% /run
tmpfs                            410M     0  410M   0% /sys/fs/cgroup
/dev/sda1                        8.0G  1.8G  6.2G  23% /
tmpfs                             82M     0   82M   0% /run/user/0
/dev/mapper/shared_vg-shared_lv  8.0G   90M  7.9G   2% /shared_disk
[root@wolf1 ~]#

wolf1을 standby로 만들어 리소스가 wolf2로 이동하도록 하고, 파일시스템을 확인해보면

# pcs node standby wolf1
[root@wolf2 ~]# df -h
Filesystem                       Size  Used Avail Use% Mounted on
devtmpfs                         395M     0  395M   0% /dev
tmpfs                            410M   53M  357M  13% /dev/shm
tmpfs                            410M   11M  399M   3% /run
tmpfs                            410M     0  410M   0% /sys/fs/cgroup
/dev/sda1                        8.0G  1.8G  6.3G  22% /
tmpfs                             82M     0   82M   0% /run/user/0
/dev/mapper/shared_vg-shared_lv  8.0G   90M  7.9G   2% /shared_disk

이제, iscsi 방식의 shared disk를 사용할 준비가 끝났다.

위에서 클러스터 상태를 보면 VirtualIP 리소스와 shared storage 리소스가 각각 다른 노드에서 실행되고 있는 것을 알 수 있다.

이제, VirtualIP 리소스와 SHARED-LVM 리소스 그룹이 함께 작동하도록 기존 VirtualIP 리소스를 삭제하고 SHARED-LVM그룹으로 다시만든다.

기존 VirtualIP 리소스를 삭제한다.

# pcs resource delete VirtualIP
Attempting to stop: VirtualIP... Stopped

VirtualIP 리소스가 SHARED-LVM 그룹에 속하도록 다시 만든다.

#  pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.0.30 cidr_netmask=24 op monitor interval=30s --group SHARED-LVM

2 comments

    • tae ung park on 2020년 10월 27일 at 12:12 오후
    • Reply

    # iscsiadm -m node -T iqn.2020-08.com.storage:disk -l
    Logging in to [iface: default, target: iqn.2020-08.com.storage:disk, portal: 192.168.0.33,3260]
    Login to [iface: default, target: iqn.2020-08.com.storage:disk, portal: 192.168.0.33,3260] successful.

    안녕하세요. 올려주신 part1 부터 하고 있습니다.
    하는중간에 위에 로그인 관련부분에서 저대로 실행하면 아래와 같은 에러가 발생하는데 해결방법 알수 있을까요..
    Logging in to [iface: default, target: iqn.2020-10.com.storage:disk, portal: 192.168.0.155,3260] (multiple)
    iscsiadm: Could not login to [iface: default, target: iqn.2020-10.com.storage:disk, portal: 192.168.0.155,3260].
    iscsiadm: initiator reported error (24 – iSCSI login failed due to authorization failure)
    iscsiadm: Could not log into all portals

    targetcli는 써주신대로 다 설정은 했습니다.

  1. /etc/iscsi/initiatorname.iscsi 내용 확인 부탁드립니다.

    InitiatorName 이 잘못되었을 수 있습니다.

답글 남기기

Your email address will not be published.