시스템이야기2015. 6. 19. 12:17

zabbix 를 오래 운영하면 zabbix DB가 무럭무럭 자라서 용량이 상당히 커지고 속도도 느려진다.
수집한 데이터는 오래될수록 필요가 없으므로 이 데이터는 제외하고, 'zabbix 설정값만' 뽑아서 zabbix DB를 새로 구축하려고 한다.


[ 조건 ]
- 수집한 데이터는 버린다.
- 설정값(호스트, 템블릿, ...)만 받는다.
- zabbix DB를 새롭게 시작한다.

zabbix


1. 설정값만 백업하기

Zabbiz 2.0, 2.2, 2.4를 지원하는 zabbix-mysql-dump 라는 간단한 스크립트가 있다.
https://github.com/maxhq/zabbix-backup/wiki 에서 셀스크립트를 다운 받는다.

스크립트에서 zabbix DB 접속 정보와 mysqldump 경로(스크립트내에서는 /usr/bin/mysqldump로 되어 있음)를 확인한다.


DBHOST="127.0.0.1"
DBNAME="zabbix"
DBUSER="..."
DBPASS="..."


스크립트를 실행하면 현재디렉토리 dump 파일이 생겼을 것이다.


# sh zabbix-mysql-dump
# ls
zabbix_localhost_20150526-1347.sql.gz


스크립트로 dump 받은 것 외에 trigger에 의해 발생한 event정보를 옮기고 싶다면, zabbix 데이터 중에 2가지가 추가로 필요하다.


1) trigger에 의해 발생한 event를 담고 있는 'events' 테이블 데이터
2) 각 event에 대해 코멘트가 담긴 'acknowledges' 테이블 데이터


[ zabbix : trigger에 의해 발생한 event 정보 ]


# mysqldump --opt --single-transaction --skip-lock-tables --extended-insert=FALSE -u zabbix -p zabbix \
  acknowledges events > zabbix_acknowledges_events.sql



2. zabbix DB를 새롭게 구축하기


1) zabbix server 데몬을 내린다.
2) MySQL 서버를 내린다.
3) 기존 zabbix innodb파일을 다른 이름으로 임시 백업해둔다.
   zabbix 스키마( MySQL DATA DIR/zabbix/) 는 그대로 둔다.


4) MySQL 서버를 실행한다.
5) 조금 전에 dump받은 셋팅값을 넣어준다.
   gunzip zabbix_localhost_20150526-1347.sql
   mysql -u zabbix -p zabbix < zabbix_localhost_20150526-1347.sql


   기존에 있던 zabbix 테이블을 drop하고 -> 새로 create -> 셋팅값 insert


6) 별도로 백업받은 acknowledges 테이블의 데이터를 insert한다.
   acknowledges 테이블의 데이터를 기준으로 해당된 event만 뽑아 insert한다.


7) zabbix server를 올린다.

Posted by 좋은진호
시스템이야기2014. 10. 15. 13:24

메신저 검열로 '텔레그램(Telegram)' 광풍이 불고 있다. 개인적으로 카톡을 자주 사용하지 않아, 텔레그램이 절실(?)하게 필요하지 않다. 하지만 텔레그램을 사용해야할 이유가 생겼다. 텔레그램이 서버에서 사용할 수 있는 CLI를 제공하고 있고, lua나 python으로 손쉽게 메신저와 연동할 수 있다.


그래서 텔레그램용 lua스크립트를 만들어서 서버 상태를 폰에서 받아볼 수 있다. 예를 들어 특정 서버의 MRTG/RRD를 메신저로 요청하면 그 이미지를 받아 볼 수 있다. 서버의 load값도 같은 방식으로 return받을 수 있다. 서버장애 문자를 텔레그램으로 받을 수 있도록 하신분도 있다. (※ 개인적으로는 이미 SMS로 받고 있는 것을 다시 텔레그램용으로 만들 필요는 없었다.)


텔레그램 CLI설치는 '리눅스에 텔레그램(Telegram) CLI 설치' (글 좋은진호)를 참고하고, 이 글은 서버 모니터링용 텔레그램 스크립트와 실제 사용 예를 보여줄 것이다.



1. 텔레그램 lua 스크립트 기본 구조


