HA(High Available = 고 가용성)
즉, 한대의 서버가 죽더라도 다른 서버가 대신하여 서비스하여 무중단 서비스를 구현한다
HA의 필요성
너무도 당연한 이유이다. 서버, 즉 기계는 언제라도 문제가 발생할 수 있다. 작게는 디스크가 고장날 수도 있으며, 크게는 서버가 다운되거나 하는 경우를 대비하기 위해 HA구성은 필수 사항이다.(물론 디스크는 raid등의 방법을 이용하지만..)
서비스 장애의 요소들
예를들어 멜론을 통해 음악을 들을때 음악을 듣지 못하거나 음악 플레이하는데 한참을 있다가 플레이된다거나 하는 요소들은 의도적인것과 의도적이 아닌것이 있을 수 있다
의도적인 것 : 신규 시스템 도입 및 연동, 소프트웨어 추가 및 변경, 시스템 마이그레이션(버전 업그레이드 등)
의도적이 아닌 것 : 정전(UPS무정전 시스템도 문제가 있을 수 있다), 하드웨어 장애(서버 다운), 소프트웨어 장애(톰캣 이상등), 네트워크 장애
물론 의도적으로 시스템을 다운할때는 미리 공지를 하고 사람이 적은 새벽에 해서 서비스 중단으로 인한 피해를 최소화하지만 의도적이지 않은 장애는 장애의 원인을 찾고 해결하고하는데 어느정도의 시간이 소요될지 이로인해 서비스에 얼마만큼의 피해가 갈지는 예측하기 어렵고 사용자는 복구될때까지 기다릴 수 밖에 없기 떄문에 사업에 치명적인 타격을 가할 수 있다.
HA의 발전
초기의 HA는 하드웨어의 장애가 발생했을 때 standby서버로 서비스를 넘기는 정도의 수준이었으며, 어플리케이션에 대한 감지는 하지 못하는 수준이었으나, 현재는 어플리케이션의 장애도 감지하여 서비스를 standby서버로 넘기고 현재의 상용제품들에서 제공하는 수준이다. (단, 세션까지 넘기지는 못해서 세션을 다시 맺어야 한다. 즉 사용자는 다시 접속해야 멜론의 음악을 들을 수 있다)
HA 구성의 2가지 방식
첫번째, Active-Standby 구성
말 그대로 한대의 서버가 서비스를하고 있을 때 다른 서버는 Standby로 대기하고 있다가 Active서버에 이상이 발생하면 바로 자신이 Active가 되어 서비스를 이어나가는 방식이다
두번째, Active-Active 구성
한대의 서버에서는 웹서비스를 다른 한대의 서버에서는 DB의 역할을 각각 담당하는 구성이다. 만약 웹서비스를 담당하는 서버가 죽게되면 DB를 담당하던 서버에 이 역할을 넘겨서 웹과 DB의 역할을 같이 수행하게 하는 구성이다.
(이렇게 되면 구성이 복잡해져 장애포인트가 많아진다. 뭐니뭐니해도 간단한게 제일 좋다고 생각한다)
HA 구성
여기서는 DRBD와 heartbeat를 이용해 active-standby를 구성
1. 기본 설정
Active |
Standby |
가상 아이피 |
hostname - NAS1 ip 주소 - 192.168.0.226 |
hostname - NAS2 ip 주소 - 192.168.0.227 |
192.168.0.225 |
1-2 기본 환경 설정
1-2-1 hostname 설정
master/slave 서버 각각의 호스트 네임을 수정해 준다
# vi /etc/sysconfig/network HOSTNAME=NAS1 |
* slave 서버도 같은 방법으로 NAS2로 등록 / reboot하거나 로그아웃후 다시 로그인하면 적용된다
1-2-2 hostname 설정
/etc/hosts파일에 master/slave서버의 정보를 입력해준다
# vi /etc/hosts 192.168.0.226 NAS1 192.168.0.227 NAS2 |
1-2-3 IP, DNS 등의 설정 확인
# cat /etc/resolv.conf nameserver 168.126.63.1 nameserver 168.126.63.2 |
1-2-4 시간 동기화
master/slave의 시간이 같아야 데이터 동기화에 문제가 없다
# yum install -y ntp # /etc/init.d/ntpd start # ntpq -p <- 동기화 # date <- 양쪽 서버 시간 확인 |
1분~10분정도의 시간이 걸린다
1-2-5 selinux 해제
# setenforce 0 이후 getenforce로 확인 # vi /etc/selinux/config SELINUX=disabled <-로 변경 |
1-2-6 iptables 해제
# iptables -F |
* iptables를 유지한 채로 운영하고 싶다면 해당 정보를 입력해준다(검색 ㄱㄱ)
2. DRBD 설치
2-1 epel 저장소 추가 (Extra Package for Enterprise Linux) - master/slave 모두
# rpm -ivh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm |
* 설치되지않으면 http://dl.fedoraproject.org/pub/epel/6/x86_64로 접속해서 최신 버전을 다운로드 받는다
2-2 DRBD yum 설치 - master/slave 모두
# yum install -y kmod-drbd84 drbd84-utils |
* yum은 repository에 등록된 내용에 따라 다운로드 받기 때문에 원하는 버전을 고를 순 없다. 원하는 버전을 설치하기 위해서는 rpm을 다운로드 받아 설치해야 한다. 혹은 그 버전이 있는 repository를 지정해서 yum으로 설치한다
2-3 모듈 적재 - master/slave 모두
# modprobe drbd |
* probe는 drbd 모듈을 커널에 적재해 준다.
2-4 config - master/slave 모두
centos5버전까지는 /etc/brbd.conf를 이용해서 설정을 하였으나, 현재 centos6에서는 /etc/drbd.d/ 디렉토리 밑에 하위 파일들을 통해 설정한다. (현재도 /etc/brbd.conf를 사용할 수 있으나 2개의 파일로 분리해서 사용하는 방식이 좀 더 빠르게 동기화되는 장점이 있다)
# vi /etc/drbd.d/data.res resource data { startup { wfc-timeout 30; outdated-wfc-timeout 20; degr-wfc-timeout 30; } net { shared-secret sync_disk; } on NAS1 { device /dev/drbd0; <- 디스크가 수행할 I/O 작업을 대신 수행 할 블록디바이스(설치 후 생성됨) disk /dev/sdb; <-백업 전용으로 추가한 디스크 address 192.168.0.226:7789; <- master IP주소 meta-disk internal; } on NAS2 { device /dev/drbd0; disk /dev/sdb; address 192.168.0.227:7789; <- slave IP 주소 meta-disk internal; } } |
* "data"라는 이름을 사용하기로 하여 data.res 파일 생성 후 위 내용을 입력해준다. 다른 global conf는 기본값으로 해도 크게 문제는 없다. 추가하고 싶은 옵션이나 설정이 있다면 추가해주면 된다
2-5 메타데이터 생성 - master/slave 모두
# drbdadm create-md data |
주의! 만약 백업용으로 추가한 디스크 /dev/sdb를 마운트시켰다면 이 부분에서 아무 반응이 없을 것이다. DRDB는 os 레벨이 아닌 커널 레벨에서 동작하므로 마운트를 하지 않아도 디스크를 인식할 수 있다. 따라서 추가한 디스크는 마운트 하지 않고 그냥 둔다
오류 1. 'xxx' not defined in your config (for this host)
xxx.res 파일 안에 있는 host를 찾지 못해서 발생하는 에러, host명이 정확한지 확인 필요
오류 2. 'access beyond end of device'
오류 메시지 중에 위의 메시지가 포함된 메시지가 있다면 디스크를 초기화 해주어야 한다
# dd if=/dev/zero of=/dev/sdb bs=1M |
2-6 DRBD 시작 - master/slave 모두
메타데이터 생성하여 success 메시지를 본 후 drbd를 시작해준다
# /etc/init.d/drbd start ( or service drbd start ) |
오류3. 오류메시지에 degr-wfc-timeout 이 포함된 에러
동기화하려는 서버와 연결을 맺을 시간을 초과했다는 의미로 양 서버를 30초이내에 시작해주면 된다
(wfc-timeout에서 설정한 시간)
2-7 primary 서버 지정 - master 서버만
# drbdadm primary --force data |
* 이 후 쉘이 바로 떨어져서 응? 끝났나? 할 수 있지만, 이 명령 이후 master와 slave서버의 동기화가 진행되고 있다. 진행상황은 "drbd-overview" 명령으로 확인 가능, 혹은 "cat /proc/drbd"로도 확인 가능
완료되면 drbd-overview로 확인 시 "Connected Primary/Secondary ...." 라는 메시지가 나온다
2-8 fail-over 테스트
2-8-1 DRBD 블록장치 파일 포맷
data.res에서 지정한 블록장치를 입력(primary에서만 된다. secondary는 파일 포맷이 안된다. slave니까)
# mkfs.ext4 /dev/drbd0 |
2-8-2 동기화 확인을 위한 마운트
# mkdir /data # mount /dev/drbd0 /data # mount /dev/drbd0 on /data type ext4 |
2-8-3 파일 생성
# echo "test" > /data/test |
2-8-4 Primary/Secondary 전환
NAS1번에서 /dev/drbd0을 마운트한 후 /data 디렉토리에 test라는 파일을 만들었다. 동기화가 제대로 되었다면 NAS2번에서도 /data/test 파일이 있어야 정상이다. 이제 primary/slave를 서로 전환하여 NAS2에서 파일을 찾아보자
[NAS1에서] # umount /dev/drbd0 # drbdadm secondary data <- NAS1을 secondary로 변경 # drbd-overview Connected Secondary/Secondary <- 둘다 secondary로 변경됨 [NAS2에서] # drbdadm primary data # mkdir /data # mount /dev/drbd0 /data # mount /dev/drbd0 on /data type ext4 # ls -al /data 합계 28 drwxr-xr-x. 3 root root 4096 2014-12-31 17:08 . dr-xr-xr-x. 26 root root 4096 2014-12-31 16:56 .. drwx------. 2 root root 16384 2014-12-31 17:00 lost+found -rw-r--r--. 1 root root 5 2014-12-31 17:08 test |
* 만약 test 파일이 검색이 안됐다면 이유는 2가지 이다. 어딘가 꼬여서 동기화가 안됐거나, 파일을 만들때 마운트를 잘못해서 마운트를 안하고 파일을 만들었을 가능성이 있기 때문에 다시한번 마운트 해보고 안되면 다시 처음부터 모든 가능성을 점검해봐야한다
DRBD를 설치를 하던 도중에 서버를 껐다 켜는 것은 굉장히 아주 상당히 위험한 행동이 될 수 있다.
정확한 원인은 모르겠으나 기존에 있던 /dev/sda를 읽기 실패하면서 os가 깨져버는 현상을 2번이나 경험하였기 때문에
(os가 깨진건지 디스크가 깨진건지) 설치 도중에는 각별한 주의를 요한다.
3. heartbeat 설치
#yum install -y heartbeat |
(http://linux-ha.org/wiki/Download yum이 싫다면 여기서 받아도 된다)
오류1. No Package Available
위에서 설치한 elrepo에는 heartbeat가 없다. epel 저장소를 추가해서 설치를 진행해야 한다
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm |
이후 이전 저장소인 elrepo를 중지시킨다
vi /etc/yum.repos.d/elrepo.repo [elrepo] name=ELRepo.org Community Enterprise Linux Repository - el6 baseurl=http://elrepo.org/linux/elrepo/el6/$basearch/ mirrorlist=http://elrepo.org/mirrors-elrepo.el6 enabled=1 --> 0으로 변경 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org protect=0 |
이후 다시 시도
3-1 설정파일 복사
설치가 완료되면 설정예제파일 3개를 복사하여 /etc/ha.d/에 넣자
#cp /usr/share/doc/heartbeat-3.0.4/ha.cf /etc/ha.d/ #cp /usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/ #cp /usr/share/doc/heartbeat-3.0.4/authkeys /etc/ha.d/ |
3-1-1 /etc/ha.d/authkeys 파일 설정
authkeys는 HA 구성원을 인증하는데 사용된다(vi로 열어서 수정)
auth 1 1 md5 hatest |
auth 1 : 아래에 적힌 라인의 번호와 매칭하여 동일한 숫자를 가진 라인의인증키 방식을 따른다 |
1 : 한 라인의 인증키 번호로 윗줄과 매칭되며 index번호로 생각하면 있다 |
|
sha1 : 해시인증방식으로 md5, crc 방식등이 있다. crc는 키를 사용안해서 위험 |
|
hatest : 인증키로 사용할 키값이다 slave서버와 동일하게 설정되어야 한다 |
authkeys 파일은 퍼미션 600으로 주어야 한다. 그렇지 않으면 실행시 에러도 나온다
3-1-2 /etc/ha.d/ha.cf 파일 설정
debugfile /home/ha_debug logfile /home/ha_log logfacility local0 keepalive 2 deadtime 30 udpport 694 bcast eth0 auto_failback on node NAS1 node NAS2 |
debugfile : 디버깅 메시지가 기록될 파일 위치 지정 logfile : 로그 파일 위치 지정 logfacility : 잘 모르겠음 퍼실리티... 그냥 기본 값으로 있음 keepalive 2 : 노드간 heartbeat를 주고 받는 기간 설정. 초단위 deadtime : 서버가 죽었다고 판단하는 시간 udpport : heartbeat의 포트 설정. 이것도 기본값 bcast : heartbeat를 보낼 인터페이스 auto_failback : 한 노드가 죽었을때 다른 노드로 보내는 기능 node : HA 구성원 지정. 순서대로 적용됨. 이 경우 마스터가 NAS1이 됨 |
secondary는 node부분을 위아래를 바꿔 적는다 NAS2는 node NAS2 node NAS1순으로
3-1-3 /etc/ha.d/haresources 파일 설정
NAS1 drbddisk::data \ Filesystem::/dev/drbd0::/data::ext4 \ Delay::1::0 \ IPaddr::192.168.0.225/27/eth0:0 |
NAS1 : master서버의 hostname 192.168.0.225 : 대표 ip가 될 가상 ip주소 27 : 서브넷 마스크 httpd : 서비스 데몬. 스페이스 바로 구분해서 여러개 지정 마지막줄 : fail-over시 동작할 가상 ip, interface, 데몬들 |
3-2 heartbeat 기동
# service heartbeat start |
* master 서버 기동 후 slave 서버를 기동한다. 가상 ip eth0:0이 올라와 있으면 성공
3-3 기타 설정
3-2-1 httpd 링크 설정
만약 httpd나 mysql같은 데몬은 heartbeat를 통해 자동으로 기동하고자한다면 다음과 같이 지정한 데몬의 링크파일을 만들어줘서 서비스가 넘어갈때 동작할 수 있도록 한다.
(만약 chkconfig에 http가 등록되어 서버 부팅시 자동으로 기동된다면 서로 꼬일 수 있다. chkconfig도 해제하자)
# ln -s /etc/rc.d/init.d/httpd /etc/ha.d/resource.d/httpd # chkconfig httpd off |
3-2-2 httpd 설정
위에서 데몬에 httpd를 등록했지만 가상 ip 192.168.11.152.로 동작하기 때문에 설정이 되어 있지 않으면 제대로 동작하지 않을 수 있다. 따라서 httpd.conf 파일내의 ServerName 항목을 지정해 주어야 한다(master/slave 둘 다)
ServerName 192.168.0.225 |
주의! heartbeat를 기동하기 전에 필요한 데몬들을 먼저 기동해야 한다.
4. NFS 연동
4-1 NFS 설치
# yum install -y nfs-utils nfs-utils-lib |
centos 6.6버전의 경우 기본적으로 rpcbind와 nfs-utils nfs-utils-lib이 기본으로 설치되어 있다. 혹여 없을 시 위와 같은 패키지명으로 다운받는다. os마다 nfs-kernel-server라든지해서 패키지명이 다를 수 있으니 잘 확인하고 다운로드 받아야 한다
## rpcbind는 원격으로 명령을 주고 받을 수 있는 일종의 프로그램이다. 이 기술을 기반으로 해서 그 위에 nfs를 얹어서 사용한다라고 생각하는 것이 좋다. 왜냐하면 프로세스를 기동/중지할때 rpcbind를 가장 먼저 살리고, 가장 나중에 죽인다. rpcbind를 기동한 후에 nfslock을 시작하고 다음으로 nfs를 실행한다. 죽일때는 nfs를 먼저 죽이고 nfslock를 죽인다 rpcbind는 굳이 죽이거나할 필요가 있다면 가장 나중에 죽인다.
참고1.
[NFS 데몬 기동 순서] [NFS 데몬 중지 순서]
service rpcbind start service nfs stop
service nfslock start service nfslock stop
service nfs start service rpcbind stop
## 경험상 이렇게 했을때 가장 성공률이 높았다
4-2 NFS 데몬 중지(중지된 상태여야 한다)
# service nfslock stop # service nfs stop |
NFS 패키지는 설치하면 /etc/init.d/ 에 링크가 생성된다(ls /etc/rc*.d/* nfs로 검색하면 관련 링크가 쫙~ 나온다)
4-3 /etc/exports 설정
# vi /etc/exports /data 192.168.0.225/27(rw,no_root_squash,sync) |
4-4 파일시스템 설정(순서대로 하신분은 할 필요 없다)
# mkfs.ext4 /dev/drbd0 |
primary에서만 실행하며 primary에서 밖에 안된다
4-5 디렉토리 마운트(순서대로 하신분은 할 필요 없다)
# mkdir /data -> 이것만 primary/slave 둘다 생성 # mount /dev/drbd0 /data # df |
4-6 nfslock관리 파일을 drbd볼륨으로 이동
[NAS1 - primary] # cp -a /var/lib/nfs /var/lib/nfs.bak # mv /var/lib/nfs /data/var_lib_nfs # ln -s /data/var_lib_nfs /var/lib/nfs # ls -l /var/lib/nfs # service heartbeat restart 재시작하면 자동으로 NAS2로 넘어감 |
[NAS2 - slave] # mv /var/lib/nfs /var/lib/nfs.bak # ln -s /data/var_lib_nfs /var/lib/nfs # ls -l /var/lib/nfs |
4-7 /etc/ha.d/haresources 파일에 내용 추가
#vi /etc/ha.d/haresources NAS1 drbddisk::data \ Filesystem::/dev/drbd0::/data::ext4 \ Delay::1::0 \ IPaddr::192.168.0.225/27/eth0:0 \ nfslock \ nfs |
이 후 깔끔하게 nfs랑 재기동해주고 다른 서버에서 nfs연결을 시도하면 된다
오류 1. mount.nfs: access denied by server while mounting NAS_VIP:/data
/etc/exports파일안에 지정된 내용이 잘못되었을 경우에 발생
맞는 예: 192.168.0.201/24(rw,no_root_squash,sync)
192.168.0.*(rw,no_root_squash,sync)
틀린 예: 192.168.0*/24/(rw,no_root_squash,sync)
192.168.0.*/24(rw,no_root_squash,sync)
근데 어떤서버는 저렇게 뒤에 *부분을 고쳐서 해결되는애가 있고 안되는 애가 있었다. 안되는 애는 따로 한줄을 추가해주니 연결이 되었다. 무엇이 문제인지는 아직 잘 모르겠다
오류2. rpcbind 프로세스 문제
위에서 설명한 내용중에 rpcbind위에서 nfs가 동작한다고 설명하였다. 만약 rpcbind가 없으면 다음과 같은 에러가 뜬다
NFS 서비스를 시작하고 있습니다: [ OK ]
NFS 쿼터를 시작하고 있습니다: 서비스를 등록할 수 없습니다: RPC: 받을 수 없습니다; errno = 연결이 거부됨
rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
[실패]
NFS mountd를 시작중 입니다.[실패]
NFS 데몬을 시작함: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
[실패]
[root@Mail /]# service nfs stop
NFS 데몬 종료 중: [실패]
NFS mountd를 종료 중입니다: [실패]
NFS 쿼터를 종료 중: [실패]
메시지를 참고해서 같은 메시지가 뜨면 rpcbind 프로세스를 확인해보자 (portmap이랑 rpcbind랑 같은거인거 같다 yum install portmap 하니까 rpcbind가 설치되어 있다고 설치가 안되긴했었는데)
'IT > 소프트웨어 설치' 카테고리의 다른 글
JBoss 6.0 설치하기 - centos6.5 (0) | 2015.02.15 |
---|---|
nagios 모니터링 툴 (4) | 2015.02.09 |
apache mod_cband 설치 및 설정 (0) | 2015.02.09 |
mrtg 설치 및 모니터링 (0) | 2015.01.06 |
NFS (0) | 2015.01.04 |