태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

티스토리 툴바


개발서적 추천
Refactoring 리팩토링
마틴 파울러 저/윤성준,조재박 공역
Debug It! 실용주의 디버깅
폴 부처 저/박일 역
예스24 | 애드온2
개발관련2012/05/15 16:47

아래 링크에 있는 걸 해볼려고 가상머신 우분투에 열심히 설치했는데, 다시 설치하는 귀찮음을 방지하기 위해 공유함.

http://yobriefca.se/blog/2012/05/08/starter-for-10-scala/?utm_source=twitterfeed&utm_medium=twitter

몽고디비는 스크립트화할수 있으나..그냥 apt-get install mongodb로 설치하시길...
(이거는 나중에 생각나면 만들어서 올릴게요. ; )
http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages (요거 보고 따라하세용)

스칼라 설치

#!/bin/bash

wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.0.1.tgz
tar zvf scala-2.9.0.1.tgz
sudo mv scala-2.9.0.1 /usr/local/

ln -s /usr/local/scala-2.9.0.1 /usr/local/scala 

SCALA_HOME="/usr/local/scala"

BIN_HOME="/usr/bin"

echo "INSTALL SCALA!"

ln -s $SCALA_HOME/bin/scala $BIN_HOME/scala
ln -s $SCALA_HOME/bin/scalac $BIN_HOME/scalac
ln -s $SCALA_HOME/bin/fsc $BIN_HOME/fsc
ln -s $SCALA_HOME/bin/sbaz $BIN_HOME/sbaz
ln -s $SCALA_HOME/bin/sbaz-setup $BIN_HOME/sbaz-setup
ln -s $SCALA_HOME/bin/scaladoc $BIN_HOME/scaladoc
ln -s $SCALA_HOME/bin/scalap $BIN_HOME/scalap

echo "INSTALL COMPLET!"

스칼라 삭제 

#!/bin/bash

echo uninstall scala

sudo rm -rf /usr/local/scala
sudo rm -rf /usr/bin/scala /usr/bin/scalac /usr/bin/fsc /usr/bin/sbaz /usr/bin/sbaz-setup /usr/bin/scaladoc /usr/bin/scalap 

플레이 프레임워크 설치 

#!/bin/bash
wget http://download.playframework.org/releases/play-2.0.1.zip

unzip play-2.0.1.zip

sudo mv ./play-2.0.1 /usr/local/
sudo chown -R gyu.gyu /usr/local/play-2.0.1
sudo ln -s /usr/local/play-2.0.1 /usr/local/play
sudo chmod +x /usr/local/play/play
sudo ln -s /usr/local/play/play /usr/bin/play


플레이 프레임워크 삭제 

#!/bin/bash
echo "play uninstall"

if [ -e "./play-2.0.1.zip" ];then
    sudo rm -rf ./play-2.0.1.zip
fi

sudo rm -rf ./play-2.0.1

if [ -d "/usr/local/play-2.0.1"  ];then
    sudo rm -rf /usr/local/play-2.0.1
fi

if [ -e "/usr/local/play" ];then
echo "Remove /usr/local/play symbolic link"
sudo rm /usr/local/play
fi

if [ -e "/usr/bin/play" ];then
echo "Remove /usr/bin/play symbolic link"
sudo rm /usr/bin/play
fi

그냥 스크립트 실행하면되니 설치노가다는 좀 줄겠지~ ㅎ

클라우드가 별거냐 저런거 자동화해주는게 클라우드지.

'개발관련' 카테고리의 다른 글

[ubuntu]scala, play2 설치, 제거 스크립트  (0) 2012/05/15
Subversion의 프로퍼티 자주 쓰는거  (0) 2012/05/10
Posted by 규이
SICP풀이2012/05/11 12:18

문제를 한글로 누가 적어놓은 사람 없나..ㅠㅠ 

;Exercise 1.3.
;Define a procedure that takes three numbers as arguments and 
;returns the sum of the squares of the two larger numbers.

(define (sum a b) (+ a b))
(define (square a) (* a a))
(define (largerNumber2 a b) 
   (cond ((> a b) a)
        ((= a b) a)
        ((< a b) b)
    )
  )

(define (largerNumber3 a b c)  (square (sum (largerNumber2 a b) (largerNumber2 a c))))

