본문 바로가기
open source solution

DRBD+pacemaker HA구성 centos 7.x

by open_tracking 2019. 8. 9.

 

 

주의

첫번째 노드, 두번째 모두 둘 다는 명령어가 일반 검정색

한쪽에만 해줄 경우 명령어가 빨간색

 

Centos 7 Pacemaker + DRBD + mariaDB 10.2

 

설치 항목에서 인프라 서버 + 개발용도구 체크

파일 시스템 ext4 / 이중화할 데이터 공간은 파티션 만들지 말고 비워둘 것.

 

아이피 설정은 생략합니다.

# setenforce 0

1. hostname 설정

# hostnamectl set-hostname node1  << 노드 1번에 해주시고

# hostnamectl set-hostname node2  << 노드 2번에 해줍니다.

 

2. 호스트 파일 설정

# vi /etc/hosts

           192.168.130.110            node1

           192.168.130.120            node2

3. 필요한 패키지 설치 (iso이미지에 yum 로컬 repo 설정하셔야 함. 별첨 참조)

# yum install -y pacemaker pcs fence-agents-all psmisc policycoreutils-python

# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

# yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

# yum install -y drbd84-utils kmod-drbd84

 

 

 

 

 

 

 

# mv apache-tomcat-8.5.34.tar.gz /root    (해당 파일 경로가 있는 곳에서 )

# cd /root

# tar xvfz apache-tomcat-8.5.34.tar.gz

톰캣 관련 환경 변수 설정

vi /etc/profile (최하단에 추가)

# tomcat

export CATALINA_HOME=/data/tomcat8.5

# java

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre

4. 방화벽 설정

           # firewall-cmd --permanent --add-service=high-availability

# firewall-cmd --permanent --zone=public --add-port=8443/tcp

# firewall-cmd --permanent --zone=public --add-port=7789/tcp

# firewall-cmd --permanent --zone=public --add-port=3306/tcp

# firewall-cmd --reload

( 사용자 요청사항에 따라 달라 질 수 있음 )

5. DRBD모듈

# modprobe drbd

# lsmod | grep drbd  (확인작업)

drbd                  405309  0

libcrc32c              12644  2 xfs,drbd

 

6. DRBD 설정

           # vi /etc/drbd.d/clusterdata.res

resource "clusterdata" {

          protocol C;

     startup {

          wfc-timeout       0;

degr-wfc-timeout  120;   

     }

     disk {

        on-io-error detach;

        resync-rate 300M;

     }

    net {

        timeout             60;    

        connect-int         10;    

        ping-int            10;

max-buffers         20000;

        unplug-watermark    20000;

        max-epoch-size      20000;

    }

on node1 {

        device /dev/drbd0;

        disk /dev/sdb1;

        address 100.100.10.201:7789;

        meta-disk internal;

    }

on node2 {

        device /dev/drbd0;

        disk /dev/sdb1;

        address 100.100.10.202:7789;

        meta-disk internal;

    }

}

7. 파티션 설정

           7-1 MBR 파티션 일 경우.

아래 작업은 MBR파티션이고 시작 시 /data로 쓸 공간이 OS 설치시 비워 있을 때 입니다.

                      예를들어 500GB/data 영역으로 사용시 해당 용량 만큼 (넉넉히 501GB이상)남기고

OS설치시 할당하지 않고 남겨놔야 합니다.

# fdisk /dev/sdb (디스크에 따라 달라질 수 있음)

                      적절하게 sdb1으로 설정.

           7-2 GPT 파티션 일 경우.

아래 작업은 GPT파티션이고 시작 시 /data로 쓸 공간을 OS 설치시 비워 있을 때 입니다.

세부 설명은 위와 같으며 아래 예를 들어 설명 하겠습니다.

# parted

GNU Parted 3.1

Using /dev/sda

Welcome to GNU Parted! Type 'help' to view a list of commands.

# (parted) p

Model: Msft Virtual Disk (scsi)

