2011년 6월 21일 화요일

Cassandra (2/12)

2. Cassandra의 설치

카산드라가 새로운 용어들을 좀 정의하기 때문에 앞으로 나아가면서 좀 익숙하지 않은 용어들이 눈에 띨수 있다. 그러나 괜찮다. 여기서 원하는 것은 간단한 설정으로 빠르게 셋업을 하여 모든 것이 실행이 되는지 확인하는 것이다. 초반 소개 작업처럼 진행이 될 것이다. 그러고난 후에 한 발짝 물러나서 더 이해하도록 하자.

2.1. 바이너리를 설치하기
카산드라는 http://cassandra.apache.org 에서 다운로드 가능하다. 가장 최신버전을 링크를 통해서 다운받도록 하자. 바이너리의 이름은 apache-cassandra-x.x.x-bin.tar.gz이다. x.x.x 는 버전 번호를 뜻한다. 다운로드는 약 10메가 근처의 크기이다.

2.1.1. 다운로드 압축풀기

가장 쉬운 출발점은 바이너리를 다운로드 받는것이다. 일반적인 ZIP 유틸리티를 써서 압축을 풀수있다. 리눅스에서는 GZip 압축풀기 유틸리티가 미리 설치되어 있어야 한다. 윈도우즈에서는 WinZip이나 7-Zip 같은 상용화 애플리케이션이나 프리웨어를 사용한다. 7-Zip의 프리웨어는 http://www.7-zip.org 에서 받을 수 있다.
압축풀기 프로그램을 연다. ZIP 파일과 TAR 파일을 각 단계별로 압축해제해야 한다. Apache-cassandra-x.x.x 같은 폴더가 생기고 나면 카산드라를 실행할 준비가 끝났다.

2.1.2. 그 안에 무엇이 있는가?

Tarball을 압축해제하고 나면 서너개의 디렉토리를 포함하여 카산드라 배포본을 볼 수 있다.
- Bin
이 디렉토리는 카산드라를 실행하기 위한 실행파일과 커맨드라인 인터페이스(CLI) 클라이언트가 있다. 클러스터가 제대로 설정이 되어있는지 또 다른 유지보수 어플래케이션이 잘 실행하기 위한Nodetool을 실행하기 위한 스크립트도 있다. Nodetool에 대해서는 뒤에서 더 자세히 본다. SSTable (데이터파일)을 JSON으로 컨버팅하기 위한 스크립트도 있다.
- Conf
팩키지 루트아래에 있는 이 디렉토리는 설정을 위한 파일들이 들어있다. Storage-conf.xml에는 키스페이스와 컬럼군을 설정함으로써 당신의 데이터 저장소를 만들수 있는 곳이다. Log4j 프로퍼티를 통해 로깅 레벨을 설정할 수 있다. 6장에서 설정을 알아볼 때 더 자세히 논할 것이다.
- Interface
0.6 버전과 그 이전에는 이 디렉토리에는 Cassandra.thrift 라는 파일 하나만 존재했었다. 이 파일은 Remote Procedure Call (RPC) 클라이언트 API를 표현했다. 인터페이스는 Thrift 문법을 이용해 정의되어있고 클라이언트를 만들기위한 쉬운 방법을 제공한다. 카산드라가 지원하는 모든 기능을 보기위해 이 파일을 일반적인 텍스트 에디터로 열어본다. 카산드라가 Java, C++, PHP, Ruby, Python, Perl, C#과 같은 언어의 인터페이스를 이 인터페이스를 통해 클라이언트 지원함을 볼 수 있다.
- Javadoc
이 디렉토리에는 Java의 JavaDoc을 이용하여 만들어진 각종 문서와 웹사이트가 들어있다. JavaDoc은 자바코드에 직접 들어있는 커멘트들만을 보여주는 것이지 모든 문서가 들어있는 것은 아니다. 코드가 어떻게 구성되어있는지 보려면 유용할 것이다. 카산드라는 매우 훌륭한 프로젝트이지만 코드안의 커멘트는 제한적이다. 만약 자바에 익숙하다면 단순히 클래스 파일들을 직접 보는 것이 유용할 것이다. JavaDoc 파일을 읽기 위해서는 javadoc/index.html 파일을 브라우저에서 열어본다.
- Lib
이 디렉토리는 카산드라가 작동하기 위한 모든 외부 라이브러리들을 담고있다. 예를 들면 두개의 다른 JSON 라이브러리를 담고있고 구글 프로젝트와 몇 개의 아파치 라이브러리가 있다. 카산드라와 상호작용하기위해 Thrift 와 Avro RPC 도 포함하고 있다.

