Grafana 및 Prometheus로 Oracle 모니터링
Grafana와 Prometheus를 사용하여 Google Cloud에서 Oracle 측정항목을 수집할 수 있습니다.
다음은 아키텍처 다이어그램 샘플입니다.
가상 머신 설정
먼저 Grafana와 Prometheus를 모두 호스팅할 가상 머신(VM)을 만듭니다.
- Cloud Console에 로그인합니다.
- Oracle 데이터베이스에 액세스하는 데 사용하는 Virtual Private Cloud(VPC)/서브넷에서 VM 인스턴스를 실행합니다. 여러 VPC에 데이터베이스가 여러 개 있는 경우 VPC에 정적 경로를 추가해야 할 수 있습니다.
Prometheus 설치
설정한 VM에 Prometheus를 설치하려면 다음 안내를 따르세요.
Prometheus 소프트웨어를 다운로드합니다.
wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
다운로드한 파일의 압축을 풉니다.
tar xvf prometheus-2.19.2.linux-amd64.tar.gz
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/*
Prometheus 서비스 파일을 만듭니다.
cd /lib/systemd/system sudo touch prometheus.service
이러한 파일 콘텐츠를 원하는 텍스트 편집기를 사용하여
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
prometheus
서비스를 사용 설정하고 시작합니다.sudo systemctl enable prometheus sudo systemctl start prometheus
Grafana 설치
Grafana는 대시보드 및 경보 설정에 사용됩니다.
간단한 Grafana 설치를 위해 yum 저장소를 만듭니다.
touch /etc/yum.repos.d/grafana.repo
/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
yum install
을 통해 Grafana를 설치하고 서비스를 사용 설정합니다.yum install grafana sudo systemctl start grafana-server sudo systemctl status grafana-server
데이터베이스 서버에 Prometheus 클라이언트 내보내기 도구 설치
Oracle에서 Prometheus로 데이터를 가져오려면 클라이언트 내보내기 도구가 필요합니다. 다음 두 가지 중에서 선택할 수 있습니다.
Oracle DB 내보내기 도구
바이너리를 다운로드하고 압축을 풉니다.
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
아래 내용과 같이 셸 스크립트를 만듭니다.
tnsping
이 아래 DB TNSname을dbrman
으로 확인해야 합니다.tnsping
가dbrman
을 확인할 수 없는 경우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
스크립트를 백그라운드로 실행하고
nohup.out
를 모니터링하여 오류가 발생했는지 확인합니다.nohup ./start_mon.sh &
수집 중인 측정항목을 확인합니다.
curl -s http://YOUR RDBMS IP ADDRESS:9161/metrics | grep oracle
Prometheus Oracle 내보내기 도구
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
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
다음 단계에 따라 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
OCI8을 설치하려면 내보내기 도구를 빌드하기 전에 몇 가지 패키지를 설치해야 하므로 다음 단계를 따라 문제를 해결하세요.
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 ```
환경 변수를 내보낸 후 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
내보내기 도구를 빌드합니다.
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
성공적으로 빌드되면 모니터링할 데이터베이스를 포함하도록
~/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
Prometheus Oracle 내보내기 도구는 이전 Oracle 타임스탬프 형식을 사용합니다. 12.2 RDBMS 버전 이상을 실행하는 경우 데이터베이스 타임스탬프를 이전 형식으로 변경하세요. 그러지 않으면 타임스탬프 문제로 인해
alert.log
오류 모니터링 기능이 작동하지 않습니다.alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
내보내기 도구를 시작합니다. 셸 스크립트를 다음과 같이 만듭니다.
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) ) )
데몬을 시작합니다.
nohup ./star_mon_free_db.sh &
Prometheus 서버에 대상 추가
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}"
prometheus
서비스를 다시 시작하여 새 변경사항을 적용합니다.systemctl status prometheus
Prometheus를 데이터 소스로 사용하여 Grafana 대시보드 만들기
기본 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
관리자 비밀번호를 내 것으로 변경합니다.
다음 단계에 따라 데이터 소스를 만듭니다.
**구성 > 데이터 소스 > 데이터 소스 추가 > Prometheus 선택으로 이동합니다.
Prometheus 서버 엔드포인트 URL**을 추가합니다. 이 예시에서
--web.listen-address=0.0.0.0:9090
은 서비스 리스너이므로 엔드포인트 URL은http://localhost:9090
입니다.Prometheus Oracle Explorer에는 Oracle 모니터링을 위한 몇 가지 샘플 대시보드가 있습니다. 여기서는 이를 가져와서 사용합니다. 자체 대시보드를 만들어 제공되는 측정항목을 표시하거나 새 커스텀 측정항목을 만들어 새 대시보드에 표시할 수 있습니다.
대시보드 > 관리 > 가져오기 > .json 파일 업로드를 클릭한 후 freenetdigital에서 다운로드한 json 파일을 선택합니다.
로드 및 가져오기를 클릭합니다.
대시보드에 측정항목이 표시되는지 확인합니다. 대시보드 > 일반을 클릭한 후 가져온 대시보드를 클릭합니다.
요약
Google은 측정항목을 캡처하고 소유하고 있는 대시보드를 통해 이러한 측정항목을 표시하여 오픈소스 소프트웨어를 사용한 샘플 모니터링 솔루션을 만들었습니다.
다음과 같은 개선사항을 구현하면 이러한 측정항목을 보호할 수 있습니다.
- 각 엔드포인트 간의 mTls
- Oracle 비밀번호를 암호화합니다.
- GCP 부하 분산기 SSL 및 허용 목록에 포함된 IP로 Grafana 엔드포인트를 보호합니다.