[RabbitMQ] 3. 초보를 위한 RabbitMQ 클러스터와 미러링 구성하기

2장까지 계정설정하고 3장에서 exchange 한다고 예고까지 해놓고 뜬금없이 클러스터와 미러링 구성하기를 작성하게 되었습니다. 방금 회사에서 클러스터랑 미러링을 구성해서 까먹기전에 후딱 써야하는 조금함때문인거 같습니다. exchange 설명 달기도 귀찮기도 하구요. 여튼 시작합니다.

0. 목표와 작업 순서

메시징 서비스를 하는데 큐의 의존도가 매우 커졌습니다. 그래서 고가용성 큐를 구성하려고 합니다. 다행히 RabbitMQ에서 완전 짱짱맨인 클러스터, 미러링 기능을 제공하니 그냥 그거 가져다 쓰면 될거 같습니다. 작업 순서는 대충 다음과 같습니다.

  1. 서버간 얼랭 쿠키 맞추기
  2. 클러스터 구성하기
  3. 클러스터 노드 타입 변경
  4. 미러링 구성하기
  5. 클러스터에서 빠져나오기

본 예제는 3대의 서버를 클러스터, 미러링 하는 것을 기준으로 작성되고 있습니다. 사실 생각보다 무지 쉽습니다. (사이트에서 하라고 하는대로만 잘 따라하면 됩니다. 물론 전 청개구리 모드가 작동하여 하지말라는 순서대로 하다가 MQ 한대 바보로 만들고 두대는 꼬여서 전체 재설치하는 곤욕을 치르기도 했습니다. 으하하!

1. 서버간 얼랭 쿠키 맞추기

서버간 얼랭 쿠키를 맞춰줘야 합니다. 자세한 이유는 저도 Document 읽기 귀찮아 생략합니다. 어쨋든 맞춰줘야 한다고 합니다.

  1. Erlang 쿠키 위치 확인
    보통 리눅스의 경우 “/var/lib/rabbitmq/.erlang.cookie” 이나 “$HOME/.erlang.cookie” 에 있다고 합니다. 이건 OS나 설치환경 차이가 있으니 각자 알아서 찾는 방법밖에 없습니다. 여튼 클러터를 구성할 3대의 서버중 1대를 기준으로 잡아 scp로 파일 카피를 하거나 vi화면으로 copy&paste 해버리면 됩니다. 혹시 모르니 RabbitMQ를 꺼놓고 작업하도록 합시다.
  2. 복사가 제대로 안되어 RabbitMQ가 작동하지 않을때…
    파일 복사가 제대로 이루어지지 않으면, 보통 vi 로 copy&paste하다 삑사리 나면 발생합니다 하하하, RabbitMQ가 구동되지 않습니다. 이럴때는 그냥 쿠키 파일을 지워버리고 다시 시작하면 됩니다. 그럼 새 쿠키카 생성되는데, 여기에 다시 작업하시면 됩니다.

2. 클러스터 구성하기

정말 별거 없습니다. 그냥 가이드(https://www.rabbitmq.com/clustering.html) 에서 시키는데로 따라하면 됩니다.

  1. 각 서버 상태 확인
    클러스터링이 되기 전 ‘rabbitmqctl cluster_status’ 명령으로 각 서버 상태를 살펴봅니다. (아래 코드들은 가이드에서 그냥 베껴왔습니다)

    # 1번서버 확인, 자기 자신 노드만 확인됨 
    rabbit1$ rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit1 ...
    [{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}]
    ...done.
    
    # 2번 서버 확인, 자기 자신 노드만 확인됨
    rabbit2$ rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit2 ...
    [{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}]
    ...done.
    
    # 3번 서버 확인, 자기 자신 노드만 확인됨
    rabbit3$ rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit3 ...
    [{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}]
    ...done.
  2. 서버들을 클러스터로 묶기
    작업 시작전 주의사항으로 rabbitmqctl로 노드를 정지시킬때 반드시 stop_app을 사용해야합니다. 실수로 stop을 해버리면 rabbitmqctl 명령 자체가 먹지 않습니다. 아마 stop은 RabbitMQ node 자체를 종료 시켜버리고 stop_app은 RabbitMQ의 Management Application을 정지시키기 때문이 아닌가 합니다. 그리고 Cluster를 묶을때 해당 서버의 hostname을 적어 주어야 하는데 정말! 반드시! hostname을 사용해야 합니다. IP이런거 절대 안됩니다. 제가 이거로 반나절 날렸습니다. 어흐흐흐흑! 그리고 /etc/hosts 에 상대 서버의 hostname을 등록할때는 상대 서버에서 cluster_status로 확인되는 hostname으로 등록해주도록 합니다. hostname을 동일하게 맞추지 않고 구성을 해보지 않아 꼭 맞춰야 되는건지는 알수 없지만 그냥 안전하게 맞추도록 합시다. (그거까지 테스트하기 귀찮아요)이제 1번 서버를 기준으로 클러스터를 묶도록 하겠습니다. 기준이 되는 1번서버는 별다른 작업을 해줄 필요가 없습니다. 그러니 2번 서버부터 작업을 시작해 봅시다.

    #2번서버 작업, 
    #관리 앱 정지
    rabbit2$ rabbitmqctl stop_app
    Stopping node rabbit@rabbit2 ...done.
    
    # 1번 서버로 붙는다. hostname의 경우 1번서버에서 cluster_status로 이름을 확인하여 맞춰 설정하도록 하자.
    rabbit2$ rabbitmqctl join_cluster --ram rabbit@rabbit1
    Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
    rabbit2$ rabbitmqctl start_app
    Starting node rabbit@rabbit2 ...done.
    

    3번 서버도 마저 작업합니다. 2번 설정할때와 동일합니다.

    rabbit3$ rabbitmqctl stop_app
    Stopping node rabbit@rabbit3 ...done.
    rabbit3$ rabbitmqctl join_cluster rabbit@rabbit2
    Clustering node rabbit@rabbit3 with rabbit@rabbit2 ...done.
    rabbit3$ rabbitmqctl start_app
    Starting node rabbit@rabbit3 ...done.
    

    서버별로 cluster_status 명령을 사용하여 실제 서로 노드를 인식하는지 확인해 봅시다. 클러스터링이 잘 되었다면 status에서 더이상 혼자가 아닌 Node(http://www.youtube.com/watch?v=R85lOwRsnvk)를 볼 수 있습니다. 상태를 보면 ram, disc 이런게 좀 신경쓰이는데 이건 곧 설명하도록 하겠습니다.

    #1번 서버 확인
    rabbit1$ rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit1 ...
    [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit3]},{ram,[rabbit@rabbit2]}]},
     {running_nodes,[rabbit@rabbit3,rabbit@rabbit2,rabbit@rabbit1]}]
    ...done.
    
    #2번 서버 확인
    rabbit2$ rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit2 ...
    [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit3]},{ram,[rabbit@rabbit2]}]},
     {running_nodes,[rabbit@rabbit3,rabbit@rabbit1,rabbit@rabbit2]}]
    ...done.
    
    #3번 서버 확인
    rabbit3$ rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit3 ...
    [{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
     {running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}]
    ...done.
  3. 클러스터 최종 확인
    클러스터로 묶인 RabbitMQ들은 서로간의 계정, Virtual Host, policy, Queue, Exchange 등을 모두 공유합니다. 따라서 1번 서버에만 붙어도 2번, 3번 서버의 Queue에 Access할 수 있습니다. 네! 짱짱맨입니다! 간단한 테스트로 Management Plugin으로 접속하여 1번 서버에서 Queue를 만들고 메세지를 Publish해보면 2번, 3번 서버에서도 인식이 되는것을 확인할 수 있습니다.

3. 클러스터 노드 타입 변경

rabbitmqctl cluster_ctl 로 상태를 보면 dics, ram 이란 녀석들이 보입니다. 각 노드들이 현재 상태를 disc로 작동하는지 ram으로 작동하는지를 보여줌니다. 이 두개의 옵션에는 차이가 있는데 ram의 경우 node의 data가 ram에만 상주하여 작동 속도가 빠르고 disc의 경우 node의 data들이 disc에 기록되며 작동한다고 합니다. RabbitMQ 클러스터를 구성할 경우 서버 1대는 반드시 disc로 구성이 되어야하는데, 그 이유는 정말 재수가 없어서 서버가 전체다 내려갔을때 disc로 구성된 녀석을 통해 어느정도 복구가 되도록 하는거 같습니다. 물론 이건 문서를 대충 읽어서 정확한 내용은 아닙니다. 테스트 또한 해보진 않았습니다. 네, 저도 불안하긴 합니다. 여튼 1대는 반드시 disc로 구성하라고 합니다. (뭔가 찜찜하다.)

  1. Cluster Node Type 변경
    저는 1번과 3번을 빠른 ram으로 2번 서버를 disc로 구성하려 합니다. 다음과 같이 합니다.

    # disc로 작동할 2번 서버 먼저 작업한다. node중에 disc가 하나라도 없는 상황이 될 수 있으면 변경이 되지 않는다.
    rabbit2$ rabbitmqctl stop_app
    Stopping node rabbit@rabbit2 ...done.
    rabbit2$ rabbitmqctl change_cluster_node_type disc
    Turning rabbit@rabbit2 into a disc node ...
    ...done.
    Starting node rabbit@rabbit2 ...done.
    
    # 1번 서버 작업
    rabbit1$ rabbitmqctl stop_app
    Stopping node rabbit@rabbit1 ...done.
    rabbit1$ rabbitmqctl change_cluster_node_type ram
    Turning rabbit@rabbit1 into a ram node ...
    rabbit1$ rabbitmqctl start_app
    Starting node rabbit@rabbit1 ...done.
    
    # 3번 서버 작업
    rabbit3$ rabbitmqctl stop_app
    Stopping node rabbit@rabbit3 ...done.
    rabbit3$ rabbitmqctl change_cluster_node_type ram
    Turning rabbit@rabbit3 into a ram node ...
    rabbit3$ rabbitmqctl start_app
    Starting node rabbit@rabbit3 ...done.
  2. 확인하기
    1번서버에서 rabbitmqctl cluster_status로 cluster type이 잘 변경되었는지 확인합니다. 그리고 1번 서버를 stop/start를 하며 2번 서버로 cluster_status를 체크해보며 node 구성에서 1번 서버의 RabbitMQ가 빠졌다가 다시 들어오는것을 확인합니다. 모든게 잘 작동하면 클러스터게 제대로 구성되었다고 볼 수 있습니다.

 4. 미러링 구성하기

3번까지 클러스터를 구성하기는 했는데 아직 고가용성이라고 볼수는 없습니다. 클러스터는 서로의 내용을 공유만 할 뿐이어서 불의의 사고로 1번서버가 죽어버린다면 2번, 3번 서버를 통해서 1번서버 큐의 내용을 읽을 수 없게 되며 1번에 남아있던 message들은 모두 증발해 버립니다. 따라서 고가용성을 위해 클러스터의 노드들이 서로의 내용을 복사하여 저장하도록 해주어야 합니다. 노드간 미러링을 구성합니다!

  1. 미러링 정책 설정하기
    클러스터만 잘 구성되었다면 미러링은 정말 쉽습니다. 그냥 정책을 정해주는 명령 하나만 날려주면 됩니다. 전 그냥 다 미러링할 계획이라 ha-mode를 all로 했습니다.  옵션별 자세한 내용은 가이드 참조 바랍니다. (https://www.rabbitmq.com/ha.html)

    # ha-all은 새로 추가되는 정책의 이름, ^ha\.은 regexp로 표현된 미러링할 queue 이름, 뒤의 json은 정책 세부 사항,
    rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
  2. Virtual Host 별로 정책 설정해주기
    1번의 내용은 default virtual host에 적용이 됩니다. 새로 만든 virtual host에 ha 정책을 정해주려면 -p 옵션을 사용해야 합니다.

    # myQueue Virtual Host 속한 이름에 .ha 가 포함된 Queue를 모두 미러링 하는 정책
    rabbitmqctl set_policy -p myQueue ha-all "^.*\.ha.*" '{"ha-mode":"all"}'
  3. ha-sync-mode 에 대해
    미러링을 하면 node간 모든 내용들이 복사됩니다. 하지만 고민해야할 것이 하나 있습니다. 클러스터에 새로운 node가 추가되었을때 이 node에 다른 node들이 가지고 있는 과거의 Data를 Sync해야할 것인가? 에 대한 문제입니다. RabbitMQ는 기본적으로 새로 추가된 node(죽었다 살아난 node 포함)에 기존 node의 과거의 data들을 복사하지 않도록 합니다. Data Sync하는 동안 해당 Queue는 무응답 상태가 되어 버려 서비스 가용성에 좋지 않은 영향을 미칠수 있기 때문입니다. 그럼에도 불구하고 추가되는 노드에 반드시 과거 Data가 Sync되어야 한다면 ha-sync-mode 옵션으로 설정할 수 있습니다.

    # ha-sync-mode를 automatic으로 설정, 새로 들어오는 node에도 과거의 data가 모두 복사된다.
    rabbitmqctl set_policy -p myQueue ha-all "^.*\.ha.*" '{"ha-mode":"all", "ha-sync-mode":"automatic"}'
  4. Management Plugin 을 이용한 테스트 및 관리
    사실 미러링은 그냥 Virtual Host에 적용되는 정책에 따라 변할뿐입니다. 그리고 이러한 정책은 Management Plugin에서 Admin=>Policies 메뉴를 이용하면 좀더 편리하게 설정을 할 수 있습니다.

5. 클러스터에서 빠져나오기

클러스터를 구성했으면 클러스터에서 빠져 나올수도 있어야 합니다.

  1. 클러스터에서 빠져나오기
    이것도 간단합니다. 클러스터에서 뺄 서버에 가서 명령 하나만 쳐주면 됩니다. 3번 서버를 제거해보도록 하겠습니다.

    # 3번 서버를 클러스터에서 제거
    rabbit3$ rabbitmqctl stop_app
    Stopping node rabbit@rabbit3 ...done.
    rabbit3$ rabbitmqctl reset
    Resetting node rabbit@rabbit3 ...done.
    rabbit3$ rabbitmqctl start_app
    Starting node rabbit@rabbit3 ...done.
    
    # 2번 서버에서 확인해보기
    rabbit2$ rabbitmqctl cluster_status
    Cluster status of node rabbit@rabbit2 ...
    [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
     {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
  2. 혹 클러스터에서 제거해야할 node가 정상적으로 작동이 되지 않는 상태라면?
    다른 서버에서 원격으로 제거할 수 있습니다.

    # 3번 서버가 정지되어있다면...
    rabbit3$ rabbitmqctl stop_app
    Stopping node rabbit@rabbit3 ...done.
    
    # 1번이나 2번 서버에서 원격으로 제거 한다. 나중에 3번 서버는 reset하여 클러스터에서 완전히 빠지도록 해준다.
    rabbit2$ rabbitmqctl forget_cluster_node rabbit@rabbit3
    Removing node rabbit@rabbit1 from cluster ...
    ...done.

마지막으로 클러스터와 미러링 구성이 잘 되었나 확인하는것도 역시 Management Plugin을 사용하면 정말 편합니다. 관리자 계정으로 접속하면 home 화면에 cluster가 어떻게 구성되었는지 뙇! 보여줍니다. 미러링이 잘되었는지는 Queue 메뉴에 들어가면 확인 가능합니다. Queue 리스트를 보면 미러링 되는 큐는 이름 옆에 (+2) 이런 표식이 나옵니다. 미러링 되고 있는 node의 수를 보여주는 값입니다. 저게 생기지 않는다면 클러스터에서 공유만 되고 미러링이 되고 있지 않는 Queue 입니다.

오늘건 좀 길었네요. 헉헉.

[RabbitMQ] 2. 초보를 위한 RabbitMQ 서비스용 계정 및 Virtual Host 설정하기

앞장에서 RabbitMQ를 구동하기 위한 설치부터 기본 설정을 끝냈으니 이제 서비스가 가능하도록 계정과 Virtual Host, Queue, Exchange 설정 등을 끝내야 한다. Terminal에서 rabbitmqctl 사용하여 간지나게 작업하면 멋있겠지만 역시 초보는 초보답게 Management Plugin을 사용하여 설정하기로 함 (rabbitmqctl 공부하기 귀찮….)

1. 서비스용 계정 설정

관리자로 설정한 rabbitmq 아이디로 Management Plugin 에 접속해 보면 상단에 ‘Admin’ 이라는 메뉴가 보인다.  클릭하여 Users 기능으로 계정을 관리할 수 있다.

RabbitMQ Management 2014-10-07 14-58-08
요런 화면이 나온다. 딱히 계정관리에 어려울건 없다. GUI니 그냥 계정 두어거 생성/삭제 해보면 금방 감이 온다. 단, 주의할 것은 Tags와 Virtual Host 부분이다.

  1. Tags : 게정의 권한을 부여하는 부분. Admin, Monitoring, Policymaker, Management, None 이렇게 5가지 종류가 있다. Admin은 말그대로 Rabbitmq를 마음대로 주무를 수 있는 관리자 계정이고 Monitoring은 조회만 가능하다. Policymaker,  Management 등등이 있는데 이 문서는 초보용이니 설명은 과감히 생략! 주의 사항으로 정의 권한을 최소한 Management 로 설정해 주어야 Management Plugin에 접속이 가능하다. (한마디로, 지금 rabbitmq를 None으로 설정해버리면 이제 Management Plugin 사용 못한다. 으하핫!) None으로 설정해버리면 오직 Client용 계정으로 작동하여 Management Plugin에 접속이 불가능해진다. 향후 관리자용 계정(Admin), 모니터링 계정(Monitoring), 서비스 Client 계정(None)으로 분리하여 사용할때 잘 구분지어 주도록 하자.  아! Tags 라는 이름 답게 여러개 설정이 가능하다.
  2. Virtual Host : Queue와 계정을 그룹핑 하는 개념이다. 사실 이것때문에 많이 방황(?)했다. 하나의 계정은 여러 Virtual Host을 할당 받을 수 있으며 자신에게 할당된 Virtual Host에 속한 Queue에만 접근이 가능하다. 자세한 설명은 뒤에서….

이미 앞선 장에서 rabbitmq 계정을 amin으로 생성했으니(그래서 Management Plugin에 접속이 가능!) 더이상 쓰지 않을 guest 계정은 삭제하고 서비스 Client 로 사용할 계정 두개를 만들어 보도록 하자. (None Tag로 pushService, smsService 두개를 만들어 보자)

2. Virtual Host 설정

나를 매우 혼란스럽게 해주었던 Virtual Host에 대해 알아보자! 앞서 대충 설명했듯이 일종의 Queue 접근에 대한 그룹핑이다. Exchange 란 애도 함게 설정이 되어야 하는데 일단 서비스용 계정 설정에 집중을 하도록 하자. Management Plugin에서 Admin => Virtula Hosts 메뉴에 들어가면 아래와 같은 설정 화면이 나온다.

RabbitMQ Management 2014-10-07 15-22-28

앞에서 설정한 계정 이름을 보면 예상이 되듯이 smsService 와 pushService 두가지 서비스가 RabbitMQ를 사용할 예정이다. 이 둘은 서로 관계가 없으니 서로의 Queue나 설정을 알필요도 관심도 없다. 그러니 서비스별로 서로 독립된 구역을 나누어주는게 좋은데 그 단위로 Virtual Host를 사용할 수 있다. smsHost와 pushHost를 당장 만들어보자. 만든 후에는 Users에서 계정별 설정을 사용하여 smsService에는 smsHost를 pushService에는 pushHost를 설정해주도록 하자. rabbitmq계정에는 모든 Virtual Host를 설정해주자. 제대로 설정했다면 Users에서 아래와 같은 화면을 볼 수 있다.

RabbitMQ Management 2014-10-07 15-50-36
참고로 한개의 계정에는 여러 Virtual Host를 설정할 수 있다. 전체 관리자나 전체 모니터링 계정의 경우에는 모든 Virutal Host를 설정하여 쉽게 관리할 수 있도록 하는게 좋다. Virtual Host에 대한 이런 저런 Policy 설정도 가능하긴 한데 이건 초보용이니 과감히 생략! (사실 딱히 특이한 경우가 아니면 쓸일이 없을거 같다..)

다음에 Queue와 Exchange를 설정하게 되면 알겠지만 관리자 계정이든 일반 계정이든 모두 자신에게 설정된 Virtual Host 영역의 Queue와 Exchange에만 CRUD가 가능하다. 다른 Virtual Host의 Queue나 Exchange는 존재조차 확인할 수 없다.

내용은 별거 아닌데 벌써 지친다;;; 서비스용 Queue와 Exchange 설정과 개념 설명은 다음에….

[Rabbitmq] 1. 초보를 위한 RabbitMQ 후딱 설치하고 설정하기

회사의 캐시카우 서비스의 푸시 파트를 개선해야할 일이 생겼다. 레거시 코드가 너무 old한게 가장 큰 문제인데 그 중 눈에 띄는 것은 push message queue를 RDBMS로 구현해 놓은 부분이다. DB 튜닝 할때도 message pub/sub 부분에서 DB에 부하가 종종 크게 나오는 것으로 봐서는 이 부분 개선은 필수 인거 같다. 결국 mq 서버를 사용하는 것으로 결론이 났는데 무엇을 쓸까 수소문 하다가 RabbitMQ를 사용하기로 결정했다.

CloudFoundry의 Nats와 Apache ActiveMQ도 후보 중 하나였으나 난 왜 RabbitMQ를 선택했을까? 그냥 주변에서 많이 써서….
(노..농담이고 Nats는 설치도 간편하고 사용성도 좋긴 한데 클러스터링/미러링 이 안되는 가장 큰 문제점이 있다. ActiveMQ는 그냥 주변에서 RabbitMQ를 더 추천해서 써보지도 않고 팽했다.)

여튼  RabbitMQ는 처음 다루다 보니 일단 사이트(https://www.rabbitmq.com/) 방문해서 닥치고 매뉴얼을 읽고 Start!

1.  설치 (ubuntu 기반)

좀 매니악한 개발자 코스프레좀 해볼까 하고 소스 부터 설치하려했다가 erlang부터 설치해야하는 귀찮니즘의 압박으로 결국 apt-get 느님의 도움을 받기로 함
참고 페이지 : https://www.rabbitmq.com/download.html

$>sudo apt-get install rabbitmq-server

2. Management Plugin 활성화

설치가 완료 되면 terminal이 익숙치 않은 초보(?)를 위해 제공하는 Management Plugin도 활성화 시켜 놓자. 플러그인 설치 후에는 RabbitMQ를 restart 해주어야 변경 사항이 반영된다.
참고 페이지 : https://www.rabbitmq.com/management.html

$>sudo rabbitmq-plugins enable rabbitmq_management
$>sudo service rabbitmq-server restart

3. 관리자 계정  추가

처음 설치하면 guest 계정을 제공하기는 하는데 안타깝게도 localhost에서만 접속을 허용한다. 즉, 설치하자마자 Management Plugin의 유려한 UI로 막막 설정해보고 싶었지만 로그인 조차 안되는 난감함이 기다린다. 그러니 일단 RabbitMQ를 설치하고 난 뒤 바로 Terminal에서 관리자 계정을 설정해주도록 하자. 아래 예제에서는 관리자 계정을 rabbitmq로 설정했다.

$>sudo rabbitmqctl add_user rabbitmq password
$>sudo rabbitmqctl set_user_tags rabbitmq administrator

4. Management Plugin 접속

유저 설정까지 끝냈으면 Management Plugin으로 RabbitMQ를 관리해보도록 하자.
웹브라우저로 http://serverip:15672/  에 접속하면 아래와 같은 화면이 나온다.

RabbitMQ Management 2014-10-06 17-59-02

이제 3번에서 설정한 관리자 id로 접속을 해보자. 로그인에 성공하고 아래와 같은 화면이 나오면 성공!

RabbitMQ Management 2014-10-06 18-00-51

축하합니다! 기본적인 RabbitMQ의 설치 및 기본 설정을 끝내셨습니다!

다음 시간엔 서비스용 계정 및 Virtual host 설정 하는 법을 진행해볼까 합니다.

OSX 자바 복구

맥에 java 버전 가지고 이런저런 장난 치다가 실수로 맥에 기본으로 설치된 자바VM 날려먹고 새로 다운로드 받은 java들도 설치가 안되는 난감한 상황이 되었다.

다행히 당황하지 않고 구글링해서 복구를 빡! 끝!

OSX 자바 복구

1. /System/Library/Java , /System/Library/Frameworks/JavaVM.framework, /Library/Java 완전 삭제

rm -rf /System/Library/Java
rm -rf /System/Library/Frameworks/JavaVM.framework
rm -rf /Library/Java

2. http://support.apple.com/kb/DL1572 에서 apple이 제공하는 java 1.6 dmg 다운로드 및 설치
3. terminal에서 자바 버전 확인을 빡! 끝!

Oracle Java 1.7로 업데이트

  1. http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 에서 oracle java 1.7 dmg 다운로드 및 설치
  2. terminal에서 자바 버전 확인을 빡! 끝!

정규표현식 정리

원본은 http://www.nextree.co.kr/p4327/

지금까지 본 정규식 관련 자료중 가장 정리를 잘 해놓은 곳인거 같다.

특히 표현식 설명해주는 테이블이 너무 이쁘다! 엔간헤선 소유욕이 발동하지 않는데 하앍! 가지고싶어!

그래서 퍼왔……문제되면 삭제하겠습니다……

jhkim-140117-RegularExpression-06

jhkim-140117-RegularExpression-07

jhkim-140117-RegularExpression-08

jhkim-140117-RegularExpression-09

오픈소스와 마인드 컨트롤

Cloud Foundry를 사용하여 PaaS 구축 프로젝트를 진행한지 1년이 다 되어간다. 그런 와중에 느낀 오픈소스를 사용하는 업무 환경에서, 특히 단순 사용이 아니라 소스를 우리 필요에 맞춰 고쳐야 하는 상황에서는 더욱, 나의 일을 방해하는 가장 큰 요소는 스트레스와 의욕 상실이다.

이미 완성이 된 소프트웨에어는 개발자 고유의 철학과 테크닉, 개성이 자연히 녹아있다.오픈소스를 개수해야 하는 입장에서는 이런 원본(?) 개발자들의 철학과 개성들을 다 받아들여야 하는데, 그렇지 않고 내 멋대로 수정하기 시작하면 기존 정상적인 로직의 흐름이 깨지고 스파게티 코드가 늘어나고 막장 프로젝트가 될 가능성이 절대적으로 커진다, 삼라만상을 깨달은 부처가 아니고서야 나와 다른 타인의 생각과 개성들을 쉽게 받아들이기란 어려운 일이다. 즉, 스트레스다. 특히 Cloud Foundry 같이 거대한 오픈 소스의 경우에는 더욱 그렇다.

요즘 하루 일과 8시간 중 실제 코딩에 쏟는 시간은 4시간 정도 이다. 그럼 남은 4시간은 뭐에 쓰는 걸까? 대부분 마인드 콘트롤 하는데 쓴다. 요렇게 말하면 좀 멋질거 같다. 실상 마인드 콘트롤이라 해봤자 대부분 시덥잖은 잡담과 웹서핑, 멍때리기 이다.

Cloud Foundry 소스들을 뜯어보며 느낀 나의 부족함에 대한 자괴감과 제약된 상황에서 어떻게든 되는 방법을 찾아보려고 발버둥 치는 자신을 돌아보며 나름 하루 20줄도 안되는 코드 생산량에 대한 정당성(?)을 부여하기 위해 틈틈히 코딩을 멈추고 정신승리를 시전한다.

사실 그냥 원본의 코어와 커먼 요소들까지 다 뜯어고치면 코딩량도 많아지고(그럼 왠지 뿌듯하다) 속도 편하겠지만, 그로 인해 기하급수적으로 늘어날 스파게티 코드와 예측할 수 없는 수많은 에러들도 내가 감당해야하니 그딴 짓은 할 수 없다.

내가 나에게 똥을 쌀 순 없어!

생각해보니 남에게 넘길거라도 양심상 그러면 안된다. 내가 싼 똥은 내가 치워야지…

결과적으로 최근 내가 생산하는 코드의 양은 많지 않다. 신입 시절 멋도 모르고 신들린듯한(?) 타이핑으로 하루에 수백줄의 (개떡같은)코드를 생산하던것과는 달리 하루 20줄 정도의 코드 생산하기도 버겁다.그리고 그렇게 생산한 20줄의 코드를 다음날 테스트 하다가 다 뒤집어 엎기도 부지기수 이다.

반면, 기존 소스의 철학과 원칙을 이해하기 위해 쏟아붓는 시간이 더 많아 졌다.

이렇게 오늘도 나는 나의 적은 코드 생산량에 스파게티 코드를 만들지 않기 위한 마인드 콘트롤이라는 정당성을 부여하며 정신승리를 시전한다.

Redhat OpenShift 분석 중

CF1으로 PaaS구축하는 일이 어느정도 끝나가는 마당에 CF1의 deprecated문제를 그냥 무시하고 지낼수는 없었다.
팀장님과 이야기를 나눈 결과 역시 deprecated된 녀석을 억지로 끌고 가는것도 정상적인 일은 아닌 것으로 결론이 났다.

그렇다고 밑바닥부터 뒹굴며 다시 만들수는 없으니 대체제를 찾아야 하는데 뭐 선택할 게 따로 있나? Cloud Foundry2나 OpenShift 둘중 하나지 뭐…

간단히 접한 Cloud Foundry 2에 대한 나의 생각은, 일단 CF1에 비해서 엄청 발전했다는 것이다. 하지만 고민하게 되는것은 역시 괴랄한 진입장벽인거 같다. Bosh를 사용한 뭔가 지랄맞은 설치 방법은 보고있다보면 토가 나올거 같다.

IaaS기 기본 사양이라니… 너무하잖아!

(사용법은 개떡같더라도) 설치는 무조건 쉽고 간단해야한다 라는 나의 철학과는 좀 많이 어긋난다. vgrant로 설치를 쉽게 해준 오픈소스가 있긴한데, 정규 프로젝트가 아니라는게 좀 마음에 걸린다. VMWare에 한번 데여서 인지, 앞으로 소스가 어떻게 바뀔지 모른다는 불안감이 크다. 그렇게 생각해보면 vgrant 유틸도 언젠가 제대로 안먹게 되겠지? 그럼 난 다시 멘붕 되겠지?

그리고 너무 CF에만 몰빵하는거 아닌가 하는 생각도 들어 슬쩍 OpenShift에 눈을 돌려보기로 했다. https://www.openshift.com/ 회원 가입도 하고, online 버전도 사용해 보고, enterprise 버전이랑 origin 버전 문서들도 좀 들여다 보고, 한 이틀정도 문서만 슬금슬금 보고 있다.

구조는 CF랑 뭔가 미묘하게 같은듯 다르면서 CF보다 뭔가 더 간단하다. (말이 뭐 이따구야.)

이래저래 문서보고 조금 써보면서 느낀건 CF는 사용자가 이미 완성된 구성을 사용하는 느낌이라면 OpenShift는 레고처럼 사용자가 취향에 맞게 적당히 조립해서 쓰는 느낌이다. 이런 사용성 부분은 취향에 따라 다르니 뭐가 좋다 나쁘다 하긴 어려울거 같다.

내 취향은 OpenShift쪽이다. 취향에 맞게 적당히 조립…. 덕 냄새가 좀 나잖아? 아키텍쳐 구성도 좀 간단하고, 대신 카트리지라는 개념이 새로 생기는 문제가 있었지만 그정도야 감안해줄 수 있지!

————————————

구성 간단히 요약

* Broker : 파스 관리 서버, Node에 Gear라는 단위의 가상머신(?)을 생성해주고 Cartridge를 설치해준다(카트리지는 후반에 설명), 관리 UI도 제공해주는거 같다.

* ActiveMQ : Broker<->Node간 메시징 채널

* Node : 물리 머신을 관리하는 컴포넌트라고 봐야할거 같다. Node가 Machine을 Gear 단위로 Virtualization 해준다. 그 단계에서 쓰이는 기술은 나중에~~ (과연 할까?) , CF로 생각하면 DEA라고 보면 될거 같다. DEA보다는 하는일이 좀더 많은거 같아 아직 한마디로 정의하기 어렵다.

** GEAR : Node에서 돌아가는 VM 단위 랄까? 여튼 Node는 사용자에게 GEAR단위로 자원이 분할되어 할당된다. 사용자는 자신에게 할당된 GEAR에 여러 툴들(카트리지)을 설치하여 사용하는 개념이다.

** CGroup, SELinux : Node에서 이놈들을 사용해서 머신을 GEAR단위로 쪼갠다. 덕분에 GEAR들은 지정된 자원 내에서만 사용자 프로세스를 돌릴 수 있다. 자세한 버추얼 기술은 내부 코드를 뜯어봐야 알수 있을거 같다. 어차피 오픈쉬프트를 사용하는 입장에서 주요 관심은 Broker와 아키텍쳐 구성일테니 이건 아직 자세히 안볼 생각.

** High-Density : 뭐 뭐신을 잘게 쪼개서 쓴다 뭐 그런 장점을 표현하는거 같은데 대충 넘어가기로…

* cartridge : 오픈쉬프트의 독특한 구성중 하나인데, GEAR에 설치되는 서비스들은 모두 카트리지라는 개념으로 제공된다. runtime이건 was이건 db건 다 카트리지다. 사용자는 자신의 gear안에 원하는 카트리지를 끼워넣는 구성이다. 내가 자바에 제이보스에 mysql을 돌릴거야! 라고 하면 gear를 하나 만들고 거기에 java 카트리지, jboss 카트리지, mysql 카트리지 를 낑겨 넣으면 된다. 레고 조립하는 느낌이다.

* horizontal App scaling : CF는 최상단에 goRouter라는 녀석이 ip랑 domain을 관리 해주기때문에 app instance간 scaling 걱정을 안해도 되는데 반해 오픈 쉬프트는 이런걸 따로 해줘야하는거 같다. HAProxy 카트리지가 있는데, 여러 GEAR에서 돌아가는 App을 Horizontal Scaling을 하려면 일단 여러 GEAR에 앱들을 배포하고 다시 다른 Gear에 HAProxy 카트리지 넣고 이녀석한테 request 라우팅을 맡기는 형태랄까? 이점에서는 CF가 좀더 편한거 같다.

* DNS : DNS도 얘네는 따로 설치해서 써야하는거 같다. CF는 goRouter가 다 관리해주니 그냥 *.xx.xxx Domain 잡아놓고 서비스하면 되는데, 구성상 DNS를 따로 만들어줘야하는거 같다. 그렇게 해놓으면 Broker에서 사용자가 만든 앱에대한 내용을 DNS에 등록해주는… 이건 귀찮은거잖아!

* git, jenkins : 기본으로 지원한다는데, 일단 지금의 주요관심사는 아니다. Broker랑 Node부터 때려잡아야 한다.

아무래도 지금까지 CF만 해왔으니 CF랑 자꾸 비교하게 되는거 같다.
Cloud Foundry가 {Router – Controller – HealthManager – DEA – SERVICE (Nats로 메시징)} 로 좀 복잡하다면
OpenShift는 {Broker – Node (ActiveMQ로 메세징)} 의 단촐한 구성이다.

Broker가 CF의 Controller, HealthManager, Router의 역할 을 담당하고
Node가 DEA, Service 역할을 담당하니 각각 컴포넌트는 내부가 더 복잡하지 않을까 예상해본다.

여튼 대충 파악 끝났으니, 다음주에는 실제 설치해봐야지

OpenShift공부하면서 좀 감동한건, RedHat에서 문서화를 엄청 잘해놨다 ㅠ.ㅠ
VMWare에 비하면 이건……흑흑…….업드려 절해주고 싶다.
서…설치 잘할게요…ㅠ.ㅠ

근데 개떡같은겓 왜 또 fedora 기준인거냐 ㅠ.ㅠ
CF하느라 CentOS버리고 Ubuntu 죽어라 했더니….
레드햇이니 팔은 안으로 굽는거니 ㅠ.ㅠ

Ubuntu 설치 법 따로 연구해야할거 같은 불안감이 엄습한다.

2013.10.13, Spring Camp, Cloud Foundry를 활용한 PaaS 구축기 발표, 소감

박용권 매니저님의 권유로 어제(13일) KSUG X 라스칼라코딩단(영어 쓰기 귀찮아..) 주최 Spring Camp에서 ‘Cloud Foundry를 활용한 PaaS 구축기’를 발표하기 되는 영광(?)을 얻게 되었다.

발표 전 첫 리뷰에서 야심차게 준비했던 발표자료는 ‘본부장님께 드리는 보고서’ 라는 낙인과 함게 강력하게 질타 받았고, 두번째 다시 만든 것은 그래도 많이 나아 졌다는 용권님의 승인(?)받아 그대로 질풍가도를 달리는 듯 했으나 발표자료에 첨부된 이미지들의 라이선스를 확인하지 않은 관계로 이미지를 전부 교체해야하는 뻘짓도 해야 했다. 이말년 작가님께는 이미지 사용 허가까지 받는 치밀함을 보여놓고 왜 나머지는 그럴 생각을 못했을까? 한이 맺히는 부분이다. 구글 이미지 검색에 라이선스 체크 옵션을 넣으니 맘에 드는 이미지가 진짜 안나오더라. 이미지 교체 작업으로만 한 네시간 날린것 같다. 지난 토요일 하루를 모두 발표자료 정리하는데 써버렸다.

발표 당일, 오전에 혹시나 하는 마음에 팀장님 리뷰 받고 일부 멘트랑 장표 순서 좀 조금 바꾸고 마무리를 했다. 발표 전까지 계속 진장이 되어 긴장을 풀고자 제자리를 빙빙돌며 걸었다. 오른 어깨에 간지나는 DSLR을 걸친채 뭘 그리 긴장하냐며 풋! 하고 웃으시는 변정훈님! 하지만 후에 변정훈님도 자신의 발표 시간이 다가오니 긴장되어 복도를 빙빙 돌더라는 웃지 못할 전설 같은 이야기…

발표 5분전, 디스플레이 미러링 해제하고 시작멘트 정리하고 마지막 장표 체크하는데 맥이 멈춰버렸다. 데모귀신인가! 커널패닉! 재빨리 강제 리붓! 다행이 시작 3분전에 준비가 완료되었다.

발표 1분전, 시작 전에는 좀 많이 떨렸는데 막상 시작하니 매우 마음이 덤덤해 지더라. 발표 중반부터는 그냥 준비했던 스크립트를 보지 않기 시작했다. 야심차게 준비했던 ‘이말년 시리즈’ 애드립은 대차게 실패하고, 개그를 쳤는데 청중이 그렇게 조용할 수가 없더라! 으아아! , 발표는 어느새 중반을 넘기고 있었다.

중간 즈음 Cloulu 시연에는 얼마전부터 속썩이덴 L4스위치 문제가 또 터져서 에러가 나기 시작. 오마이갓! 하며 리프레쉬를 반복하니 느리지만 다시 되긴 했다. 당황하지 않은척 하며 시연은 마칠 수 있었지만, 원래는 채팅 방도 열어 놓고 설문 사이트도 열어 놓으면서 파스를 자유롭게 쓰는 모습을 보여주고 싶었는데 그렇지 못한게 많이 아쉽다. 혹시나 또 에러나는거 아닐까 하는 걱정에 그냥 접었다. 에잇! 이게 다 L4 때문이다.

데모 삑사리와 회심의 애드립을 죄다 말아먹는 불상사가 있었지만 전반적으로 별 탈 없이 발표는 마무리 지을 수 있었다.

긴장풀려고 하루종일 빙글빙글 걸어다녔더니 다리가 매우 아프다. 내일 데뷰 행사는 잘 갈 수 있으려나.

마지막으로 의미있는 행사 준비하시느라 많은 고생 하셨을 KSUG 및 라스칼라코딩단 여러 분들께 감사드립니다.

발표 마무리에 Special Thanks to에 LG CNS때부터 알고 지내온 대(!)선배 채수원님과 이동욱님을 넣었는데, 멘트가 꼬여 마치 Cloulu개발에 도움을 주신 분처럼 묘사된거 같은 느낌이다. 오래전부터 많은 조언으로 큰 힘을 불어 넣어주신 이라고 말하고 싶었는데, 혀가 꼬인건지 멘트가 꼬인건지 엉망이 되어버렸다. 젠장.

Special Thanks to 인물 소개 사진으로 페북 프로필 사진을 따다 썼는데 때 마침 채수원님의 프로필 사진이 채수원님의 애견(dog). 시간이 없어 별 생각 없이 넣었는데 발표 끝나고 생각해보니(주변 분들 말씀도 그렇고) 오바한거 같다. 나중에 혼날거 같다. ㅠ.ㅠ 죄송합니다.

구글 드라이브에 올려놓은 발표자료 URL
https://drive.google.com/open?id=0B35qkFCKn8rjVm1qay00WlI5N3c

SK Planet PaaS Service, Cloulu 1.2 베타 오픈

지난 1월부터 준비했던 PaaS인 Cloulu 1.2 가 드디어 베타 오픈했다.
(정확히는 작년부터이지만, 난 1월부터 참여했으니까!)

팀내 오픈이라는 작은(?) 규모이지만,
생에 대외(?) 서비스로 내놓는 세번째 제품이라 감회가 남다르다.
지난 6개월동안의 삽질과 마음고생을 생각하면 눙물이……..크흑……

아직 부족한 부분도 많고 보수해야 할 부분도 많아 잠깐의 휴식후 다시 바빠질것 같다.
그렇지만 팀 분위기도 자유롭고, 모듈원끼리도 호흡이 잘맞아 당분간은 행복하게 일할 수 있을것 같다.

SK Planet 인원이시라면 누구든 사용하실 수 있습니다. PSD1팀에 문의해주세요.

https://cloulu.com