메시지를 수신하면 on_msg_receive 함수가 호출된다. 이 함수내에서 send_msg, send_photo, send_text 등의 함수를 이용해서 메시지를 상대에서 보낼 수 있다. 다음은 'hello'를 수신하면, 결과를 보내준다.


[ 스크립트 기본 구조 : hello.lua ]

function on_msg_receive (msg)

if ( msg.text == 'hello' ) then

send_msg(msg.from.print_name, "world", ok_cb, false)

return

end

end

function ok_cb(extra, success, result)

end


$ bin/telegram-cli -s hello.lua

... 생략 ...

[14:21]  Jinho >>> aa

User Jinho is typing

[14:22]  Jinho >>> bb

User Jinho is typing

User Jinho is typing

[14:22]  Jinho >>> 헬로우

User Jinho is typing

[14:22]  Jinho >>> hello

[14:22]  Jinho <<< world

User Jinho marked read 1 outbox and 0 inbox messages



telegram-cli 실행화면[ telegram-cli 실행화면 ]


스마트폰 어플 화면[ 스마트폰 어플 화면 ]



2. 서버모니터링용 스크립트 살펴보기


[ 모니터링용 스크립트 일부 : server_mon.lua ]

now = os.time()


dir_cmd = "/home/cnx/cmd"

cmd_ping = "cd ".. dir_cmd .."; sh ping.sh"

cmd_load = "cd ".. dir_cmd .."; sh load.sh"

cmd_netlog = "cd ".. dir_cmd .."; sh show_netlog.sh"

cmd_mrtg = "cd ".. dir_cmd .."; perl mrtg.pl"

cmd_404 = "cd ".. dir_cmd .."; perl 404.pl"


mrtg_res = {"load", "swap", "public_if", "private_if", "disk_io", "memory_free", "memory_inactive"}

auth_phone = {["821012345678"] = true, ["821087654321"] = true }


-- 메시지 수신 처리

function on_msg_receive (msg)

if msg.date < now then

return

    end

if msg.out then

return

end


-- command

local recv_msg = ""

if ( msg.text ~= nil ) then

recv_msg  = string.gsub(msg.text,"[;|<>]","") -- 받은 msg중에 ;, |, <, > 등의 문자는 지움

end

local cmd, arg  = split(recv_msg) -- exam : ping a b c d => cmd = "ping", arg = "a b c d"

local file_name = ""

cmd = string.lower(cmd)

print("receive : ", cmd, "\n")


-- user_info

print("Name    : ", msg.from.print_name) -- 메시지 보낸사람 real name (Jinho)

print("Phone   : ", msg.from.phone) -- 메시지 보낸사람 전화번호  (8210AAAABBBB)

print("Msg Num : ", msg.id) -- 메시지 번호

print("to.Name : ", msg.to.print_name)


-- 일반대화, 비밀대화 구분해서 메시지 전송

if (msg.to.id == our_id) then

user_id = msg.from.print_name -- 일반대화창

else

user_id = msg.to.print_name -- 비밀대화창

end


-- auth (지정한 폰번호만 인증)

if auth_phone[msg.from.phone] then

print "auth    : OK "

else

print "auth    : invalid user"

return

end

mark_read(user_id, ok_cb, false) -- 읽은 메시지로 표시


-- ping

if ( cmd == 'ping' ) then

os.execute(cmd_ping .. arg)

send_text(user_id, dir_cmd ..'/result_ping.txt', ok_cb, false)

return

end


-- load

if ( cmd == 'load' ) then

... 생략 ...

end


-- netlog

if ( cmd == 'netlog' ) then

... 생략 ...

end


-- MRTG

if ( cmd == 'mrtg' ) then

os.execute(cmd_mrtg .. arg)

arg = trim(arg)

for i=1, table.maxn(mrtg_res) do

file_name = dir_cmd .."/".. arg .."_".. mrtg_res[i] .."-day.png" -- DIR/FILE

-- print (file_name)

if ( file_exists(file_name) ) then

send_photo(user_id, file_name, ok_cb, false)

end

end

return

end


-- web 403/404 status

if ( cmd == '404' ) then

... 생략 ...

end


-- help

-- if ( cmd ~= '' ) then

if ( cmd == 'help' ) then

send_text(user_id, dir_cmd ..'/help.txt', ok_cb, false)

end

end


... 생략 ...