2.2. 소스로부터 빌드하기

카산드라는 빌드 스크립트로 Apache Ant를 사용하고 상호의존관계 관리를 위해서는 Ivy 플러그인을 사용한다.
Ant는 http://ant.apache.org에서 받을수 있다. 카산드라 빌드를 위해서 Ivy를 별도로 받을 필요는 없다.
Ivy는 Ant를 필요로한다. 소스에서 빌드를 하기위해 JDK 1.6.0_20 이나 그 이후 버전으로서 단지 JRE가 아니다. Ant가 tools.jar를 가지고 있지 않다는 메시지가 나오면 JDK가 모두 있지 않거나 패스를 틀린것이다.
만약 모든 소스를 받고 싶다면 Hudson 에서 받을 수 있다. http://hudson.zones.apache.org/hudson/job/Cassandra/ 위치이다.
만약 당신이 Git 팬이라면 읽기전용의 카산드라 버전을 아래 명령어를 통해서 받을 수 있다.
>git clone git://git.apache.org/Cassandra.git
Git는 리누스 토발즈가 만든 소스 코드 관리 시스템이다. 지금은 유명해졌고 Android, Fedora, Ruby, Perl 와 많은 카산드라 클라이언트에의해 사용되어진다. Ubuntu와 같은 리눅스 시스템에 있다면 Git을 이용하기 쉽다. 콘솔에서 그냥 >apt-get install git 을 치면 설치된다. 더 많은 정보를 위해서는 http://git-scm.com/ 을 방문하라.
Ivy가 모든 상관관계를 관리하기 때문에 소스코드가 있다면 빌드하기가 쉽다. 단지 당신이 루트 디렉토리에 있고 소스가 다운로드되어서 ant 프로그램을 실행하기만 하면 된다. 그것은 build.xml을 현재 디렉토리에서 찾아서 디폴트 빌드를 할 것이다. Ant와 Ivy가 나머지를 알아서 처리한다. Ant를 실행하고 소스 컴파일을 하기 위해서는 >ant 라고 타이프한다.
이제 모두 끝났다. Ivy가 모든 상관관계를 처리하고 Ant가 350개 정도되는 소스 파일을 빌드하고 테스트를 수행할 것이다. 만약 잘 된다면 BUILD SUCCESSFUL이라는 메시지를 보게된다. 잘 안되면 패스 설정이 모두 올바른지 확인한다. 당신이 다운로드 받은 소스가 컴파일 되는지 Hudson 보고서를 확인할 수 있다.
만약 빌드되면서 자세한 정보를 보고 싶으면 -v 로 Ant에 옵션을 켜주면 된다.

2.2.1. 추가적인 빌드 타겟

서버를 컴파일하기 위해 ant를 위에서 본 것 처럼 실행해주면 된다. 하지만 빌드 파일에서 당신이 흥미를 가질 만한 다른 사항들이 있다.
- Test
유닛 테스트들을 실행하기 때문에 사용자가에게 가장 유용할 것이다. 카산드라와 상호작용하는 좋은 예제로서 소스파일들을 볼 수도 있다.
- Get-thrift-java
자바 데이터베이스와 상호작용하기위해 아파치 Thrift 클라이언트 인터페이스를 생성한다.
- Gen-thrift-py
파이선 사용자를 위한 Thrift 클라이언트 인터페이스를 생성한다.
- Build-jar
Java Archive (JAR)를 배포하기위해 >ant jar를 실행한다. 이것은 빌드를 완전히 몇 가지 실행하고 빌드 디렉토리 apache-cassandra-x.x.x.jar 에 아웃풋 파일을 생성한다.

2.2.2. Maven으로 빌드하기

