본문 바로가기

IT/기타

운영 자동화 -시스템 모니터링 및 로그 관리

반응형

시스템 모니터링 및 로그 관리 자동화


1. 기능
  • CPU, 메모리, 디스크 사용량을 주기적으로 체크
  • 특정 임계값을 초과하면 관리자에게 이메일 알림 (또는 로그 저장)
  • 시스템 로그를 일정 기간 후 자동 정리

2. 스크립트 내용 (system_monitor.sh)

#!/bin/bash

# 로그 파일 위치
LOG_FILE="/var/log/system_monitor.log"

# 임계값 설정 (필요에 따라 조정)
CPU_THRESHOLD=80      # CPU 사용률 80% 이상 경고
MEM_THRESHOLD=90      # 메모리 사용률 90% 이상 경고
DISK_THRESHOLD=90     # 디스크 사용률 90% 이상 경고
LOG_RETENTION_DAYS=7  # 7일 지난 로그 삭제

# 이메일 설정 (메일 알림이 필요할 경우)
ADMIN_EMAIL="admin@example.com"

# 현재 시간 저장
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")

# CPU 사용량 확인
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
CPU_INT=${CPU_USAGE%.*}

# 메모리 사용량 확인
MEM_USAGE=$(free | awk '/Mem/{printf "%.0f", $3/$2 * 100}')
MEM_INT=$MEM_USAGE

# 디스크 사용량 확인 (루트 파티션 기준)
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
DISK_INT=$DISK_USAGE

# 로그 기록 및 경고 알림
echo "[$TIMESTAMP] CPU: ${CPU_INT}%, MEM: ${MEM_INT}%, DISK: ${DISK_INT}%" >> "$LOG_FILE"

if [ "$CPU_INT" -ge "$CPU_THRESHOLD" ]; then
    echo "[$TIMESTAMP] 경고: CPU 사용량 ${CPU_INT}% 초과!" >> "$LOG_FILE"
    echo "CPU 사용량 경고: ${CPU_INT}%" | mail -s "CPU 사용량 경고" "$ADMIN_EMAIL"
fi

if [ "$MEM_INT" -ge "$MEM_THRESHOLD" ]; then
    echo "[$TIMESTAMP] 경고: 메모리 사용량 ${MEM_INT}% 초과!" >> "$LOG_FILE"
    echo "메모리 사용량 경고: ${MEM_INT}%" | mail -s "메모리 사용량 경고" "$ADMIN_EMAIL"
fi

if [ "$DISK_INT" -ge "$DISK_THRESHOLD" ]; then
    echo "[$TIMESTAMP] 경고: 디스크 사용량 ${DISK_INT}% 초과!" >> "$LOG_FILE"
    echo "디스크 사용량 경고: ${DISK_INT}%" | mail -s "디스크 사용량 경고" "$ADMIN_EMAIL"
fi

# 오래된 로그 자동 정리
find /var/log -name "system_monitor.log*" -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \;

# 로그 롤링 (파일 크기 제한)
LOG_SIZE=$(du -k "$LOG_FILE" | cut -f1)
MAX_LOG_SIZE=10240  # 10MB 제한

if [ "$LOG_SIZE" -ge "$MAX_LOG_SIZE" ]; then
    mv "$LOG_FILE" "$LOG_FILE.$(date '+%Y%m%d_%H%M%S')"
    touch "$LOG_FILE"
fi

 

3. 설정 방법
  • 스크립트 저장 및 실행 권한 부여

sudo nano /usr/local/bin/system_monitor.sh


  • 위 스크립트 내용을 저장한 후, 실행 권한을 부여합니다.

sudo chmod +x /usr/local/bin/system_monitor.sh

 

4. 크론잡(Cron Job) 설정
  • 매 5분마다 실행되도록 설정하려면

crontab -e

• 아래 줄을 추가

*/5 * * * * /usr/local/bin/system_monitor.sh