주요부분을 살펴보자.

if ( cmd == 'ping' ) then

os.execute(cmd_ping .. arg)

send_text(user_id, dir_cmd ..'/result_ping.txt', ok_cb, false)

return

end


모니터링용 스크립트에서는 각 명령어마다 외부 명령을 호출하고 결과를 text파일로 저장했다. 그리고, 그 text파일 내용을 메시지로 뿌려지도록 했다. 명령어 추가는 if ( cmd == '명령어 ' ) then 형태로 확장해주고, 외부 명령 처리할 스크립트만 만들어주면 된다.

 

if (msg.to.id == our_id) then

user_id = msg.from.print_name -- 일반대화창

else

user_id = msg.to.print_name -- 비밀대화창

end


secret chat을 지원한다. msg.to.id == our_id 라면, 즉 받는 사람과 CLI 메신저 유저가 같다면 일반대화창으로 대화중이고, 그렇지 않는 것은 비밀대화이다. 비밀대화는 msg.from.print_name이 아닌 msg.to.print_name 에게 메시지를 보내야 한다. 아래 루틴이 없다면 폰에서 비밀대화로 메시지를 보냈더라도 CLI에서는 응답을 일반대화창으로 보낸다.


if auth_phone[msg.from.phone] then

print "auth    : OK "

else

print "auth    : invalid user"

return

end


auth_phone 에서 지정한 휴대폰에서만 명령을 처리한다.


mark_read(user_id, ok_cb, false)


메시지를 읽은 것으로 표시한다.


※ lua스크립트를 처음해봤다. lua 매뉴얼을 보면서 스크립트를 하루에 만들고, 그 이후에 한번 기능을 추가한 정도다. 그래서 스크립트 lua개발자들이 보기에는 좋지 않은 부분도 있을 것이다. lua고수에게는 연필깍는 칼처럼 뻑뻑하게 보일 수 있겠지만, 누군가 다듬어 사용하면 생선회감용 칼처럼 휼륭(?)하게 쓰일 수 있을 것 같다.


※ ping.sh, load.sh 등의 외부 호출 스크립트는 공개하지 않겠다. 내부 서버들의 데이터를 추출하는 부분이라서 공개하기가 쉽지 않고, 이 글을 읽는 분들의 서버상황이 저와는 다를테니 스크립트 내용보다는 호출 방식만 눈여겨 보면 좋을 것 같다.



3. 텔레그램 CLI 실행


$ bin/telegram-cli -s server_mon.lua

또는

$ bin/telegram-cli -s server_mon.lua -d &


테스트위해서는 -s 옵션만, 추후 운영하기 위해서는 -d 옵션으로 넣어 데몬형태로 실행한다.



telegram-cli 화면[ telegram-cli 화면 : help를 보내주고, ping 결과를 보내준 화면 ]


텔레그램 스마트폰 어플 화면[ 스마트폰 어플 화면 : 아무키나 입력해서 도움말을 확인, 서버그룹별 ping과 개별 IP별 ping 결과 요청 ]

※ 스크립트를 수정해서 'help'명령을 내렸을 때만 도움말을 보여주도록 바꿨다. 스크립트 수정 전에 캡쳐한 것임.



telegram-cli 화면[ telegram-cli 화면 : load 결과, MRTG 그래프 7개를 보내준 화면 ]


텔레그램 어플 화면[ 스마트폰 어플 화면 : load 결과, MRTG 그래프를 받은 화면 ]




4. 참고자료


* 텔레그램 CLI 소스에 들어있는 test.lua

* 텔레그램 README-LUA

* Lua check if a file exists

* Telegram Messenger Client



Posted by 좋은진호
시스템이야기2011. 4. 8. 13:06
Splunk(스플렁크) 솔루션은 '이런 솔루션이다'라고 하나의 명칭으로 정의하기가 쉽지않다. 그만큼 다양한 기능을 갖고 있고, 활용분야도 넓기 때문이다. 데이터(로그 등) 수집 & 실시간 검색부터 데이터 분석, 모니터링 등에 활용할 수 있는 솔루션으로 생각하면 될 것 같다.

splunk


