Mysql DB Insert가 분당 15만회 정도 발생해서 발생하는 문제.

softpro의 이미지

우선 제가 하고 있는 내용은 라우터로부터 Netflow data가 저희 시스템에 오면 이 데이터를 Mysql DB에 저장하는 것이 목적입니다.
그런데 실제 Mysql DB에 insert 되는 양이 분당 15만회정도가 발생하고 있으며 이로 인해서 Netflow data의 일부가 처리되지 못하고 패킷 드랍되고 있는것 같습니다.
그래서 이를 해결할수 있는 방법이 없을까요?

제 시스템은
dell: poweredge sc1420
CPU: 제온 3.0
HDD: 울트라 SCSI 73G
OS: fedora Core 4
입니다.

File attachments: 
첨부파일 크기
Binary Data NetFlow2MySQL-0.24.tar.gz36.34 KB
atie의 이미지

티어나 프로세스의 설명이 없어서, 메세지 큐 미들웨어, 병렬 프로세싱 그리고 데이타베이스 교체 등을 고려해 보시라고 권하겠습니다.

데이타 양이 문제가 아니라 어디서 문제가 일어나는지를 알려주셔야 (데이터 소실이 일어나는 것을 단계별로 중간에 어떻게 확인을...) 추가 답변이 이어질 듯 합니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

softpro의 이미지

다시 정리 하자면 라우터에서 Netflow data가 UDP 패킷에 실려서 저희 서버에 도착하면 Netflow2Mysql이라는 프로그램이 이것을 받아 mysql DB에 저장하게 되어있습니다.
문제는 라우터에서 서버까지의 UDP 패킷 드랍은 없었습니다.
그렇다면 Netflow2Mysql에서 DB로 insert 처리가 늦어지면서 Netflow2mysql 프로그램의 버퍼가 오버되면서 패킷을 처리 하지 못하고 드랍되는것 같습니다.

spacelee의 이미지

DB가 바틀넥이면
데이터 들을 임시 flat 파일로 저장하고
flat 파일의 데이터를 DB로 넣는 작업은
별도의 데먼이나 유틸로 진행하는 것이 어떨까 싶은데요.
atie님이 얘기하신 메세지큐미들웨어가 그런 구조를 말씀하신 건지 모르겠네요.

여러 모듈이 단방향 커뮤니케이션인 경우에는,
뒤쪽 모듈의 속도가 앞 모듈의 속도보다 빠르다는 보장이 없는 경우
뒤쪽 모듈의 옵티마이징만으로는 별 효과가 없습니다.
일반적으로 DB처리가 네트웍의 데이터 유입보다 빠를 것 같지는 않네요.

임시 flat 파일을 메모리로 대체해서 생각해볼 수도 있지만,
그 중간 구조는 파일이던 메모리던간에
앞쪽 모듈이 상대적으로 빠른 경우에는
속도 차에 의해 거의 무한대로 늘어나는 경우도
있다고 가정해야 합니다.

모듈간의 flow control이 불가능 하다면
무한대 크기 큐를 가정하는 것이 가장 낫지 않을까 싶습니다.
그나마 flat file이 그에 가장 근접하니까 가장 낫지 않을까 싶습니다. 그리고 flat file도 여러 하드 디스크에 분산해서 처리하면
IO의 효율상 아주 좋습니다.
그리고 IO를 아주 효율적으로 사용할 수 있도록 버퍼링등도
잘 고려하셔야 겠죠. 데이터 크기를 줄이는 것도 중요하구요.

그리고 뒤쪽 모듈의 옵티마이징은 이와 병행해서 진행해야 되겠죠.

얘기해놓고 보니 atie님의 얘기를 풀어쓴 꼴이 됏네요.^^;;

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

atie의 이미지

공개나 상용의 MQ 미들웨어도 결국은 파일에 일정한 규칙을 적용하여 API를 제공하는 제품입니다. 따라서 위에 spacelee님의 지적과 일맥 상통합니다.

Netflow2mysql가 어떻게 쓰여졌는지에 따라 상당 부분 결과가 달라질 것이라고 생각은 들지만, 한 프로그램 내에서 네트웍 데이타와 DB 입력을 순서적으로 처리하는 구조라면 바람직하지 않습니다. 데이타의 소실이 없게 중간에 미들웨어를 두고 데이터를 받는 부분과 데이타베이스에 쓰는 부분을 분리하는 것을 먼저 해보시라고 권합니다.