네트워크 모니터링 및 자동 복구


1. 기능
  • 인터넷 연결 상태 확인 : 특정 웹사이트(예: Google, Cloudflare) 핑 테스트
  • 네트워크 인터페이스 상태 체크
  • 네트워크 장애 감지 시 자동 복구
  • DHCP 리뉴얼 (dhclient)
  • 네트워크 서비스 재시작 (systemctl restart networking)
  • 4. 로그 저장 및 관리자 이메일 알림
  • 오래된 로그 자동 삭제

2. 스크립트 내용 (network_monitor.sh)

#!/bin/bash

# 설정
LOG_FILE="/var/log/network_monitor.log"
PING_TARGET="8.8.8.8"  # Google DNS 서버 (네트워크 체크용)
INTERFACE="eth0"  # 감시할 네트워크 인터페이스
LOG_RETENTION_DAYS=7  # 7일 지난 로그 자동 삭제
ADMIN_EMAIL="admin@example.com"

# 현재 시간
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")

# 로그 기록
echo "[$TIMESTAMP] 네트워크 상태 점검 시작..." >> "$LOG_FILE"

# 인터넷 연결 확인
ping -c 4 "$PING_TARGET" > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "[$TIMESTAMP] 인터넷 연결 안 됨! 복구 시도 중..." >> "$LOG_FILE"
    
    # 네트워크 인터페이스 리셋
    echo "[$TIMESTAMP] $INTERFACE 재시작..." >> "$LOG_FILE"
    ifdown "$INTERFACE" && ifup "$INTERFACE"

    # DHCP 리뉴얼
    echo "[$TIMESTAMP] DHCP 리뉴얼..." >> "$LOG_FILE"
    dhclient "$INTERFACE"

    # 네트워크 서비스 재시작
    echo "[$TIMESTAMP] 네트워크 서비스 재시작..." >> "$LOG_FILE"
    systemctl restart networking

    # 재시작 후 인터넷 연결 확인
    sleep 10
    ping -c 4 "$PING_TARGET" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "[$TIMESTAMP] 네트워크 복구 실패! 관리자에게 알림 전송" >> "$LOG_FILE"
        echo "서버 네트워크 연결이 끊어졌으며, 자동 복구에 실패했습니다." | mail -s "네트워크 장애 경고" "$ADMIN_EMAIL"
    else
        echo "[$TIMESTAMP] 네트워크 복구 성공" >> "$LOG_FILE"
    fi
else
    echo "[$TIMESTAMP] 인터넷 연결 정상" >> "$LOG_FILE"
fi

# 오래된 로그 자동 삭제
find /var/log -name "network_monitor.log*" -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \;

# 로그 롤링 (파일 크기 제한)
LOG_SIZE=$(du -k "$LOG_FILE" | cut -f1)
MAX_LOG_SIZE=10240  # 10MB 제한

if [ "$LOG_SIZE" -ge "$MAX_LOG_SIZE" ]; then
    mv "$LOG_FILE" "$LOG_FILE.$(date '+%Y%m%d_%H%M%S')"
    touch "$LOG_FILE"
fi

echo "[$TIMESTAMP] 네트워크 점검 완료." >> "$LOG_FILE"

3. 설치 및 설정 방법
  •  스크립트 저장 및 실행 권한 부여

sudo nano /usr/local/bin/network_monitor.sh

  •  위 스크립트를 저장한 후, 실행 권한을 부여합니다.

sudo chmod +x /usr/local/bin/network_monitor.sh


4. 크론잡(Cron Job) 설정

# 매 5분마다 실행되도록 설정하려면

crontab -e

# 아래 줄을 추가

*/5 * * * * /usr/local/bin/network_monitor.sh


5.  특정 포트 모니터링

# 특정 포트(예: 웹 서버 80, 443) 체크 및 복구 기능 추가 가능

