ubuntu 18.04 환경 오픈소스 이중화 구성 방법

ubuntu 18.04 환경 오픈소스 이중화 구성 방법

안녕하세요.


ubuntu18.04 server DRBD+pacemaker 로 구성하여


자주쓰는 mysql과 apache를 예를들어 실시간 이중화 구성방법을 작성하였습니다.





Ubuntu 18.04 server DRBD + Pacemaker HA구성

   주의

첫번째 노드두번째 모두  다는 해줘야하는 명령어가 일반 검정색

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

 

ubuntu server 18.04 기준입니다. (LTS버전이여서 패치가 2028년까지 제공됩니다.)

 

ubuntu18.04 Pacemaker + DRBD + mariaDB + apache

 

pacemaker 등록방법을 예시로 들기위해서 tomcat하고 mariadb  예시로 합니다. 

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

 

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

(node1 192.168.152.151, 172.20.20.151/ node2 192.168.152.152, 172.10.10.152)



1. hostname 설정

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

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


2. 호스트 파일 설정 (서버와 다이렉트로 연결된 네트웍 정보)

# vi /etc/hosts

           172.10.10.151            node1

           172.10.10.152            node2

hosts파일에 127.0.0.1 호스트이름  <<이런거 있음 지워주세요. localhost 용납돼요


3. 필요한 패키지 설치

# apt install -y pacemaker pcs drbd8-utils

# apt install -y mariadb-server apache2

 

 우분투에서 설치시 위와 같은 화면이 나옵니다.

저는 딱히 필요가 없어서 no config하겠습니다.


4. 방화벽 설정

# ufw allow 8443/tcp

# ufw allow 7789/tcp

# ufw allow 3306/tcp

# ufw allow 80/tcp

# ufw allow 2224/tcp



5. DRBD모듈

# modprobe drbd

# lsmod | grep drbd  (확인작업)

drbd                  364544  0

lru_cache                 16384  1 drbd

libcrc32c                   16384  3 nf_conntrack,drbd,raid456 


6. DRBD 설정

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

resource "clustertest" {

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 172.10.10.151:7789;

        meta-disk internal;

    }

on node2 {

        device /dev/drbd0;

        disk /dev/sdb1;

        address 172.10.10.151:7789;

        meta-disk internal;

    }

}


7. 파티션 설정

(저는 테스트를 위해서 용량 작게합니다. fdisk 생성하셔도 됩니다.)

# parted /dev/sdb

# (parted) mklabel gpt

# (parted) mkpart

Partition name?  []?

File system type?  [ext2]? ext4

Start? 0GB

End? 9.9GB

# (parted) p

Disk /dev/sdb: 10.7GB

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

Partition Table: gpt

Disk Flags:


Number  Start   End     Size    File system  Name  Flags

 1      17.4kB  9900MB  9900MB  ext4 

#(parted) q

 Information: You may need to update /etc/fstab.



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

# drbdadm create-md clustertest

# systemctl start drbd  (이건 빠르게 양쪽노드 해주세요)

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

      

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

위와 같은 오류가  

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

그래도 오류가 발생시 아래와 같이 (오류 안뜨면 다음으로 넘어가요)


drbdadm up clusterdata

drbdadm primary clustertest --force

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

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

동기화가 다되면 위와같이 보여집니다.

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

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

# mkdir /data

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

 


9. Mariadb 관련 (복잡할수있지만 중요하여 조금 길어요~)

 # vi /etc/mysql/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/ 적용)          

 # /usr/bin/mysql_secure_installation                                            <<마스터 로드에만

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

 이제 슬레이브 노드도 셋팅해야 합니다.

# [email protected]: systemctl stop mariadb                                                 <<마스터 로드에만

# [email protected]: umount /data                                                                 <<마스터 로드에만

# [email protected]: drbdadm secondary all                                                  <<  마스터 로드

 

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

# [email protected]: drbd-overview                                                 << 슬레이브였던 노드 ( node2)

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

# [email protected]: drbdadm primary clustertest                           << 슬레이브였던 노드 ( node2)

# [email protected]: mount /dev/drbd0 /data                                   << 슬레이브였던 노드 ( node2)

# [email protected]: drbd-overview                                                  << 슬레이브였던 노드 ( node2)

 

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

 

# [email protected]: mv /var/lib/mysql /var/lib/mysql.back

# [email protected]: ln -sf /data/mysql /var/lib/mysql

# [email protected]: systemctl start mariadb

           

<접속  되시는  확인>

#systemctl stop mysql

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

# [email protected]: systemctl stop mariadb