Splunk는 어떤 기능을 가졌는가?
  • 로그 등 다양한 형태의 데이터를 수집할 수 있다. 데이터 포맷은 따지지 않는다. syslog, 네트웍 장비에서 보내주는 데이터, mail 로그, 오픈소스 IDS인 snort 로그, 웹로그, Nagios, squid, bind, Netflow,  Windows의 이벤트 로그 등 다양하다. 또한 포맷에 상관없이 운영자가 필요시 원하는 데이터를 수집할 수 있다. w, uptime, free등의 명령의 결과를 수집할 수도 있다는 얘기다.
  • 수집된 데이터를 검색할 수 있다.

splunk search

[ Splunk의 검색창 ]


  • 다양한 검색어를 지원한다. (정말 많다. ^^ : Search Reference Manual )
  • 검색된 결과를 그래프 또는 도표로 볼 수 있다. (보고서 기능)
  • 그래프, 도표들을 모아서 한페이지에서 모니터링을 할 수 있다. (대시보드)
  • 제공되는 다양한 apps를 설치할 수 있다. Splunk를 하나의 플랫폼으로 생각하면 된다. iOS,안드로이드가 하나의 플랫폼이고, 거기에 apps를 설치하는 것처럼.
  • 검색어를 지정해두고, 실시간 데이터에서 이 것을 찾게되면 alert되도록 설정을 할 수 있다. (error 로그가 검색되면 alert되도록 하면 좋다.)
  • 실시간으로 로그를 볼 수 있다. (쉘에서 tail -f 한 것처럼)
  • 시간지정이 가능하다. (최근 몇분에서 몇시간, 전체, 또는 특정일부터 특정일까지 등 다양하다.)
  • 한글화가 되어 있다.
