기본적인 설정방법은 http://tajo.apache.org/docs/current/configuration/ha_configuration.html 를 참고하면 된다.

Tajo에서 마스터 노드는 HA 구성이 가능하다. 근데 저 문서만 보면 좀 애매하다.

그래서 내가 테스트하면서 얻은 지식을 정리하려고 한다.


1. HA구성할때 tajo-site.xml 주의점

tajo를 분산처리환경으로 구성할때 tajo-site.xml을 모든노드(마스터+워커)에 복사하라고 한다. (설정파일과 tajo-env.sh를 모두)

HA구성 할때는 한가지 주의할것이 있다. 

백업마스터 노드서버의 tajo-site.xml의 설정값에서 마스터서버의 hostname 값은 자기자신으로 변경해야한다는점이다.


이해를 돕기위해 아래와 같이 서버가 구성되어있다고 가정하겠다.

이럴 경우 tajo-site.xml 의 서버별 설정파일내용을 적으면 아래와 같다.


 SERVER

 IP

 tajo ACTIVE MASTER

 10.0.0.1

 tajo BACKUP MASTER 

 10.0.0.2

 tajo worker 1

 10.0.0.3

 tajo worker 2 

 10.0.0.4

 tajo worker 3

 10.0.0.5



* ACTIVE MASTER , worker 1, worker 2, worker 3 (tajo-site.xml)

... 생략 ...


<!-- System Settings -->

<property> 

  <name>tajo.master.ha.enable</name>  <!-- HA모드를 활성화 하려면 필요함-->

      <value>true</value>

      </property>

<property>

<property>

  <name>tajo.master.umbilical-rpc.address</name>

  <value>10.0.0.1:26001</value>

  <description>TajoMaster binding address between master and workers.</description>

</property>


<property>

  <name>tajo.master.client-rpc.address</name>

  <value>10.0.0.1:26002</value>

  <description>TajoMaster binding address between master and clients.</description>

</property>


<property>

  <name>tajo.resource-tracker.rpc.address</name>

  <value>10.0.0.1:26003</value>

  <description>TajoMaster binding address between master and workers.</description>

</property>


<property>

  <name>tajo.catalog.client-rpc.address</name>

  <value>10.0.0.1:26005</value>

  <description>CatalogServer binding address between catalog server and workers.</description>

</property>


<!-- Worker Settings -->

... 생략 ...



* BACKUP MASTER (tajo-site.xml)

... 생략 ...


<!-- System Settings -->

<property>

  <name>tajo.master.ha.enable</name>   <!-- HA모드를 활성화 하려면 필요함-->

      <value>true</value>

      </property>

<property>

<property>

  <name>tajo.master.umbilical-rpc.address</name>

  <value>10.0.0.2:26001</value>

  <description>TajoMaster binding address between master and workers.</description>

</property>


<property>

  <name>tajo.master.client-rpc.address</name>

  <value>10.0.0.2:26002</value>

  <description>TajoMaster binding address between master and clients.</description>

</property>


<property>

  <name>tajo.resource-tracker.rpc.address</name>

  <value>10.0.0.2:26003</value>

  <description>TajoMaster binding address between master and workers.</description>

</property>


<property>

  <name>tajo.catalog.client-rpc.address</name>

  <value>10.0.0.2:26005</value>

  <description>CatalogServer binding address between catalog server and workers.</description>

</property>


<!-- Worker Settings -->

... 생략 ...


만약, 백업마스터 서버에서 ip를 바꾸지 않고 실행했다면 어떤일이 일어날까?

결론부터 말하면 java.net.BindException 오류가 나면서 실행에 실패한다. 

tajo-site.xml에 설정한 ip나 hostname값은 워커프로세스라면 connection을 위해 사용하고, 마스터프로세스라면 accept 하기위해 사용한다.

즉, 백업마스터서버의 IP는 10.0.0.2 인데, 프로그램에서는 10.0.0.1 이라는 잘못된 값으로 값을 할당하려고 하니 에러가 나는것이다.


한마디 더하자면, ip/hostname 설정을 안하거나 설정파일이 없으면 기본값인 localhost(127.0.0.1)로 할당된다.

이때 마스터에서는 외부서버에서 connection 할수없는 상태가 된다. 

워커노드에서는 마스터노드 정보가 없어서 localhost(127.0.0.1)이라고 열심히 연결을 시도하다가 java.net.ConnectException 에러가 날것이다.