MySQL에 분당 15만 건의 데이타 처리가 되는지는 저는 모르겠고, 상용의 MQ 미들웨어들은 그 이상의 트랜잭션을 처리할 수 있습니다. 공개된 MQ 소프트웨어들이 있고 상용 제품이라도 테스트 버전은 대부분 무료로 구할 수 있으니 시도를 해 보십시요.

----
I paint objects as I think them, not as I see them.
atie's minipage

cpulpul의 이미지

Quote:
DB가 바틀넥이면
데이터 들을 임시 flat 파일로 저장하고
flat 파일의 데이터를 DB로 넣는 작업은
별도의 데먼이나 유틸로 진행하는 것이 어떨까 싶은데요.
atie님이 얘기하신 메세지큐미들웨어가 그런 구조를 말씀하신 건지 모르겠네요.

궁금한게 있습니다.

flat 파일이라는 것이 압축 파일을 말하는 건가요??

그러면 index 생성, SELECT WHERE문에서의 조건 검색등..
제약이 많을것 같습니다.

이에 대한 처리는 어떻게 하는지요..

softpro의 이미지

제가 4년 만에 C 코드를 보니 완전히 까막눈이 되어 있더군요 ㅡㅡ;
이 소스를 보시고 이쪽 버퍼를 어떻게 처리하면 될지 조언을 주시면 감사 하겠습니다.

댓글 첨부 파일: 
첨부파일 크기
Binary Data 0바이트
익명 사용자의 이미지

분당 15만회라면 어마어마한 쿼리인데, 이것을 Query문으로 일일이 넣을 필요가 있을까요?

혹시 실시간으로 처리되어야 하는 문제가 아니라면, 프로그램을 2개로 나누는것은 어떻습니까?

하나의 프로그램은 라우터로부터 데이터를 받아서 텍스트 파일에 001, 002 이런 식으로 저장하는겁니다.

그리고 하나의 프로그램은 아래와 같은 load data문을 이용해서 텍스트 파일을 MySQL로 넣는겁니다.

load data local infile "001" into table NetFlow

이런식으로 집어넣고 집어넣은 파일은 삭제하면 부하량을 상당히 줄일수 있지 않을까요?

익명 사용자의 이미지

* UDP로 받은 패킷데이터를 단위 시간별로(netflow 발생시키는 라우터 및 netflow data export 주기) 파일에 저장한 후, 이들을 별도의 프로세스가 데이터베이스로 넣는 유형이 가장 적절해 보입니다.

* 위에 좋은 의견들이 많아서, 쓸 필요가 없어 보였지만, 끄적여 봅니다.
* flatfile -> 이는 특정 데이터 포맷 및 별도 시스템을(이를테면 서버) 필요로 하지 않는 데이터 파일들을 의미한다. 이를테면, DBMS, XML, DOC, HWP, 등은 flatfile이라고 칭하지 않는다. 대체로 특정 프로그램을 운용하기 위해 복잡한 구조없이 단순하게 데이터를 저장한 유형을 의미한다. 그래서, 플랫파일은 만든사람맘대로 바뀌게 된다. 당근.
기껏해야 콤마, 줄바꿈(line feed)등을 구분자로 하는 파일등이다. 또한 대부분(전부는 아님) 텍스트 에디터로 읽거나, 편집가능하다.

익명 사용자의 이미지

데이터 손실이 일어난 부분은 이미 밝혀진듯하지만, 다음을 참고하세요.

(1) 라우터(Netflow)------>(2) Server ---> (3) MySQL

1-2사이에 UDP를 사용해서 1-2사이에서의 전송이 원활했다는 가정을 하면,
* UDP는 단일 시스템내에서도 데이터를 잃어버릴 수 있음을 관과하지 마세요.
2->3이 느려서, (2)커널의 UDP버퍼로 부터 읽어 들이는 속도가 느릴 경우, 1-2에서 온 데이터를 (2)의 커널은 과감하게 버립니다.(UDP의 경우)

*실험적으로 동일 시스템의 프로세스와 프로세스간에 UDP전송에서도 데이터의 손실이 잃어날 수 있음을 기억하세요.

softpro의 이미지