2달동안 무료로 사용할 수 있는 버전을 Splunk 사이트( http://www.splunk.com/ )에서 받을 수 있다. 1일 500MB 데이터로 제한되어 있다. 설치와 Splunk 실행은 설명할 필요도 없이 간단하다.

Splunk 개략적 이용 과정은 이렇다.

데이터 수집 → 검색 유용한 필드 추출 보고서 작성 대시보드 생성

1. 어떠한 데이터를 수집할 것인지를 설정한다. (데이터 추가하기)
2. 수집된 데이터를 검색해본다.

이단계까지는 누구나 쉽게 할 수 있다. 여기까지만 이용하면 데이터 수집과 검색 용도로만 사용하게 되는 것이다. 이제부터 중요하다.

3. 의미있는 보고서(그래프나 도표)를 만들기 위해서는 수집된 데이터의 포맷을 파악해야 한다.
   이를 테면 네트웍 로그중에서 어떤 source IP를 많이 차단했는지, 어떤 프로토콜(TCP, UDP, ICMP 등) 비율이 많은지를 알고 싶다고 하자.
   로그 중에 Source IP가 있는 위치와 프로토콜이 있는 필드를 알아야 한다.
4. 로그 포맷을 파악하고, 정규식을 사용하여 필드 패턴을 추출한다. 추출한 패턴을 저장한다.
   정규식을 몰라도 필드 추출을 할 수 있도록 똑똑하게 만들어놨다. 그렇지만 정규식을 알면, 보다 정확하고 유연하게 적용이 가능하다. 
5. 이제 어떤 데이터를 통계화하여 볼 것인지 조건문(검색어)을 만들면 된다. 예를 들면 다음 처럼.

   host="network" denied | top ACL_denied_icmp limit=20 또는
   host="network" denied | top 20 ACL_denied_icmp

   로그 중에 denied 단어를 검색하고, 검색 결과에서 ACL_denied_icmp필드를 기준으로 상위 20개를 보여달라는 뜻이다.

splunk search

[ 검색어를 입력하여 통계화할 때(윗부분), 왼쪽 필드를 클릭했을 때(아래부분) ]

   위의 조건문을 모르더라도 통계화하는 방법을 제공한다. 얼마나 좋은가? 검색창 왼쪽 하단에 '선택된 필드'항목을 클릭하면 TOP 10조건을 보여준다.

6. 검색 결과를 보고서로 만든다. ('보고서 보기')
   이 때 보고서는 다양한 형태의 그래프 모양과 도표 등으로 표시를 할 수 있다.
7. 여러 검색 조건을 저장해두고 이를 모아서 대쉬보드를 만든다.

splunk dashboard

[ 트래픽 차단 대시보드의 일부분 (네트웍 장비(방화벽 등)에서 받은 데이터를 활용) ]



splunk dashboard

[ ID별 ssh login 대시보드 일부분 (syslog를 통해 받은 로그를 활용) ]


어느 정도 사용하다보면, 본인이 직접 apps를 만들 수 있을 것이다. 그리고 필드명, 검색어명, 대쉬보드명 등의 네이밍 요령도 생길 것이다.
XML를 사용하여 더 세세하게 설정할 수도 있을 것이다.

운영하면서 느낀 몇가지를 적는다.

  • 데이터가 많으면 속도가 느려졌다. '빠르다'라는 말만 강조하던 Splunk이지만, '빠르지만 느려지기도 하다'로 이해하면 될 것 같다.
  • 검색 대상시간은 전체보다는 1일, 7일, 4시간 등 특정 시간으로 제한하는게 효과적이다.
  • 웹로그를 수집하지는 말자. 한두대의 서버의 로그만 샘플링으로 수집한다고 하더라도 엄청난 양이 된다.  Splunk가 다른 일을 할 수 있도록 힘을 빼지 않는게 좋을 것이다. 웹로그 분석은 전용 서비스나 솔루션을 이용하는게 낫다.
  • SNMP로 데이터를 가져오는 부분이 보이지 않는다. (모르는 건가 없는건가)
  • 쉘에서도 검색할 수 있다.
  (예) ./splunk search '검색어' -auth (처음 한번은 인증과정이 필요해서 -auth사용)
  이를 활용하면 특정 조건(error 또는 지정한 임계치)이 발생하면 스크립트를 호출할 수 있다.
  또는 주기적으로 특정 검색 결과를 .txt(csv)로 저장할 수도 있다.

  #!/bin/bash
  CURR=`date +'%Y_%m%d_%H'`

  cd $SPLUNK_HOME/bin
  ./splunk search "denied udp | top ACL_denied_udp limit=10 | outputcsv denied_UDP_${CURR}" -auth

  $SPLUNK_HOME/var/run/splunk/ 경로에 denied_UDP_YYYY_MM_DD_HH.csv로 저장된다.

2개 업체('유섹'과 보안업체 출신이 세운 업체)에서 매달 무료 교육을 실시한다고 들었다. 들어보질 않아서 어떤 것을 교육하는지는 모르지만, 관심있으신 분은 신청해보시는 것도...

몇주간 사용중인데, Splunk는 굉장한 물건인 건 확실히다. Splunk를 포크레인으로 만들것이나 삽으로, 또는 숟가락 정도로 만들 것이냐는 엔지니어의 능력에 달렸다.

Posted by 좋은진호
IT이야기2010. 4. 15. 01:32
최근 KISA의 '입찰공고' 중에 '2010년 웹사이트 개인정보 모니터링 사업자 선정' 제안요청서를 봤다. 개인정보 모니터링 시스템의 환경 정보가 있다.

- 10대 검색서버(OS : Redhat Ent5.0 이상)
-  3대 검증/제어/현황/확인 서버
-  1대 DB 서버 (DBMS 알티베이스)

검색서버, 즉 검색봇 용도로 10대가 마련되어 있다. 10대라면 떠오르는게 있다.

2009년 12월에 'KISA, 개인정보 노출 검사 위해 웹페이지 마구잡이로 긁어가'라는 제목으로 썼던 'KISA 개인정보 노출 대응시스템'이 있다. 그 때 검색봇인 pirs 봇의 IP가 210.97.192.140~149이거나 211.254.252.50~59등 IP개 10개다. 그리고, 당시 언론에서 '검증,확인,분석,대응'을 수행하는 시스템이라는 말을 썼는데, 제안요청서에 적혀있는 3대의 서버용도명과도 비슷하다. 이 제안서에 있는 시스템과 'KISA 개인정보 노출 대응시스템'은 같은 시스템일 것으로 추측해본다. 다른 시스템이라 하더라도, 모니터링 대상만 조금 다를 뿐 목적은 같을 것 같다.

작년말에는 대상이 6500여개 웹사이트였는데, 제안요청서에는 '약 45,000개 웹사이트 개인정보 모니터링'이라고 적혀있으니 그 대상이 확대된 모양이다.

  o 약 45,000개 웹사이트 개인정보 모니터링
   - 점검 대상 : 중앙부처, 지자체, 공사/공단, 대학교, 준용사업자, 교육기관 및 초중고 학교 웹사이트
     ※ 점검 대상은 '09년 점검대상과 KISA가 추가로 지정하는 웹사이트
   - 점검 주기 : 2주

2. 고려사항
  o 주요 준용사업자(병원,호텔,백화점 등) 및 초중고 학교로 노출점검 대상 확대
    - 약 22,000개 도메인 목록 수작업 확보 필요


다른 제안서도 봐보자.

  • 휴대전화 실시간 스팸차단리스트(M-RBL) 구축
스팸메일 차단할 때, RBL(Real-time Blackhole List)을 이용하는 경우가 많다.
제안요청서를 보니, 모바일도 스팸전화 차단을 위해 스팸메일과 비슷한 방법을 이용한다. KISA에 M-RBL 시스템(모바일 RBL시스템)을 구축해두고, 이통사에서는 rsync를 이용해서 주기적으로 M-RBL파일을 받아가는 형태이다.
  •  이해관계자별 IPv6 적용 안내서 제작 사업자 선정
2011년경 IPv4주소 할당 중지 예상에 따라 IPv6 인프라 준비를 위해서 안내서를 제작한다는 것이다.
IPv4 중지 예측에 대해서는 'IPv4, 2011년 9월 할당 중지 예측'를 읽어보길.


위 3개의 정보만으로도, KISA의 '입찰공고'를 자주 봐야할 이유가 생겼다.
1) '시스템 구성'정보를 얻을 수 있고,
2) 정책방향(그 정책이 좋은지, 나쁜지와는 상관없이)도 미리 알 수 있는 흥미로운 공간이다.