(물론, 하나의 서버에 워커랑 마스터를 같이 기동하는 구조라면 오류는 안날수 있지만 자웅동체(?) 연결이라 정상적인 설정은 아니다. 단 desktop모드제외)





2. master 파일 / workers 파일 생성

master 파일의 경우 마스터노드로 사용될 서버의 IP나 호스트명을 적어주면 된다. 

workers 파일의 경우 워커노드로 사용될 서버의 IP나 호스트명을 적어주면 된다.


예를 들면 다음과 같다.


* masters

10.0.0.1

10.0.0.2


* workers

10.0.0.3

10.0.0.4

10.0.0.5


이 파일의 용도는 어떤것일까?

참고로 tajo를 기동할때 수동으로 10.0.0.1 ~ 10.0.0.5 서버에 접속해서 기동하지 않는다. (물론 가능하지만)

보통 마스터서버 한곳에 가서 ./start-tajo.sh 만 실행하면 모든 서버에서 기동된다.

이게 가능한건, 실행할때 

masters 파일을 보고 해당 서버에 마스터프로세스를 기동하라고 요청하고

workers 파일을 보고 해당 서버에 워커프로세스를 기동하라고 요청하기 때문이다. 





3. HA의 액티브마스터와 백업마스터의 주의점

실제 서비스에 이용하는것이 active master, 대기중인걸 backup master 라고 한다.

일반적으로 active master로 사용할 서버에서 start-tajo.sh 를 실행해서 모든 서버의 tajo프로세스를 기동할것이다. (예제라면 10.0.0.1 서버)

하지만 backup master로 사용할 서버라고 생각했던 서버가 active 상태로 잡히는 경우가 있다.


tajo에서는 명시적으로 서버에서 누가 active고 master인지 지정한것는 구조가 아니다 (0.12 기준)

마스터서버 1번과 2번이 있다고 하면 동시에 실행해서 먼저 기동된 녀석이 active가 되고 나중에 기동된 녀석이 backup이 된다.

처음에 이런 설명이 없다보니 왜 1번서버에서 기동했는데 2번이 active상태인것인가 혼란이 왔었다.



추가로 한가지 경험담을 말하면

타조마스터의 경우 준비작업이 많아서, 워커보다 실행이 늦는게 일반적이다. 

그래서 워커노드의 로그를 보면 연결에 실패했다고 재요청하다가 연결되는 로그도 자주 볼수 있다.

문제는 이런 미묘한 시간적 차이에 위 이미지처럼 worker가 갈려서 등록되거나 일부 worker는 기동에 실패하는경우도 있다.


이런 문제를 줄이기위해서 나같은 경우는 active master 서버로 사용할곳에서 마스터프로세스를 먼저 실행하고, 나머지노드를 실행하는방식으로 해결하고 있다. (뭔가 나이스한거 같진 않다)


참고로 아래와 같은 형태로 기동한다. (물론 10.0.0.1 서버에는 masters / workers 파일이 있는 상태)

# 10.0.0.1 서버에서 master 노드만 실행 (http://10.10.0.1:26080 접속해서 active인지 확인)

[10.10.0.1]$   ./tajo-daemon.sh start master


# 마스터노드는 이미 떠있으니 그걸 제외한 모든 프로세스 기동

[10.10.0.1]$   ./start-tajo.sh




4. HA의 active / backup 구분은 어떻게 할까?

tajo-site.xml설정할때 'tajo.rootdir' 값을 설정할텐데 그 하위 폴더에 보면 ha를 위해 파일로 기입해둔다.

예를 들어 /tajo 폴더가 기본이라면  /tajo/system/ha 폴더에 관련된 이력값이 존재한다.


마스터노드를 동시에 실행시켰을때 가장 먼저 기동된 녀석이 acvite 에 이력이 남고

늦게 도착하면 backup으로 빠지는 구조로 보인다. 서버가 죽었는지 Heartbeat 를 주기적으로 날리면서 체크하는 형태로 보인다.


[user@서버 ~]$ hadoop fs -ls /tajo/system/ha/active/

Found 2 items

-rw-r--r--   3 user supergroup        101 2015-08-28 15:58 /tajo/system/ha/active/10.0.0.1_26001

-rw-r--r--   3 user supergroup          0 2015-08-28 15:58 /tajo/system/ha/active/active.lock



[user@소버 ~]$ hadoop fs -ls /tajo/system/ha/backup/

Found 1 items

-rw-r--r--   3 user supergroup        101 2015-08-28 16:00 /tajo/system/ha/backup/10.0.0.2_26001






+ Recent posts