테스트 해본 결과 라우터->서버까지의 데이터는 패킷 드랍이 거의 없는 것을 확인 했습니다. 그럼 문제는 서버->mysql 이고 또한 데이터를 실시간으로 처리가 되어야 되는 문제라 저두 난감하네요.

익명 사용자의 이미지

혹시 그렇다면 여러 라인을 한번에 입력하는것은 어떻습니까?

각 insert마다 insert_id가 필요하지 않다면 말이죠.

소스를 잠깐 봤는데.. 레코드 하나하나 입력하고 있더군요.

이것을 10개단위로 늘리기만 해도 부하가 상당히 줄어듭니다.

예를들어

INSERT INTO header ( version, system_uptime, unix_seconds, ackage_sequence, source_id ) VALUES (1,1,1,1,1), (2,2,2,2,2),(2,2,2,2,2)

이런식으로 데이터를 받았다가 일정개수를 넘으면 여러 레코드를 한번에 입력하면 될것 같습니다.

jongwooh의 이미지

디스크 기반 RDBMS를 xeon 3Ghz 정도 가지고는 분당 15만번의 insert를 하기 어렵습니다. 실험해본 결과 xeon 3.0 은 초당 네트워크 인터럽트를 약 8만번 정도 처리가 가능합니다. 비용이 감당이 가능하다면 이렇게 해보십시요.

1. 메모리를 최대한 확장한 다음 메모리 파일시스템을 만들어 그 위에서 mysql 데이터 파일을 운영하십시요.
2. 다른 분들이 언급하신 대로 도착하는 데이터는 충분한 메모리로 버퍼링을 하면서 쓰기 프로세스에 넘기십시요.
3. 해당 row에 index를 모두 없애십시요.

you must know the power of dark side.

익명 사용자의 이미지

* 매 레코드마다 insert를 호출 하는 방법은 데이터베이스에 입력하는 많은 방법 중 일반적인 방법이지만, 한번의 인서트 호출로 여러개를 인서트 하는 방법 및 벌크로 인서트하는 방법등이 있습니다. 이중 첫번째 방법은, 가장 느리지요..
* 또 한가지는 DB를 튜닝하여 캐시사이즈를 적절한 크기로 올려주는 방법도 있겠습니다. 캐시크기의 결정은 넷플로우가 한번에 내보내는 데이터 건수와 유관하게 해야겠지요?

* netflow의 경우 export주기가 있는데 이 주기에 발생할 수 있는 최대 플로우 건수를 메모리에 버퍼링하고, 이를 다른 프로세스로, 입력하시는 것도 방법입니다. 이때 메모리가 많다면, 램디스크를 만들어 파일로 쓰고.. 어쩌구 하는 것도 별로 느리지 않습니다. 또 하나는, 데이터를 넣기만 할것은 아닐텐데, (즉, 무슨 사용자의 쿼리가 입력된 데이터에 대해 동작할텐데...) 이 순간에 벌써 초단위 정보의 처리는 쉽지 않습니다.(실시간이라는 말... 도대체 어느 정도의 dead line을 가지는 실시간인지? 정의)

* 관건은 최대 입력할 수 있는 수치적 크기를 정의하고, 그 크기를 벗어나는 데이터는 샘플링을 통해 제거하는 것이 보통(Netflow V9, IPFIX, sflow등이 관련 진보된기술)의 처리입니다. 사이트 특성에 따라서 플로우 건수가 천차만별일 수 있기 때문입니다. 그 때마다 튜닝하면 .... 좀 ... 하겠지요?

spacelee의 이미지

interrupt wrote:
Quote:
DB가 바틀넥이면
데이터 들을 임시 flat 파일로 저장하고
flat 파일의 데이터를 DB로 넣는 작업은
별도의 데먼이나 유틸로 진행하는 것이 어떨까 싶은데요.
atie님이 얘기하신 메세지큐미들웨어가 그런 구조를 말씀하신 건지 모르겠네요.

궁금한게 있습니다.

flat 파일이라는 것이 압축 파일을 말하는 건가요??

그러면 index 생성, SELECT WHERE문에서의 조건 검색등..
제약이 많을것 같습니다.

이에 대한 처리는 어떻게 하는지요..

flat 파일은 위에 분 말씀대로 그냥 raw text file을 말합니다.