(largerNumber3 2 2 2)
(largerNumber3 10 11 12)
(largerNumber3 10 12 12)

'SICP풀이' 카테고리의 다른 글

[scip]연습문제 1.3  (0) 2012/05/11
Posted by 규이
nodejs2012/05/10 20:58

3장 노드의 기본모듈 (1,2장은 그냥 읽기만 했음 설치는 아래 링크 참조)

http://godpage.tistory.com/entry/%EC%9A%B0%EB%B6%84%ED%88%AC-1004%EC%97%90%EC%84%9C-nodejs%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0 

- 개인적으로 여러버전을 사용하려고 할때 환경변수의 패스를 수정하는게 아니라 심볼릭 링크를 만들어서 연결하는게 편한것 같음. 책에는 안나와 있지만..- 

process : 노드js의 프로세스에 관한 모듈 

nextTick : CPU연산이 많은 작업을 비동기로 실행할수 있도록 도와주는 메서드란다.
nextTick에 등록된 함수는 바로 실행하지 않고 이벤트 큐에 등록한다.
싱글스레드가 현재 작업을 완료하고 나서 다음 이벤트 처리때 처리함

process.nextTic(function() {
    console.log("nextTick으로 호출됐심다");
});

이벤트 (nodejs는 이벤트 루프 기반 - 비동기 콜백방식 이라고 하는게 더 알아먹기 쉬울라나?)

- 그러고 보니 책에는 Object를 전부 객체라고 이야기를 해놨네..흠.. 맞는듯 틀린듯 -  

발생하는 이벤트는 모두 events.EventEmitter(이벤트 발생기 - 이벤트 던지는 넘? )의 객체임
require('events').EventEmitter로 접근
listener 리스너 - 이벤트 발생시 실행되는 함수

관련 함수 
emitter.on(event, listener) or emitter.addListener(event, listener)
emitter.once(event, listener) - 한번만 실행해야하는 리스너
emitter.removeListener(event, listener)
emitter.removeAllListeners([event]) - event지정안하면 다 삭제
emitter.emit(event, [arg1], [arg2], ...) - 이벤트 발생시키기 > 글치...이름대로구만

스트림 - 모든 스트림을 다루는 객체의 추상 인터페이스(추상?!)
 - 읽기 쓰기 둘다가능 (그래서 아래 2개의 모듈이 존재)

Readable Stream
    data - 데이터가 들어올때 읽음
    stream.pipe(destination, [options]) - 스트림에서 읽어들인 내용을 destination으로 지정된 쓰기 스트림에 연결

Writable Stream
    
파일시스템 - 음 이거는 잘 봐둬야 될듯 (근데 귀찮...;)

fs.rename(original, newfile, [callback]) - 당연히 파일명 변경
fs.stat(path, [callback]) - 파일에 관한 여러가지 정보
fs.writeFile(파일명, 데이타, 인코딩, [콜백])
   - 음..머 파일 쓰기. 없으면 만들고 있으면 덮어쓴다. 데이타에 있는 문자열을 파일로 작성함 
fs.watchFile(파일명, [옵션들], 리스너) - 파일의 변경사항 감시.. 호 이런거 첨봄. 
fs.createReadStream(패스, [옵션들]) - 위에나온 Readable Stream을 리턴해준다.
fs.createWriteStream (패스, [옵션들]) - 글치.. 당연히 이것도 있어야지. 당연히 Writable Stream을 리턴합니당.

경로(PATH 말하는거임 - 敬老 가 아님다)

path.normalize(path) - /usr/local/node 이런거 잘 틀리기 쉬우니 알아서 고쳐준다.
     (슬래시두개 라든가, 윈도우에서는 \를 쓴다든가하는 - 그럼 util에다 넣지..싶었으나 저거하나땜에 util쓰면 귀찮긋징..ㅎ)
path.join([path1], [path2], [...]) - 그냥 패스를 이어 붙여줌
path.resolve([from ..], to) - 전달 받은 경로의 절대경로를 반환
path.dirname(path) - 유닉스에 dirname이라는게 있다. 머냐면 디렉토리명만 짤라서 보내주는거임.
                              궁금하면 dirname을 구글에서 찾으세여.
path.basename(path, [ext]) - 이거는 디렉토리는 짤라내고 파일명만 반환. ext에 있는 문자열도 짤라냄.
path.extname(path) - 요거는 확장자만 돌려줌
path.exists(p, [callback]) - 파일이 있는지 확인하는 함수