Disk /dev/sda: 37.6GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system     Name                  Flags

 1      1049kB  525MB   524MB   fat16           EFI System Partition  boot

 2      525MB   1050MB  524MB   xfs

 3      1050MB  22.5GB  21.5GB  xfs

 4      22.5GB  24.7GB  2147MB  linux-swap(v1)

                      # (parted) unit GB                     // 최소용량 단위 설정

                      예를 들면 아래처럼 합니다. 저는 5GB만 하겠습니다. (pc용량이 부족해서..)

# (parted) mkpart

Partition name?  []?

File system type?  [ext2]? xfs

Start? 30.0GB

End? 35.0GB

# (parted) p

Model: Msft Virtual Disk (scsi)

Disk /dev/sda: 37.6GB

Sector size (logical/physical): 512B/4096B

Partition Table: gpt

Disk Flags:

 

Number  Start   End     Size    File system     Name                  Flags

                     1      0.00GB  0.53GB  0.52GB  fat16           EFI System Partition  boot

                     2      0.53GB  1.05GB  0.52GB  xfs

                     3      1.05GB  22.5GB  21.5GB  xfs

                     4      22.5GB  24.7GB  2.15GB  linux-swap(v1)

                     5      30.0GB  35.0GB  5.00GB

 

#(parted) q

 

8. DRBD 메타데이터 생성 및 동기화

 

# drbdadm create-md clusterdata

# systemctl start drbd

# drbdadm primary clusterdata                         <<마스터 로드에만

           # drbdadm primary clusterdata --force                          << 오류발생시 잠시 후 실행

                     0: State change failed: (-2) Need access to UpToDate data

                     위와 같은 오류가 뜰 때

                                # drbdadm up clusterdata

                                # drbdadm primary clusterdata --force

# watch cat /proc/drbd                           (100%까지 차는 거 보시고 진행하세요)

동기화 다 되면 아래에 사항들 진행할 것.

# mkfs.xfs /dev/drbd0                                                         <<마스터 로드에만

만약 운영체제가 ext4라면 xfs대신 ext4 사용할 것.

, ext4, xfs는 되는데 ext3는 안되더라구요;;; 나머지 파티션에 대해 확인 안됬습니다.

# mkdir /data

# mount /dev/drbd0 /data                                                   <<마스터 노드에서만

 

9. Mariadb설치

           # vi /etc/my.cnf

 

           [client]

default-character-set           = utf8

socket                          = /data/mysql/mysql.sock

 

[mysql]

default-character-set           = utf8

 

[mysqld]

character-set-server            = utf8

collation-server                = utf8_general_ci

datadir                         = /data/mysql

socket                          = /data/mysql/mysql.sock

 

[mysqldump]

default-character-set           = utf8

 

          

# cp -rfp /var/lib/mysql /data/mysql                 <<마스터 로드에만

# mv /var/lib/mysql /var/lib/mysql.back             <<마스터 로드에만

# ln -sf /data/mysql /var/lib/mysql                   <<마스터 로드에만

          

# mysql_install_db --datadir=/data/mysql                                            <<마스터 로드에만

# systemctl start mariadb                                                                          <<마스터 로드에만

(실패시 chown -R mysql.mysql /data/mysql/ 적용)          

# mysqladmin -u root password '설정하실패스워드'                                           <<마스터 로드에만

< mysql 접속하셔서 잘 접속되는지 확인하시는 것을 권장 드립니다.>

 

# systemctl stop mariadb                                              <<마스터 로드에만

# umount /data                                                           <<마스터 로드에만

# drbdadm secondary all                                               << 현 마스터 로드

 

슬레이브였던 노드에서 해야 할 작업

# drbd-overview                                          << 슬레이브였던 노드 (즉 node2)

0:clusterdata/0  Connected Secondary /Secondary UpToDate/UpToDate 되어 있다면

 

# drbdadm primary clusterdata                        << 슬레이브였던 노드 (즉 node2)