그리고 flat 파일의 용도는 임시 버퍼링 용입니다.
즉, flat파일에 넣고 DB에 insert 하는 모듈은 별도 입니다.
따라서, flat 파일에서는 index, select가 필요없구요.
DB에 인서트 되면 바로 지워줘야 합니다.

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

정태영의 이미지

jwhan wrote:
1. 메모리를 최대한 확장한 다음 메모리 파일시스템을 만들어 그 위에서 mysql 데이터 파일을 운영하십시요.

mysql 의 heap table 은 메모리기반입니다 ... 메모리 파일시스템을 만들어 mysql 데이터 파일을 운영하는 것보단 그냥 heap table 을 이용하는게 편하지 않을까 하는 생각이 들어 토달고 갑니다 =3=33

http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

cronex의 이미지

정태영 wrote:
jwhan wrote:
1. 메모리를 최대한 확장한 다음 메모리 파일시스템을 만들어 그 위에서 mysql 데이터 파일을 운영하십시요.

mysql 의 heap table 은 메모리기반입니다 ... 메모리 파일시스템을 만들어 mysql 데이터 파일을 운영하는 것보단 그냥 heap table 을 이용하는게 편하지 않을까 하는 생각이 들어 토달고 갑니다 =3=33

http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html


그렇다면 편할 뿐 아니라 성능도 더 나올겁니다.
메모리 파일시스템이라는 단계가 하나 더 줄어드니까요 ^^;

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

atie의 이미지

잠깐 오프토픽, 하나의 테이블인 경우는 문제가 아니지만 여럿의 테이블에 데이타를 넣는 경우는 프로세스가 데이터를 순서적으로 처리를 해도 테이블에는 순서적으로 들어가지 않는 경우가 발생을 합니다. 따라서 꼭 처리의 속도만을 위해서 중간 단계를 두는 것은 아닙니다. 향후의 확장성도 고려를 해서 입니다.

그리고, udp 데이터를 DB 테이블에 넣은 것은 무슨 이유인지가 궁금하기는 합니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

softpro의 이미지

udp 데이터를 그대로 DB에 저장하는 것이 아니라 데이터안에 Netflow data 정보가 여러개 있습니다. 이것을 의미단위로 쪼개서 넣는 것이라 데이터의 시간과 순서가 일치 되어야 하는 문제 때문입니다.

IsExist의 이미지

DB용으로 물리적으로 분리된 하드를 사용하는건 어떨까요?

iostat 로 상황을 볼 필요도 있을거 같습니다.

iostat -dmx 60

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

softpro의 이미지

초보. wrote:
혹시 그렇다면 여러 라인을 한번에 입력하는것은 어떻습니까?

각 insert마다 insert_id가 필요하지 않다면 말이죠.

소스를 잠깐 봤는데.. 레코드 하나하나 입력하고 있더군요.

이것을 10개단위로 늘리기만 해도 부하가 상당히 줄어듭니다.

예를들어

INSERT INTO header ( version, system_uptime, unix_seconds, ackage_sequence, source_id ) VALUES (1,1,1,1,1), (2,2,2,2,2),(2,2,2,2,2)

이런식으로 데이터를 받았다가 일정개수를 넘으면 여러 레코드를 한번에 입력하면 될것 같습니다.


헤더파일에 define으로 다음과 같이 정리 되어 있구요.
#define SQL_INSERT_IPV4_RECORD \
"INSERT INTO record (\
hid,\
ip_protocol_version,\
last_switched,\
first_switched,\
bytes,\
pkts,\
input_snmp,\
output_snmp,\
ipv4_src_addr,\
ipv4_dst_addr,\
prot,\
src_tos,\
l4_src_port,\
l4_dst_port,\
ipv4_next_hop,\
dst_as,\
src_as,\
dst_mask,\
src_mask,\
tcp_flags\
) \
VALUES\
(\
%llu,\
%hhu,\
%lu,\
%lu,\
%lu,\
%lu,\
%hu,\
%hu,\
%lu,\
%lu,\
%hhu,\
%hhu,\
%hu,\
%hu,\
%lu,\
%hu,\
%hu,\
%hhu,\
%hhu,\
%hhu )"