네트워크 - 비동기 네트워크를 다루는 클래스다.

- 흐미 내가 못하는 거다. - 

net.createServer([options], [connectionListener]) - TCP서버를 생성한다. connectionListener에 지정한 콜백함수는
        connection(서버에 요청이 들어올때 마다 생성됨)이벤트에 자동으로 연결된다. 
        allowHalfOpen : 한쪽에서 연결을 종료하면 반대쪽도 종료할것인지 정하는거 디폴트는 false
        이거는 예제를 한번 해봐야 될것 같은데 
        http://nodejs.org/api/net.html#net_net_createserver_options_connectionlistener 여기있는걸 함 해보자. 
        포트로 붙는거말고 소켓으로 붙는게 있는데, 이거 재밌음....(처음 알아서..?! 역시 모르니 글이 길어 지는구나..)
        암튼 아래에 적을 server객체를 만들기위해 쓰는넘

net.Server
server.listen(port, [host], [listeningListener]) - 지정한 port, host로 들어온 컨넥션을 받을 수 있게 함.
        서버가 바운드 (올라간다라고 표현들 한다.)될 때 listening이벤트가 발생하는데,
        listeningListener를 콜백으로 등록해놨으면 그게 listening 이벤트 리스너에 추가된다.
        (머... 그냥 실행된다라고 하지.. - 근데 정확하게는 적어놓은게 맞다. 공돌이식 으로 생각하자. )
server.address() - 서버호스트와 포트정보 
server.pause(밀리세컨드) - 말그대로다 밀리초만큼 서버.멈춤이다. DoS공격 같은거에 좋단다. 

- 책에는 net.Server가 가지고 있는 이벤트에 대해서도 나와있는데 그냥 넘어간다. 궁금하면 책을사자. - 

net.Socket - TCP나 UNIX의 소켓을 추상화한 오브젝트이다. - 그래야 자바스크립트에서 쓰지 ㅎ- 

- 찾아보니 소켓은 아이피랑 포트를 합친걸 소켓이라하네. 그러나 여기서는 자바스크립트 객체겠지여.-

서버에서 connection이벤트가 발생하면 콜백 함수(예제에서는 createServer에 connectionListener를 지정한 곳으로 소켓이 전달 됨.  c 라고 변수명을 적은곳 )로 소켓이 전달된다. 

socket.write(data, [encoding], [callback]) - 소켓에 데이터 전달.
socket.end(data, [encoding]) - 소켓 종료. FIN을 보내서 소켓을 닫으므로 서버쪽에서는 데이터 보낼 수 있다. 
socket.pause() - 소켓에서 데이터를 읽는 것을 멈추어 data이벤트가 발생하지 않게한다. 
socket.resume() - 다시 데이터받기.
socket.remoteAddress - 접속한 클라이언트의 원격 IP를 리턴함.
socket.bufferSize - 소켓에 쓰기위해 현재 버퍼에 있는 캐릭터 문자의 크기를 알수 있음. 인코딩되기 전의 크기이니 주의!

HTTP와 HTTPS  

HTTP - http의 서버, 클라이언트가 사용해야 하는 모듈 
HTTPS - http위에 TLS/SSL 을 얹어서 보안을 강화한거 http랑 거의 비슷. (그래서 패쓰 ㅎㅎㅎ)

아래의 3가지 이벤트가 사용가능하다. 
request - 요청이 들어올 때 발생
connection - TCP 스트림이 생성되면 발생
close - 서버가 닫힐 때 발생

http.createServer([requestListener]) - http 서버 생성.
        requestListener는 function(request, response) { blar..blar..} 요런 형식으로 되어있어야됨.
        server.listen(port, [host], [listeningListener]) 를 실행하면 서버가 바운드됨.
        이거도 예제를 해봐야 되는데...없어서 그냥 간단히 만들었음.
        아래 예제대로 만들면 nodejs로 웹서버를 띄울수 있음. 
        그리고 웹브라우저에서 localhost:8124로 들어가보면 'you connected local webserver'라고 뜰꺼임

