[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)

# Pacemaker를 이용한 HA-Proxy 이중화 구성

> KVM 가상화를 이용한 MASTER / SLAVE 구성을 다룬다.

# 구성 환경

- KVM Virtual Machine
- CentOS 7
- Pacemaker / Corosync
- Heartbeat Network


## Overview

![ha_proxy](./images/ha-proxy.png)


## Pacemaker 설치 및 구성

Pacemaker는 Heartbeat Network으로 구성되기 때문에 다음과 같이 `/etc/hosts` 파일에 IP를 설정한다.

```bash
# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.200.233 haproxy-master
192.168.200.234 haproxy-slave
```

아래와 같이 모든 Node에 Pacemaker 패키지를 설치한다.

```bash
[ALL]# yum install pcs fence-agents-all
```

> 위의 패키지는 CentOS 기본(Base) 패키지에서 제공한다.

설치를 마무리 한다.

```bash
[ALL]# systemctl start pcsd; systemctl enable pcsd

[ALL]# echo 패스워드 | passwd --stdin hacluster
[MASTER]# pcs cluster auth haproxy-master haproxy-slave

[MASTER]# pcs cluster setup --start --name L4 haproxy-master haproxy-slave
[MASTER]# pcs cluster enable --all
[MASTER]# pcs property set stonith-enabled=false
[MASTER]# pcs property set no-quorum-policy=ignore
```

`!중요` : 클러스터 Quorum 및 Fencing 설정

> 다음의 클러스터 구성은 2 Node로 구성되기 때문에 정족수(Quorum) 설정을 비활성화하여야 한다. 또한 Fence Device(IPMI 등)가 구성되지 않은 경우에도 설정(stonith)을 비활성화 해야 한다. 만약 `이 설정이 무시될 경우 클러스터가 구성되지 않는다.`


## 클러스터 리소스 구성 및 용도

* [ ]  서비스 / Private VIP 리소스 구성 => **서비스 VIP 사용**
* [ ]  HA-PROXY 설치 및 리소스 구성 => **Load Balancer 서비스**
* [ ]  Memcached 설치 및 리소스 구성 => **WEB Session Store 서비스**
* [ ]  클러스터 제약조건 설정


## 서비스 / Private VIP 구성

```bash
[MASTER]# pcs resource create PU-VIP IPaddr2 ip=61.100.0.XX cidr_netmask=32 nic=eth0 op monitor interval=10s timeout=30s on-fail=standby
[MASTER]# pcs resource create PR-VIP IPaddr2 ip=172.24.0.XX cidr_netmask=32 nic=eth1 op monitor interval=10s timeout=30s on-fail=standby
```

> `서비스 VIP(61.100.0.XX)를 설정`하고, 시스템의 nic는 eth0, 모니터링 주기는 10초, 최종 timeout은 30초로 설정한다. 만약 현재 Owner의 장애가 발생하면, Standby로 Role을 이관한다.


## HA-PROXY 설치 및 리소스 구성

```bash
[ALL]# yum install haproxy
```

`!중요` : haproxy 데몬은 pacemaker가 제어해야하기 때문에 리부팅 후 실행되지않게 비활성처리가 되어야 함

```bash
[ALL]# systemctl disable haproxy
```

다음과 같이 클러스터 리소스로 haproxy 데몬을 등록한다.

```bash
[MASTER]# pcs resource create HAPROXY systemd:haproxy
```


## Memcached 설치 및 리소스 구성

```bash
[ALL]# yum install memcached
```

`!중요` : memcached 데몬은 pacemaker가 제어해야하기 때문에 리부팅 후 실행되지않게 비활성처리가 되어야 함

```bash
[ALL]# systemctl disable memcached
```

다음과 같이 클러스터 리소스로 haproxy 데몬을 등록한다.

```bash
[MASTER]# pcs resource create HAPROXY systemd:memcached
```

## 클러스터 제약조건 설정

> 위와 같이 서비스가 등록되면, MASTER / SLVAE의 구분없이, 서로 리소스를 실행하려고 한다.


- 클러스터 리소스 시작순서 설정

* [ **STEP 1** ] : 서비스 Public IP / Private IP 실행