초기 카산드라를 만든 사람들은 Maven에 대해서 많은 신경을 쓰지 않은 것 같다. 이른 버전의 카산드라는 Maven POM 파일을 포함하고 있지 않다. 하지만 많은 자바 개발자들이 Ant보다 Maven을 사용하기 하고 IDE에서 Maven을 지원하자 pom.xml 파일이 생겨서 이제 원하면 Maven으로 빌드할 수 있다.
Maven에서 빌드하기 위해서는 /contrib./maven으로 이동하여 아래 명령을 수행한다.
$mvn clean install
Maven으로 빌드하는데 어려움이 있다면 필요한 JAR파일을 수동으로 얻을 수도 있다. 버전 0.6.3 에서는 libthrift.jar와 같은 리파지토리에 존재하지 않는 파일에 대한 의존성 때문에 Maven POM이 제대로 작동하지 않을수 있다.

2.3. Cassandra 실행하기

카산드라의 이전 버전에서는 실제로 서버를 실행하기 전에 Ivy에서 몇 가지 일을 하고 설정 변수를 몇 개 맞추어 주어야 했다. 하지만 개발자들이 노력하여 이제 시작하는 것을 매우 쉽게 해 놓았다.


2.3.1. Windows 에서

당신이 바이너리를 가지고 있거나 소스를 다운로드해서 컴파일했다면 이제 데이터베이스 서버를 시작할 준비가 되어있다.
JAVA_HOME 환경 변수를 또 설정해야 할 필요가 있을 것이다. Windows 7에서 이것을 하기 위해서 시작 버튼을 누르고 컴퓨터를 오른쪽 클릭한다. 그리고 Advanced System Settings 를 클릭하고 환경 변수를 클릭한다. 새로 만들기 버튼을 클릭하여 새로운 시스템 환경 변수를 만든다. 변수 이름에 JAVA_HOME을 쓴다. 그리고 값에는 JDK 가 설치된 위치를 넣는다. 이것은 C:\Program Files\Java\jdk1.6.0_20과 같은 것일 것이다. 환경 변수를 새로 설정했을때는 열려있는 터미널 등도 다시 열어서 환경 변수가 제대로 인식되는지 검사해 본다. 제대로 설정이 되었는지 보기위해서 >echo %JAVA_HOME% 를 터미널에서 실행해본다. 이것은 당신의 환경변수의 내용을 프린트할 것이다.
카산드라를 처음 실행하면 시스템에 디렉토리 두개를 추가할 것이다. 첫번째는 C:\var\lib\cassandra 인데 commitlog라고 불리는 데이터 파일을 저장하는 곳이다. 다른 것은 c:\var\log\cassandra 인데 system.log 라는 파일에 로그를 기록할 것이다. 만약 무슨 어려움을 만난다면 이 디렉토리에 있는 파일들을 참조하여 무슨 일이 생기는지 알수있다.

2.3.2. Linux 에서

리눅스에서도 윈도우즈에서와 비슷하다. JAVA_HOME이 1.6.0_20 이상 버전에 잘 설정되어 있는지 확인한다. 그리고 Cassandra 압축을 gunzip을 사용하여 풀어준다. 그리고 데이터와 로그를 저장하는 몇 개 디렉토리를 만들어 준다.
ehewitt@morpheus$ cd /home/eben/books/cassandra/dist/apache-cassandra-0.7.0-beta1
ehewitt@morpheus$ sudo mkdir -p /var/log/cassandra
ehewitt@morpheus$ sudo chown -R ehewitt /var/log/cassandra
ehewitt@morpheus$ sudo mkdir -p /var/lib/cassandra
ehewitt@morpheus$ sudo chown -R ehewitt /var/lib/cassandra
물론 ehewitt 대신에 당신의 사용자 이름을 넣어준다.