http.ServerReqeust - EventEmitter의 객체 
        아래 2가지 이벤트가 사용가능하다.
        data  - 콜백함수 function(chunk) {}
        end - 요청이 종료될 때 발생하는 이벤트
        request.mothod - HTTP 메서드를 리턴 
        request.header - 헤더정보
        request.httpVersion - HTTP 버전
        request.setEncoding(encoding=utf8) - 인코딩설정
        request.pause() 
        request.resume()

http.ServerResponse - Writable Stream 객체이다. 
        response.writeHead(statusCode, [reasonPhrase], [headers]) - 응답 헤더 지정
        response.write(chunk, encoding='utf8') - 응답 바디에 청크를 보냄
        response.end([data], [encoding]) - 응답 종료        

var http = require('http');
var net = require('net');

// Craete a HTTP server
var server = http.createServer(function (req, res){
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('you connected local webserver');
});

// Running Server
server.listen(8124, function(){
console.log("server running!");
});

URL과 쿼리 문자열 - 이건...머지?   URL에 대한 모듈 

url
url.parse(urlstr, parseQueryString=false, slashesDenoteHost=false)
        - URL문자열을 호스트명이나 쿼리 문자열, 경로등으로 파싱한 객체를 리턴 
        parseQueryString은 쿼리문자열을 추가로 파싱할건지 지정 디폴트 false
        slashesDenoteHost은 / 가 호스트를 나타내는지 지정
url.format(urlObj) - url객체를 URL문자열로 변경.

querystring - 이 녀석은 자주 쓸듯
querystring.stringify(obj, sep='&', eq='=') - JSON객체의 키와 값을 이용해 쿼리문자열로 만듦.
        sep는 구분자 &, eq는 키와 값을 연결하는 녀석인 = 
querystring.parse(str, sep='&', eq='=') - 쿼리문자열을 JSON객체로 변환

Child Process - 이거 너무 멋진 모듈임!

- 콘솔의 command의 자식 프로세스구만 이걸로 콘솔 명령어를 nodejs에서! - 
child.stdin, child.stdout, child.stderr의 세가지 스트림을 사용 - 오 직이네 -  

require('child_process').spawn(command, args=[], [options]) - command를 사용하는 자식프로세스 생성
child_process.exec(command, [options], function(error, stdout, stderr) {} ) - command를 사용하고 결과를 리턴 

클러스터 - CPU계산량이 많은 경우 클러스터링으로 해결하는데, 그거 할려면 요걸쓰세염.

- 다중 프로세스의 로드밸런싱을 통합해 클러스터 모듈로 제공한다고 함.

cluster.isMaster - 마스터 프로세스인지
cluster.isWorker - 워커 프로세스인지 

아래에 있는 예제를 참고 하는게 도움이 될듯함다.
http://nodejs.org/api/cluster.html 


아...이것 말고도 많은데 일단 책에 있는거 요약해서 올립니다. 
지금 nodejs 공부중이니 혹시 질문을 올려주시면, 열~~~~~~~심히 찾아서 알려드리겠슴다. 



       

'nodejs' 카테고리의 다른 글

[nodejs] [아웃사이더]님 책3장 노드의 기본모듈 정리  (0) 2012/05/10
Posted by 규이
개발관련2012/05/10 12:53

소스관리 프로그램은 개발자라면 거의 쓰고 있을 텐데, 알면 편한 Subversion의 프로퍼티들을 정리한다.
(사실 누가 정리해놓은거 있으면 그냥 그거 보고 싶은데 없는듯?! ) 

락이 필요한파일인 경우
svn:needs-lock : *

파일의 타입지정
svn:mime-type : <text|binary|image/pnc>

커밋할때 무시
svn:ignore : *

파일에 실행권한을 부여(chmod 755 * 랑 같음) 
svn:executable : *

윈도우즈랑 리눅스랑 개행을 운영체제에 맞게 자동으로해줌
svn:eol-style : native


'개발관련' 카테고리의 다른 글

[ubuntu]scala, play2 설치, 제거 스크립트  (0) 2012/05/15
Subversion의 프로퍼티 자주 쓰는거  (0) 2012/05/10
Posted by 규이
Java2012/03/06 18:30
외우고 있는 코드를 매번 쓰는건 꽤나 귀찮은 작업이다.
그래서 이클립스에 템플릿으로 등록해놓고 사용하니 매우 편하다. 

이클립스의 Windows -> Preferences순으로 클릭하면 
Preferences 화면이 나온다. 

여기서 Java > Editor > Templates 순으로 가야된다. 