# [email protected]: umount /data

# [email protected]: drbdadm secondary all  


# [email protected]: drbd-overview                                         

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

# [email protected]: drbdadm primary clustertest                     

# [email protected]: mount /dev/drbd0 /data                             

# [email protected]: systemctl start mariadb

이제부터 DB이중화가 됩니다.

# [email protected]mysql -uroot -p

create databaes createbynode1;

분명 node1에서 만들었습니다슬레이브로 가서  만들어져 있는지 확인해봅시다.

# [email protected]: systemctl stop mariadb                                             

# [email protected]: umount /data                                                           

# [email protected]: drbdadm secondary all                                               

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

# [email protected]: drbdadm primary clustertest                      << 슬레이브였던 노드 ( node2)

# [email protected]: mount /dev/drbd0 /data                              << 슬레이브였던 노드 ( node2)

# [email protected]: drbd-overview                                            << 슬레이브였던 노드 ( node2)

# [email protected]: systemctl start mariadb

1번에서 생성했던 database 보이네요~

이제 다시 node1 가서 이번엔 apache 해보도록 하죠

# [email protected]: systemctl stop mariadb

# [email protected]: umount /data

# [email protected]: drbdadm secondary all  

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

# [email protected]: drbdadm primary clustertest                     

# [email protected]: mount /dev/drbd0 /data                             



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

# systemctl disable mariadb

# systemctl disable mysql

자동으로 올라오면 큰일 납니다부팅시 자동으로 올라오지 못하게 해주세요.
 (HA투입되는 모든  똑같이 해주세요 apache2 여기선 투입되니 똑같이 해주세요)


11. apache 셋팅

# [email protected]: cp -rfp /var/www/html /data/

# [email protected]: rm -rf /var/www/html

# [email protected]: ln -s /data/html /var/www/html

# [email protected]: systemctl stop apache2

# [email protected]: umount /data

# [email protected]: drbdadm secondary all  

슬레이브 노드 마스터 전환

# [email protected]: drbdadm primary clustertest                     

# [email protected]: mount /dev/drbd0 /data                             

# [email protected]: cp -rfp /var/www/html /data/

# [email protected]: rm -rf /var/www/html

# [email protected]: ln -s /data/html /var/www/html

# [email protected]: systemctl start apache2

웹페이지 node2 ip 접속되는지 확인  .

# [email protected]: systemctl stop apache2

# [email protected]: umount /data

# [email protected]: drbdadm secondary all  

다시 node1 마스터로 만들어 줍니다.(귀찮으시지만 실수하지 않기 위해서 이렇게 합니다.)

[email protected]: drbdadm primary clustertest

[email protected]: mount /dev/drbd0 /data 



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

양쪽 모두 /lib/systemd/system/corosync.service 경로에 Type부분 아래와 같이 수정합니다.

# passwd hacluster

  (원하시는 패스워드로 설정)

# systemctl enable 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 status                                                                            <<마스터 로드에만

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

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

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

 

# pcs cluster cib drbd_cfg

# pcs -f drbd_cfg resource create Data ocf:linbit:drbd drbd_resource=clustertest 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="ext4"  

# pcs -f drbd_cfg resource create vip ocf:heartbeat:IPaddr2 ip="192.168.150.150" 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/mysql/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 apache2 ocf:heartbeat:apache configfile="/etc/apache2/apache2.conf" op monitor timeout="30s" interval="20s" role="Slave" op monitor timeout="30s" interval="10s" role="Master"

  

# pcs -f drbd_cfg resource group add HA-GROUP vip storage DBmaria apache2

# pcs -f drbd_cfg constraint colocation add HA-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 status

양쪽 모두 아래를 등록해주세요

# crontab -e

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

# ip addr show 명령어로 보시면 마스터노드에서 ip ipaddr2 지정한게 올라옴을 볼수 있어요


node2  현재 마스터로 있습니다.

보시면 마스터에는 가상아이피로 설정한 150번이 올라와있습니다.

해당 ip 마스터만 가지게 됩니다.

따라서 서버셋팅할  서비스 IP  가상IP 설정 하시면 된다는 거죠.


13. fail-over test

마스터 노드 service 하나만 죽여보는 작업                  

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

# watch netstat -antp

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


아니면 pcs cluster stop 노드명 (마스터 노드를 내려보셔야 겠죠?)

(stop하신 뒤에  start 나중에 해주시구요둘다 stop하는 상황오지 않게..)



14. 예상되는 오류 조치사항 