# mount /dev/drbd0 /data                              << 슬레이브였던 노드 (즉 node2)

# drbd-overview                                           << 슬레이브였던 노드 (즉 node2)

0:clusterdata/0  Connected Primary/Secondary UpToDate/UpToDate /data xfs 1017M 290M 727M 29%

위와 유사하게 나와야 합니다. %는 달라도 무관

 

# mv /var/lib/mysql /var/lib/mysql.back

# ln -sf /data/mysql /var/lib/mysql

 

# systemctl start mysql

           <접속 잘 되시는 지 확인>

 

#systemctl stop mysql

다시 슬레이브 마스터 위치를 변경 합니다.

           # systemctl stop drbd                                    << node2

           # systemctl start drbd                                    << node2

           # drbdadm primary all                                   << node1

           # mount /dev/drbd0 /data                              << node1

           # drbd-overview                                           << node1

           노드 1번에서 primary되있고 data가 뜨는지 확인

10. 이중화에 앞서 몇가지 주의 사항 (두 노드 둘다 입니다.)

           # systemctl disable mariadb

           # systemctl stop mariadb

           # systemctl disable mysql

( mysql이 등록되있는지 모르겠는데 자동으로 그것도 chkconfig에 등록이 되어있더라구요.
확인하고 등록이 안 되 있다면 생략 가능합니다.)

11. 추가사항 톰켓

# mv apache-tomcat-8.5.34 /data/tomcat8.5                     <<마스터 로드에서만

# vi /usr/lib/systemd/system/tomcat.service

[Unit]

Description=Apache Tomcat Web Application Container

After=syslog.target network.target

 

[Service]

Type=forking

 

Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre"

Environment="CATALINA_PID=/data/tomcat8.5/temp/tomcat.pid"

Environment="CATALINA_HOME=/data/tomcat8.5"

Environment="CATALINA_BASE=/data/tomcat8.5"

Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

 

ExecStart=/data/tomcat8.5/bin/startup.sh

ExecStop=/data/tomcat8.5/bin/shutdown.sh

 

User=root

Group=root

UMask=0007

RestartSec=10

Restart=always

 

find[Install]

WantedBy=multi-user.target

 

12. PCS 클러스터 핵심 셋팅 ( 빨간 색은 마스터 로드만 해주세요 )

# echo "설정하실패스워드" | passwd --stdin hacluster

# systemctl enable drbd

# systemctl start drbd

# systemctl start pcsd

# systemctl enable pcsd

# pcs cluster auth node1 node2 -u hacluster                        <<마스터 로드에만

# pcs cluster setup --name FileCluster node1 node2                    <<마스터 로드에만

# pcs cluster start –-all                                                          <<마스터 로드에만

                     오류가 뜬다면 각각 로드에 pcs cluster start 해주기

 

# pcs cluster enable –-all                                                       <<마스터 로드에만

           마찬가지 오류가 뜬다면 각각 노드에 pcs cluster enable

 

 

# pcs property set stonith-enabled=false                                    <<마스터 로드에만

# pcs property set no-quorum-policy=ignore                               <<마스터 로드에만

# pcs property set default-resource-stickiness="INFINITY"                <<마스터 로드에만

# pcs status                                                                      <<마스터 로드에만

 

# pcs cluster cib drbd_cfg

# pcs -f drbd_cfg resource create Data ocf:linbit:drbd drbd_resource=clusterdata op monitor timeout="30s" interval="20s" role="Slave" op monitor timeout="30s" interval="10s" role="Master"

 

# pcs -f drbd_cfg resource master DataSync Data master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

 

# pcs -f drbd_cfg resource create storage Filesystem device="/dev/drbd0" directory="/data" fstype="xfs" 

<< 8번 에서 xfs확장자 아니시고 다른거 하셨다면 바꾸셔야 해요

 

# pcs -f drbd_cfg resource create vip ocf:heartbeat:IPaddr2 ip="192.168.137.100" cidr_netmask="32" op monitor timeout="30s" interval="20s" role="Slave" op monitor timeout="30s" interval="10s" role="Master"

 