내가 자주 사용하는 건 테스트 케이스 static 클래스 임포트랑 로그 변수를 자동으로 입력해주는 템플릿을 자주 사용한다. 
등록해보자 



 log4j 변수용으로 하나 만들고 



테스트 케이스 클래스 임포트 용으로 하나 만들자. 



addlog를 타이핑하고 컨트롤과 스페이스를 같이 누르면 addlog라고 뜰것이다. 그걸 선택하면 아래와 같이
템플릿으로 설정한걸 이클립스에서 넣어준다. 



아래는 템플릿 추가할때의 구문들이다. 

log4j 변수추가하기

${:import('org.apache.commons.logging.Log','org.apache.commons.logging.LogFactory')}

private Log log = LogFactory.getLog(${primary_type_name}.class);


테스트 케이스용 import 클래스 추가하기

${:importStatic(

'org.hamcrest.CoreMatchers.*'
, 'org.junit.Assert.*'
, 'org.junit.matchers.JUnitMatchers.*'
, 'org.hamcrest.Matchers.*;'
, 'org.junit.Test'
)}


이걸로 조금 더 편해지는 사람이 있을라나?  


조금 더 자세한것은 아래 링크를 참조하시요.
http://eclipse.dzone.com/news/effective-eclipse-custom-templ
 
Posted by 규이
개발관련/리눅스2012/03/02 17:30
rm [-dfirv] 파일명/디렉토리명

-d : 디렉토리의 링크를 제거한다. 관리자 권한 필요
-f : 존재하지 않는 파일이 있어도 에러를 내지 않는다.
-i : 파일을 삭제해도 좋은지 확인한다.
-r : 디렉토리를 재귀적으로 삭제
-v : 로그를 표시해줌

사용예

$ rm file1* [file1 로 시작하는 파일을 모두 삭제]


$ rm -r dir1 [dir1 디렉토리를 삭제 - 하위폴더 포함]

Posted by 규이
Cassandra2012/02/20 12:21
아래글은  http://wiki.apache.org/cassandra/CassandraLimitations 여기 있는 글을 발로 번역한겁니다.. ;-)


변경이 안될것 같은 것

- 모든 데이터는 하나의 머신의 하나의 로우로 있어야 한다. 왜냐하면 row키는 단지 리플리케이션을 위한 노드를 결정하는데 쓰이며, 모든 데이터는 하나의 키로 연결되어 있기 때문이다. 

- 하나의 컬럼값은 2기가 이상 커질수 없다. (큰값들이 메모리에 읽기 요청이 들어오는 것보다는 "작은 수의 MB"가 더 적절하다. )

- 컬럼당 row의 최대값은 2000,000,000(20억)개이다. 
- 키와 컬럼명은 64키로 바이트 이하이어야 한다. 


현재 코드 베이스의 산물들

- 카산드라는 키와 컬럼이라는 2단계의 인덱스를 가지고 있다. 슈퍼패밀리에는 서브컬럼들까지 3단계인데, 이것들은 인덱싱되지 않느다. 서브컬럼에 대한 모든 요청은 슈퍼컬럼의 모든 서브컬럼으로 디시리얼라이즈된다. 그러니 당신은 많은 서브컬름을 요구하는 데이터모델을 피하길 바란다. 복합 컬럼은 이것에 해당되지 않는다. 

- 카산드라의 퍼블릭 API는 Thrift - no streaming기능을 제공한다 - 에 기초해있다. 쓰기위한 값이나 수정되는 값은 모두 메모리에 저장된다. 이것은 Thrift디자인으로 부터 따온것이고 그래서 변경되지 않을 가능성이 크다. 그러니 큰오브젝트를 카산드라에 추가하기위해서는 특별한 API가 필요하다. 그 특별한 API는 큰오브젝트를 개별의 몇개의 조각으로 자른다. 
하나의 잠정적인 접근은 요기에 쓰여져 있다. http://issues.apache.org/jira/browse/CASSANDRA-265.
차선책으로서는 당신이 직접 파일을 자른다음에 최소 한사람이 64메가를 사용하게끔 당신이 편한 사이즈로 청크하라.  
그리고 하나의 row로 일치되게끔하고. 컬럼값도 청크시켜라.