```bash
[MASTER]# pcs constraint order start PU-VIP then start PR-VIP
```
> PU(Public IP)-VIP 리소스를 실행한 후 PR-VIP 리소스를 실행한다.

* [ **STEP 2** ] : Private IP / HA-PROXY 실행

```bash
[MASTER]# pcs constraint order start PR-VIP then start HAPROXY
```
> PR(Private IP)-VIP 리소스를 실행한 후 HAPROXY 리소스를 실행한다.

* [ **STEP 3** ] : Memcached를 실행

```bash
[MASTER]# pcs constraint order start HAPROXY then start MEMCACHED
```

* [ **STEP 4** ] : 중요 클러스터 리소스의 우선순위 설정

```bash
[MASTER]# pcs constraint colocation add PU-VIP with PR-VIP
[MASTER]# pcs constraint colocation add PR-VIP with HAPROXY
[MASTER]# pcs constraint colocation add HAPROXY with MEMCACHED
```
> 이 설정은 클러스터의 모든 리소스가 Owner Node에서 실행됨을 의미한다.


## 클러스터 구성내역

```bash
# pcs status
Cluster name: L4
Stack: corosync
Current DC: haproxy-master (version 1.1.20-5.el7_7.2-3c4c782f70) - partition with quorum
Last updated: Tue Mar  2 10:47:58 2021
Last change: Wed Feb  3 04:51:30 2021 by root via crm_resource on haproxy-master

2 nodes configured
4 resources configured

Online: [ haproxy-master haproxy-slave ]

Full list of resources:

 PU-VIP (ocf::heartbeat:IPaddr2):       Started haproxy-master
 PR-VIP (ocf::heartbeat:IPaddr2):       Started haproxy-master
 HAPROXY        (systemd:haproxy):      Started haproxy-master
 MEMCACHED      (systemd:memcached):    Started haproxy-master

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

```

다음은 리소스의 제약조건에 대한 결과이다.

```bash
# pcs resource --full
 Resource: PU-VIP (class=ocf provider=heartbeat type=IPaddr2)
  Attributes: cidr_netmask=32 ip=61.100.0.XX nic=eth0
  Operations: monitor interval=10s on-fail=standby timeout=30s (PU-VIP-monitor-interval-10s)
              start interval=0s timeout=20s (PU-VIP-start-interval-0s)
              stop interval=0s timeout=20s (PU-VIP-stop-interval-0s)
 Resource: PR-VIP (class=ocf provider=heartbeat type=IPaddr2)
  Attributes: cidr_netmask=32 ip=192.168.200.XX nic=eth1
  Operations: monitor interval=10s on-fail=standby timeout=30s (PR-VIP-monitor-interval-10s)
              start interval=0s timeout=20s (PR-VIP-start-interval-0s)
              stop interval=0s timeout=20s (PR-VIP-stop-interval-0s)
 Resource: HAPROXY (class=systemd type=haproxy)
  Operations: monitor interval=60 timeout=100 (HAPROXY-monitor-interval-60)
              start interval=0s timeout=100 (HAPROXY-start-interval-0s)
              stop interval=0s timeout=100 (HAPROXY-stop-interval-0s)
 Resource: MEMCACHED (class=systemd type=memcached)
  Operations: monitor interval=60 timeout=100 (MEMCACHED-monitor-interval-60)
              start interval=0s timeout=100 (MEMCACHED-start-interval-0s)
              stop interval=0s timeout=100 (MEMCACHED-stop-interval-0s)
```

# 클러스터 관리명령

* [ ]  클러스터 리소스 CleanUP 수행

클러스터에 에러가 발생할 경우 다음과 같이 `CleanUP`을 수행해야 처리할수 있다.

```bash
[OWNER]# pcs resource cleanup 리소스명
```

단, 시스템 구성이나 데몬에 이상이 발생되면, 에러는 Fix되지 않고 계속 발생될 것이다. 이는 기 발생된 에러에 대한 CleanUP 처리이다.

* [ ]  클러스터 리소스 Relocate 수행

현재 운용되는 클러스터의 유지보수로 인해 Slave Node로의 `On-demand 절체(relocate)`를 수행할 수 있다.

```bash
[OWNER]# pcs resource relocate 리소스명
```