2.3.3. 서버 시작하기
어떤 OS에서든 카산드라를 시작하기 위해 터미널에 커맨드를 열고 /bin으로 이동한다. 그리고 아래 커맨드를 시작하기 위해 입력한다. 제대로 설정되었으면 아래와 같은 로그를 보게된다.
eben@morpheus$ bin/cassandra -f
INFO 13:23:22,367 DiskAccessMode 'auto' determined to be standard, indexAccessMode
is standard
INFO 13:23:22,475 Couldn't detect any schema definitions in local storage.
INFO 13:23:22,476 Found table data in data directories.
Consider using JMX to call org.apache.cassandra.service.StorageService
.loadSchemaFromYaml().
INFO 13:23:22,497 Cassandra version: 0.7.0-beta1
INFO 13:23:22,497 Thrift API version: 10.0.0
INFO 13:23:22,498 Saved Token not found. Using qFABQw5XJMvs47lg
INFO 13:23:22,498 Saved ClusterName not found. Using Test Cluster
INFO 13:23:22,502 Creating new commitlog segment /var/lib/cassandra/commitlog/
CommitLog-1282508602502.log
INFO 13:23:22,507 switching in a fresh Memtable for LocationInfo at CommitLogContext(
file='/var/lib/cassandra/commitlog/CommitLog-1282508602502.log', position=276)
INFO 13:23:22,510 Enqueuing flush of Memtable-LocationInfo@29857804(178 bytes,
4 operations)
INFO 13:23:22,511 Writing Memtable-LocationInfo@29857804(178 bytes, 4 operations)
INFO 13:23:22,691 Completed flushing /var/lib/cassandra/data/system/
LocationInfo-e-1-Data.db
INFO 13:23:22,701 Starting up server gossip
INFO 13:23:22,750 Binding thrift service to localhost/127.0.0.1:9160
INFO 13:23:22,752 Using TFramedTransport with a max frame size of 15728640 bytes.
INFO 13:23:22,753 Listening for thrift clients...
INFO 13:23:22,792 mx4j successfuly loaded
HttpAdaptor version 3.0.2 started on port 8081

-f 옵션을 켜면 카산드라에게 백그라운드 프로세스로 실행하지 않고, 포어그라운드에 머물러서 표준 출력에게 모든 로그를 출력한다.
축하한다. 당신의 카산드라 서버는 Test Cluster라는 한 개의 노드로 9160 포트를 열고 실행이 되었다.

2.4. Command-Line 클라이언트 인터페이스 실행하기

카산드라 설정을 한 개 실행시켰다. 모든 것이 잘 설정이 되었는지 확인해보자. 리눅스에서 커맨드 라인 인터페이스는 잘 작동할 것이다. 윈도우즈에서는 몇 가지 더 해줄일이 있다.
윈도우즈에서 카산드라 홈 디렉토리로 이동해서 터미널을 새로 연후 다음을 실행해준다.
>bin\cassandra-cli
윈도우즈에서는 클라이언트를 시작할 때 아래와 같은 에러를 볼 수 있다.
Starting Cassandra Client
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/cassandra/cli/CliMain
이는 당신이 카산드라를 bin 디렉토리에서 곧바로 실행했음을 의미한다. 그리고 Java 클래스패스를 잘 설정하지 못하여 CliMain을 찾지 못하는 것이다. CASSANDRA_HOME이라는 환경변수를 카산드라를 설치한 최상위 디렉토리로 설정하여 카산드라를 어디서 시작하든지 신경을 별로 쓰지 않도록 한다.
리눅스에서 커맨드 라인 인터페이스를 실행하기 위해서 카산드라 홈으로 이동하고 Cassandra-cli 를 bin 디렉토리에서 실행한다.
>bin/Cassandra-cli
카산드라 클라이언트가 시작한다.
eben@morpheus$ bin/cassandra-cli
Welcome to cassandra CLI.
Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
[default@unknown]
이제 커맨드를 실행할 수 있는 상호작용 쉘이 열린것이다.
하지만 당신이 Oracle SQL Plus에 익숙해 있다면 당황할 것이다. 카산드라 CLI는 개발에 적합한 것이다. 그래서 카산드라를 시작하기에는 적당하다.

2.5. 기본 CLI 명령들

카산드라에 대해서 더 깊이 공부하기전에 클라이언트 API의 오버뷰를 통해서 당신이 서버에게 보낼수 있는 명령어 들에 대해 알아본다. 우리는 기본 환경 커맨드를 보고 데이터를 집어넣고 빼고 하는 것을 본다.

2.5.1. Help