한물간 한계(limitations)들
- 0.7버전이전에는 카산드라의 컴팩션 코드는 모든 row에 대해 디시리얼라이즈 되었었다(컬럼 패밀리 별로).
그래서 모든 데이타는 메모리에 있거나 2기가 이하였다.(왜냐면 row의 길이는 java의 int로 시리얼라이즈 되었었다.)
-  0.7버전 이전에는, Thrift와 cassandra 사이에 랜덤값또는 악의적인 값에대해 충돌되는 부분이 있었다. 이것은 카산들의 포트를 다른 곳으로 노출하게 만드므로 좋지 않은 생각이다. 
- 0.4버전 이전에는 카산드라는 write ack가 없을 경우 커밋로그에 대해서 fsysc를 하지 않았다. 이거는 그냥 생략.

'Cassandra' 카테고리의 다른 글

카산드라의 한계들  (0) 2012/02/20
Astyanax 조사#1  (0) 2012/02/08
Posted by 규이
Java2012/02/16 17:30
System.currentTimeMills()가 더 빠르다.
Date 클래스의 생성자에서 System.currentTimeMills()를 사용하고 있으니
Date를 생성하는 비용이 플러스로 더 든다.

public Date() {
    this(System.currentTimeMills());
}

그러니깐 그냥 현재시간의 밀리세컨드를 구하고 싶으면 그냥 System.currentTimeMills()를 쓰자. OK?

만약에 시간을 더 잘게 쪼개서 보고싶다..?!

라고 한다면,

System.nanoTime()을 쓰자.

나노초까지 보여준당.

long startNano = System.nanoTime();
//뭔가 CPU에게 일을 시키자
long elapsed = System.nanoTime() - startNano;

그냥 별로 알아두면 좋은 자바 내용이네..;ㅎㅎ
Posted by 규이
Cassandra2012/02/08 16:08
카산드라의 모니터링 툴을 만드는 중인데,
클라이언트도 조사할 필요가있어서 정리 차원에서 일단 발번역.  
이상한 부분이 많겠지만, 저의 영어실력이 미천하여..ㅠㅠ


원문은 아래에 있습니다.
http://techblog.netflix.com/2012/01/announcing-astyanax.html 

다음에는 카산드라 맛보기 코드를 올려야징.

Astyanax는 뭔가용?

- 넷플릭스에서 공개한 오픈소스 카산드라 클라이언트 
- 헥터의 코드를 리팩토링해서 만듦. 이름도 헥터의 아들이름인 아스타이낙스
- 헥터에서 많은 컨셉을 빌려왔다. 
- 컨넥션풀과 클라이언트 API구현은 다르다. 
- 중점적으로 다룬 관심사는 컨넥션풀과 카산드라 각각을 커스터마이즈하고 개별적으로 개선할수 있도록 둘의 API사이에 깔끔한 추상화를 제공하는 것이었다. 
- Astyanax는 키와 컬럼으로 된 간소한 쿼리뿐 아니라 우리가 직면했던, 좀 더 복잡한 쿼리를 제공하는 유려한 API를 제공한다.  
- 헥터보다 좋은 Astyanax의 운영상의 이점은 lower latency, latency variance의 감소 그리고 좀 더 나은 에러 핸들링이다. (latency가 낮다는 것은 반응시간이 작다. 라는 의미이고 latency vairiance의 감소라는 말은 반응시간의 변화량이 적다 라는 얘기임.)

Astyanax는 3개의 파트로 갈라져있다. 

connection pool The connection pool abstraction and several implementations including round robin, token aware and bag of connections.
컨넥션 풀 추상화와 몇가지 구현들 - 라운드로빈, 토큰 인지, 컨넥션들의 가방(?)
cassandra-thrift API implementation Cassandra Keyspace and Cluster level APIs implementing the thrift interface.
thrift 인터페이스를 구현한 카산드라 키스페이스와 클러스터 레벨의 API의 구현
recipes and utilities Utility classes built on top of the astyanax-cassandra-thrift API.
 astyanax-cassandra-thrift API의 최상위에 구축되어있는 유틸리티 클래스


Astyanax API

Astyanax는 호출을 간단하게 해주고, 잘 정의된 인터페이스의 세트들로 쿼리를 커스터마이즈할 수 있도록 유려한 API를 구현했다. 
가능한한 저 수준 RPC레이어는 닫음으로서 효율적으로 실행가능한 몇개의 레서피를 포함하고 있다. 
클라이언트는 시리얼라이저를 지정해주어야하는 필요성을 거의 대부분 제거하기위해 제네릭과 오버로딩을 마구 사용했다. 


