반응형
반응형

클러스터 구성한 RabbitMQ중 노드 하나가 내려간 경우, 

client에서 죽은 노드로 요청을 보내면 실패를 하기 때문에, Load Balancer를 통해 health체크를 하여,

죽은 노드로는 요청을 보내지 않도록 하기 위해 HAProxy를 사용해보았다.


일단 HAProxy를 설치해보도록 하자. (CentOS 기준)

CentOS버전이 낮다면, yum repository에 포함이 되어 있지 않은 경우가 있으므로, repo를 추가 해준 후 install한다.

$ rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

$ sudo yum install haproxy


설치가 되었으니, 설정을 해보도록 한다.

설정 파일은 /etc/haproxy/haproxy.cfg에 위치해 있다.

# haproxy.cfg
listen rabbitmq-cluster 192.168.33.10:5670
balance roundrobin

mode tcp server node-01 192.168.33.10:5672 check inter 5s rise 2 fall 3 server node-02 192.168.33.11:5672 check inter 5s rise 2 fall 3 server node-03 192.168.33.12:5672 check inter 5s rise 2 fall 3

192.168.33.10번 서버에서 5670포트로, 아래 나열된 server들에 대해서

tcp방식의 roundrobin방식으로 밸런싱을 한다. 


이제 서비스를 올리면 끝난다.

$ service haproxy start


이제 client단에서 10번 서버의 5670포트만 바라보도록 설정을 변경하면 되고,

노드를 일부로 죽여서 테스트를 해보면, 죽은 노드로는 밸런싱이 되지 않도록 구성이 되었다.


하지만, HAProxy를 단일로 두게되면, 심각한 SPOF이기 때문에 slave구성을 해야될 듯 하다.

slave구성은 완료되는 대로 다음포스트에 작성하는걸로..

반응형

'개발 > Linux, System' 카테고리의 다른 글

[Vagrant] CentOS 가상환경 세팅  (0) 2016.06.10
[CentOS] TimeZone 변경  (0) 2016.06.10
[HAProxy] Logging  (0) 2016.06.10
[Shell] Expect 사용 시 timeout 설정  (0) 2016.06.10
[Expect] Crontab에서 사용 시 주의점  (0) 2016.06.10
,
반응형

Http의 경우 기본설정이라 로그가 잘 남는진 모르겠는데,

RabbitMQ의 경우는 TCP로 연결을 해서 그런지, 로그가 남질 않았다.


일단 /etc/haproxy/haproxy.cfg에 들어가서

option tcplog 항목을 추가를 해줬다.


그리고 cfg파일 상단에 보면, syslog에다가 local2.*    /var/log/haproxy.log 이런걸 설정해주라고 되어있다.

일단 rsyslog설정파일(/etc/rsyslog.conf)에 들어가서, udp로그와 tcp로그부터 활성화를 시켜주어야 한다.

아래 부분을 찾아서 주석을 해제해준다.


#/etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514

/etc/rsyslog.d/haproxy.conf 파일을 만들어서, 아까 주석에 달려있던 내용을 그대로 넣어준다. 

(local2 뒤의 *는 로그 레벨이니, 로그 레벨에 따라 파일을 나눠서 저장하는 것도 가능하다.)


#/etc/syslog.d/haproxy.conf
local2.* /var/log/haproxy.log

rsyslog와 haproxy 서비스를 재시작한다.


$ service rsyslog restart
$ service haproxy restart


이제부터 /var/log/haproxy.log 파일에 모든 로그 레벨에 대한 로그가 남게 되었다.

반응형
,
반응형
mkdir -p /home/vagrant/.ssh 

sudo chmod 0700 /home/vagrant/.ssh 

sudo wget --no-check certificate https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/authorized_keys 

sudo chmod 0600 /home/vagrant/.ssh/authorized_keys 

sudo chown -R vagrant /home/vagrant/.ssh



패키징할때 뭘 잘못했는진 모르겠는데.. vagrant ssh로 직접 접근해서 ssh key를 다시 설치하니까 잘된다.


반응형
,
반응형
#!/bin/sh

expect -c "shell 명령어" 



이런식으로 작성을 하게 되는데, expect가 눈에 보이지 않는 timeout 10초를 가지고 있다.

90메가짜리 파일을 국내에서 유럽망으로 전송했는데, 10초만에 끝나길래.. 빠르구나라고 좋아라했더니만

