Grafana 및 Prometheus로 Oracle 모니터링

GrafanaPrometheus를 사용하여 Google Cloud에서 Oracle 측정항목을 수집할 수 있습니다.

다음은 아키텍처 다이어그램 샘플입니다.

Grafana 및 Prometheus 구현

가상 머신 설정

먼저 Grafana와 Prometheus를 모두 호스팅할 가상 머신(VM)을 만듭니다.

  1. Cloud Console에 로그인합니다.
  2. Oracle 데이터베이스에 액세스하는 데 사용하는 Virtual Private Cloud(VPC)/서브넷에서 VM 인스턴스를 실행합니다. 여러 VPC에 데이터베이스가 여러 개 있는 경우 VPC에 정적 경로를 추가해야 할 수 있습니다.

VM 실행 요청

Prometheus 설치

설정한 VM에 Prometheus를 설치하려면 다음 안내를 따르세요.

  1. Prometheus 소프트웨어를 다운로드합니다.

    wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
    
  2. 다운로드한 파일의 압축을 풉니다.

    tar xvf prometheus-2.19.2.linux-amd64.tar.gz
    
  3. VM에서 Prometheus 서비스를 만듭니다.

    sudo useradd -rs /bin/false prometheus
    cd prometheus-2.19.2.linux-amd64
    sudo cp prometheus promtool /usr/local/bin
    sudo chown prometheus:prometheus /usr/local/bin/prometheus
    sudo mkdir /etc/prometheus
    sudo cp -R consoles/ console_libraries/ prometheus.yml /etc/prometheus
    sudo mkdir -p data/prometheus
    sudo chown -R prometheus:prometheus data/prometheus /etc/prometheus/*
    
  4. Prometheus 서비스 파일을 만듭니다.

    cd /lib/systemd/system
    sudo touch prometheus.service
    
  5. 이러한 파일 콘텐츠를 원하는 텍스트 편집기를 사용하여 prometheus.service 파일에 추가합니다.

    [Unit]
    Description=Prometheus
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=simple
    User=root
    Group=root
    ExecStart=/usr/local/bin/prometheus \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path="/data/prometheus" \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries \
    --web.listen-address=0.0.0.0:9090 \
    --web.enable-admin-api
    
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
  6. prometheus 서비스를 사용 설정하고 시작합니다.

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    

Grafana 설치

Grafana는 대시보드 및 경보 설정에 사용됩니다.

  1. 간단한 Grafana 설치를 위해 yum 저장소를 만듭니다.

    touch /etc/yum.repos.d/grafana.repo
    
  2. /etc/yum.repos.d/grafana.repo에 다음 줄을 추가합니다.

    [grafana]
    name=grafana
    baseurl=https://packages.grafana.com/oss/rpm
    repo_gpgcheck=1
    enabled=1
    gpgcheck=1
    gpgkey=https://packages.grafana.com/gpg.key
    sslverify=1
    sslcacert=/etc/pki/tls/certs/ca-bundle.crt
    
  3. yum install을 통해 Grafana를 설치하고 서비스를 사용 설정합니다.

    yum install grafana
    sudo systemctl start grafana-server
    sudo systemctl status grafana-server
    

데이터베이스 서버에 Prometheus 클라이언트 내보내기 도구 설치

Oracle에서 Prometheus로 데이터를 가져오려면 클라이언트 내보내기 도구가 필요합니다. 다음 두 가지 중에서 선택할 수 있습니다.

Oracle DB 내보내기 도구

  1. 바이너리를 다운로드하고 압축을 풉니다.

    wget https://github.com/iamseth/oracledb_exporter/releases/download/0.2.2/oracledb_exporter.0.2.2.linux-amd64.tar.gz
    
    tar -zxf oracledb_exporter.0.2.2.linux-amd64.tar.gz
    cd oracledb_exporter.0.2.2.linux-amd64
    
  2. 아래 내용과 같이 셸 스크립트를 만듭니다. tnsping이 아래 DB TNSname을 dbrman으로 확인해야 합니다. tnspingdbrman을 확인할 수 없는 경우 tnsnames.ora를 수정합니다.

    export ORACLE_HOSTNAME={your host name}
    export ORACLE_UNQNAME=dbrman
    export ORACLE_BASE=/apps/oracle/oracle_base
    export ORACLE_HOME=/apps/oracle/19.0.0/db_home_standalone
    export ORACLE_SID=dbrman
    export CUSTOM_METRICS=/home/oracle/oracledb_exporter.0.2.2.linux-amd64/custom-metrics.toml
    export PATH=/usr/sbin:$PATH
    export PATH=$ORACLE_HOME/bin:$PATH
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/opt/glibc-2.14/lib
    export DATA_SOURCE_NAME=user/xxxxx@dbrman
    /home/oracle/oracledb_exporter.0.2.2.linux-amd64/oracledb_exporter -default.metrics=/home/oracle/oracledb_exporter.0.2.2.linux-amd64/default-metrics.toml
    -web.listen-address=0.0.0.0:9161
    
  3. 스크립트를 백그라운드로 실행하고 nohup.out를 모니터링하여 오류가 발생했는지 확인합니다.

    nohup ./start_mon.sh &
    
  4. 수집 중인 측정항목을 확인합니다.

    curl -s http://YOUR RDBMS IP ADDRESS:9161/metrics | grep oracle
    

Prometheus Oracle 내보내기 도구

  1. Oracle 내보내기 도구를 사용하려면 추가 단계가 필요하며 이를 빌드해야 합니다. 먼저 Go 1.14 이상을 설치합니다. 이전 버전의 Go가 이미 설치되어 있으면 이를 제거해야 오류를 방지할 수 있습니다.

    Oracle 및 루트 사용자에게 Go 바이너리 경로를 추가해야 합니다.

    wget https://golang.org/dl/go1.14.6.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.14.6.linux-amd64.tar.gz
    export PATH=$PATH:/usr/local/go/bin
    source ~/.bash_profile
    
    go version
    go version go1.14.6 linux/amd64
    
  2. Go 빌드에 필요한 패키지를 설치합니다. 이 패키지는 1.2 인스턴트 클라이언트를 사용하므로 Oracle rpm 12.2 인스턴트 클라이언트를 다운로드하면 됩니다. 또한 Oracle SDK oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm은 건너뛰지 마세요.

    rpm -i oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
    rpm -i oracle-instantclient12.2-tools-12.2.0.1.0-1.x86_64.rpm
    rpm -i oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
    yum install git
    yum install gcc
    go get github.com/BurntSushi/toml
    go get github.com/prometheus/client_golang/prometheus
    go get github.com/prometheus/common/log
    go get gopkg.in/yaml.v2
    go get github.com/sirupsen/logrus
    go get gopkg.in/alecthomas/kingpin.v2
    
  3. 다음 단계에 따라 Oracle OCI8을 설치합니다.

    pkg-config --cflags --libs oci8
    

    먼저 OCI8 패키지만 설치하면 다음과 같은 오류가 발생합니다. 이 문제는 이 포털 링크에 설명되어 있습니다.

    Package oci8 was not found in the pkg-config search path.
    Perhaps you should add the directory containing oci8.pc
    to the PKG_CONFIG_PATH environment variable
    No package 'oci8' found
    
  4. OCI8을 설치하려면 내보내기 도구를 빌드하기 전에 몇 가지 패키지를 설치해야 하므로 다음 단계를 따라 문제를 해결하세요.

  5. github에서 oci8.pc를 /usr/local/share/pkgconf라는 디렉터리에 복사합니다.

    mkdir /usr/local/share/pkgconfig
    cp {Downloaded unzipped directory}/oci8.pc /usr/local/share/pkgconfig
    
    cat oci8.pc
    
    prefix=/usr
        includedir=${prefix}/include/oracle/12.2/client64 # <<== This is Oracle 12.2 instant client was installed via yum
        libdir=${prefix}/lib/oracle/12.2/client64/lib
    
        Name: oci8
        Description: Oracle Instant Client
        Version: 12.2
        Cflags: -I${includedir}
        Libs: -L${libdir} -lclntsh
     ```
    
  6. 환경 변수를 내보낸 후 OCI8을 다시 설치해 봅니다.

    export PKG_CONFIG_PATH=/usr/local/share/pkgconfig
    export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib
    go get github.com/mattn/go-oci8
    
  7. 내보내기 도구를 빌드합니다.

    git clone https://github.com/freenetdigital/prometheus_oracle_exporter.git
    cd {cloned directory}
    export GOPATH=/home/oracle/go
    pwd
    
    /home/oracle/prometheus_oracle_exporter
    
    export GOPATH=/home/oracle/go
    go get github.com/freenetdigital/prometheus_oracle_exporter
    cd /home/oracle/go/src/github.com/freenetdigital/prometheus_oracle_exporter/
    ls
    
    alertlog.go  grafana  LICENSE  main.go  misc.go
    oracle.conf.example  README.md
    
    go install
    go build
    
  8. 성공적으로 빌드되면 모니터링할 데이터베이스를 포함하도록 ~/prometheus_oracle_exporter/oracle.conf 파일을 수정할 수 있습니다.

    connections:
       - connection: user/password@dbrman
         database: dbrman
         instance: dbrman
         alertlog:
          - file: /apps/oracle/oracle_base/diag/rdbms/dbrman/dbrman/trace/alert_dbrman.log
          ignoreora:
           - ORA-00001
           - ORA-01033
           - ORA-01041
           - ORA-01089
           - ORA-01555
           - ORA-28
           - ORA-235
           - ORA-609
           - ORA-3136
       queries:
        - sql: "select 1 as column1, 2 as column2 from dual"
          name: sample1
          help: "This is my metric number 1"
          metrics:
           - column1
          labels:
           - column2
        - sql: "select 2 as column1 from dual"
          name: sample2
          help: "This is my metric number 2"
          metrics:
           - column1
    
  9. Prometheus Oracle 내보내기 도구는 이전 Oracle 타임스탬프 형식을 사용합니다. 12.2 RDBMS 버전 이상을 실행하는 경우 데이터베이스 타임스탬프를 이전 형식으로 변경하세요. 그러지 않으면 타임스탬프 문제로 인해 alert.log 오류 모니터링 기능이 작동하지 않습니다.

    alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
    
  10. 내보내기 도구를 시작합니다. 셸 스크립트를 다음과 같이 만듭니다.

    vi star_mon_free_db.sh
    

    다음 줄을 추가합니다.

    export PKG_CONFIG_PATH=/usr/local/share/pkgconfig
    export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib
    export TNS_ADMIN=/apps/oracle/19.0.0/db_home_standalone/network/admin
    export NLS_LANG=AMERICAN_AMERICA.UTF8
    /home/oracle/prometheus_oracle_exporter/prometheus_oracle_exporter
    -configfile=/home/oracle/prometheus_oracle_exporter/oracle.conf
    -web.listen-address 0.0.0.0:9500
    -defaultmetrics
    -recovery
    

    RAC 환경에서는 아래 예시와 같이 TNS 이름을 인스턴스별로 사용할 수 있습니다. 따라서 각 인스턴스를 연결하여 인스턴스별 측정항목을 수집할 수 있습니다.

    ORCL1 =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = {node 2 IP address} )(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
        (INSTANCE_NAME= orcl1)
      )
    )
    
    ORCL2 =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = {node 1 IP address} )(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
        (INSTANCE_NAME= orcl2)
      )
    )
    
  11. 데몬을 시작합니다.

    nohup ./star_mon_free_db.sh &
    

Prometheus 서버에 대상 추가

  1. Prometheus 서비스를 설치한 VM에서 다음 엔드포인트 정보를 포함하도록 /etc/prometheus/prometheus.yml 파일을 수정합니다. yml 파일에서는 탭 대신 공백을 사용해야 합니다. 작업 이름 oracle_short는 RAC의 첫 번째 노드이고 oracle_short2는 두 번째 노드입니다.

    - job_name: 'oracle_short'
      static_configs:
    - targets: ['{your DB IP}:9500']
      relabel_configs:
      - source_labels: ['__address__']
       target_label: instance
       regex:  '(.*):\d+'
       replacement: "${1}"
    - job_name: 'oracle_short2'
    static_configs:
    - targets:
      - 192.168.1.11:9500
    relabel_configs:
     - source_labels: ['__address__']
       target_label: instance
       regex:  '(.*):\d+'
       replacement: "${1}"
    
  2. prometheus 서비스를 다시 시작하여 새 변경사항을 적용합니다.

    systemctl status prometheus
    

Prometheus를 데이터 소스로 사용하여 Grafana 대시보드 만들기

  1. 기본 Grafana 사용자 ID 및 비밀번호는 admin입니다. 먼저 익명 로그인을 사용 중지하고 false로 설정하여 가입을 허용합니다.

    vi /etc/grafana/grafana.ini
    
    enable anonymous access
    ;enabled = false
    disable user signup / registration
    ;allow_sign_up = false
    

    Grafana를 다시 시작합니다.

    systemctl restart grafana-server
    
  2. 관리자 비밀번호를 내 것으로 변경합니다.

  3. 다음 단계에 따라 데이터 소스를 만듭니다.

    **구성 > 데이터 소스 > 데이터 소스 추가 > Prometheus 선택으로 이동합니다.

    Prometheus 서버 엔드포인트 URL**을 추가합니다. 이 예시에서 --web.listen-address=0.0.0.0:9090은 서비스 리스너이므로 엔드포인트 URL은 http://localhost:9090입니다.

  4. Prometheus Oracle Explorer에는 Oracle 모니터링을 위한 몇 가지 샘플 대시보드가 있습니다. 여기서는 이를 가져와서 사용합니다. 자체 대시보드를 만들어 제공되는 측정항목을 표시하거나 새 커스텀 측정항목을 만들어 새 대시보드에 표시할 수 있습니다.

    대시보드 > 관리 > 가져오기 > .json 파일 업로드를 클릭한 후 freenetdigital에서 다운로드한 json 파일을 선택합니다.

  5. 로드 및 가져오기를 클릭합니다.

  6. 대시보드에 측정항목이 표시되는지 확인합니다. 대시보드 > 일반을 클릭한 후 가져온 대시보드를 클릭합니다.

요약

Google은 측정항목을 캡처하고 소유하고 있는 대시보드를 통해 이러한 측정항목을 표시하여 오픈소스 소프트웨어를 사용한 샘플 모니터링 솔루션을 만들었습니다.

다음과 같은 개선사항을 구현하면 이러한 측정항목을 보호할 수 있습니다.

  • 각 엔드포인트 간의 mTls
  • Oracle 비밀번호를 암호화합니다.
  • GCP 부하 분산기 SSL 및 허용 목록에 포함된 IP로 Grafana 엔드포인트를 보호합니다.