커맨드 라인 인터페이스에서 도움말을 받기 위해서는 help 나 ?를 타이핑하여 쓸수 있는 명령어들의 목록을 본다. 아래 목록은 메타데이터와 설정에 관한 것을 보여준다. 다른 명령어들도 있어서 값들을 설정하거나 읽을 수 있으며 그것은 나중에 보도록 한다.
[default@Keyspace1] help
List of all CLI commands:
? Display this message.
help Display this help.
help Display detailed, command-specific help.
connect / Connect to thrift service.
use [ 'password'] Switch to a keyspace.
describe keyspace Describe keyspace.
exit Exit CLI.
quit Exit CLI.
show cluster name Display cluster name.
show keyspaces Show list of keyspaces.
show api version Show server API version.
create keyspace [with = [and = ...]]
Add a new keyspace with the specified attribute and value(s).
create column family [with = [and = ...]]
Create a new column family with the specified attribute and value(s).
drop keyspace Delete a keyspace.
drop column family Delete a column family.
rename keyspace Rename a keyspace.
rename column family Rename a column family.

2.5.2. 서버에 연결하기

클라이언트를 이렇게 시작하는 것이 카산드라 서버에 자동으로 연결을 해주는 것은 아니다. 카산드라를 시작한 후에 특정 서버에 연결하기 위해서는 connect 명령을 사용한다.
eben@morpheus:~/books/cassandra/dist/apache-cassandra-0.7.0-beta1$ bin/cassandra-cli
Welcome to cassandra CLI.
Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
[default@unknown] connect localhost/9160
Connected to: "Test Cluster" on localhost/9160
[default@unknown]
간략하게 클라이언트를 시작하고 특정서버에 호스트와 포트 등 파라미터를 넘겨줌으로써 연결할 수 있다. 다음과 같다.
eben@morpheus:~/books/cassandra/dist/apache-cassandra-0.7.0-beta1$ bin/
cassandra-cli localhost/9160
Welcome to cassandra CLI.
Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
[default@unknown]
CLI가 Test Cluster라는 카산드라 서버에 연결되었다고 보여준다. localhost라는 한 개의 노드가 있는 클러스터가 디폴트로 설정되어 있기 때문이다.

2.5.3. 환경을 기술하기

Test Cluster라는 카산드라에 접속하고 바이너리 배포판을 사용한다면 비어있는 keyspace 나 카산드라 데이터베이스가 테스트하기 위해 설정되어 있을 것이다.
현재 사용중인 클러스터의 이름을 보고싶다면 다음과 같이 타이프한다.
[default@unknown] show cluster name
Test Cluster
클러스터에서 어떤 keyspace가 쓸 수 있는지 보려면 다음을 친다.
[default@unknown] show keyspaces
system
만약 당신이 당신만의 keyspace를 만들었다면 그것도 역시 보여질 것이다. System keyspace는 카산드라에 의해서 내부적으로 쓰여질 것이고 우리가 데이터를 쓸수는 없다. Microsoft SQL 서버의 마스터와 임시 데이터베이스와 같다. 이 keyspace는 스키마 정의를 담고있고 런타임시에 수정되는 스키마에 대한 모든 사항을 알고 있다. 이것은 타임스탬프에 따라 한 개의 노드에 만들어진 변경사항을 클러스터 전체에 알려지게 한다. 당신이 사용하는 API의 버전을 보기위해서는 다음과 같이 타이핑한다.
[default@Keyspace1] show api version
10.0.0
실험해 볼 다른 명령어 들도 있다. 지금은 데이터베이스에 데이터를 추가해보고 다시 얻어보자.

2.5.4. Keyspace 와 컬럼군을 만들기

