infiniflux append protocol
TRANSCRIPT
4
배경 – 전통 프로토콜의 한계
Client
ServerIdle time
……
Client
Client
Client
Server
Server
Idle time
Idle time
• 전통적인 동기 프로토콜(Request / Reply )의 한계
• 매번 레코드 입력 시 Execute 이후 결과를 확인하는 동기적인 방식• I/O 수행 횟수가 레코드 개수에 따라 급격하게 증가• 한 레코드에 대한 결과를 매번 확인해야 함• 초당 1000건 이상 입력하기 힘듦
5
배경 – 개선 프로토콜
Append Protocol 개념도
• 낙관적비동기프로토콜도입 (Append Protocol)
• 입력레코드를연속적으로버퍼에쌓고, 일정조건에다다르면버퍼 Flush 수행• Append Success시결과를돌리지않음.• Append Failure 시에만서버로부터에러코드, 메시지를클라이언트로되돌림• 초당수백만건의레코드입력가능• 대부분의입력이성공하며, 극히일부분에러가발생하므로최적의대안
Flush Append
Flush Append
Client
Client
Client
No Idle time
No Idle time
Server
Server
Server
6
배경 – API 구조
Title Contents
통신 채널 수립 API• Append를 위한 채널을 Open 하도록 함• 입력 대상 테이블을 명시• 이 채널을 통해 데이터를 고속으로 입력
데이터 입력 API• 주어진 테이블 스키마에 맞는 컬럼 데이터 바인딩• 길이 및 포맷에 어긋날 경우 에러 검출• 버퍼링을 통해 빠른 데이터 전송 성능 보장
데이터 Flush API • 입력버퍼가 모두 채워지지 않을 경우 강제로 네트워크로 전송하도록 함
에러 Callback 설정 API
• 서버로부터 도달하는 에러코드 및 메시지를 처리하는 비동기 사용자 Callback 설정 기능
• 입력과는 비동기적으로 동작
통신 채널 종료 API• 현재 Append 중엔 프로토콜을 종료함• 버퍼에 남아있는 레코드를 모두 네트워크로 전송
8
CLI 설치 확인
InfiniFlux가 설치된 디렉토리의 install, include, lib 디렉토리에서 파일을 확인한다.
• Makefile
• Header file
• Library file
$IFLUX_HOME/install/iflux_env.mk
$IFLUX_HOME/include/iflux_sqlcli.h
$IFLUX_HOME/lib/libifluxcli.a$IFLUX_HOME/lib/libifluxcli_dll.so
9
Makefile & Compile
• sample/cli 디렉토리로이동한다.
• Makefile의내용을확인한다.
• Compile을해본다.
$ cd $IFLUX_HOME/sample/cli
include $(IFLUX_HOME)/install/iflux_env.mk
INCLUDES += $(LIBDIR_OPT)/$(IFLUX_HOME)/include
all : sample4_append2
sample4_append2 : sample4_append2.o$(LD_CC) $(LD_FLAGS) $(LD_OUT_OPT)$@ $< $(LIB_OPT)ifluxcli$(LIB_AFT) $(LIBDIR_OPT)$(IFLUX_HOME)/lib $(LD_LIBS)
sample4_append2.o : sample4_append2.c$(COMPILE.cc) $(CC_FLAGS) $(INCLUDES) $(CC_OUT_OPT)$@ $<
clean :rm -f *.o sample4_append2
$ make
$IFLUX_HOME/sample/cli/makefile을확인하여 compile을해본다.
10
Append program 구조
InfiniFlux 고유의 확장 함수
CLI 표준 연결 함수
CLI 표준 연결 해제 함수
$IFLUX_HOME/sample/cli/sample4_append1.c 에대해서설명한다.
SQLAllocEnv
SQLAllocConnect
SQLDriverConnect
SQLAllocStmt
SQLAppendOpen
SQLAppendDataV2
SQLAppendClose
SQLAppendSetErrorCallback
SQLFreeStmt
SQLDisconnect
SQLFreeConnect
SQLFreeEnv
11
SQLAppendOpen
• 특정테이블에데이터를입력하기위해서채널을오픈한다.
• 이후이채널을 close하지않으면계속열린상태를유지한다.
• 하나의연결에최대 1024개의 Statement 설정이가능한다.
• 각 Statement마다 SQLAppendOpen을사용하면된다.
SQLRETURN SQLAppendOpen( SQLHSTMT aStatementHandle, SQLCHAR *aTableName, SQLINTEGER aErrorCheckCount );
• aStatementHandle : append를 수행할 statement의 핸들
• aTableName : append를 수행할 대상 테이블의 이름
• aErrorCheckCount : 서버 에러를 검사하는 입력 건수. 0이면 검사하지 않음
12
SQLAppendDataV2
• 해당채널에대해서데이터를입력하는함수이다.
• InfiniFlux v2.0 부터지원한다.
• TEXT, BINARY 타입의데이터입력이가능하다.
SQLRETURN SQLAppendDataV2( SQLHSTMT aStatementHandle, SQL_APPEND_PARAM *aData );
• aStatementHandle : append를수행할 statement의핸들• aData : SQL_APPEND_PARAM이라는인자배열을가리키는포인터
SQL_APPEND_PARAM은 iflux_sqlcli.h에정의되어있음
13
SQLAppendClose
• 현재열린채널을닫는다.
• Append 성공, 실패한레코드개수를확인할수있다.
SQLRETURN SQLAppendClose( SQLHSTMT aStatementHandle, int *aSuccessCount, int *aFailureCount );
• aStatementHandle : append를 수행한 statemen의 핸들• aSuccessCount : append를 성공한 레코드 개수 값• aFailureCount : append를 실패한 레코드 개수 값
14
SQLAppendSetErrorCallback
• Append 도중에 에러가 발생할 경우 호출되는 callback 함수를 설정한다.
• 만약 이 함수를 설정하지 않을 경우 서버에서 에러가 발생하더라도 클라이언트에서는 무시하게 된다.
SQLRETURN SQLAppendSetErrorCallback( SQLHSTMT aStatementHandle, SQLAppendErrorCallback *aFunc );
• aStatementHandle : append를 수행하는 statement의 핸들• aFunc : append 에러시 호출할 callback 함수 포인터
typedef void (*SQLAppendErrorCallback)( SQLHSTMT aStatementHandle,SQLINTEGER aErrorCode,SQLPOINTER aErrorMessage,SQLLEN aErrorBufLen,SQLPOINTER aRowBuf,SQLLEN aRowBufLen );
• aStatementHandle : append를 수행하는 statement의 핸들.• aErrorCode : 에러의 원인이 된 32bit 에러 코드.• aErrorMessage : 해당 에러코드에 대한 문자열• aErrorBufLen : aErrorMessage의 길이• aRowBuf : 에러를 발생시킨 레코드의 내용이 담긴 문자열• aRowBufLen : aRowBuf의 길이
15
기타 함수
• 추가적으로몇가지유용한함수를제공한다.
• 자세한사항은 InfiniFlux 홈페이지매뉴얼문서를참조하면된다. (http://www.infiniflux.com/document)
함수명 함수선언 함수설명
SQLAppendDataByTimeV2
SQLRETURN SQL_API
SQLAppendDataByTimeV2(
SQLHSTMT aStatmentHandle,
SQLBIGINT aTime,
SQL_APPEND_PARAM *aData)
SQLAppendDataV2()처럼 해당 채널에 데이터를 입력한다.
다만 숨은 칼럼인 _arrival_time 값은 현재 시간이 아닌 특정 시간의
값으로 설정할때 사용한다.
즉 로그 파일에 있는 시간을 aTime값으로 넘겨주면 된다.
SQLAppendFlush
SQLRETURN SQL_API
SQLAppendFlush(
SQLHSTMT aStatementHandle)
현재 채널 버퍼에 쌓여 있는 데이터를 InfiniFlux 서버로 즉시 전송
한다.
SQLSetConnectAppendFlush
SQLRETURN SQL_API
SQLSetConnectAppendFlush(
SQLHDBC aHdbc,
SQLINTEGER aTimeOption)
일정 주기로 InfiniFlux 서버로 전송할지 여부를 설정한다.
0 : auto flush off
1 : auto flush on
SQLSetStmtAppendInterval
SQLRETURN SQL_API
SQLSetStmtAppendInterval(
SQLHSTMT aStatementHandle,
SQLINTEGER aValue)
SQLSetConnectAppendFlush()를 이용하여 auto flush on한 경우,
flush 주기를 조정하거나 auto flush off 한다.
aValue가 0이면 flush를 하지 않는다.
기본 값은 1000이며 단위는 ms이다.
100의 배수로 설정해야 한다.
17
Library 설치 확인
Java 1.6 이상 지원
InfiniFlux가설치된디렉토리의 lib 디렉토리에서파일을확인한다.
• Library file
• Log4j file
• Sample
• Makefile
$IFLUX_HOME/lib/iflux.jar
$IFLUX_HOME/lib/ifluxLog.jar$IFLUX_HOME/lib/log4j.jar
$IFLUX_HOME/sample/jdbc
$IFLUX_HOME/sample/jdbc/Makefile
18
Append program 구조
InfiniFlux 고유의확장함수
표준연결함수
표준연결해제함수
$IFLUX_HOME/sample/jdbc/sample4_append.java에대해서설명한다.
DriverManager.getConnection
Connection.createStatement
executeAppendOpen
executeAppendData
executeAppendClose
executeSetAppendErrorCallback
ResultSet.close
Statement.close
Connection.close
19
executeAppendOpen
• 특정테이블에데이터를입력하기위해서채널을오픈한다.
• 이후이채널을 close하지않으면계속열린상태를유지한다.
• 하나의연결에최대 1024개의 Statement 설정이가능한다.
ResultSet IfluxStatement.executeAppendOpen( String aTableName, int aErrorCheckCount );
• aTableName : append를수행할대상테이블의이름• aErrorCheckCount : 서버에러를검사하는입력건수. 0이면검사하지않음
20
executeAppendData
• 해당채널에대해서데이터를입력하는함수이다.
int IfluxStatement.executeAppendData( ResultSetMetaData aRsmd, ArrayList aData );
• aRsmd : 해당테이블의칼럼 meta 정보• aData : appen할데이터의 array list
21
executeAppendClose
• 현재열린채널을닫는다.
int IfluxStatement.executeAppendClose();
이함수실행이후에getAppendSuccessCount(), getAppendFailureCount()를호출하여성공,실패한개수를확인할수있다.
22
executeSetAppendErrorCallback
• Append 도중에에러가발생할경우호출되는 callback 함수를설정한다.
• 만약이함수를설정하지않을경우서버에서에러가발생하더라도클라이언트에서는무시하게된다.
int IfluxStatement.executeSetAppendErrorCallback( IfluxAppendCallback aCallback);
• aCallback : append 에러시호출할 callback 함수
IfluxAppendCallback cb = new IfluxAppendCallback() {@Overridepublic void onAppendError(long aErrNo, String aErrMsg, String aRowMsg) {
System.out.format("Append Error : [%05d - %s]\n%s\n", aErrNo, aErrMsg, aRowMsg);}
};
stmt.executeSetAppendErrorCallback(cb);
23
기타 함수
• 추가적으로몇가지유용한함수를제공한다.
• 자세한사항은 InfiniFlux 홈페이지매뉴얼문서를참조하면된다. (http://www.infiniflux.com/document)
함수명 함수선언 함수설명
executeAppendDataByTime
intexecuteAppendDataByTime(ResultSetMetaData aRsmd,long aTime,ArrayList aData)
executeAppendData()처럼 해당 채널에 데이터를 입력한다.다만 숨은 칼럼인 _arrival_time 값은 현재 시간이 아닌 특정시간의 값으로 설정할때 사용한다.즉 로그 파일에 있는 시간을 aTime값으로 넘겨주면 된다.
executeAppendFlush int executeAppendFlush()현재 채널 버퍼에 쌓여 있는 데이터를 InfiniFlux 서버로즉시 전송한다.
executeAppendSuccessCountlong getAppendSuccessCount()
Append 성공한 레코드 개수를 리턴한다.
executeAppendFailureCountlong executeAppendFailureCount()
Append 실패한 레코드 개수를 리턴한다.
25
Multi Table Insert 구조
$IFLUX_HOME/sample/cli/sample8_multi_session_multi_table.c에대해서설명한다.
• Main함수에서 threa를 생성하고, 개별 threa에서 모든 것을 처리한다.
• 즉 SQLHENV, SQLHDBC, SQLHSTMT 에 대한 alloc과 free를 개별 thread에서 처리한다.
• 하나의 statement가 한 개의 table에 데이터를 입력하도록 한다.
• 이렇게 하는 이유는 thread간에 statement 또는 connection 정보를 공유할 경우 하나의 thread에서 에러가 발생할 경우 전체
세션을 종료할 가능성이 있기 때문이다.
• 가능하면 thread간 resource의 공유는 하지 않도록 하는 것이 안전하다.
• 데이터의 입력 주기가 불규칙하고 interval이 긴 경우가 있으면 SQLSetConnectionAppendFlush()와
SQLSetStmtAppendInterval()을 이용하여 auto timed flush를 수행하도록 한다.