리눅스 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
# 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는 써주신대로 다 설정은 했습니다.
Author
/etc/iscsi/initiatorname.iscsi 내용 확인 부탁드립니다.
InitiatorName 이 잘못되었을 수 있습니다.