혹시 이글을 KISA등 IT 정책세우시는 분들이 한분이라도 읽을지도 모르니, 한가지 덧붙인다.

'IT이용도'에 따라 '한 사람'의 생활이 달라지지만,
'IT정책'은 '한 국가'의 IT생태계를 좌우한다는 것.

Posted by 좋은진호
시스템이야기2008. 11. 26. 01:19
MySQL서버는 log 옵션(my.cnf에서 log=파일명. slow query는 log-slow-queries=파일명)을 통해서 실행된 DB 쿼리를 모두 파일로 저장할 수가 있다. 그러나 DB 서버에서 작은 사이트가 아니고선 엄청난 양의 실시간 쿼리를 모두 쌓는다는 것은 힘들다. DB 운영도중에 잠시동안 쿼리 로그를 쌓겠다고 MySQL 재실행할 수도 없는 노릇이다. MySQL 5.1에서는 재실행없이 로그를 쌓을 것인지 안할 것인지를 결정할 수 있지만, 이부분은 뒤에서 설명하기로 하고, 패킷 스니핑 방법으로 실시간으로 살펴보는 방법을 소개한다.

Poor man’s query logging (Posted by Maciej Dobrzanski) 에서 tcpdump와 perl의 정규표현으로 실시간 쿼리를 살펴보는 괜찮은 방법을 소개하고 있다.

* 위 블로그에 올라온 간단한 명령
     # tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
   if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
      if (defined $q) { print “$q\n”; }
      $q=$_;
   } else {
      $_ =~ s/^[ \t]+//; $q.=” $_”;
   }
}’
    
위 명령을 활용하여 SELECT/UPDATE/DELETE/INSERT 등을 highlight 하도록 작성했다. highlight 에 대한 자세한 글은 '로그 모니터링시 특정 문자를 highlight하기 (2008.1, 글 좋은진호)'를 살펴보기 바란다.

* query_sniff.sh 내려받기
* query_view.pl 내려받기

[ MySQL 쿼리를 스니핑한 후 highlight. 'count'문자도 함께 highlight ]


MySQL 5.1에서는 쿼리를 로깅할지 안할지 여부를 재실행없이 변경할 수 있는 기능이 있다. 다음과 같이 로그 저장을 ON으로 설정할 수 있고, 필요없을 때 다시 OFF를 하면 된다.

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';
... 생략 ...
SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';

파일이 아닌 테이블로 로그를 저장하려면 다음과 같이 설정한다.
SET GLOBAL log_output = 'TABLE';