혹시 # 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부분 셋팅(12 systemctl start pcsd 부터 하심되요)



15. 우분투 서버 특성으로 apparmor 걸리는 경우가 있습니다(selinux 같은 거라 보심되요)

# aa-status 명렁어로 참조하시고

/etc/apparmor.d/ 해당 경로에 가셔서 관련 패키지 들어가셔 보시면 이해가 될 겁니다.

개인적으로 selinux보다 심플합니다.





기타

  • 1.일부 서비스는 가상 ip로 서비스 데몬이 올라오도록 config를 수정해야 될 수도 있습니다.

  • 2.kill -9으로 죽이고 지켜보실 때 watch pcs status 로 1분정도 지켜보시는 걸 추천드려요.

  • 3.간단히 말해서 systemctl start로 시작할 수 있는건 모두 HA투입이 가능합니다.

최근엔  이러한 방식으로 오픈소스 IPSEC VPN인 strongswan HA구성 하였습니다.

(ipsec VPN은 client less가 가능해서…)

  • 1.주의사항으로 마스터 슬레이브 둘다 셧다운하면 아주 골치가 아파질 수 있습니다.
    꼭 구축하려는 곳에 가셔서 환경에 맞게 ip다 넣으시고 cluster cib-push 하시는걸 추천드려요..
    마지막 보시면 drbd_cfg라는 파일을 push하는데 해당 파일이 작성하신 경로에 있습니다그 파일에서
    수정하시고 cib-push로 바로 가셔도 되요.

  • 2.방화벽 설정 관련으로는 동기화 부분이 내부 이더넷 포트 1개 잡아서 하고 있습니다.
    해당 이더넷ip를 그냥 all 허용하는 심플한 방법도 있습니다.
    추가로 보통은 서버끼리 해당 이더넷끼리 랜선을 바로 연결하는데 겪어본 결과 일부 HP서버에서
    마스터 슬레이브 상태에 슬레이브가 꺼지면 해당 포트 링크가 down되서 마스터쪽 링크도 down이라서

마스터도 죽은줄 알고 둘다 죽는 문제가 있습니다.
그 문제는 중간에 스위칭허브를 두고 연결하여 상대서버가 죽었다고 해서 linkdown 되는 일이
없도록 했습니다.

  • 1.systemd 기반 pcs작성 예제

pcs -f drbd_cfg resource create 이름정하기 systemd:패키지이름 op monitor timeout="30s" interval="20s" role="Slave" op monitor timeout="30s" interval="10s" role="Master"

패키지 이름 항목에 openvpn이 될수도 있고 이름정하기 부분에 openvpn_server 라고 적고
할수 도 있습니다.
예시 2개를 써보자면 아래와 같습니다.


pcs -f drbd_cfg resource create openvpn_server systemd:[email protected] op monitor timeout="30s" interval="20s" role="Slave" op monitor timeout="30s" interval="10s" role="Master"


pcs -f drbd_cfg resource create docker_service systemd:docker op monitor timeout="30s" interval="20s" role="Slave" op monitor timeout="30s" interval="10s" role="Master"

  • 1.RHEL계열 7버전에서 자료 https://open-infra.tistory.com/7 (블로그 광고목적 아닙니다광고없어요)

  • 2.RHEL계열 8버전에서는 설치 방법과 셋팅 방법이 바뀝니다주의해주세요.


이번에 RHEL계얼 버전 다 치우면서 느낀 것인데..보안패치 짧은 곳에 셋팅하면 너무 고생 타이밍이 빨리 오는 것 같아서 우분투 18.04 LTS로 작성하였습니다.
최초 한번만 제대로 구성하면 fail over도 빨라서 서비스 중단없이 운영함에 장점이 있습니다.
충분히 테스트 하시고 주요 설정이 눈에 들어오신다음 적용하심을 권장드립니다.

8개의 댓글이 있습니다.

7일 전

좋은 정보 잘 보고 갑니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

17일 전

와우 멋진 정보글입니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

20일 전

그럼 우분트는 HA 솔루션이 제공 되는거네요
HA 솔루션이 비싼데~
정말 좋은 정보입니다.
감사합니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

21일 전

자세한 정보 잘 보았습니다~

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

21일 전

이런게 있군요. 좋네요. 참고하겠습니다. 감사합니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

23일 전

좋은정보 감사합니다.....^^

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

29일 전

좋은 정보 감사합니다.!

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

29일 전

게시 글 잘 읽었습니다.

Reply

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입

댓글 남기기

댓글을 남기기 위해서는 로그인이 필요합니다.

로그인 회원가입