nc -zv 127.0.0.1 80
if [ $? -ne 0 ]; then
    echo "[$TIMESTAMP] 웹 서버(포트 80) 다운됨! 복구 시도 중..." >> "$LOG_FILE"
    systemctl restart apache2
fi

오라클 데이터베이스  모니터링 


다음은 오라클 데이터베이스에서 중요한 체크 사항들입니다.

1. 성능 모니터링
  • CPU 사용률 : DB 서버의 CPU 사용률을 주기적으로 점검하여 과도한 부하를 파악.
  • 메모리 사용량 : 메모리의 과다 사용 여부를 확인하여 성능 저하를 방지.
  • 디스크 I/O : DB의 I/O 성능을 점검하여 데이터 읽기/쓰기 속도를 최적화.
  • SQL 성능 : 느린 쿼리나 자주 실행되는 쿼리 성능을 점검하고 튜닝.
  • 세션 수 : 너무 많은 세션이 열려있는지 확인하여 리소스 고갈을 방지.

2. 백업 및 복원
  • 백업 상태 점검: 오라클 RMAN(Recovery Manager)을 사용하여 백업 상태를 점검하고, 실패한 백업을 추적.
  • 백업 주기: 백업이 제대로 실행되고 있는지, 주기가 지켜지고 있는지 확인.
  • 아카이브 로그 상태 점검: 아카이브 로그가 정상적으로 백업되고 있는지, 유실된 로그가 없는지 확인.

3. 보안 점검
  • 사용자 권한 관리 : DB 사용자 및 역할에 대한 권한을 점검하여 불필요한 권한이 부여되지 않았는지 확인.
  • 비밀번호 정책 : 사용자 비밀번호의 복잡성 및 주기적인 변경 여부 점검.
  • 로그 관리 : 중요 시스템 로그(예: alert.log, listener.log)와 감사 로그를 모니터링하여 의심스러운 활동을 감지.

4. 장애 및 로그 모니터링
  • 오류 로그 점검 : alert.log와 listener.log를 정기적으로 확인하여 오류나 경고를 빠르게 파악.
  • 장애 대응 준비 : DB 서버나 데이터베이스 인스턴스가 다운될 경우, 자동으로 재시작할 수 있도록 설정.

5. 스토리지 관리
  • 테이블스페이스 사용률 점검: 테이블스페이스의 사용량을 확인하고, 용량이 부족해지지 않도록 모니터링.
  • 오래된 세그먼트 삭제: 사용되지 않는 인덱스나 테이블을 삭제하여 디스크 공간을 확보.

6. 자동화 스크립트 예시

# 오라클 데이터베이스 모니터링 스크립트(oracle_monitor.sh)

# 이 스크립트는 오라클 데이터베이스 성능 및 상태를 점검하고, 필요 시 자동 복구를 수행합니다.

#!/bin/bash

# 설정
LOG_FILE="/var/log/oracle_monitor.log"
DB_SID="orcl"  # 오라클 DB SID
ORACLE_HOME="/u01/app/oracle/product/19.0.0/dbhome_1"  # Oracle 홈 디렉토리
ORACLE_USER="oracle"  # 오라클 사용자
ORACLE_GROUP="dba"  # 오라클 그룹
LOG_RETENTION_DAYS=7  # 7일 지난 로그 자동 삭제
ADMIN_EMAIL="admin@example.com"

# 현재 시간
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")

# 로그 기록
echo "[$TIMESTAMP] 오라클 데이터베이스 상태 점검 시작..." >> "$LOG_FILE"

# 1. CPU 사용량 확인
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}' | cut -d'.' -f1)
if [ "$CPU_USAGE" -ge 80 ]; then
    echo "[$TIMESTAMP] CPU 사용량이 80% 초과! ($CPU_USAGE%)" >> "$LOG_FILE"
    echo "CPU 사용량 경고: $CPU_USAGE%" | mail -s "오라클 DB CPU 사용량 경고" "$ADMIN_EMAIL"
fi

