반응형
반응형

물리 장비에다가 여러대의 가상머신을 두는 가상환경을 구축하는 경우가 많다.


가상머신이 많아지는 경우, 동일한 물리 장비에서 제공되는 환경이다보니,

특정 가상머신이 CPU를 많이 차지하게 되면, 다른 머신들도 따라서 느려지게 되는데,

이 현상을 CPU Steal이라고 한다.


CPU를 많이 차지하고 있는 머신의 CPU Steal Time은 낮게 측정이되고,

같은 물리 장비에 구성된 다른 가상 머신의 경우 CPU Steal Time이 높게 측정이 되게 된다.


가상 환경을 구축해볼 일이 거의 없는데, 갑자기 이런 질문이 와서 당황을 했는데

아는 분이 답변을 해주셔서 정리를 하게 되었다.

반응형
,
반응형

최근 퍼블리셔에서 Linux Application을 깔아주지 못하겠다고 얘기를 해와서

어디서 줏어들은 Docker나 써보자! 하고 생각을 하였다.


Docker Image라는 것을 잘 구성해서, 다른 서버에서도 동일한 Docker Image를 가지고 Container로써 이용이 가능하다고 한다. 

(Docker Image를 띄우면 Container가 됨)


GitHub이나 Yum Repository처럼, 누군가 만들어둔 어플리케이션을 아래 url에서 검색하여, pull 명령어 하나만으로 받을 수 있다.


https://registry.hub.docker.com/


※ Docker 설치 과정은 간단해서 생략.


나는 Tomcat 8.0 버전을 설치할 것이므로, 아래와 같이 입력을 한다.

$ docker pull tomcat:8


Tomcat8 버전에 대한 Docker Image가 받아졌으므로, 준비해둔 war파일과 함께 daemon 형태로 띄우고, 외부에서 접근 가능하도록 port forwarding 설정까지 명령어 한번으로 해결을 해보자.

$ docker run -d -i -t --name="tomcat8-test" -p 8081:8080 -v /mypath/test.war:/usr/local/tomcat/webapps/test.war tomcat:8.0



docker run --help 명령어를 통해 옵션들에 대해 알아볼 수 있지만, 위에서 사용된 중요한 키워드에 대해 짚고 넘어가도록 하자.


-d : 데몬으로 띄움

-p 8081:8080 : image를 8080으로 띄우는데, host에서는 8081로 접근이 가능하도록 한다. (port forwarding)

-v /mypath/test.war:/usr/local/tomcat/webapps/test.war : -v는 볼륨 관련 명령어로써, host에 있는 파일을 container로 이동할 수가 있다. host와 container는 콜론 (:)으로 구분을 한다. host에 /mypath/test.war 파일을 docker container의 /usr/local/tomcat/webapps/test.war로 이동시킴.


추가로 옮겨야할 파일 (jdbc Driver 등)들은, docker cp 명령어를 이용하면 될 것 같다.  


DockerFile을 작성해서 운영하면 더 편하다고 하는데, 이건 좀 더 연구해서 다음 포스팅에 작성하도록 해야겠다.

반응형
,
반응형

Vagrant로 ubuntu 기본을 세팅해서 일일히 설치하는 방법도 있지만..

대부분 잘되지 않는 경우가 많기 때문에, 아예 Docker사용에 특화되어 있는 CoreOS를 직접 깔아서

Docker를 사용해보면 어떨까하는 마음에 시작하였다.


※ Vagrant는 워낙 설치가 간단해서 생략. (그냥 다운로드 받아서 더블클릭만 하면 끝)


1. git bash를 이용하여 VagrantFile이 들어있는 CoreOS를 받아온다. 

$ git clone https://github.com/coreos/coreos-vagrant.git


2. 받아온 폴더로 이동하여 vagrant up

$ cd coreos-vagrant
$ vagrant up


3. 터미널 띄우기

$ vagrant ssh


이제 윈도우에서 docker를 사용할 수 있는 환경이 구축되었습니다.

반응형
,
반응형