# pcs -f drbd_cfg resource create DBmaria ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" socket="/var/lib/mysql/mysql.sock" config="/etc/my.cnf" datadir="/data/mysql" op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s

          

# pcs -f drbd_cfg resource create tomcat8 systemd:tomcat java_home="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/" catalina_home="/data/tomcat8.5" tomcat_user="root" op monitor timeout="30s" interval="20s" role="Slave" op monitor timeout="30s" interval="10s" role="Master"

 

( ocf:heartbeat일 경우

pcs -f drbd_cfg resource create tomcat7 ocf:heartbeat:tomcat java_home="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/jre/" catalina_home="/usr/share/tomcat" tomcat_user="tomcat" op monitor timeout="60s" interval="20s"

톰켓을 ocf:heeartbeat로 한다면 wget 패키지 설치 필요

)

 

# pcs -f drbd_cfg resource group add p-group vip storage DBmaria tomcat8

# pcs -f drbd_cfg constraint colocation add p-group DataSync INFINITY with-rsc-role=Master

# pcs -f drbd_cfg constraint order promote DataSync then start storage

# pcs cluster cib-push drbd_cfg

 

CIB updated

 pcs

# pcs property set stonith-enabled=false                                  (필 수 작 업)

# crontab -e

* * * * * /usr/sbin/crm_resource -R

 

13. fail-over test

# pcs cluster stop node1                                                      <<1번 노드에서

node1: Stopping Cluster (pacemaker)...

node1: Stopping Cluster (corosync)...

 

상태 체크

# pcs status                                                                      <<2번 노드에서

13-1. 마스터 노드 service 하나만 죽여보는 작업                  

# kill -9 [죽일 프로세스]

# watch netstat -antp

1분안에 해당 service 포트가 올라오면 성공

( 톰캣하고 mariadbfailover가 안되는 문제를 crontab으로 리소스 체크로 명령어 1분마다

실행 하는 것으로 해결 하였습니다.)

 

14. selinux 설정

vi /etc/selinux/config

항목에서 slave부터 설정 시작!

 

slave enforcing 설정 후 (현재 slave node2 라고 가정합니다.)

slave 재부팅 합니다.

 

# [root@node2 ~] pcs status

Online: [ node1 node2 ]

 

Full list of resources:

 

 Master/Slave Set: DataSync [Data]

     Masters: [ node1 ]

     Slaves: [ node2 ]

 Resource Group: p-group

     vip        (ocf::heartbeat:IPaddr2):       Started node1

     storage    (ocf::heartbeat:Filesystem):    Started node1

     DBmaria    (ocf::heartbeat:mysql):    Started node1

     tomcat8    (systemd:tomcat):       Started node1

 

 이렇게 써 있다면 node2가 슬레이브 입니다.

# [root@node2 ~] semanage permissive -a drbd_t

# [root@node2 ~] semanage permissive -a cluster_t

# [root@node2 ~] semanage permissive -a mysqld_t

# [root@node2 ~] semanage permissive -a kernel_t   

# [root@node1 ~] pcs cluster stop

 이렇게 되면 node2 는 현재 selinux enforcing 상태이고

# [root@node2 ~] pcs status

Master/Slave Set: DataSync [Data]

     Masters: [ node1 ]

     Slaves: [ node2 ]

 Resource Group: p-group

     vip        (ocf::heartbeat:IPaddr2):       Started node2

     storage    (ocf::heartbeat:Filesystem):    Started node2

     DBmaria    (ocf::heartbeat:mysql):    stop

     tomcat8    (systemd:tomcat):       stop

위와 같은 상태가 되어있을 겁니다. (아니면 전부 잘 올라올 수도 있습니다. )

 

# [root@node2 ~] semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"

# [root@node2 ~] restorecon -Rv /data/mysql