API에 들어있는 몇개의 중요 기능들

  • 시리얼라이저를 지정하지 않기위해 Key, column 타입은 ColumnFamily로 정의되었다.
  • 멀티 Column family key 타입은 같은 키스페이스에 있다. 
  • 어노태이션 기반 컬럼명 구성
  • 오토매틱 페이징
  • 평행화된(Parallelized) 쿼리 - 토큰인식 Token aware -
  • 각각의 명령에 대해 consistency level이 설정가능
  • 각각의 명령에 대해 재시도 정책을 설정가능
  • 특정 노드에 대해 명령을 고정하기(Pin operations to specific node)
  • Futures를 사용한 단일 타임아웃에 대한 비동기 명령실행
  • 간단한 어노태이션 기반 오브젝트 매핑
  • 명령 실행 결과 리턴. host, latency, 시도횟수
  • 명령의 실패와 성공에 대한 커스텀 이벤트를 로깅하기 위한 Tracer 인터페이스
  • 최적화된 batch 뮤태이션
  • 호출시에 clock은 완전히 숨겨져 있으나 커스터마이즈 할수 있도록 hook을 제공
  • 심플 CQL 지원
  • composite column ranges를 간단히 구성할 수 있는 RangeBuilders
  • composite columng names를 간단히 만들수 있는 Composite builders 

레시피들

  • CSV 임포트
  • 광범위한 커스터마이즈로 쿼리의 결과를 JSON으로 export해주는 녀석 
  • 평행 역 인덱스 검색
  • 키 유니크 constraint(제약) 확인
컨넥션 풀

Astyanax 컨넥션풀은 클라이언트 API층의 완전한 추상화를 제공하기 위해 디자인 되었습니다.  
Astyanax의 오픈소스화를 준비할 때의 우리의 주된 목표는 다른 사람들이 컨넥션 풀의 컴포넌트들을 간단히 플러그인 식으로 커스터마이징 할 수 있도록, 컴포넌트들의 적절한 디커플링을 하는 것이었습니다.
예를 들면, 우리는 미들티어에 로드밸런서가 있습니다. 그것들은 클러스터에 있는 노드들을 계속해서 따라다니고 클라이언트에 시드 노드들의 소스를 만들게 됩니다. 

컨넥션 풀의 주기능 