# 2. 메모리 사용량 확인
MEM_USAGE=$(free | awk '/Mem/{printf "%.0f", $3/$2 * 100}')
if [ "$MEM_USAGE" -ge 90 ]; then
    echo "[$TIMESTAMP] 메모리 사용량이 90% 초과! ($MEM_USAGE%)" >> "$LOG_FILE"
    echo "메모리 사용량 경고: $MEM_USAGE%" | mail -s "오라클 DB 메모리 사용량 경고" "$ADMIN_EMAIL"
fi

# 3. 데이터베이스 상태 확인
export ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=$DB_SID

DB_STATUS=$(sqlplus -S /nolog <<EOF
CONNECT / AS SYSDBA
SET HEADING OFF;
SET FEEDBACK OFF;
SELECT status FROM v\$instance;
EXIT;
EOF
)

if [ "$DB_STATUS" != "OPEN" ]; then
    echo "[$TIMESTAMP] 오라클 데이터베이스가 비정상 상태입니다. ($DB_STATUS)" >> "$LOG_FILE"
    echo "오라클 데이터베이스 상태 비정상: $DB_STATUS" | mail -s "오라클 DB 상태 경고" "$ADMIN_EMAIL"
    # DB 재시작 시도
    sqlplus / as sysdba <<EOF
    startup;
    EOF
    echo "[$TIMESTAMP] 오라클 데이터베이스 재시작 시도" >> "$LOG_FILE"
fi

# 4. 테이블스페이스 사용률 점검
TS_USAGE=$(sqlplus -S /nolog <<EOF
CONNECT / AS SYSDBA
SET HEADING OFF;
SET FEEDBACK OFF;
SELECT tablespace_name, round(used_space / total_space * 100, 2) AS usage_percentage
FROM (
    SELECT tablespace_name,
           SUM(bytes) / 1024 / 1024 AS used_space,
           (SELECT SUM(bytes) / 1024 / 1024 FROM dba_data_files WHERE tablespace_name = d.tablespace_name) AS total_space
    FROM dba_segments d
    GROUP BY tablespace_name
);
EXIT;
EOF
)

echo "[$TIMESTAMP] 테이블스페이스 사용률: $TS_USAGE" >> "$LOG_FILE"

# 5. RMAN 백업 상태 점검
BACKUP_STATUS=$(rman target / <<EOF
LIST BACKUP SUMMARY;
EXIT;
EOF
)

if [[ $BACKUP_STATUS == *"ERROR"* ]]; then
    echo "[$TIMESTAMP] RMAN 백업 상태 오류 발생!" >> "$LOG_FILE"
    echo "RMAN 백업 오류 발생" | mail -s "RMAN 백업 상태 경고" "$ADMIN_EMAIL"
fi

# 오래된 로그 자동 삭제
find /var/log -name "oracle_monitor.log*" -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \;

# 로그 롤링 (파일 크기 제한)
LOG_SIZE=$(du -k "$LOG_FILE" | cut -f1)
MAX_LOG_SIZE=10240  # 10MB 제한

if [ "$LOG_SIZE" -ge "$MAX_LOG_SIZE" ]; then
    mv "$LOG_FILE" "$LOG_FILE.$(date '+%Y%m%d_%H%M%S')"
    touch "$LOG_FILE"
fi

echo "[$TIMESTAMP] 오라클 데이터베이스 점검 완료." >> "$LOG_FILE"


  • 설치 및 설정 방법

1. 스크립트 저장 및 실행 권한 부여

sudo nano /usr/local/bin/oracle_monitor.sh

위 스크립트를 저장한 후, 실행 권한을 부여합니다.

sudo chmod +x /usr/local/bin/oracle_monitor.sh


  • 크론잡(Cron Job) 설정

# 매 5분마다 실행되도록 설정하려면

crontab -e

# 아래 줄을 추가

*/5 * * * * /usr/local/bin/oracle_monitor.sh
반응형