# [root@node2 ~] ll -aZ /var/lib/mysql

           위 명령어로 보았을 때 mysqld_db_t 가 안 들어가 있다면

           아래 2가지 항목을 추가 입력이 필요합니다.

# [root@node2 ~] semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?"

# [root@node2 ~] restorecon -Rv /data/mysql

          

# [root@node1 ~] pcs cluster start

 

 

node1selinuxenforcing 설정 후 재부팅 합니다.

# [root@node1 ~] semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"

# [root@node1 ~] restorecon -Rv /data/mysql

# [root@node1 ~] ll -aZ /var/lib/mysql

           위 명령어로 보았을 때 mysqld_db_t 가 안 들어가 있다면

           아래 2가지 항목을 추가 입력이 필요합니다.

# [root@node1 ~] semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?"

# [root@node1 ~] restorecon -Rv /data/mysql

# [root@node2 ~] pcs cluster stop

# [root@node1 ~] pcs status

Online: [ node1 node2 ]

 

Full list of resources:

 

 Master/Slave Set: DataSync [Data]

     Masters: [ node1 ]

     Slaves: [ node2 ]

 

 Resource Group: p-group

     vip        (ocf::heartbeat:IPaddr2):       Started node1

     storage    (ocf::heartbeat:Filesystem):    Started node1

     DBmaria    (ocf::heartbeat:mysql):    Started node1

     tomcat8    (systemd:tomcat):       Started node1

 

 

 

+ 추가사항

두 노드에서 # ll -aZ /var/lib/mysql 보았을 때

lrwxrwxrwx. mysql mysql system_u:object_r:mysqld_db_t:s0

두 노드에서 # ll -aZ /data/mysql/보았을 때

lrwxrwxrwx. mysql mysql system_u:object_r:mysqld_db_t:s0 (mysql.sock 제외)

 

이렇게 안나와있으면 다른 부분의 것을 고쳐줘야 합니다.

첫번째 mysql mysql 이 아니고 root root 일때

chown -R mysql:mysql /var/lib/mysql

chown -R mysql:mysql /data/mysql

두번째 system_u:object_r:mysqld_db_t:s0 중에 system_u 가 아닐때 (경로는 아닌 경로에 맞게 설정해주세요)

chcon -u system_u "/var/lib/mysql"

restorecon -vF /var/lib/mysql

세번째는 mysqld_db_t 가 아닐때 처음 소개한 내용과 중복됩니다만 (경로는 아닌 경로에 맞게 설정해주세요)

semanage fcontext -a -t mysqld_t "/data/mysql(/.*)?"

restorecon -Rv /data/mysql

이제 두 노드의 패키지 관련 selinux 설정이 끝났습니다.

밑에 설정은 두개의 노드에 모두 적용해주시면 되겠습니다.

# setsebool secure_mode_policyload=1

# getsebool -a |grep secure_mode_policyload

           secure_mode_policyload on 설정이 되어 있으면 됩니다.

 

 

 

예상되는 오류 조치사항

혹시 # drbd-overview에서 StandAlon 상태이면

drbd-overview 에서 primary /data가 마운트 된 곳이 마스터 입니다.

슬레이브 노드에서 (페기 절차)

# drbdadm secondary all

# drbdadm disconnect all

# drbdadm -- --discard-my-data connect all

 

마스터 노드에서 (동기화할 마스터 노드)

# drbdadm primary all

# drbdadm disconnect all

# drbdadm connect all

 

이렇게 하면 마스터에 동기화가 됩니다.

-------------------------------------------------------------------------------------------------------------------

PCS설정 잘못 했을때

 

pcs cluster stop --all

pcs cluster destroy --all

 

다시 PCS부분 셋팅

 



[별첨 1]

OS ISO CD마운트 방법와 로컬 repo설정 방법

# mkdir /cdrom

# mount /dev/cdrom /cdrom

 

# vi /etc/yum.repos.d/local.repo

[LocalRepo]

name=LocalRepository

baseurl=file:///cdrom

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

댓글