유럽망에 있는 서버에 들어가보니 보내지다가 말았다-_-


이런 경우 timeout을 늘려서 해결이 가능하다.


스크립트 자체를 bash가 아닌 expect로 사용한다면, 상단에다가

set timeout 60 // 타임아웃 60초

이런식으로 붙여주면 되고,


bash의 경우

expect -c "set timeout 60" 과 같이, -c 하위에 넣어주고 이후 명령어를 작성하면, 정상적으로 동작을 한다.


이걸 타임아웃 없이 젠킨스에 넣고 테스트를 해봤었는데, 뭔가 이상하길래

shell로 만들어서 돌려보니 이런 문제였음.. ㅠㅠ

반응형
,
반응형

virtualBox guest addition를 설치한다.

$ apt-get update
$ apt-get install virtualbox-guest-additions-iso


설치 후 /usr/share/virtualbox 디렉토리에 가보면 VBoxGuestAdditions.iso 파일이 있을 것이다.


이 파일을 아래 명령어를 쳐서, /mnt 경로에 mount시켜준다. 

$ mount -t iso9660 -o loop /usr/share/virtualbox/VBoxGuestAdditions.iso /mnt/


이미지가 마운트되었으니, 해당 경로로 가서 실행파일을 실행시켜준다.

$ cd /mnt
$ ./VBoxLinuxAdditions.run


잘 설치가 되면 좋겠지만, x.org windows driver failed 어쩌고하는 에러가 발생하는 경우가 있는데,

이 경우는 아래 명령어를 이용하여, x.org 관련된 패키지들을 설치한 뒤, 재실행 하면 정상적으로 설치가 된다.

$ sudo apt-get install xserver-xorg xserver-xorg-core


설치는 끝났는데, 그래도 안되는 경우에는 

방금 설치한 GuestAdditions 경로를 /usr/lib 밑으로 심볼릭 링크를 잡아주어야 한다.

$ sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions


리붓하면 정상동작한다.

$ sudo reboot
반응형
,
반응형

특정 파일 및 폴더를 crontab을 이용하여 원격지 서버에 동기화를 해줘야 하는 경우가 있다.


이런 경우 expect를 설치해서 password입력 부분을 skip하도록 해야 하는데,

아래와 같이 사용을 하면 잘 넘어간다.


spawn rsync -avr -e ssh ORIGIN_DIR root@ip.address:REMOTE_DIR
expect {
      -nocase yes/no {
           send yes\r
           expect eof
      }
      -nocase password: {
           send pw\r
           expect eof
      }
}
exit



보통 다른 사이트에서의 예시를 보면 send 구문 이후에 interact 명령어를 날리는데,

interact를 사용하면, 수동 실행 시에는 정상동작 하지만, crontab으로 돌렸을 때는 동작을 하지 않는다.


이런 경우 interact를 expect eof로 바꾸면, 수동 실행 시에도 잘 되고, crontab으로 실행 시에도 잘된다.


그리고 위 구문 중 -nocase라는게 있는데..

이게 if 문의 역할과 비슷한 역할을 한다.


이게 없으면, 명령어 수행 간 yes/no를 물어보는 부분이 없으면, 이후 진행을 못하게 된다.

따라서, 최초에 실행 시에는 yes/no를 물어보기 때문에 실행이 잘되지만, 그 이후 ssh 키가 원격지에 등록된 상태에서는 yes/no구문을 볼 수 없기 때문에, 동작을 하지 않는 경우가 되버린다.


따라서, expect구문 사용 시에는 -nocase, expect eof를 필수적으로 사용해야 할 것 같다.


send로 명령어 전송 시 \r을 누르는 것도 잊지 말아야 한다.

\r가 빠지면 send 이후 구문에 대해서 입력만 하고, 엔터를 누르지 않기 때문에 미궁에 빠지게 된다. ㅠㅠ

반응형
,
반응형

Jenkins-Slave를 연결하여, windows서버에 파일을 배포할 일이 있어서

xcopy를 검토하였으나, 거지같은 .svn 폴더가 발목을 잡았다.


xcopy의 /EXCLUDE옵션은 명령어 형태가 아닌, 파일 참조 형태로 되어 있어서..그지같음.. ㅠㅠ

이 기회에 xcopy의 강화버전인 robocopy를 사용해 보기로 했다.


자주 사용하는 옵션이 있는데, 아래와 같은 옵션을 사용하였다.