C 파일에 보면 아래와 같은 구문이 있습니다.
for(i = 0; i < num_of_records; i++){
r = (struct netflow_v5_record *)&buf[sizeof(struct netflow_v5_header) + sizeof(struct netflow_v5_record) * i];
insert_Record_for_NetFlow_Version_5(r, &hid);
}
여기 소스에서 보면 record 수만큼 insert가 동작 되는 것 같습니다. 그렇다면 INSERT INTO header ( version, system_uptime, unix_seconds, ackage_sequence, source_id ) VALUES (1,1,1,1,1), (2,2,2,2,2),(2,2,2,2,2)
같이 처리 할려면 insert_Record_for_Netflow_Version_5로 넘겨주기 전에 위와 같은 포멧으로 만들어서 넘겨 줘야 할 것 같은데요 어떻게 하면 될지요. 제가 넘 오랜만에 C언어를 보는 통에 힘드네요.
그리고 insert_Record_for_NetFlow_Version_5 함수는 다음과 같이 되어 있습니다.
unsigned long insert_Record_for_NetFlow_Version_5(
struct netflow_v5_record *r,
unsigned long long *p_hid
){
char buffer[1024];
unsigned long sampled_packet_count;
unsigned long sampled_byte_count;

sampled_packet_count = packet_sampling(
ntohl(r->dPkts),
ntohl(r->dOctets),
&sampled_byte_count
);

if(sampled_packet_count == 0){
return(0);
}

sprintf(
buffer,
SQL_INSERT_IPV4_RECORD,
(unsigned long long) *p_hid,
(unsigned char) 4,
(unsigned long) ntohl(r->Last),
(unsigned long) ntohl(r->First),
(unsigned long) sampled_byte_count,
(unsigned long) sampled_packet_count,
(unsigned short) ntohs(r->input),
(unsigned short) ntohs(r->output),
(unsigned long) ntohl(r->srcaddr),
(unsigned long) ntohl(r->dstaddr),
(unsigned char) r->prot,
(unsigned char) r->tos,
(unsigned short) ntohs(r->srcport),
(unsigned short) ntohs(r->dstport),
(unsigned long) ntohl(r->nexthop),
(unsigned short) ntohs(r->dst_as),
(unsigned short) ntohs(r->src_as),
(unsigned char) r->dst_mask,
(unsigned char) r->src_mask,
(unsigned char) r->tcp_flags
);

if(debug){
printf("SQL: %s\n", buffer);
}

if(mysql_real_query(sql->handler, buffer, strlen(buffer))){
fprintf(stderr, "mysql_real_query() failed\n");
fprintf(stderr, "%s\n", mysql_error(sql->handler));
}

return(1);
}

maximus의 이미지

mysql 성능 개인적으로 볼때 아주 좋습니다..
다만 기능에 대해서 먼져 잘 살펴 볼 필요가 있다고 보여집니다.. 현재 mysql 내부 기능이 여러가지 엔진 및 버젼으로 인해 단순히 "갖다 쓴다" 라는 형태로는 충분한 활용을 기대 하실수 없을듯 합니다.

제가 추천하는 형태입니다.

1. innoDB 를 사용한다.
-. row level locking이 지원되기 떄문에 디폴트인 myisam 으로 할때 보다 월등한 속도가 나옵니다.. myisam 은 해당 테이블에 수정이 가해지면 table 전체가 lock이 된다고 알고 있습니다.

2. 충분한 크기의 table 를 미리 지정하고 insert가 아니고 update 형태의 쿼리를 사용한다.

3. db query time 이 보통 connection 과 disconnection 에서 대부분 발생 합니다.. 소스를 안봤지만 혹시나 미련하게 연결과 해제를 반복하고 있다면 수정이 필요.

4. connection thread pool 을 적절하게 사용한다.

5. policy 를 정의 해서 특정 단위 시간 또는 크기만큼에 대해서 mysql 내의 heap table 을 만들고 요건이 충족할때 insert 하는 형태를 취한다. (trigger 사용)

6. 최신 버젼의 mysql 엔진을 사용한다.
(이젠 procedure, trigger 도 지원합니다.)

정도인것 같습니다..

=================================
:: how about a cup of tea ? ::
=================================

maximus의 이미지

앗 그러고 보니 제주도분이신가요 ?
방가워용~

=================================
:: how about a cup of tea ? ::
=================================

softpro의 이미지

네 제주도 살아요. ^^
님두 제주도 시구나 제가 mysql을 잘 몰라서 어떻게 처리 해야 할지를 잘 모르겠네요. 좀던 구체적으로 설명 해주시면 안되겠습니까?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.