DRBD + APM 서버 구축
■ OS
- CentOS Linux release 7.9.2009 (Core)
■ 테스트에 사용한 IP
- 192.168.100.249(192.168.0.100) active.tyjung.site
- 192.168.100.251(192.168.0.101) standby.tyjung.site
- 192.168.100.254 VIP
■ DRBD 구성 파티션 (Active, Standby 동일)
/dev/xvda2 : /home
/dev/xvdb1 : /home2
(1) Pacemaker Cluster 구성
1. 사설망 연결을 위해 사설 IP 등록
# vi /etc/hosts
192.168.0.100 active.tyjung.site
192.168.0.101 standby.tyjung.site
* Pacemaker
■ 데몬
- Corosync : 클러스터 인프라 지원
- Pacemaker : 클러스터 자원 관리자
- PCS : Corosync / pacemaker 관리하는 Management 데몬
■ 방화벽 포트
- TCP : 2224, 3121, 21064
- UDP : 5405
2. Pacemaker 주요 패키지 설치
# yum install -y pacemaker corosync pcs psmisc policycoreutils-python
# systemctl enable pcsd
# systemctl enable corosync
# systemctl enable pacemaker
# systemctl start pcsd
3. Cluster Node 인증 설정
# pcs cluster auth active standby
Username : hacluster
Password :
standby : Authorized
active : Authorized
4. Cluster 구성
# pcs cluster setup --name drbd_cluster active standby
-> PCS로 클러스터 생성시, /etc/corosync/corosync.conf 파일 생성
# pcs cluster start --all
# pcs cluster enable --all
# pcs property set stonith-enabled-false
STONITH(Fencing Device) : 의도치 않은 동시 엑세스로 인한 데이터 손상을 보호함.
→ 클러스터 장애 시 해당 node를 끊어 공유 데이터의 무결성을 보장.
(2) DRBD 구성
1. 주요 패키지 설치
# yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum -y install kmod-drbd84 drbd84-utils
* drbd 모듈 확인 (확인 되지 않을 경우 모듈로드)
# lsmod | grep drbd
# modprobe drbd
drbd 585395 0
libcrc32c 12644 2 drbd,nf_conntrack
2. DRBD 설정 (Active, Standby)
# vi /etc/drbd.conf
============================
global {
usage-count yes;
}
common {
syncer {
}
}
resource "r0" {
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}
on active.tyjung.site {
device /dev/drbd0;
disk /dev/xvda2;
address 192.168.0.100:7787;
meta-disk internal;
}
on standby.tyjung.site {
device /dev/drbd0;
disk /dev/xvda2;
address 192.168.0.101:7787;
meta-disk internal;
}
}
resource "r1" {
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}
on active.tyjung.site {
device /dev/drbd1;
disk /dev/xvdb1;
address 192.168.0.100:7788;
meta-disk internal;
}
on standby.tyjung.site {
device /dev/drbd1;
disk /dev/xvdb1;
address 192.168.0.101:7788;
meta-disk internal;
}
}
============================
3. DRBD Metadata 생성 (Active, Standby)
* metadata 생성전 DRBD 볼륨으로 사용할 공간은 파일 시스템이 생성되어 있지 않아야되며,
미리 파일시스템이 생성된 상태면 dd명령어를 이용하여 MBR 영역을 제거
# drbdadm create-md r0
# drbdadm create-md r1
--== Thank you for participating in the global usage survey ==--
The server's response is:
you are the 4215th user to install this version
initializing activity log
initializing bitmap (960 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
Success
# systemctl start drbd
# systemctl status drbd
● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager.
Loaded: loaded (/usr/lib/systemd/system/drbd.service; disabled; vendor preset: disabled)
Active: active (exited)
Process: 5530 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS)
Main PID: 5530 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/drbd.service
# cat /proc/drbd
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:84 nr:35276312 dw:35276400 dr:2193 al:11 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:17160 nr:32202748 dw:32219932 dr:3497 al:16 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
* 네트워크 상태
StandAlone : 리소스가 아직 연결되지 않았거나, 사용자가 drbdadm disconnect를 사용하여 연결을 끊었거나, 인증 실패 또는 스플릿 브레인과 같은 이유로 연결이 끊어져 네트워크 구성이 가능하지 않은 상태.
Disconnecting : 연결이 끊어지는 동안의 일시적인 상태
→ 다음 상태: StandAlone
Unconnected : 연결을 시도하기 전의 일시적인 상태
→ 다음 상태: Connecting 또는 Connected.
Timeout : 상대 노드와의 통신 시간 초과에 따른 일시적인 상태
→ 다음 상태: Unconnected
BrokenPipe : 상대 노드와의 연결이 끊어진 후 일시적으로 표시되는 상태
NetworkFailure : 상대 노드와의 연결이 끊어진 후 일시적으로 표시되는 상태
ProtocolError : 상대 노드와의 연결이 끊어진 후 일시적으로 표시되는 상태
→ 다음 상태: Unconnected
TearDown : 상대 노드가 연결 종료 중임을 나타내는 일시적인 상태
→ 다음 상태: Unconnected
Connecting : 상대 노드가 네트워크에서 확인 되기를 기다리고 있는 상태
Connected : TCP 연결이 설정되었으며, 상대 노드로부터 첫 번째 네트워크 패킷을 기다림
* 복제 상태 (Replication states)
Off : 상대노드와 연결이 끊어졌거나, 복제가 진행되지 않는 상태
Established : 정상적으로 연결된 상태, WDRBD 연결이 설정되었으며 데이터 미러링이 활성화된 상태
WFConnection : 해당 노드가 네트워크에 표시될 때까지 기다리고 있는 상태.
WFReportParams : TCP 연결 설정이 정상적으로 되었으며, 해당 노드에서 네트워크 패킷을 기다리고 있는 상태.
SyncSource : 로컬 노드가 소스이고, 동기화가 진행 중인 상태
SyncTarget : 로컬 노드가 타겟이고, 동기화가 진행 중인 상태
VerifyS : 로컬 노드가 소스이고, On-line 디바이스 검증이 실행 중
VerifyT : 로컬 노드가 타겟이고, On-line 디바이스 검증이 실행 중
PausedSyncS : 로컬 노드가 소스이고, 다른 동기화 작업 완료에 대한 의존성 또는 수동 명령 (drbdadm pause-sync)에 의해 동기화가 일시 정지된 상태
PausedSyncT : 로컬 노드가 타겟이고, 다른 동기화 작업 완료에 대한 의존성 또는 수동 명령 (drbdadm pause-sync)에 의해 동기화가 일시 정지된 상태
Ahead : 로컬노드가 네트워크 혼잡상태에 도달하여 복제데이터를 전송할 수 없는 상태
→ (상대노드로 OOS Info 전송
Behind : 상대노드가 네트워크 혼잡상태에 도달하여 복제데이터를 수신할 수 없는 상태
→ 이후 SyncTarget 상태로 전환
* 디스크 상태(disk state)
Diskless : 디바이스가 드라이버에 할당되어 있지 않은 상태입니다. 리소스 디바이스에 부착된 적이 없거나, drbdadm detach <resource> 명령으로 수동 분리되었거나, lower-level I/O 오류 후에 자동으로 분리된 경우 이 상태가 됩니다.
Attaching : 메타 데이터를 읽는 동안의 일시적인 상태입니다.
Failed : 디바이스의 I/O 실패 보고에 따른 일시적인 상태입니다.
→ 다음 상태 : Diskless
Negotiating : 이미 연결된 WDRBD 디바이스에서 Attach 가 실행되었을 때, 디스크는 일시적으로 이 상태가 됩니다.
Inconsistent : 데이터의 불일치 상태입니다. 새로운 리소스를 구성했을 경우 양 노드의 상태이며, 동기화 중인 타겟 노드의 디스크 상태입니다.
Outdated : 리소스의 데이터가 일치하지만, 업데이트가 오래된 상태 입니다.
Dunknown : 네트워크 연결을 사용할 수 없는 경우, 원격 디스크의 상태를 표시하기 위해 사용됩니다.
Consistent : 노드가 연결되지 않았지만, 데이터는 일치한 상태입니다. 연결이 완료되면, UpToDate 인지 Outdated인지 결정됩니다.
UpToDate : 데이터가 일치하고, up-to-date 상태입니다. 이는 정상 상태입니다.
4. Primary 지정 및 파일시스템 생성 (Active)
# drbdadm primary --force r0
# drbdadm primary --force r1
# mkfs.ext4 /dev/drbd0
# mkfs.ext4 /dev/drbd1
# mount /dev/drbd0 /home
# mount /dev/drbd1 /home2
/dev/drbd0 ext4 33G 49M 31G 1% /home
/dev/drbd1 ext4 30G 45M 28G 1% /home2
5. DRBD Test
* DRBD 구성된 파티션에 아래와 같은 데이터 존재
[active.tyjung.site]
# umount /dev/drbd0
# umount /dev/drbd1
# drbdadm secondary r0
# drbdadm secondary r1
[standby.tyjung.site]
# drbdadm primary r0
# drbdadm primary r1
# mount /dev/drbd0 /home
# mount /dev/drbd1 /home2
# cd /home2; ls -al
(3) APACHE, MYSQL 설정
1. 설정파일 이동
양쪽 서버의 설정이 동일해야 하는 설정들은 drbd 구성한 파티션으로 이동
* apache 설정파일
* mysql data
* my.cnf
* php.ini
2. 각 설정 파일 링크
# ln -s /home2/APACHE_CONF /usr/local/httpd2/conf
# ln -s /home2/MYSQL_DATA /usr/local/mysql/data
# ln -s /home2/my.cnf /etc/my.cnf
# ln -s /home2/php.ini /usr/local/lib/php.ini
3. apache 설정
# vi /usr/local/httpd2/conf/vhosts.conf
===============================
<VirtualHost *:80>
ServerAdmin test@tyjung.site
DocumentRoot /home/tyjung.site/docs
ServerName tyjung.site
CustomLog logs/tyjung.site-access_log combined
ErrorLog logs/tyjung.site-error_log
</VirtualHost>
===============================
# vi /home/tyjung.site/docs/index.php
===============================
<?php
$db_host = "localhost";
$db_user = "tyjung";
$db_passwd = "tyjung$!$@";
$db_name = "tyjung";
$db_conn = mysqli_connect($db_host,$db_user,$db_passwd,$db_name);
if(!$db_conn)
echo "Mysql Session Connect Fail!!!!!";
else
echo "This is tyjung.site DRBD Testing Server. Mysql connect success";
?>
===============================
4. mysql 설정
mysql ((none))>create database hkchoi;
Query OK, 1 row affected (0.01 sec)
mysql ((none))>grant all privileges on tyjung.* to tyjung@localhost identified by 'tyjung$!$@';
Query OK, 0 rows affected (0.00 sec)
mysql ((none))>flush privileges;
Query OK, 0 rows affected (0.00 sec)
(4) pcs resource 생성
CIB(Cluster Information Base) : Raw xml 에 우선 설정을 저장 후 업데이트 하는 방식으로 진행
# pcs cluster cib drbd_cfg
→ 'drbd_cfg' 파일을 cib 형식으로 생성.
# pcs -f drbd_cfg resource create Data1 ocf:linbit:drbd drbd_resource=r0 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
→ “drbd r0” 리소스의 대한 설정으로 Primary/Secondary가 변경이 된다.
# pcs -f drbd_cfg resource create Data2 ocf:linbit:drbd drbd_resource=r1 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
→ “drbd r1” 리소스의 대한 설정으로 Primary/Secondary가 변경이 된다.
# pcs -f drbd_cfg resource master DataSync1 Data1 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
# pcs -f drbd_cfg resource master DataSync2 Data2 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
→ Data1, Data2 각 리소스의 Master / Slave 구성 제약조건.
=================================================
→ 각 [Data1], [Data2] Resource에 대한 제약 조건.
ex) pcs resource master [<master/slave id>] <resource id | group id> [options]
- master-max = 1
마스터로 승격시킬 수있는 자원의 매수
- master-node-max = 1
하나의 노드에서 마스터로 승격시킬 수있는 자원의 매수
- clone-max = 2
시작할 리소스 복사본 수로, 기본값은 클러스터의 노드 수
- clone-node-max = 1
단일 노드에서 시작할 수 있는 리소스 복사본 수
- notify = true
복사본을 중지하거나 시작할때 모든 복사본을 미리 알리고, 작업 성공시 알려준다.
=================================================
# pcs -f drbd_cfg resource create storage1 ocf:heartbeat:Filesystem device="/dev/drbd0" directory="/home" fstype="ext4"
# pcs -f drbd_cfg resource create storage2 ocf:heartbeat:Filesystem device="/dev/drbd1" directory="/home2" fstype="ext4"
→ drbd 파티션과 파일시스템을 지정하여 mount 시키는 리소스로, 노드별로 Master 노드에 마운트 시킨다.
# pcs -f drbd_cfg resource create VirtualIP ocf:heartbeat:IPaddr2 ip=121.254.171.254 cidr_netmask=32 nic=eth0:1 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
→ VIP에 대한 Resource 설정.
# pcs -f drbd_cfg resource create Apache lsb:apache op monitor timeout="30s" interval="20s" role="Master" op monitor timeout="30s" interval="10s" role="Slave"
=================================================
→ /etc/init.d/ 경로에 아래와 같은 스크립트 작성
#!/bin/sh
case "$1" in
start)
echo -n "Starting apahce: "
/usr/local/httpd2/bin/apachectl start
;;
stop)
echo -n "Shutting down apache"
/usr/local/httpd2/bin/apachectl stop
;;
*)
echo "Usage: $0 {start|stop}"
esac
exit 0
=================================================
# pcs -f drbd_cfg resource create Mysql lsb:mysql.server op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s
# pcs -f drbd_cfg resource group add HA-GROUP VirtualIP storage1 storage2 Apache Mysql
→ HA-GROUP에 VIP, DRBD mount, Apache, Mysql 순서대로 구동되도록 그룹화.
# pcs -f drbd_cfg constraint colocation add HA-GROUP DataSync1 INFINITY with-rsc-role=Master
# pcs -f drbd_cfg constraint colocation add HA-GROUP DataSync2 INFINITY with-rsc-role=Master
→ HA-GROUP & DataSync 리소스의 Master 가 공통된 Master 에서 실행되도록 설정.
# pcs -f drbd_cfg constraint order promote DataSync1 then start storage1
→ DataSync1 리소스가 실행된 후 storge1 리소스 (/dev/drbd0 mount) 실행
# pcs -f drbd_cfg constraint order promote DataSync2 then start storage2
→ DataSync2 리소스가 실행된 후 storge2 리소스 (/dev/drbd1 mount) 실행
(5) 리소스 확인
# pcs status
Online: [ standby ]
OFFLINE: [ active ]
Full list of resources:
Master/Slave Set: DataSync1 [Data1]
Masters: [ standby ]
Stopped: [ active ]
Master/Slave Set: DataSync2 [Data2]
Masters: [ standby ]
Stopped: [ active ]
Resource Group: HA-GROUP
VirtualIP (ocf::heartbeat:IPaddr2): Started standby
storage1 (ocf::heartbeat:Filesystem): Started standby
storage2 (ocf::heartbeat:Filesystem): Started standby
Apache (lsb:apache): Started standby
Mysql (lsb:mysql.server): Started standby
'서버 이중화 > Pacemaker' 카테고리의 다른 글
[CentOS 7 / Pacemaker] LVS 서버 구축 및 테스트 (0) | 2022.08.19 |
---|