What is Ganglia?

Ganglia is a scalable distributed monitoring system for high-performance computing systems such as clusters and Grids. It is based on a hierarchical design targeted at federations of clusters. It leverages widely used technologies such as XML for data representation, XDR for compact, portable data transport, and RRDtool for data storage and visualization. It uses carefully engineered data structures and algorithms to achieve very low per-node overheads and high concurrency. The implementation is robust, has been ported to an extensive set of operating systems and processor architectures, and is currently in use on thousands of clusters around the world. It has been used to link clusters across university campuses and around the world and can scale to handle clusters with 2000 nodes.

그렇다 -_-; 다시말해 갱그리아는 클러스터 모니터링 툴이라고 할 수 있다.

이를 이용해서 카산드라 서버을 모니터링 해보고자 한다.

고고고!

 

1. 설치

apt-get은 진짜 요즘 세상 좋아졌다-_- 라는 말이 절로 나오게 만든다.

apt-get install ganglia-monitor

 

2. 설정

vi /etc/ganglia/gmond.conf

globals {
  daemonize = yes
  setuid = yes
  user = root
  debug_level = 0
  max_udp_msg_len = 1472
  mute = no
  deaf = no
  host_dmax = 0 /*secs */
  cleanup_threshold = 300 /*secs */
  gexec = no
  send_metadata_interval = 0
}

cluster {
  name = "Cassandra cluster"
  owner = "Cardia"
  latlong = "unspecified"
  url = "unspecified"
}

host {
  location = "unspecified"
}

udp_send_channel {
  host = node1
  port = 86
  ttl = 1
}

udp_recv_channel {
  port = 8661
}

tcp_accept_channel {
  port = 8661
}

설정을 막 하고 나면 ganglia에서 데몬을 돌리고 있는 상태이므로 
sudo service ganglia-monitor restart

ps aux | grep gmond
해서 원하는 유저의 이름으로 gmond가 돌아가고 있는지 확인한다.

카산드라의 동작을 상세히 알아보기 위해 디버깅을 해보기로 했다.

http://wiki.apache.org/cassandra/HowToDebug

위 사이트에 카산드라를 디버깅하는 방법이 나와있지만 너무 간단히 나와있기 때문에 조금 자세히 설명해 보기로 하겠당.


1. 다운로드

이클립스를 사용하여 디버깅 할 것이므로 이클립스와 디버깅할 카산드라의 소스를 다운받아야 한다.

http://eclipse.org

http://cassandra.apache.org/

 

2. 이클립스에서 자바 프로젝트를 만든다.

3. 소스의 내용을 프로젝트 안으로 전부 카피한다.

4. build.xml 파일을 ant로 build한다.

5. 여기서부터는 위키의 내용과 비슷하다.
    프로젝트의 properties로 가서 기존의 src폴더를 지우고 위키에 나와 있는 대로 수정한다.

1) src/gen-java
2) interface/thrift/gen-java
3) src/resources
4) src/java
5)
src/avro

6. build/classes를 라이브러리에 추가한다.

7. 다음 jar파일들을 라이브러리에 추가한다.