Vagrant를 알기 전까지.. 로컬에 리눅스 가상환경 구축을 위해서 했던 짓은

VirtualBox 설치 + OS iso 파일 구하기 + 기타 네트워크 설정 + 삼바 설정 + 엄청난 시간 + ... 등등 이었다.


하지만, Vagrant를 알고 나서는..

VirtualBox 설치 + Vagrant 설치 + 간단한 명령어 + 네트워크 및 공유폴더 설정 + 짧은 시간 으로 가능하게 되었다.



CentOS 가상환경을 Vagrant를 이용하여 구축해보자.


1. VirtualBox와 Vagrant를 설치한다. (모두 기본설정으로 깔아도 상관없음)


2. Vagrant 세팅

http://www.vagrantbox.es/ 에서 이미지 파일들을 제공을 하고 있는데, 이걸 그냥 vagrant에 add만 시켜주면 된다.

지금 다니는 회사에서 가장 많이 사용하는 CentOS 6.5버전을 깔아보도록 하자. 

위 사이트에 들어가보면, 아래 명령어 사용법도 친절하게 나와있음.

$ vagrant box add centOS6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ vagrant init centOS6.5
$ vagrant up


CentOS 가상환경 구축이 완료되었다


3. 이제 네트워크 설정을 해보자.

vagrant init을 하면, 현재 경로에 VagrantFile이라는 파일이 생기는데, 이것을 열어주고 아래와 같은 부분을 수정하여, 사설 IP를 하나 할당받도록 하자. 주석만 풀면 될 것임.

config.vm.network "private_network", ip: "192.168.33.10"

공인 아이피 설정은 config.vm.network "public_network" 부분을 이용하면 되는데, 공짜로 해주는 것 같진 않고..

별도 DNS서버 같은게 필요할 것 같아서 시도해보지 않았음.


4. 공유폴더 설정을 해보자.

config.vm.synced_folder "D:/data", "/home/vagrant/data"       // 내 컴퓨터의 D:/data경로를 가상 환경의 /home/vagrant/data와 동기화 시킨다.

심볼릭 링크처럼 동작을 하는데, 삼바보다 훨씬 편리한 듯..


5. 포트포워딩 설정을 해보자.

가상환경에서 구동중인 예를 들면, httpd가 80포트로 동작을 하고 있는데, 

사내에 다른 사람들은 내 가상환경에 공인 아이피 설정이 되어 있지 않는한, 접근을 할 수 있는 기회조차 얻지 못하게 되는게 보통이다.

그래서, Vagrant는 내 컴퓨터 IP의 포트를 통해 가상환경 포트로 접근이 가능하도록 포트포워딩 설정을 제공을 한다.

config.vm.network "forwarded_port", guest: 80, host: 8180      // 가상환경의 80포트를 내 컴퓨터의 8180포트로 들어갈 수 있도록 포워딩

참고로 여러개 설정 가능.


빌드 환경이 Linux 환경이거나, 공용으로 사용하는 Linux머신이 거지같이 느리다면...

Vagrant를 이용해서 가상환경을 구축해서 사용하는 것을 추천합니다.


Docker 공부하려고 Vagrant부터 알아보고 있는데, Docker보다 이게 더 대박인듯...


※ 머신 부팅 시 계속적으로 timeout이 지속된다면, cmos 셋업의 cpu 가상화 지원 활성화 옵션을 켜면 해결이 되는 경우가 있다.

반응형
,
반응형

1. 어떤시간대를 머신에서 지원하는지 확인

$ ls /usr/share/zoneinfo/


2. Seoul시간으로 변경

$ cp -f /usr/share/zoneinfo/Asia/Seoul /etc/localtime


물론 소프트 심볼릭 링크로 처리하는 경우도 많다.

반응형
,
반응형

클러스터 구성한 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 파일에 모든 로그 레벨에 대한 로그가 남게 되었다.

반응형
,
반응형
#!/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로 만들어서 돌려보니 이런 문제였음.. ㅠㅠ

반응형
,
반응형

특정 파일 및 폴더를 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

반응형
,
반응형