/MIR : 하위 디렉토리까지 tree구조를 유지시킨다.

/XA:H : 숨김파일은 굳이 복사하지 않는다. (.svn 폴더 제외 시 유용함)

/R:횟수 : retry횟수를 몇번으로 할 것인지 정함. (디폴트가 100만번이라고 하니 조절하는 게 정신건강에 좋을듯;)

/W:횟수 : retry시 대기시간 (디폴트 30초)


그리고 Jenkins에서는 현재 디렉토리를 기준으로 Target에 옮겨야 하기 때문에,

Batch에서 지원하는 %cd% 명령어를 사용해보았다.


아참, 그리고 배치 스크립트에다가 명령어를 넣고 싶은 경우는,

하단에 EXIT /B 0 이런걸 꼭 넣어줘서 마무리를 시켜주자.


Robocopy의 버그인진 모르겠는데, 다른데서 참조해서 사용하면,

스크립트 종료를 못 시켜줘서 그런지 에러가 난다. 예를 들면.. Jenkins;


RoboCopy 옵션에 대해 제대로 알고 싶은 분은 나무위키를 참조.. 무려 한글임!

https://namu.wiki/w/Robocopy

반응형
,
반응형

테스트용도로 이리저리 지지고 볶는 서버가 한 대 있는데,

희한하게 이것만 SSH접근이 느린거다.


리소스 사용량도 거의 없고, 떠있는것도 없는데 느리길래 원인을 파악해보기로 함.


일단 원인은 DNS lookup이 문제인 경우가 대부분이라고 한다.


네트워크가 복잡한 경우에는 이리저리 많이 왔다갔다할테니...

VPN을 사용하지 않는 환경일 경우는 문제가 없는게 대부분일테지만, VPN 환경에서는 가는 곳마다 한 두 서버는 항상 이런 현상이 있었던 것 같다.


이런경우 SSH 접속 시 DNS lookup을 하지 않는 방향으로 설정을 바꿔버리면 손쉽게 해결이 된다.


/etc/ssh/sshd_config 파일을 열어서

UseDNS no 라는 구문을 추가해주고, ssh를 재시작해주면 해결이 된다.


물론 이걸로 해결이 안될지도 모르지만.. 내가 사용하는 환경에서는 이 옵션이면 다 해결이 되는것 같다.


# 추가

UseDNS를 no로 지정하면, postfix (메일 관련 모듈) 이용 시에 문제가 발생하는 것을 확인하였다.

이런 경우에는 UseDNS옵션은 다시 제거 후, GSSAPIAuthentication no 옵션을 지정하면, 메일 관련 모듈에는 영향 없이 SSH 접속만 빨라진다.


GSSAPIAuthentication 옵션은 인증 관련 프레임워크고, openSSH에서 활용하고 있는 모듈 중 하나라고 한다.

yes로 되어 있으면 좀 더 견고한 보안상태로 ssh를 이용할 수 있는 것 같긴한데, 요즘 acl같은게 앞단에 존재하고 있어서 굳이 ssh접속을 느리게 하면서까지 이 옵션을 켜서 써야되나 싶기는하다.


그래서 난 과감하게 no로 지정..;

물론 ssh접속이 빠른 경우에는 굳이 손을 대지 않는게 맞는 것 같다.

반응형
,
반응형

간혹 3rdParty에서 제공하는 바이너리들을 이용하여 스크립트를 짜다보면, 

배치 스크립트는 분명히 인터프리터 방식으로 동작하는데, 자기꺼만 실행하고, 

이후에 명령어는 무시해버리는 경우가 발생한다.


이런 경우, 3rdPary 바이너리를 이용한 스크립트와, 이후 구문을 Background에서 동작하게끔하면,

동시에 실행이 되어 위의 문제가 해결된다.


단, 동시에 실행이 안되는 경우는, 별도의 배치로 빼서 call 실행할Batch.bat 실행을 하면, 순차적으로도 실행이 가능하다.


일단 본 포스팅은 Background로 명령어 실행하는 게 목적이기 때문에, 아래와 같이 하면 된다.


@START /b cmd /c 명령어 입력
@START /b cmd /c 명령어2 입력
반응형
,
반응형

기초적인 건데 나중에도 찾아볼까봐 적어둠.

SET /p param=입력하세요 : 

입력받은 값이 param으로 들어가서, 아래 구문부터 %param% 커맨드로 사용이 가능하다.

반응형
,
반응형