HostSupplier/NodeAutoDiscovery Background task that frequently refreshes the client host list. There is also an implementation that consolidates a describe ring against the local region's list of hosts to prevent cross-regional client traffic.
백그라운드 태스크. 
클라이언트 호스트리스트를 자주 리프레쉬 시켜준다. 
그리고 로컬지역에 대한 링을 그려주어서 지역간의 클리아언트 크래픽을 막아주고 강화 시켜준다. 
TokenAware The token aware connection pool implementation keeps track of which hosts own which tokens and intelligently directs traffic to a specific range with fallback to round robin.
토큰 인식 컨넥션 풀 구현은 해당 호스트 자신의 토큰을 지속적으로 추적하고 라운드 로빈의 대비책으로 지능적으로 특정 래인지에 트래픽을 보낸다.  
RoundRobin This is a standard round robin implementation
그냥 라운드로빈 
Bag We found that for our shared cluster we needed to limit the number of client connections. This connection pool opens a limited number of connections to random hosts in a ring.
공유 클러스터에 대해 우리는 클라이언트 컨넥션에 제한이 필요하다는것을 알게되었습니다. 이 컨넥션은 풀은 하나의 링안에 있는 랜덤한 호스트에 대해 컨넥션의 제한 수를 오픈해 줍니다. 
ExecuteWithFailover This abstraction lets the connection pool implementation capture a fail-over context efficiently
이 추상화는 대체 컨텍스를 효율적으로 캡춰하게 한다. 
RetryPolicy Retry on top of the normal fail-over in ExecuteWithFailover. Fail-over addresses problems such as connections not available on a host, a host going down in the middle of an operation or timeouts. Retry implements backoff and retrying the entire operation with an entirely new context.
ExecuteWithFailover에서 발생한 일반적인 fail-over 재시도. Fail-over는  명령실행 중간에 죽었던가, 타임아웃이 걸린 호스트 의 사용하지 못하는 컨넥션에서 문제를 찾는다. 
재시도의 구현은 대응하지 않기와 새로운 컨텍스트에 오든 명령 실행하기이다. 
BadHostDetector Determine when a node has gone down, based on timeouts
타임아웃기준으로 노드가 죽었는지를 결정한다. 
LatencyScoreStrategy Algorithm to determine a node's score based on latency. Two modes, unordered (round robin) ordered (best score gets priority)
응답속도에 기반한 노드의 스코어를 결정하는 알고리즘
정렬안됨(라운드 로빈). 정렬됨(최고 점수를 얻으면 우선권을 줌)이라는 
두가지 모드가 있다. 
ConnectionPoolMonitor Monitors all events in the connection pool and can tie into proprietary monitoring mechanisms. We found that logging deep in the connection pool code tended to be very verbose so we funnel all events to a monitoring interface so that logging and alerting may be controlled externally.
컨넥션풀과 소유 모니터링 메카니즘으로 관련 지을수 있는 모든 이벤트들을 감시한다. 
우리는 컨넥션풀에 있는 코드는 매우 상세하게 로그를 남기도록 의도되었다는 것을 알아버렸다.
그래서 우리는 모니터링 인터페이스의 모든 이벤트에 외부에서 컨트롤되어서 로깅하거나 경고할 수 있도록 깔때기(funnel)를 대었다. 
Pluggable real-time configuration
플러그인 리얼타임 설정
The connection pool configuration is kept by a single object referenced throughout the code. For our internal implementation this configuration object is tied to volatile properties that may change at run time and are picked up by the connection pool immediately thereby allowing us to tweak client performance at runtime without having to restart.
컨넥션 풀 설정은 코드를 통해 하나의 오브젝트를 참고하는 것으로 유지됩니다. 그래서 우리의 내부적인 구현 이것 설정 객체는 변경가능한 프로퍼티들로 묵여있어요. 그 객체는 런타임에 변경될 수 있고, 컨넥션풀에서 즉시 가져 올수 있죠. 그렇게 함으로서 클라이언트의 성능을 런타임에 변경 할 수 있어요. 리스타트 없이요.
RateLimiter Limits the number of connections that can be opened within a given time window. We found this necessary for certain types of network outages that cause thundering herd of connection attempts overwhelming Cassandra.
주어진 윈도우 시간안에 열수있게되는 컨넥션 수의 제한. 
우리는 특정한 타입의 네트워크의 단절은 엄청난 수의 컨넥션의 시도가 카산드라를 압도하는 원인이 되므로 이것이 필요하다는 것을 알게됐다. 


'Cassandra' 카테고리의 다른 글

카산드라의 한계들  (0) 2012/02/20
Astyanax 조사#1  (0) 2012/02/08
Posted by 규이
개발관련/javascript2012/02/06 20:58
아래 링크에 있는 예제인데, 버전이 달라서 그런지 그대로 치면 안돌아간다..
그래서 최신 버전(그래봐야 0.6)으로 변경해서 올림.
http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/
 

파일명 simpleStaticFileServer.js

실행 

$ node simpleStaticFileServer.js


브라우저에서 아래 URL에 접속

http://localhost:8080/simpleStaticFileServer.js


요딴식으로 나온다. (파일경로를 정확히 지정해 줘야하니 살짝 귀찮.....ㅡㅡ;)


소스 

var util = require("util"),
        http = require("http"),
        url = require("url"),
        path = require("path"),
        fs = require("fs");


http.createServer(function (request, response) {
        var uri = url.parse(request.url).pathname;
        var filename = path.join(process.cwd(), uri);
        util.puts("filename : " + filename);
        path.exists(filename, function(exists){
                if(!exists){
                        response.sendHeader(404,{"Content-type":"text/plain"} );
                        response.write("404 Not Found\n");
                        response.close();
                        return;
                }

                fs.readFile(filename, function(err, data){
                        if(err){
                                console.log("error!!!");
                                response.writeHead(500, {"Content-type":"text/plain"});
                                response.write(err + "\n");
                                response.end();
                                return;
                        }

                        util.puts("data : " + data);
                        response.statusCode = 200;
                        response.write(data, "binary");
                        response.end();
                });
        });
}).listen(8080);


Posted by 규이