ES에서 제공하는 결과물은 대부분 멋지지만 가끔 odbc의 기능들이 필요한 경우가 있다. (X-pack을 사용하면 sql like query가 가능하지만 비용이 ..)


kibana 등에서는 결과를 실시간 쿼리를 통해 보기 때문에 반응성이 항상 아쉽다.


이런 저런 이유로 리포트용 솔루션을 별도 구축하게 되었다. 


만드는 김에, 일부 sql query가 필요한 경우를 위해, 필요한 로그들을 ES로 보냈다가 가져오기는 추가적인 절차가 필요해서,


logstash에서 ES로 보내면서 필요한 일부분만 바로 mysql에 직접 보내기로 했다. 


플러그인을 만들어야 하나 찾아보니... 


https://www.elastic.co/guide/en/logstash/current/input-plugins.html  >> input에는 


https://www.elastic.co/guide/en/logstash/current/output-plugins.html >> output에는 없네??


구글링 해보니 git에 있다.


https://github.com/theangryangel/logstash-output-jdbc/tree/master


하지만 2018/07/23 기준으로 아직 6.x 버전 대에서는 문제가 있을 수 있다네.


"See master branch for logstash v5 & v6 warning This is untested under Logstash 6.3 at this time, and there has been 1 unverified report of an issue. Please use at your own risk until I can find the time to evaluate and test 6.3."


대량 삽입에 대한 이슈가 한 개 올라와 있는데, 회피하거나, 어차피 오픈소스니 문제 생기면 고쳐서 리포트도 해줄 겸 해보자고 시작함. 



[ 설  치 ]


일단 jdbc 다운로드 해서 vendor 폴더 안에 jar/jdbc 폴더 만들고 삽입.


http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.11.tar.gz  >> 오늘 기준 최신 파일. https://dev.mysql.com/downloads/connector/j/에서 최신 버전을 확인 후 버전 번호를 대체하면 다운 받을 수 있음.


압축 풀어서 vendor/jar/jdbc 폴더에 삽입. logstash가 설치된 곳마다 별도 설치해야 함.


이후 logstash 폴더에서 bin/logstash-plugin install logstash-output-jdbc를 실행. 


[ 설  정 ]


사용하는 config파일 열어서 아래 내용 추가.


output 내용 중 필요한 조건에 따라 아래 내용을 추가하면 됨.


if[조건]==값{ jdbc { driver_class => "com.mysql.cj.jdbc.Driver" connection_string => "jdbc:mysql://your_mysql_addr:port/your_db?characterEncoding=UTF-8&serverTimezone=UTC&user=input_your_id&password=input_your_pwd" statement => [ "INSERT INTO table_name (column1, column2) VALUES(?,?)", "raw_data_name1", "raw_data_name_2" ] } }


보다 상세한 옵션에 대해서는 https://github.com/theangryangel/logstash-output-jdbc/tree/master#configuration-options 를 참고할 것.


이상. 





'개발/경험 > linux-Solution' 카테고리의 다른 글

시스템 기본 사양 확인하기  (0) 2018.08.30
Elasticsearch cluster 설정  (0) 2018.07.25
logstash와 mysql 연동  (0) 2018.07.24
logstash 인덱스 수정, 조건 설정하는 방법  (0) 2018.07.16
Kibana systemd 에 등록하기  (0) 2018.07.11
Elasticsearch 설치기  (0) 2018.07.06

게임 관리툴(mysql 연동)/로그 시스템(couchbase 연동) 제작하면서 같이 정리함.