카산드라의 keyspace는 관계형 데이터베이스와 유사하다. 한 개나 두개의 컬럼군을 정의하여 관계형 세상에서와 대강 유사한 테이블을 만든다. 당신이 특별한 keyspace를 설정하지 않고 CLI 클라이언트를 시작하면 출력은 다음과 같을 것이다.
>bin/cassandra-cli --host localhost --port 9160
Starting Cassandra Client
Connected to: "Test Cluster" on localhost/9160
Welcome to cassandra CLI.
Type 'help' or '?' for help. Type 'quit' or 'exit' to quit.
[default@unknown]
당신이 키스페이스와 특정 사용자를 정의하지 않았기 때문에 쉘 프롬프트는 default@unknown 이다. (6장에서 방법을 살펴볼 것이다.)
우리의 keyspace를 만들어보자.
[default@unknown] create keyspace MyKeyspace with replication_factor=1
ab67bad0-ae2c-11df-b642-e700f669bcfc
replication_factor에 대해서는 현재로서는 신경을 쓰지 말자. 그것은 차후에 자세히 볼 사항에 대해서 설정한다. 당신의 keyspace를 만든후에 쉘에서 다음을 타이핑하여 전환할 수 있다.
[default@unknown] use MyKeyspace
Authenticated to keyspace: MyKeyspace
[default@MyKeyspace]
MyKeyspace는 어떤 크리덴셜을 필요로 하지 않으므로 이것을 사용할 수 있게 인증되어 있는 상태이다.
우리는 이제 우리의 keyspace에 컬럼군을 만들수 있다. CLI에서 이것을 하기위해 아래의 명령을 사용한다.
[default@MyKeyspace] create column family User
991590d3-ae2e-11df-b642-e700f669bcfc
[default@MyKeyspace]
이것은 User 라는 컬럼군을 우리의 keyspace에 만든다. 그리고 컬럼군 셋팅의 디폴트값을 갖는다. 우리는 CLI에서 describe keyspace 명령을 통해서 keyspace 정보를 보고 우리가 원하는 keyspace를 가지고 있는지 본다. 다음과 같다.
[default@MyKeyspace] describe keyspace MyKeyspace
Keyspace: MyKeyspace
Column Family Name: User
Column Family Type: Standard
Column Sorted By: org.apache.cassandra.db.marshal.BytesType
flush period: null minutes
------
[default@MyKeyspace]
Type, Sorted By, flush period 에 대해서는 이후에 본다. 당장은 시작하는데 충분하다.

2.5.5. 데이터를 쓰고 읽기

이제 keyspace와 컬럼군을 가지고 있다. 이제 데이터를 쓰고 다시 읽어보겠다. 현재 여기서는 어떻게 되어가는지 자세히 알 필요는 없다. 카산드라의 데이터 모델에 관해서는 차후에 살펴본다. 당신은 현재 컬럼군을 가진 keyspace(데이터베이스) 를 가지고 있다. 여기서는 컬럼군을 다차원의 지도와 같이 생각하고 미리 정의할 필요는 없다. 컬럼군은 컬럼을 가지고 있고 컬럼은 데이터 저장할 수 있는 한 개의 유닛이다.
어떤 값을 쓰기위해서 set 명령을 사용한다.
[default@MyKeyspace] set User['ehewitt']['fname']='Eben'
Value inserted.
[default@MyKeyspace] set User['ehewitt']['email']='me@example.com'
Value inserted.
[default@MyKeyspace]
여기 ehewitt 라는 키를 위한 두 개의 컬럼을 만들었다. 컬럼의 이름은 fname과 email이다. Count 명령을 사용하여 한 개의 키에 두개의 컬럼을 썼는지 볼수 있다.
[default@MyKeyspace] count User['ehewitt']
2 columns
Get 명령을 사용하여 데이터를 읽어보자.
[default@MyKeyspace] get User['ehewitt']
=> (column=666e616d65, value=Eben, timestamp=1282510290343000)
=> (column=656d61696c, value=me@example.com, timestamp=1282510313429000)
Returned 2 results.
Del 명령을 사용하여 컬럼을 지울수도 있다. 여기서 ehewitt의 email 컬럼을 지워본다.
[default@MyKeyspace] del User['ehewitt']['email']
column removed.
여기서는 모든 로우를 지워본다. 명령은 같지만 컬럼 이름을 지정하지 않는다.
[default@MyKeyspace] del User['ehewitt']
row removed.
지워진 것을 확인하기 위해서 다음과 같이 쿼리해볼수 있다.
[default@Keyspace1] get User['ehewitt']
Returned 0 results.

댓글 없음:

댓글 쓰기