log_output= 설정 값으로는 FILE, TABLE, NONE (log_output = 'FILE', log_output = 'TABLE', ..)을 지정할 수 있다. DB 테이블로 쿼리를 저장하게 되면 쿼리 전체는 general_log 테이블에, slow 쿼리는 slow_log 테이블에 각각 저장된다. general_log 테이블의 스키마는 다음과 같으며, slow_log 테이블은 query_time, lock_time 등 다른 형식의 데이터들이 저장된다.

mysql> desc mysql.general_log;
+--------------+-------------+------+-----+-------------------+-----------------------------+
| Field        | Type        | Null | Key | Default           | Extra                       |
+--------------+-------------+------+-----+-------------------+-----------------------------+
| event_time   | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| user_host    | mediumtext  | NO   |     | NULL              |                             |
| thread_id    | int(11)     | NO   |     | NULL              |                             |
| server_id    | int(11)     | NO   |     | NULL              |                             |
| command_type | varchar(64) | NO   |     | NULL              |                             |
| argument     | mediumtext  | NO   |     | NULL              |                             |
+--------------+-------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

보다 자세한 것은 커피닉스에 써둔 'MySQL 쿼리 실시간 모니터링 및 저장하기'를 살펴보기 바란다.
Posted by 좋은진호
시스템이야기2008. 11. 19. 18:40
서버에 접속한 유저가 어떤 명령을 내렸는지 실시간으로 확인하려면 어떻게 해야할까? history file을 뒤진다? 이건 너무 불편하다. 명령이 실행될 때마다 특정이벤트를 발생해서, 별도 저장해주면 효과적일 것이다. 그 것도 syslog를 통해서 명령이 저장된다면 원격지 서버에서 특정 서버의 실행 명령을 모조리 확인해볼 수 있을 것이다.

몇줄의 쉘 function으로 syslog로 실행명령을 보내는 방법을 알아보자.

function logging
{
        stat="$?"
        cmd=$(history|tail -1)
        if [ "$cmd" != "$cmd_old" ]; then
                logger -p local1.notice "[2] STAT=$stat"
                logger -p local1.notice "[1] PID=$$, PWD=$PWD, CMD=$cmd"
        fi
        cmd_old=$cmd
}
trap logging DEBUG

위 스크립트에서 중요한 부분은 logger와 trap이다.

1) logger는 지정한 메시지를 syslog로 보내주는 명령이다.
   위에서는 local1 서비스종류(facility)과 notice 레밸로 syslog로 메시지를 보내준다.
   logger의 활용에 대해서는 '여러 서버의 load를 터미널에서 실시간 모니터링' (글 좋은진호, 2008.2)
   중 '2. 미리 준비되어 있어야할 사항' 부분을 살펴보기 바란다.
2) trap은 bash내부 명령으로 특정시그널이 발생할 때 지정한 명령어가 실행된다.
   형식) trap "명령" 시그널
   위에서는 DEBUG 형태로, 명령이 실행될 때마다 logging function을 호출한다.

위의 스크립트를 global하게 적용하려면 /etc/profile 에 추가하거나 /etc/profile.d/cmd_logging.sh 로 저장하면 된다. 유저별로 적용하려면 $HOME/.bash_profile 또는 $HOME/.bashrc에 넣어둔다. 이제 적용됐는지 로긴해보자.

Sep 30 17:11:32 cnx1 coffeenix: [2] STAT=0
Sep 30 17:11:32 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD=    7  ls -la
Sep 30 17:11:36 cnx1 coffeenix: [2] STAT=0
Sep 30 17:11:36 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD=    8  vi get_stat.sh
Sep 30 17:15:24 cnx1 coffeenix: [2] STAT=0
Sep 30 17:15:24 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD=    9  chmod 700 get_stat.sh
Sep 30 17:15:28 cnx1 coffeenix: [2] STAT=0
Sep 30 17:15:28 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD=   10  ./get_stat.sh
Sep 30 17:15:35 cnx1 coffeenix: [2] STAT=0
Sep 30 17:15:35 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD=   11  ls
Sep 30 17:16:31 cnx1 coffeenix: [2] STAT=0
Sep 30 17:16:31 cnx1 coffeenix: [1] PID=29168, PWD=/home/coffeenix, CMD=   12  cd /var/log
Sep 30 17:16:32 cnx1 coffeenix: [2] STAT=0
Sep 30 17:16:32 cnx1 coffeenix: [1] PID=29168, PWD=/var/log, CMD=   13  ls