* 일단 node.js를 설치한다.  (http://www.nodejs.org/)

* express 패키지를 설치한다. (command line 에서 "npm install express" 입력!)

 : 설치하고 나서 npm list installed에 express 안나오네? 일단 node_modules에 들어가면 설치된 것을 확인할 수 있음.

* 집에서 하고 있는 거라 DB는 xampp 에 있는 mysql 사용. 가동 편하고 인스톨 편하고, 이미 설치되어 있고...

* node-mysql 모듈 설치 ("npm install mysql")

* couchbase는 여기서 다운로드 (http://www.couchbase.com/)

* couchbase 모듈 설치("npm install couchbase")

  => 이 모듈 외에도 설치시 vcbuild.exe가 필요한 경우가 있음. 

    :http://www.microsoft.com/ko-kr/download/details.aspx?id=40787

  => python3 버전으로 설치했었는데, 빌드가 안됬음. 2.7 버전에 3.0 버전 사이 쓰라는 메세지 나옴. 주의할 것!

  => 모듈을 한번 빌드하고, 다음엔 그냥 복사해서 썼는데, 32bit에서 빌드한거 64bit용에서 쓰니 에러 남. 주의할 것!

  => 윈도 서버에서는 해당 모듈 폴더에 빌드가 되던데, 일반 PC에서는 "users/계정/appdata/roaming/npm/node_modules/에 빌드 됨. 폴더 위치 주의할 것!


 


쿼리브라우져를 사용할 때,


새로운 편집 창을 열면 새로운 세션이 생성됨.


그래서 편집 창을 열었다가 뭔가 하고 닫기를 반복하면, 


세션이 계속 생성되어, max_connections 개수를 초과하는 문제가 발생할 수 있다. 


거기다 wait_timeout을 길게 잡아두면 더 쉽게 걸림. 


sp를 줄줄이 수정하다가 문제가 생기는 경우가 있음. 


주의하자.!!



예를들어 sp를 사용할 때, 내가 조회하는 테이블에 seqIndex라는 컬럼이 있고,


쿼리문은 아래와 같다고 가정한다.


insert into tbTable_Backup (seqIndex) select @seqIndex from tbTable where index=@inp_index;


tbTable과 tbTable_Backup은 같은 구조로 되어 있으며,


tbTable은 seqIndex bigint 컬럼 하나만 가지고 있다고 가정한다.


위 쿼리에서 원래는 서브쿼리인 select문은, 아래의 코드가 원래 의도했던 바다.


insert into tbTable_Backup (seqIndex) select seqIndex from tbTable where index=@inp_index;


이 경우, 


Query Browser 든, WorkBench든 문법 오류를 발생하지 않는다.


(컬럼 이름과 변수명이 틀린다고 해도 오류를 발생하지는 않음.)


sp를 사용할 때는 더 황당해 지는데, SQLExecute를 실행해도 오류는 발생하지 않는다.



output 값이 없을 경우, 이런 에러에 대해서는 대처할 방안이 없다. 


또한 output 값이 있어도 정상적인 output값을 리턴하지 않는다.


지정된 output값에는 @seqIndex값이 들어가 있을 것이다. 


output 변수의 이름이 @seqIndex가 아니어도...


단순 오타에서 비롯된 문제긴 했지만, 


mysql에서 어떻게 이런 코드가 output값에 영향을 미쳤는지 찾아봐야 할 듯.









쿼리 브라우져에서 sp가 안보이는 현상 발생.


CentOS , Mysql. 5.6.x, 


[발생 상황]

- sp를 실시간으로 수정하기 위해 sp 수정해서 실행을 누름. 

- 때마침 DB 부하 테스트 중이었는데 ... 

- sp 수정을 위한 실행이 멈춤. 응답없음으로 돌변

- 시스템 재부팅 해봄. 

- 디스크 용량 부족을 확인함.

- 디스크 정리.


이제 다른 DB는 다 보이는데, 내가 작업하던 DB만 안보임. 


show procedure status 때려보니 일단 존재는 함. 휴~~~


show create procedure sp이름; 해보니 내용도 잘 존재함. 휴~~~


근데 왜 쿼리 브라우져에서는 sp가 안보이는거지??


--;; 리플레쉬하니 나오네.. ㅋ


로그 위치를 별도 지정하지 않았다면 일반적으로 /var/lib/mysql 에 생성됨.


바이너리 로그는 mysql-bin.0000XX 이런식으로 생성되며, 이 파일을 삭제할 경우가 생긴다면

mysql-bin.index에 기록된 정보도 같이 수정되어야 한다.

(* 이 내용이 일치하지 않으면 실행 안됨.)


바이너리 log 파일은 mysqlbinlog [로그파일명] 으로 볼 수 있으며, 텍스트 파일 형태로 변환할 때는 mysqlbinlog mysql-bin.000001 >> mysqlquerylog.txt 형태로 변경하여 볼 수 있다. 

용량이 크면 split으로 분리할 것!


/etc/my.cnf 에서 innodb_log_file_size의 용량을 수정할 때는 innodb_buffer_pool_size의 25% 이하로 설정해야 함.


innodb_log_file_size옵션값으로 설정되는 파일이 ib_logfile0과 1인데, 해당 옵션의 값을 조정하려면 아래와 같은 순서로 진행해야 한다.


1) mysql 종료

2) ib_logfile0과 1을 이동하거나 이름 변경

3) 옵션값 조정

4) 재시작


기존에 할당된 용량만큼의 사이즈로 이미 할당되어 있기에 옵션만 바꾸면 실행시 에러가 발생한다. 주의할 것!


(원 출처)http://www.skysql.com/blogs/max-mether/mysql-56-vs-mariadb-100


지원하는 기능들에 대해서 잘 정리되어 있어 공유해둠.



10.0.2가 릴리즈되면 지금 쓰는 mysql5.6을 대체할 예정이었는데 좀 더 고민 중.


mariaDB에 innoDB의 memcached plugin이 아직 존재하지 않는 듯.


빨리 지원되어야 할텐데... 

악질 문제점들이 좀 있다. 해결 방법을 찾아야 되는데 걱정이네... 쩝!


1. sp 내부에 $tiCount라는 변수를 선언없이 사용할 경우 SP 생성 시 에러 안나고 넘어감.

   sp를 사용하는  코드에서도 에러가 안남. 리턴값이 있을 경우 완전히 엉뚱한 결과가 돌아옴.

   하지만 결과적으로 다음 쿼리의 지연을 발생해서 원인이 어디의 문제인지를 찾기 어려움.

   

2.  자료형이 완벽히 일치해야 한다. 오타가 있을 경우 1번의 경우와 같은 결과를 발생시킴. 에러없이 오작동함. 


이 두가지가 사람 미치게 만드는 듯. 


일단 주의만 하면 큰 문제는 없겠지만.. 


MariaDB가 10버전이 되는 순간 바로 바꿔 버려야지 +_+

+ Recent posts