기존에 있던 서버가 하드가 맛이 가면서 안에 있던 인증 내용이랑 웹서버 복구를 하게 되었다 -_-

다행이 하드가 아예 맛이 간건 아니고 일부 블록에 문제가 생기면서 커널 패닉이 발생하는 상황

원래 교체작업이 예정에 있었던 터라 부랴부랴 신규 서버를 셋팅하기로 했습니다.

우분투를 설치하고 아파치 셋팅 파일을 옮겨와서 설정 해주고 나니 남은건 디비 복구!

기존에 설치되어있던 mysql이 고스란히 있긴 한데 어어어어엄청 옛날 서버라서 그냥 데이터 파일을 가지고 복구를 진행해보기로 했습니다.


MySQL의 기본 데이터 저장소는 /var/lib/mysql 이며, 해당 디렉토리 내부에 데이터베이스 별로 디렉토리가 생성되어 있습니다.

해당 디렉토리 내부에 테이블 별로 frm및 ibd 파일이 존재하고 이 파일을 이용해서 복구를 하면되는데, mysqlfrm 커맨드로 frm 파일들을 조사해서 스키마 정보를 뽑아올 수 있습니다.

mysqlfrm커맨드는 기본 mysql패키지에는 포함 되어있지 않고, mysql-utilities 패키지를 설치해야 사용할 수 있습니다.



스키마 정보로 테이블을 생성 후, 테이블 스페이스를 폐기하고 기존의 ibd파일을 옮겨 다시 import하면 끝입니다.



$ sudo apt-get install mysql-utilities


$ sudo /var/lib/mysql/[Database]/*.frm > create_table.sql

$ mysql -r root -p


mysql> source create_table.sql;

mysql> alter table [Database].[Table] discard tablespace;

mysql> quit;


$ sudo cp /old_mysql/*.ibd /var/lib/mysql/[Database]

$ sudo chown mysql:mysql /var/lib/mysql/[Database]/*.ibd

$ mysql -u root -p


mysql> alter table [Database].[Table] import tablespace;



기존 row_format과 값이 다른 경우
ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)
라는 오류가 발생할 수 있습니다. 이럴 경우 테이블을 생성할 때 row_format=compact 값을 넣어주면 됩니다.


CREATE TABLE `table` (

  `no` bigint(20) NOT NULL AUTO_INCREMENT,

  `id` varchar(150) NOT NULL,

PRIMARY KEY `PRIMARY` (`no`)

) ENGINE=InnoDB row_format=compact;


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

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으로 바꿔주면 된다.



자, 디버깅 해보자!

드디어 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


; haribote-ipl
; TAB=4

CYLS EQU  10   
ORG  0x7c00   

; 이하는 표준적인 FAT12 디스크를 위한 기술

  JMP  entry
  DB  0x90
  DB  "CARDIABS"  ; Bootsector name (8바이트)
  DW  512   ; 1섹터 크기(512로 해야 함)
  DB  1   ; 클러스터 크기(1섹터로 해야 함)
  DW  1   ; FAT시작(보통은 1섹터부터)
  DB  2   ; FAT 개수(2로 해야 함)
  DW  224   ; 루트 디렉토리 영역의 크기(보통은 224엔트리로 한다)
  DW  2880   ; 드라이브 크기(2880섹터로 해야 함)
  DB  0xf0   ; 미디어 타입(0xf0로 해야 함)
  DW  9   ; FAT영역의 길이(9섹터로 해야 함)
  DW  18   ; 섹터(18로 해야 함)
  DW  2   ; 헤드 수(2로 해야 함)
  DD  0   ; 파티션을 사용하지 않기 때문에 여기는 반드시 0
  DD  2880 
  DB  0,0,0x29 
  DD  0xffffffff 
  DB  "CARDIAOS " 
  DB  "FAT12   "  
  RESB 18    

; 프로그램 본체

entry:
  MOV  AX, 0   ; 레지스터 초기화
  MOV  SS,AX
  MOV  SP,0x7c00
  MOV  DS,AX

; 디스크를 읽는다

  MOV  AX,0x0820
  MOV  ES,AX
  MOV  CH, 0   ; 실린더 0
  MOV  DH, 0   ; 헤드 0
  MOV  CL, 2   ; 섹터 2
readloop:
  MOV  SI, 0  
retry:
  MOV  AH, 0x02  ; AH=0x02 : 디스크 read
  MOV  AL, 1   ; 1섹터
  MOV  BX,0
  MOV  DL, 0x00  ; A드라이브
  INT  0x13   
  JNC  next   
  ADD  SI, 1   
  CMP  SI, 5   
  JAE  error   
  MOV  AH,0x00
  MOV  DL, 0x00  ; A드라이브
  INT  0x13  
  JMP  retry
next:
  MOV  AX, ES   
  ADD  AX,0x0020
  MOV  ES, AX  
  ADD  CL, 1   ; CL에 1을 더한다
  CMP  CL, 18   ; CL와 18을 비교
  JBE  readloop  ; CL <= 18 이라면 readloop에
  MOV  CL,1
  ADD  DH,1
  CMP  DH,2
  JB  readloop  ; DH < 2 라면 readloop에
  MOV  DH,0
  ADD  CH,1
  CMP  CH,CYLS
  JB  readloop  ; CH < CYLS 라면 readloop에

; 다 읽었지만 우선 할일이 없기 때문에 sleeve

fin:
  HLT     
  JMP  fin   ; Endless Loop

error:
  MOV  AX,0
  MOV  ES,AX
  MOV  SI,msg
putloop:
  MOV  AL,[SI]
  ADD  SI, 1 
  CMP  AL,0
  JE  fin
  MOV  AH, 0x0e 
  MOV  BX, 15 
  INT  0x10   
  JMP  putloop
msg:
  DB  0x0a, 0x0a 
  DB  "load error"
  DB  0x0a   
  DB  0

  RESB 0x7dfe-$ 
  DB  0x55, 0xaa


이것으로 기본적인 부팅이 가능 - _-)

OS 제작을 위해 사용한 바이너리 에디터

+ Recent posts