시간표시를 자세히 보면 [2]가 먼저 저장되고, [1]이 그 다음에 저장된다. [2] 는 이전에 실행한 명령의 실행 결과 코드이며, [1]은 방금 실행한 명령이다. 방금 실행한 결과 코드는 다음 명령이 실행되어야 결과로 저장이 된다.

실행명령만 별도 로그로 저장하고 싶다면 /etc/syslog.conf 에 다음을 추가하고, syslogd 데몬을 재실행해주면 된다.

local1.notice                           /var/log/cmd.log

보다 자세한 것은 커피닉스에 써둔 '쉘에서 실행한 명령을 syslog로 자동 보내기'를 살펴보기 바란다.

Posted by 좋은진호
시스템이야기2008. 8. 31. 00:55
로그 파일을 모니터링할 때 가장 유용하게 사용하는 명령이 tail이다. tail -f /var/log/messages 처럼 실행하면 messages에 새로 추가되는 로그를 실시간으로 모니터링할 수 있다. 서버를 조금이라도 다뤄본 사람은 수시로 tail -f 명령을 이용해봤을 것이다. 너무나 잘 아는 -f 옵션에 대해 얘기하려 했다면 이 글을 쓰지 않았을 것이다. ^^

-F 옵션은 사용하는 사람이 드물고 잘 알지도 못하는 경우가 많다. -F 는 -f 의 개선된 옵션으로 파일이 새롭게 생성되는 경우(rename, rotation 등)를 검사하여 파일을 새로 오픈해서 보여준다. 다음과 같은 상황일 때 유용하다.

1. 로그 파일이 로테이션될 때

error_log 파일을 tail -f error_log 명령으로 모니터링하고 있다. 이 error_log 파일은 특정 시간에 로테이션(현재까지 로그는 다른 파일명으로 변경되고 새롭게 error_log 파일이 생성)된다고 하자.
로테이션이 이뤄지게 되면, tail -f 명령을 다시 실행해서 모니터링해야 한다. 그러나 -F 옵션은 같은 파일명으로 새로 생성된 파일을 자동으로 파악하여 재실행없이 계속 모니터링할 수 있다.

2. 로그 파일이 심볼릭 링크되어 있는데, 링크되는 대상 파일이 자주 바뀔 때

다음과 같은 로그 파일이 있다.

-rw-r--r--  1 root      root      114556 Aug 27 11:58 log.20080827_AM
-rw-r--r--  1 root      root       44261 Aug 27 23:53 log.20080827_PM
-rw-r--r--  1 root      root       50704 Aug 28 11:54 log.20080828_AM
-rw-r--r--  1 root      root      100585 Aug 28 23:50 log.20080828_PM
-rw-r--r--  1 root      root      110558 Aug 29 11:44 log.20080829_AM
-rw-r--r--  1 root      root      157601 Aug 29 18:30 log.20080829_PM
lrwxr-xr-x  1 root      root           8 Aug 29 12:01 log.current -> log.20080829_PM

현재 이순간에는 log.20080829_PM 파일이 log.current 이름으로 링크되어 있다. 시간이 지나면, 새로운 파일명이 생성되고 신규 파일로 링크될 것이다. 이 때 tail -F log.current 명령으로 모니터링한다면 tail 명령을 재실행하지 않아도 지속적으로 모니터링할 수 있다.

위 tail 명령의 -F옵션은 리눅스와 FreeBSD에서 모두 사용할 수 있다.

Posted by 좋은진호
시스템이야기2007. 4. 15. 20:20
Bandwidth Monitoring Tools For Linux
http://www.ubuntugeek.com/bandwidth-monitoring-tools-for-linux.html

너무나도 잘 정리되어 있어서 따로 꺼낼 필요도 없을 듯 싶다.

- CUI(IPTraf, Iperf, tcpflow, vnstat, pktstat, ifstat, ibmonitor, nload, ...)
- GUI(EtherApe, GKrellM, netspeed, ...),
- 웹용(bandwidthd, kernel.org에서 사용하는 bwbar, ntop, ...) 등과
- 통합 모니터링툴인 Cacti, NetMRG, ...
Posted by 좋은진호