lib/*.jar
build/lib/jars/hadoop-core-*.jar,
build/lib/jars/jna-*.jar,
build/lib/jars/commons-logging-*.jar,
build/lib/jars/pig-*.jar,
build/lib/apache-rat-*.jar 

8. run/debug configuration을 만들어준다.

1) src/java에 있는 org.apache.cassandra.thrift.cassandradaemon 클래스를 메인 클래스로 지정한다.
2) classpath에 conf 폴더를 추가한다(advanced를 누르면 폴더를 추가할 수 있다.)
3) 다운받은 소스 중 bin/cassandra.bat을 열어 JAVA options 부분(set JAVA_OPTS로 시작되는 부분)아래부터 classpath 부분 전까지를 복사해서 VM arguments에 넣어준다.

-ea
 -javaagent:(workspace의 위치)/workspace/cassandra/lib/jamm-0.2.5.jar
 -Xms1G
 -Xmx1G
 -XX:+HeapDumpOnOutOfMemoryError
 -XX:+UseParNewGC
 -XX:+UseConcMarkSweepGC
 -XX:+CMSParallelRemarkEnabled
 -XX:SurvivorRatio=8
 -XX:MaxTenuringThreshold=1
 -XX:CMSInitiatingOccupancyFraction=75
 -XX:+UseCMSInitiatingOccupancyOnly
 -Dcom.sun.management.jmxremote.port=7199
 -Dcom.sun.management.jmxremote.ssl=false
 -Dcom.sun.management.jmxremote.authenticate=false
 -Dlog4j.configuration=log4j-server.properties
 -Dlog4j.defaultInitOverride=true


중간중간에 F5를 눌러서 프로젝트를 새로고침하는 것을 잊지 말고 여기까지 하면 기본적인 준비는 끝이 났다. 소스코드에서 에러도 뜨지 않을 것이다.

만약 다음과 같은 오류가 발생한다면



windows -> preferences -> Java -> Compile -> Errors/Warnings -> Deprecated and restricted API에서 Forbidden reference를 Error에서 warning으로 바꿔주면 된다.



자, 디버깅 해보자!


이클립스를 실행시 failed to create the java virtual machine과 같은 메세지가 나온다면 

이클립스 폴더의 eclipse.ini 파일을 열어서 수정해준다.

-vm
C:\Program Files\Java\jdk1.5\bin\javaw.exe(자바 설치 위치)

알맞게 각자의 위치로 설정해준다.

이래도 고쳐지지 않으면

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20120522-1813
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Xms40m
-Xmx512m


빨간색으로 표시된 부분을 알맞은 메모리 크기로 바꾸어준다.

이 오류는 아마도 이클립스가 실행될 때 자바 가상머신에 할당될 메모리가 부족해서 생기는 오류인 듯.

역시나 실험을 위해 SSD 두대를 RAID0으로 구성해보기로 한다.


구성을 하기에 앞서, RAID란 Redundant Array of Inexpensive Disks의 준말로, 여러대의 디스크를 가지고 안정성을 위해 같은 데이터를 다른 디스크에 중복 저장하거나 패리티를 사용하여 패리티 값을 저장하거나 한다.

RAID의 형태로는 9가지 정도가 있다.

RAID-0 : 이 방식은 스트라이프를 가지고는 있지만 데이터를 중복해서 기록하지 않는다. 따라서, 가장 높은 성능을 기대할 수 있지만, 고장대비 능력이 전혀 없으므로 이 방식은 진정한 RAID라고 하기 어렵다.

RAID-1, RAID-2, RAID-3, RAID-4, RAID-5, RAID-6, RAID-7, RAID-10, RAID-53


우리는 RAID-0을 사용해서 SSD두개를 묶은 다음 swap으로 사용하겠당.


# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdc1 /dev/sda1

SSD는 sdc1과 sda1에 각각 위치해 있다.

확인!



사실 글 쓰기 전에 카테고리를 어디에 넣어야 할지 정말 많은 고민을 했다 ㅋㅋㅋ

Valgrind는 여러 CPU family에서 사용 가능하고 또한 지원하는 언어도 다양하기 때문에 거의 어디서든 사용할 수 있기 때문이다.

그래서 그냥 programing에 넣어버렸다.


각설하고, Valgrind는 memory trace tool로 대부분 memory leak이나 잘못된 포인터의 접근 등을 알아보는데 쓰이지만 나는 현재 진행하고 있는 in-memory 프로젝트에서 Cassandra가 현재 어떻게, 얼마나 메모리를 사용하고 있는지 알아보기 위해 사용하도록 하겠다.

1. 다운 & 설치

# wget http://www.valgrind.org/downloads/valgrind-3.7.0.tar.bz2

# tar -xvjf valgrind-3.7.0.tar.bz2

리눅스의 기본 3대 설치법

./configure

make

make install

끗!


단, 주의할 점이 있는데 README를 읽어보자.

Important!  Do not move the valgrind installation into a place
different from that specified by --prefix at build time.  This will
cause things to break in subtle ways, mostly when Valgrind handles
fork/exec calls.

라고 합니다. 난 걍 설치 ㄱㄱ


구동하기 위해선 다음과 같은 패키지가 필요한듯.

On Debian, Ubuntu:                 libc6-dbg
On SuSE, openSuSE, Fedora, RHEL:   glibc-debuginfo


테스트 해보자 ! ls -l 을 가지고 테스트해 보겠다

# valgrind ls -l

leak check을 위해서는 --leak-check=yes 옵션을 붙여준다.

==8275== HEAP SUMMARY:
==8275==     in use at exit: 15,212 bytes in 109 blocks
==8275==   total heap usage: 604 allocs, 495 frees, 102,693 bytes allocated
==8275==
==8275== LEAK SUMMARY:
==8275==    definitely lost: 80 bytes in 2 blocks
==8275==    indirectly lost: 240 bytes in 20 blocks
==8275==      possibly lost: 0 bytes in 0 blocks
==8275==    still reachable: 14,892 bytes in 87 blocks
==8275==         suppressed: 0 bytes in 0 blocks
==8275== Rerun with --leak-check=full to see details of leaked memory
==8275==
==8275== For counts of detected and suppressed errors, rerun with: -v
==8275== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 31 from 8)


다음과 같은 결과가 잘 나오는 것을 볼 수 있다.

드디어 Cassandra 를 In-memory에서 돌려보기 위한 준비가 끝났다.

Memtable threshold를 조정하여 가능한 한 disk로 flushing되지 않고 메모리에서 동작하게 해보자.


MemtableSizeInMB요소인 binary_memtable_throughput_in_mb 에서 지정된 값으로 이 값은 메모리의 Memtable 크기의 기준이고, Column indexing과 관련된 overhead탓에 커지게 될 heap 사용량은 아니다.


MemtableObjectCountInMillions의 memtable_throughput_in_mb는 Memtable에서 SSTable로 disk에 flushing하기 전에 단일 Memtable에 저장했던 coloumn의 최대 개수를 말한다.

기본값은 0.3이고, 이것은 약 333,000컬럼을 말한다.


또한 Memtable을 disk에 flushing한 뒤에 얼마나 오래 메모리에 남겨둘 것인가에 대한 threshold가 존재하는데 이것은 memtable_flush_after_mins 값을 변경하면 된다고 한다.

그리고 flush를 수행할 때, Memtable을 flush buffer에 쓰게 되는데, flush_data_buffer_size_in_mb값으로 buffer의 크기를 조절할 수 있다.


마지막으로 memtable_flush_writers값이 있는데 이것은 필요할 때 Memtable에 write명령을 수행하기 위한 thread의 개수를 지정하게 된다.


BUT!!

이렇게 쉽게 안 넘어갈 줄 알았다.

위의 값들은 0.8 대의 버전에서는 사용하지 않으며, 각각은 기본값으로 주석처리 되어 있고, 몇몇 값들은 아예 column family에 종속되어 버렸다.

따라서 우리는 이 값들을 다시 볼 필요가 있는데, Cassandra에서 column family의 정보를 보면 다음과 같이 나오는 것을 알 수 있다.

[default@usertable] show schema;
create keyspace usertable
  with placement_strategy = 'NetworkTopologyStrategy'
  and strategy_options = [{datacenter1 : 1}]
  and durable_writes = true;

use usertable;

create column family data
  with column_type = 'Standard'
  and comparator = 'BytesType'
  and default_validation_class = 'BytesType'
  and key_validation_class = 'BytesType'
  and memtable_operations = 2.3203125
  and memtable_throughput = 495
  and memtable_flush_after = 1440

  and rows_cached = 0.0
  and row_cache_save_period = 0
  and keys_cached = 200000.0
  and key_cache_save_period = 14400
  and read_repair_chance = 1.0
  and gc_grace = 864000
  and min_compaction_threshold = 4
  and max_compaction_threshold = 32
  and replicate_on_write = true
  and row_cache_provider = 'ConcurrentLinkedHashCacheProvider';

빨간색으로 칠해놓은 저 세가지의 threshold가 보이는가!?

이제 설치된 카산드라 위에 YCSB를 돌려보자.

전에도 말했듯이 소스로 받는 것이 조금 불편할 수 있으나 확실한 동작을 보장한다고 할 수 있으므로 소스로 가겠다 ㄱㄱㄱㄱ

이번엔 git을 이용해서 받아보자

# git clone git://github.com/brianfrankcooper/YCSB.git

git이 없으면

# apt-get install git-core

다 받아졌으면 YCSB폴더로 들어가서 빌드를 하자. 이번엔 maven을 사용한다.

# mvn clean package

역시 maven이 없으면 설치

# apt-get install maven2

하다가 에러가 났다.


으아니! 문제는 asm-3.1.jar 파일이군!

받아준다

http://www.java2s.com/Code/Jar/a/Downloadasm31jar.htm

문제가 발생한 디렉토리에 덮어씌워주고 다시

# mvn clean package


끝나면 workload를 돌리면 된다.

script를 짜도 되고 걍 돌려도 된다.


(뒤에 처자는 애교로 넘기져)


만약 다음과 같은 오류가 발생한다면 이것은 client disclosed를 의미하는 내용이기 때문에

무시해도 상관 없다고 한다.

DEBUG [pool-2-thread-2] 2011-10-05 12:00:49,374 CustomTThreadPoolServer.java (line 197) Thrift transport error occurred during processing of message. org.apache.thrift.transport.TTransportException        at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)        at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)        at org.apache.thrift.transport.TFramedTransport.readFrame(TFramedTransport.java:129)        at org.apache.thrift.transport.TFramedTransport.read(TFramedTransport.java:101)        at org.apache.thrift.transport.TTransport.readAll(TTransport.java:84)        at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:378)        at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:297)        at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:204)        at org.apache.cassandra.thrift.Cassandra$Processor.process(Cassandra.java:2877)        at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:187)        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)        at java.lang.Thread.run(Thread.java:636) DEBUG [pool-2-thread-2] 2011-10-05 12:00:49,376 ClientState.java (line 94) logged out: #<User allow_all groups=[]>

자세한 내용은 여기



이번에 연구실에서 진행하는 프로젝트를 위해 YCSB를 돌려봐야 되는데

이를 위해 Nosql DB인 Cassandra를 설치해 보겠다.


1. 다운로드

apt-get 으로도 설치할 수 있는 것 같지만 나는 최신버전은 필요 없기도 하고 물리적으로 접근할 수 없는 노드에서 설치해야하기에 관리하기가 편하기도 하고 소스코드에서 설치하는게 뭔가 안심되기도 하기 때문에 소스코드에서부터 설치하도록 하겠다.


다운로드 : http://cassandra.apache.org/


0.8.10 버전을 받아 설치하도록 하겠당!

# wget http://apache.mirror.cdnetworks.com/cassandra/0.8.10/apache-cassandra-0.8.10-src.tar.gz


2. 압축풀기

# tar -xvzf apache-cassandra-x.xx.xx-src.tar.gz


3. 자바 버전 확인

카산드라는 자바 1.6 이상의 버전에서 돌아간다.

OpenJDK, Sun 모두에서 돌아가니 버전만 간단하게 확인하고 넘어가자

# java -version


4. 환경설정

하나의 노드에 테스트용으로 설치할것이기 때문에 log폴더와 lib폴더 모두 설치폴더 안에 존재하도록 하기 위해서 폴더를 만들어준다.

(홈 디렉토리에서)

# mkdir {commitlog,log,saved_caches,data}

conf폴더에 들어가서 먼저 log4j-server.properties 파일을 보자.

중요한 부분은 log4j.rootLogger부분의 INFO를 DEBUG로 바꿔주자
이래야 서버에서 나오는 다양한 메세지들을 확인할 수 있다.

앞에서 설정한 로그폴더로 로그를 받을 수 있게 설정하자.

log4j.appender.R.File=~/log/system.log

나와서 이제 cassandra.yaml로 들어가자

data_file_directories: ~/data

commitlog_directory: ~/commitlog

saved_caches_directory: ~/saved_caches

위에서 폴더를 만들었던 곳으로 각각 고쳐준다.


만일, 하나의 컴퓨터에서 멀티 노드로 구성할 생각이라면 서로 다른 디렉토리를 사용하는것이 바람직하겠다.

또한, 아랫부분의 listen_address와 rpc_address부분도 loopback을 사용해서 127.0.0.2 같이 바꾸어야 한다.


cassandra-env.sh 파일로 넘어온다.

이 파일의 JMX_PORT부분도 위의 하나의 컴퓨터에서 멀티 노드를 구성할 때에는 서로 다르게 지정해야 한다.

5. 빌드

ant나 maven을 사용해서 빌드하면 된다.

6. 돌려본다

# bin/cassandra -f

DB modeling을 위해 툴을 알아보던 중, linux환경에서 동작하는 DBDesigner를 발견했다!
무료!
꽤 좋다!
설치하자 두번하자

패키지 파일 받아서 압축 풀고 실행하면 되는데 libborqt-6.9.0-qt2.3.so 관련 오류가 뜰 경우

wget http://www.bnr2.org/libborqt-6.9.0-qt2.3.so.tgz

받아서 라이브러리에 넣고 실행 ㄱㄱ
 

했지만 오류가 난다.


이럴 땐

http://wiki.splitbrain.org/dbdesigner

요기서 해결책을 발견했다

wget http://heanet.dl.sourceforge.net/sourceforge/kylixlibs/kylixlibs3-borqt_3.0-1_i386.deb


기본적으로 리눅스에서는 NTFS를 지원하지 않았다.

하지만 요즘에는 mount명령으로 읽기만 가능하게 마운트 시킬 수 있는 모양이다.

그렇지만 읽기만 가능하게 해서는 안되므로 따로 ntfs-3g패키지를 설치하여 NTFS파일 시스템을 사용해보자.


사용법은 누구나 알기 쉬운

ntfs-3g [device] [directory]

로 읽기/쓰기가 가능하게 마운트 시킬 수 있다.


또한, rc.local이나 뭐 리눅스가 부팅될 때 실행하는 스크립트에 넣어주면 부팅시 알아서 마운트 ~_~

+ Recent posts