2016년 7월 13일 수요일

EXADATA X5-2 Performance Test Network Issue

Symptom
성능테스트 부하를 실행 했을 시 1번 노드의 SQL 트래픽이 정상 유입량의 절반 수준으로만 처리됨.
동일한 트래픽을 2번 노드에서만 실행했을 시에는 정상 수준으로 처리됨.
네트웍 트래픽도 양쪽 노드를 비교 했을 시 1번 노드가 현저히 낮은 상태.
양쪽 노드의 AWR 리포트 비교했을 시 1번 노드에서만 네트워크 관련 대기 이벤트가 높게 나타남.
1번 노드에 뭔가 문제가 있는 것으로 판단.

DB Node1 QPS 및 네트워크 모니터링
DB Node2 QPS 및 네트워크 모니터링
AWR Report

Cause
1번 노드의 네트웍카드 설정이 100Mb/s 로 되어 있음. (2번 노드는 1000 Mb/s)
100Mb/s 로 잡힌 이유는 public switch 와 통신 시 auto negotiation 과정에서 네트웍 속도를 결정하는데 몇번의 서버 리붓 과정에서 100Mb/s 로 잡힌 것이었다.
네트웍 카드와 스위치가 모두 1000Mb/s를 지원하면 보통은 1000Mb/s 로 된다고 하는데 100Mb/s 로 잡힌 명확한 이유는 알 수 없다. (네트웍인프라에서는 간혹 있는 일이라 함)

[EXA]root@dbnode1:/root# ethtool eth1
Settings for eth1:
        Supported ports: [ TP ]
        Supported link modes:   100baseT/Full
                                1000baseT/Full
                                10000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Ye s
        Advertised link modes:  100baseT/Full
                                1000baseT/Full
                                10000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Du plex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: external
        Auto-negotiation: on
        MDI-X: Unknown
        Supports Wake-on: d
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes
[EXA]root@dbnode1:/root#
[EXA]root@dbnode1:/root# ethtool eth2
Settings for eth2:
        Supported ports: [ TP ]
        Supported link modes:   100baseT/Full
                                1000baseT/Full
                                10000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  100baseT/Full
                                1000baseT/Full
                                10000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 100Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: external
        Auto -negotiation: on
        MDI-X: Unknown
        Supports Wake-on: d
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

Solution
ethtool 명령어로 1000Mb/s 로 적용하고 성능테스트 진행하였고 정상 QPS 트래픽 유입 확인.
eth1, eth2 는 본딩으로 이중화 구성되어 있으므로 둘다 적용.

[EXA]root@dbnode1:/root# ethtool -s eth1 speed 1000 duplex full autoneg on
[EXA]root@dbnode1:/root# ethtool -s eth2 speed 1000 duplex full autoneg on
[EXA]root@dbnode1:/root#
... 약 1분뒤 적용됨...
[EXA]root@dbnode1:/root# ethtool eth1
Settings for eth1:
        Supported ports: [ TP ]
        Supported link modes:   100baseT/Full
                                1000baseT/Full
                                10000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: external
        Auto-negotiation: on
        MDI-X: Unknown
        Supports Wake-on: d
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes
[EXA]root@dbnode1:/root#
[EXA]root@dbnode1:/root# ethtool eth2
Settings for eth2:
        Supported ports: [ TP ]
        Supported link modes:   100baseT/Full
                                1000baseT/Full
                                10000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: external
        Auto-negotiation: on
        MDI-X: Unknown
        Supports Wake-on: d
        Wake-on: d
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes

이런 위험을 방지하기 위해 자동이 아닌 강제(autoneg off) 로 1000Mb/s를 지정하려고 했으나 Exadata DB서버상에는 강제할 수 없었다. 

[EXA]root@dbnode1:/root# ethtool -s eth2 speed 1000 duplex full autoneg off
Cannot set new settings: Invalid argument
  not setting speed
  not setting duplex
  not setting autoneg

Oracle Linux 6: Network Limitation of a 1GB Card over Auto Negotiation (Doc ID 1904433.1)
"According to IEEE 802.3-2002 specification, you can not disable auto negotiation when using a 1000baseT NIC"

만약의 경우를 대비해서 스위치에만 autoneg off 로 강제지정하였고 리붓시에도 제대로 적용되도록 DB서버 모두 아래와 같이 ETHTOOL_OPTS 설정을 추가 함.

[EXA]root@dbnode1:/root# cat /etc/sysconfig/network-scripts/ifcfg-eth1 | grep ETHTOOL_OPTS
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"
[EXA]root@dbnode1:/root# cat /etc/sysconfig/network-scripts/ifcfg-eth2 | grep ETHTOOL_OPTS
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"
[EXA]root@dbnode2:/root# cat /etc/sysconfig/network-scripts/ifcfg-eth1 | grep ETHTOOL_OPTS
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"
[EXA]root@dbnode2:/root# cat /etc/sysconfig/network-scripts/ifcfg-eth2 | grep ETHTOOL_OPTS
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"

Conclusion
Exadata 와 상관 없이 외부스위치 설정으로 인해 네트웍 속도가 결정될 수 있다.
Exadata는 고가이고 훌륭한 DB 어플라이언스 제품이지만 성능테스트로 꼼꼼하게 확인할 필요가 있다.
SQL 처리량이 Product 에서 캡쳐한 시점과 차이가 많이 나면 꼼꼼하게 확인하여 원인 분석 하자.



EXADATA X5-2 Performance Test DB Issue - 12C Adaptive Optimization

Symptom
1번노드에서 트래픽 유입 중 특정 시점 이후로 library cache lock 대기 이벤트가 많이 발생 함.
13:57 부터 강제 vip fail-over 로 1번 노드로 전체 트래픽 유입.
fail-over 까지는 정상이나 약 10여분 뒤 14:08 시점 부터 1번 노드에서 library cache lock 을 대기하는 active session 이 약 100여개 정도 급증하면서 SQL처리량 감소.
/* Active Session */
SQL> select inst_id, username, program, module, event, sql_id
     from gv$session where status='ACTIVE'
     order by 1,2,4

   INST_ID USERNAME   PROGRAM                               MODULE                         EVENT                               SQL_ID
---------- ---------- ------------------------------------- ------------------------------ ----------------------------------- -------------
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache: mutex X              bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
....
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache: mutex X              bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache: mutex X              bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      wrc@oratest (TNS V1-V3)               JDBC Thin Client               library cache lock                  bttd0gttbjx9w
         1 P_USR      oracle@exaoradb01.melon.com (O000)                                   class slave wait


Cause
12c New Feature 인 Adaptive Optimization 관련 버그.
My Oracale Support, Bug 19490852 : EXCESSIVE LIBRARY CACHE LOCK
12.2 버전 부터 해결 예정으로 현재(2016년 7월) 최신 버전은 12.1.0.2 로서 버그 패치는 없고 workaround 만 있는 상태.
SQL> select * from v$version;

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production              0
PL/SQL Release 12.1.0.2.0 - Production                                                    0
CORE    12.1.0.2.0      Production                                                        0
TNS for Linux: Version 12.1.0.2.0 - Production                                            0
NLSRTL Version 12.1.0.2.0 - Production                                                    0

Solution
Adaptive Optimization 기능을 off 하는 workaound 로 해결.
SQL> alter system set optimizer_adaptive_features=false scope=both sid='*';
SQL> alter system set optimizer_dynamic_sampling=0 scope=both sid='*';
적용 후 정상 결과 확인.

Conclusion
New Feature에 대한 사이트 이펙트를 미리 확인해보기 위해서라도 성능테스트를 꼼꼼하게 하자.
추후 12.2 업그레이드 시 Adaptive Optimization관련 사이드이펙트를 확인해 보자.



EXADATA X5-2 Performance Test Memory Issue

Symptom
성능테스트 부하를 주기 시작하면 memory used 및 cache 가 빠른 속도로 증가하고 free memory가 고갈되는 시점에 서버 hang 상태로 빠져 테스트 불가.
free memory 가 고갈되기 전까지는 정상적으로 트래픽 수용 함.
특이하게 1번 노드의 memory used 가 매우 높은 상태 ( Node1:128G, Node2:12G)
양쪽 노드의 SGA 크기는 85G로 설정 되어 있음.
ASMM 사용 안함. (max_sga_size=85G)


Cause
1번 노드의 hugepage 설정이 크게 잡혀 있어 1번 노드의 used 가 기본적으로 많이 높은 상태를 유지하였다.
2번 노드는 실수로 hugepage 설정을 빠뜨려서 used가 낮은 상태를 유지된 것임.

[EXA]root@dbnode1:/root#grep Huge /proc/meminfo
HugePages_Total:   60000
HugePages_Free:    58982
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
[EXA]root@dbnode2:/root#grep Huge /proc/meminfo
HugePages_Total:    1024
HugePages_Free:        6
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

커널 파라미터의 hugepage 사용량을 설정한 만큼은 기본적으로 memory used 로 할당 된다.
즉, 1번 노드는 설정에 따라 HugePages_Total x Hugepagesize = 60000 X 2048K = 117G 만틈은 항상 used 로 할당된 것이다.
60000으로 설정한 이유는 과거 11g Exadata 서버 구축 시 hugepage 설정이 SGA 크기보다 작으면 에러가 발생하여 설정한 것이다.
use_large_pages DB parameter 에 의해 SGA할당 시 hugepage 사용 여부가 결정되는데 TRUE(사용), FALSE(미사용), ONLY(무조건사용) 중에 하나의 값을 가진다.
과거 11g Exadata 에서는 ONLY로 설정되어 있어서 SGA증가 했을 시 DB가 기동되지 않았고 hugepage를 먼저 크게 설정한 다음 기동했어야 했다.
그런데 12c 에서는 use_large_pages 가 FALSE 로되어 있어서 1번 노드에서 미리 크게 잡아놓은 hugepage는 무의미해지고 free memory 로부터 SGA를 할당하여 메모리 고갈이 발생한 것이다.

SQL> show parameter use_large_pages
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
use_large_pages                      string      FALSE

과거 11g 버전의 Exadata 에서는 초기 셋팅 시 use_large_pages=ONLY 로 변경하는 절차가 있었으나..
고객이 SGA를 늘릴 경우 DB가 올라오지 않는 혼선으로 인해 최근 부터는 use_large_pages=ONLY 로 적용하는 절차가 제외 되었다고 한다.
즉, DB버전 차이로 인한 문제가 아닌 오라클 설치 정책의 변화로 인한 차이이며, 12c 에서도 best practice는 SGA를 크게 잡을 시 use_large_pages=ONLY로 하고 hugepage를 사용하는 것이다.

Solution
양쪽 DB노드 모두 hugepage 사이즈를 동일하게 크게 설정하고 use_large_pages=ONLY 로 적용.

[EXA]root@dbnode1:/root# sysctl -w vm.nr_hugepages=51200
[EXA]root@dbnode1:/root# echo "vm.nr_hugepages=51200" >> /etc/sysctl.conf
[EXA]root@dbnode1:/root# cat /etc/sysctl.conf | grep nr_huge
# vm.nr_hugepages = 1024
vm.nr_hugepages=51200
[EXA]root@dbnode1:/root#grep Huge /proc/meminfo
HugePages_Total:   51200
HugePages_Free:     1669
HugePages_Rsvd:      119
HugePages_Surp:        0
Hugepagesize:       2048 kB
SQL> alter system set use_large_pages scope=both sid='*';
SQL> show parameter use_large_pages
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
use_large_pages                      string      ONLY

적용 후 성능테스트 부하를 발생했을 시 SGA를 hugepage로 미리 할당된 used에서 사용하므로 메모리 사용량에 큰 변화가 크게 없다.

Conclusion
SGA 설정 시 hugepage 사용 여부 및 관련 파라미터도 확인하자.
* DB Parameter : use_large_pages
* Kernel Parameter :  vm.nr_hugepages



InfluxDB, Telegraf, Grafana를 활용한 Monitoring System 만들기(1)

모니터링 관련하여 많은 오픈소스 솔루션이 있지만 만족스러운 솔루션을 찾기 어려운 것도 사실입니다.
개인적으로는 다음과 같은 점을 기대했는데...

- 보고 싶은 지표만 모아볼 수 있도록 커스터마이징이 유연할 것
- 다양한 지표 수집이 가능할 것 (system, database, network..)
- 수집, 저장, 조회 성능이 좋을 것 (실시간 모니터링이 가능 할 것)
- 설정이 간편할 것
- 이쁠 것 (보기 좋을 것)

그러던 중 Grafana를 알게 되었고 투박한 RRD기반의 그래프와 다소 아쉬움이 있는 상용모니터링 시스템만 보던 저에게는 신선한 충격이었습니다.
Grafana의 아름다움과 유연함에 반하여 알아보니 Grafana는 그냥 대시보드만 이쁘게 그려주는 툴일 뿐 데이터 저장과 수집을 위해서는 별도 솔루션이 필요했습니다.
처음에는 Graphite를 저장소로 사용하고 데이터 수집은 입맛에 맞는 솔루션이 없어 쉘스크립트로 자체 제작했었는데 설치도 까다롭고 번거로웠지만 Grafana의 아름다움을 위해서는 참을 수 있었습니다.
그렇게 1년 반 가까이 잘 사용하다 InfluxDB라는 솔루션을 알게되었고 지금은 성능과 편리함 때문에 InfluxDB + Telegraf + Grafana 조합으로 굳혀서 사용하고 있습니다.
물론 이 조합도 100% 만족스럽다고 할 수는 없겠으나 왠만한 모니터링 시스템 부럽지 않은 퀄리티는 될거라고 봅니다.

InfluxDB(저장), Telegraf(수집), Grafana(대시보드) 순서로 약 3~4회에 걸쳐 포스팅할 계획입니다.
화면 캡쳐와 부수적으로 확인하는 내용이 많아 다소 긴 내용 같지만 실제 설치와 구성은 매우 간편합니다. (30분 내 가능)
OS 및 mysql 모니터링 중심으로 설명하지만 그외 다른 모니터링도 본 포스트와 온라인 메뉴얼을 참고하면 별로 어렵지 않게 구축할 수 있을 것입니다.
저처럼 기존 모니터링 시스템에 불만이 많거나 새로 구축하고 싶은 분들께 유용한 참고가 되면 좋을 것 같습니다..



What is InfluxDB?

InfluxDB는 시계열(Time-series) 데이터를 저장하는 데이터저장소 입니다.

시계열 데이터란 시간의 흐름에 따라 발생하는 데이터로서 서버, DB, 네트웍, 스토리지와 같은 IT인프라 모니터링을 위한 각종 데이터들, 서비스 반응을 확인하기위한 각종 지표들(동시접속자, PV 등), 요즘 뜨고 있는 IOT기기들의 각종 수집 데이터들, 다이어트를 위해 매일 기록하는 내 몸무게 등등 활용 목적에 따라 무척 다양할 수 있습니다.
시계열DB는 이러한 시계열 데이터들을 효율적으로 저장할 목적으로 사용되며 Grafana 같은 대쉬보드 툴과 연계하여 모니터링 용도로 주로 사용됩니다.



Why InfluxDB?

시계열DB를 선택함에 있어 가장 중요하게 고려할 점은 저장 및 조회 성능, 저장 공간 효율성, 유연한 확장가능성을 들 수 있을 것 같은데 그런 점에서 InfluxDB는 괜찮은 선택인 것 같습니다.
시계열DB 관련 트렌드 자료를 보아도 기존에 많이 사용되던 RRDTool 이나 Graphite 를 제치고 압도적인 1위로 성장하고 있음을 볼 수 있는데 아직 정식 1.0 버전이 출시되지 않은 상태임을 고려하면 대단한 발전인 듯 합니다.


작년 하반기까지는 Graphite 를 사용하여 Grafana와 연계하여 DB모니터링 툴을 만들어 사용하고 있었는데 다음과 같은 이유로 InfluxDB로 교체하여 지금껏 사용하고 있습니다. Graphite는 파이썬으로 개발되었고 메트릭 하나당 파일 한개씩 생성하는 구조로 동시 IO가 많은 상황에서는 좀 취약한 면이 있습니다. 
즉, N개 메트릭 저장시 N개의 파일IO를 일으켜야 하는 방식이라 동시에 많은 수의 메트릭을 저장한다면 클러스터링으로 서버 수를 늘려서 커버해야 했습니다.
이에 비해서 InfluxDB는 Go언어로 개발되었고  LSM(Log Structured Merge) Tree를 개량하여 시계열 데이터 저장에 최적화되도록 자체 개발한 TSM(Time Structured Merge) Tree를 스토리지 엔진으로 사용합니다. 그래서 동시성 및 IO처리 성능이 뛰어나며 압축 알고리즘도 적용하여 저장 용량 효율면에서  뛰어납니다. (정확히 말하면 처음에는 LevelDB(LSM Tree)를 스토리지 엔진으로 사용하였으나 0.10 버전부터 TSM Tree를 사용하고 있습니다.)
또한 Graphite는 더이상 업데이트가 안되는 듯하나  InfluxDB는 활발하게 업데이트되고 있는데 글을 쓰고 있는 현재 0.13 버전이 최신 버전이며 올여름에 1.0출시 예정이라고 합니다.


이외 InfluxDB의 주요 특징으로는 다음과 같은 점을 들 수 있습니다.
  • 오픈소스로서 MIT 라이센스
  • 의존 관계가 없어 설치가 매우 간편함.
  • SQL-like 문법을 사용하여 사용에 친숙함.
  • Schemaless 구조.
  • 클러스터링을 지원하여 확장 가능.
  • Grafana 와의 연계가 훌륭 함.



Let's Start InfluxDB

 Redhat & CentOS 에서의 설치 예는 다음과 같습니다. (타 플랫폼은 온라인 메뉴얼 참고)

su - 
wget --no-check-certificate https://s3.amazonaws.com/influxdb/influxdb-0.10.0-1.x86_64.rpm
yum localinstall influxdb-0.10.0-1.x86_64.rpm
service influxdb start

설치하면 /etc/influxdb/influxdb.conf 로 설정파일이 생기며 데이터파일들은 /var/lib/influxdb 에 생깁니다. 향후 운영관점에서 데이터가 늘어날 것을 대비하여 미리 용량이 충분한 위치로 데이터파일들을 옮기고 싶으면 아래와 같이 influxdb를 정지한 다음  데이터파일들을 옮긴 후 설정 파일을 수정하고 influxdb 를 다시 기동 하면 됩니다.

$ service influxdb stop
$
$ mv /var/lib/influxdb /data2/influxdb_data
$
$ vi /etc/influxdb/influxdb.conf

...
   [meta]
     # Controls if this node should run the metaservice and participate in the Raft group
     enabled = true
  
     # Where the metadata/raft database is stored
     dir = "/data2/Influxdb_data/meta"
  
     bind-address = ":8088"
     retention-autocreate = true
     election-timeout = "1s"
     heartbeat-timeout = "1s"
     leader-lease-timeout = "500ms"
     commit-timeout = "50ms"
     cluster-tracing = false
...
  
   [data]
     # Controls if this node holds time series data shards in the cluster
     enabled = true
  
     dir = "/data2/Influxdb_data/data"
     wal-dir = "/data2/Influxdb_data/wal"
     wal-logging-enabled = true
     data-logging-enabled = true
...

   [hinted-handoff]
     enabled = true
     dir = "/data2/Influxdb_data/hh"
     max-size = 1073741824
     max-age = "168h"
     retry-rate-limit = 0
...
    [admin]
      enabled = true
      bind-address = ":8083"
      https-enabled = false
      https-certificate = "/etc/ssl/influxdb.pem"
    
    [http]
      enabled = true
      bind-address = ":8086"
      auth-enabled = false
      log-enabled = false
      write-tracing = false
...

:wq

$ service influxdb start

데이터를 주고 받을 때 http 통신으로 8086 포트를 이용하는데 포트를 변경하고 싶으면 설정파일에서 수정 후 restart 하면 됩니다. 그리고 8083 포트는 어드민 페이지 접속 포트인데 아래와 같이 접속하여 간편하게 데이터 확인 및 유저 생성, 데이터 보관 주기 설정(retention policy)과 같은 어드민 설정도 가능합니다.



터미널에서 influx라고 입력하면 influxdb 관리 툴에 접속되며 쿼리 및 운영작업이 가능합니다.




Simple Data Test

논리적인 구조는 간단히 다음과 같은 명칭으로 구성되어 있습니다.
  • database :  set of measurements
  • measurement : table
  • tag : indexed column
  • field : no indexed column
아래는 InfluxQL(Influxdb Query Language) 로 데이터 입력 및 조회 하는 예시입니다.
[root@devdb:/root]# influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.10.0
InfluxDB shell 0.10.0
>
> show databases
name: databases
---------------
name
_internal
mydb
telegraf
melon

>
> create database testdb
>
> use testdb 
Using database testdb
>
> show measurements
>
> insert devdb,mon_type=os,metric=cpu_idle value=88.20
>
> show measurements
name: measurements
------------------
name
devdb

> select * from devdb
name: devdb
-----------
time                    metric          mon_type        value
1463151090146831513     cpu_idle        os              88.2

>
> insert devdb,mon_type=os,metric=cpu sys=11,user=15,io_wait=10
> insert devdb,mon_type=os,metric=cpu sys=11,user=15,io_wait=11,idle=63
>
> select * from devdb
name: devdb
-----------
time                    idle    io_wait metric          mon_type        sys     user    value
1463151090146831513                     cpu_idle        os                              88.2
1463151107975728431             10      cpu             os              11      15
1463151113823628131     63      11      cpu             os              11      15

>
insert devdb,mon_type=os,metric=cpu sys=11,user=15,io_wait=10
이 insert 문으로 예를 들면 다음과 같습니다.
measurement : devdb
tag key : mon_type, metric
tag value : os(mon_type), cpu(metric)
field key : sys, user, io_wait
field value : 11(sys), 15(user), 10(io_wait)
Schemaless 구조라 measurement나 tag, filed 를 생성하는 DDL을 수행하지 않고 바로 insert 하는 것을 볼 수 있습니다. 별로 중요한 건 아니지만 한가지 특이한 점은 출력 결과가 tag, field 가 구분되어 나오지 않고 단순히 알파벳 순서로 나열되어 나옵니다.

아래는 curl 을이용하여 http 통신으로 데이터를 입력하고 확인하는 예시입니다.

[root@devdb:/root]#
[root@devdb:/root]# curl -i -XPOST 'http://localhost:8086/write?db=testdb' --data-binary 'devdb,mon_type=os sys=30,user=15,io_wait=15,idle=40'
HTTP/1.1 204 No Content
Request-Id: 0d157f64-191c-11e6-af10-000000000000
X-Influxdb-Version: 0.10.0
Date: Fri, 13 May 2016 15:04:55 GMT
Connection: close

[root@devdb:/root]# influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.10.0
InfluxDB shell 0.10.0
>
> use testdb
Using database testdb
>
> select * from devdb
name: devdb
-----------
time                    idle    io_wait metric          mon_type        sys     user    value
1463151090146831513                     cpu_idle        os                              88.2
1463151107975728431             10      cpu             os              11      15
1463151113823628131     63      11      cpu             os              11      15
1463151895067151010     40      15                      os              30      15



마치며..

Graphite에서 InfluxDB로 교체 이후 확실히 체감 속도도 빠르고 저장 용량이나 Grafana와 유연하게 연계하는 부분등 여러모로 만족하며 사용하고 있습니다. 
기존에는 DB서버들의 OS 및 DB 모니터링 지표들을 10초 또는 60초 단위로 수집하였는데 지금은 1초 단위로 수집하여 Realtime 모니터링이 가능한 정도라고 보면 됩니다.(서버 1대댱 대략 100여개 메트릭) 
적절한 모니터링 툴이 없는 스타트업의 경우 약간의 노력으로 왠만한 상용 솔루션 부럽지 않은 모니터링 시스템을 만들 수도 있습니다.  
내부적으로 DB모니터링 목적으로 시작하였으나 지금은 어뷰징탐지, 서비스트래픽, 어플리케이션성능 모니터링 용도로도 활용 범위가 넓어졌는데 이럴 수 있는 것은 정말 약간의 노력 만으로 괜찮은 모니터링 대시보드를 금방 만들 수 있기 때문입니다. 
뭔가 모니터링 하고자하는 니즈가 있는 부서의 담당 개발자에게 데이터 수집 방법 및 Grafana로 대시보드 그리는 법 포함해서 30분 정도만 교육하면 얼마 안되서 바로 만들어서 활용하는 식입니다. 
 이처럼 시스템모니터링 용도뿐 아니라 서비스 반응을 실시간으로 모니터링하여 개선점 도출, 수정, 테스트, 배포 프로세스가 스피드있게 진행되어야 하는 DevOps 환경에서는 더욱 유용할 것입니다. 
실제로 최근부터 InfluxData 라는 솔루션으로 Custom DevOps Monitoring 이라는 용도를 정의하고 세일즈하고 있기도 합니다.  
이어서는 모니터링을 위한 데이터 수집 및 Grafana와 연계하여 모니터링 대시보드를 만드는 부분을 포스팅 하겠습니다.



# 추가 내용 (2016.07)
Clustering 기능은 0.12.0 버전 부터 오픈소스로는 지원하지 않고 비용을 지불하고 InfluxData라는 솔루션의 서비스로 이용해야 한다고 합니다.
즉, 오픈소스로는 standalone 모드로만 운영 가능한데 대신 Influx Relay라는 별도 오픈소스 프로젝트로 HA 기능을 구현할 수는 있다고 합니다.

아래 링크는 HA를 구현하는 다양한 방법에 대한 소개입니다. 




APEX(Applcation Express)를 활용한 SQL 협업 환경 만들기 (for Oracle)

DB를 운영하다 보면 개발자를 위한 SQL실행 환경을 제공할 필요가 있습니다.
실서비스DB는 일반적으로 DBA외에는 직접적인 SQL실행을 허용하지 않지만 테스트나 QA환경 같은 경우는 다수의 개발자들이 수시로 데이터를 확인해야 합니다.
SQL*Developer 같은 무료이고 좋은 툴도 있지만 DB로 직접 접속하는 클라이언트 툴이라 로컬 개발 환경이 아닌한 DB서버에 다수의 일반 개발자들이 직접 접속하도록 허용하지 않는 것이 보통입니다.
그래서 과거에는 웹기반의 iSQL*Plus 를 이용하여 게이트 역할을 하는 웹서버에서만 DB를 접근하고 개발자들은 웹브라우저에서 iSQL*Plus에 접속하여 데이터를 확인하기도 했었습니다.
그런데 11g 부터는 iSQL*Plus는 더이상 지원하지 않고 APEX(Application Express)를 사용해야 한다고 합니다.
APEX 는 Oracle DB 를 이용하여 웹 어플리케이션을 쉽게 개발 및 배포하기 위한 웹 기반의 통합개발 및 협업 환경 툴입니다.
즉, SQL실행은 APEX 포함된 일부 기능이고 원래의 모든 기능은 분량이 꽤 많습니다. (검색하다 보면 APEX 관련 해외 도서도 심심치 않게 볼 수 있습니다. -관련도서-)
여기서는 SQL조회 환경을 구축하는 것에 포커스를 맞춰서 정리하였습니다.
기회가 되어 다른 기능들도 알아보면 간단히 모니터링 툴이나 기타 관리툴을 만든다던지 꽤 유용하게 사용할 수 있을 것 같다는 생각도 듭니다.
그리고 중요한 건 APEX는 공짜라서 마음껏 써도 됩니다. :)


SQL조회 환경을 구축하기 위해서 다음 사항들을 중요하게 생각했고 그에 맞는 기능들을 찾아서 아래와 같이 적절히 사용했습니다.

- 사용자 및 권한 관리 기능 : APEX 에서 지원 
- 부서별 접근 데이터(스키마) 관리 : APEX에서 가능
- 리소스 과점유 방지 : Oracle Resource Manager 기능 활용
- 데이터 유출 위험 제거 : Oracle Data Redaction 기능 활용 (11.2.0.4 이상)

제작년 APEX 4 버전 부터 시작해서 작년 APEX 5 버전으로 업그레이드 하고 지금까지까지 약 2년 넘게 사용해본 바로는 기본적인 기능 및 관리적인 부분도 편리하여 만족스러운 것 같습니다.
설치에 앞서 APEX 아키텍처를 살펴보면 다음과 같습니다.


SQL을 실행할 대상DB에는 APEX 스키마가 설치되어 있어야 하며 DB가 여러대라면 각각의 DB인스턴스에 모두 설치해줘야 합니다. 그리고 Oracle Rest Data Service (ORDS) 를 어플리케이션 서버 에 설치하는데 ORDS 는 JAVA로 개발된 웹 어플리케이션으로 과거 4 버전 까지는 APEX Listener 라고 했었고 5버전 부터 ORDS 라고 이름이 바뀌었습니다. 검색하다가 APEX Listener 라고 보이면 ORDS와 같은 것으로 이해해도 괜찮을 것 같습니다.
APEX는 공짜라고 좋아했는데 그림에서 WebLogic 을 보는 순간 별로 의미없다는 생각이 들수도 있겠으나 WebLogic 없이 독립모드(Standalone mode)로도 구동 가능합니다.
동시사용자가 많은 상황에서는 독립모드는 부적합하겠으나 개발자를 위한 SQL조회 환경을 제공하는 정도라면 독립모드로도 충분합니다. 그러나 독립모드는 https를 지원하지 않는 제한이 있습니다. 저 같은 경우는 개인정보 보호 실태 조사를 했을 때 전송구간 암호화 조건을 충족하기 위하여 SE분의 도움으로 ORDS 앞단에 웹서버(apache)를 통하게 하여 https를 적용 하는 방법을 이용했었습니다. 테스트나 QA환경을 실서비스 데이터를 기반으로 구축한 경우는 전송구간 암호화 및 데이터 마스킹 기능도 중요하게 챙겨야 합니다. 여기서는 Standalone mode로 설치하며 설치 과정은 총 7단계로 정리하였습니다.



1. APEX 스키마 설치

APEX Download 에서 설치파일을 다운 받습니다.

지금은 5.0.3 버전까지 나와 있는데 여기서는 예전에 받아둔 5.0.1 버전으로 설치하였습니다.

testdb:/home/oracle/programs>ll
합계 186256
-rw-r--r-- 1 oracle dba 138044543 2015-07-23 10:49 apex_5.0.1.zip
-rw-r--r-- 1 oracle dba  52678336 2015-07-23 10:49 ords.3.0.1.177.18.02.zip
testdb:/home/oracle/programs>unzip apex_5.0.1.zip
..... 압축해제...
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>ll
합계 186260
drwxrwxr-x 6 oracle dba      4096 2015-07-06 06:01 apex
-rw-r--r-- 1 oracle dba 138044543 2015-07-23 10:49 apex_5.0.1.zip
-rw-r--r-- 1 oracle dba  52678336 2015-07-23 10:49 ords.3.0.1.177.18.02.zip
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>du -csh *
624M    apex
132M    apex_5.0.1.zip
51M     ords.3.0.1.177.18.02.zip
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>mv apex ../apex_5.0.1
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>cd /home/oracle/apex_5.0.1/
testdb:/home/oracle/apex_5.0.1>
testdb:/home/oracle/apex_5.0.1>ll
합계 560
-rw-r--r--  1 oracle dba   1593 2014-12-11 15:54 apex_epg_config.sql
-rw-r--r--  1 oracle dba   2205 2014-12-04 16:52 apex_epg_config_cdb.sql
-rw-r--r--  1 oracle dba   9166 2015-03-04 05:02 apex_epg_config_core.sql
.......
.......
.......
-rw-r--r--  1 oracle dba  15344 2015-06-21 01:52 devins.sql
-rw-r--r--  1 oracle dba   2166 2015-02-27 14:29 endins.sql
drwxrwxr-x 33 oracle dba  36864 2015-07-06 06:00 images
-rw-r--r--  1 oracle dba   3214 2014-09-20 18:36 load_trans.sql
drwxrwxr-x  6 oracle dba   4096 2015-07-06 06:00 utilities
testdb:/home/oracle/programs>
testdb:/home/oracle/programs>
압축을 푼 설치파일을 적절한 경로로 옮기고 해당 경로로 이동합니다. 여기서는 /home/oracle/apex_5.0.1 입니다.

testdb:/home/oracle/apex_5.0.1>
testdb:/home/oracle/apex_5.0.1>sqlplus '/as sysdba'

SQL*Plus: Release 11.2.0.4.0 Production on Fri Apr 8 00:15:31 2016

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Automatic Storage Management and Real Application Testing options

SQL> /* Full development environment */
SQL> !pwd
/home/oracle/apex_5.0.1

SQL>
SQL> @apexins.sql TBS_APEX TBS_APEX TEMP /i/
.. 생략 ..
.. 설치가 끝나면 SQL*Plus 프롬프트를 빠져 나온다.
.. SQL*Plus 다시 접속하여 생성된 스키마를 확인.
SQL> select username, default_tablespace, created, account_status, lock_date
from dba_users 
where created > trunc(sysdate)
order by created;

USERNAME                  DEFAULT_TABLESPACE             CREATED             ACCOUNT_STATUS                   LOCK_DATE
------------------------- ------------------------------ ------------------- -------------------------------- -------------------
APEX_PUBLIC_USER          USERS                          2016-04-04 17:05:18 EXPIRED & LOCKED                 2016-04-04 17:07:01
APEX_050000               TBS_APEX                       2016-04-04 17:05:18 EXPIRED & LOCKED                 2016-04-04 17:07:01
FLOWS_FILES               TBS_APEX                       2016-04-04 17:05:18 EXPIRED & LOCKED                 2016-04-04 17:07:01
SQL*Plus 에 sysadmin 으로  접속하여  apexins.sql 를 실행해 주면 APEX 와 관련된 3개의 스키마가 생성됩니다. apexins.sql 의 인자 정보는 다음과 같습니다.

  @apexins.sql tablespace_apex tablespace_files tablespace_temp images 


- tablespace_apex : APEX_050000 유저의 DEFAULT TABLESPACE 입니다. 여기서는 미리 생성해둔 TBS_APEX 를 사용했습니다.
- tablespace_files : FLOW_FILES 유저의 DEFAULT TABLESPACE 이며 마찬가지로 TBS_APEX를 사용했습니다.
- tablespace_temp : TEMPORARY TABLESPACE
- images : 웹서버의 이미지 가상 디렉토리 경로 입니다. 나중에 ORDS를 설치하고 이미지파일을 복사할때 이 경로대로 해야 합니다. (6번 과정)


2. APEX 어드민 인스턴스 생성 및 패스워드 설정


SQL> @apxchpwd.sql
================================================================================
This script can be used to change the password of an Application Express
instance administrator. If the user does not yet exist, a user record will be
created.
================================================================================
Enter the administrator's username [ADMIN]
User "ADMIN" does not yet exist and will be created.
Elapsed: 00:00:00.00
Enter ADMIN's email [ADMIN] 
Enter ADMIN's password []
Created instance administrator ADMIN
Elapsed: 00:00:00.23
sysadmin 으로 접속한 상태에서 apexchpwd.sql 을 실행하면 어드민 계정을 생성하고 패스워드를 설정합니다. 나중에 운영하다가 어드민 패스워드를 잊어버렸을 때 이파일을 실행하면 패스워드를 다시 설정할 수 있어서 이 파일은 기억해 두는 것이 좋습니다.


3. APEX_PUBLIC_USER 설정

SQL> alter user APEX_PUBLIC_USER account unlock;
SQL> alter user APEX_PUBLIC_USER identified by "apex";
SQL> select username, created, account_status, lock_date 
from dba_users 
where created > trunc(sysdate)
order by 2;

USERNAME                  CREATED             ACCOUNT_STATUS                   LOCK_DATE
------------------------- ------------------- -------------------------------- -------------------
APEX_PUBLIC_USER          2016-04-04 17:05:18 OPEN
APEX_050000               2016-04-04 17:05:18 EXPIRED & LOCKED                 2016-04-04 17:07:01
FLOWS_FILES               2016-04-04 17:05:18 EXPIRED & LOCKED                 2016-04-04 17:07:01
APEX_PUBLIC_USER 의 LOCK을 풀고 패스워드를 설정합니다.

SQL> alter profile DEFAULT limit PASSWORD_FILE_TIME unlimited;
SQL> SELECT * FROM DBA_PROFILES; 

PROFILE                        RESOURCE_NAME                    RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
DEFAULT                        COMPOSITE_LIMIT                  KERNEL   UNLIMITED
DEFAULT                        SESSIONS_PER_USER                KERNEL   UNLIMITED
DEFAULT                        CPU_PER_SESSION                  KERNEL   UNLIMITED
DEFAULT                        CPU_PER_CALL                     KERNEL   UNLIMITED
DEFAULT                        LOGICAL_READS_PER_SESSION        KERNEL   UNLIMITED
DEFAULT                        LOGICAL_READS_PER_CALL           KERNEL   UNLIMITED
DEFAULT                        IDLE_TIME                        KERNEL   UNLIMITED
DEFAULT                        CONNECT_TIME                     KERNEL   UNLIMITED
DEFAULT                        PRIVATE_SGA                      KERNEL   UNLIMITED
DEFAULT                        FAILED_LOGIN_ATTEMPTS            PASSWORD UNLIMITED
DEFAULT                        PASSWORD_LIFE_TIME               PASSWORD UNLIMITED
DEFAULT                        PASSWORD_REUSE_TIME              PASSWORD UNLIMITED
DEFAULT                        PASSWORD_REUSE_MAX               PASSWORD UNLIMITED
DEFAULT                        PASSWORD_VERIFY_FUNCTION         PASSWORD NULL
DEFAULT                        PASSWORD_LOCK_TIME               PASSWORD UNLIMITED
DEFAULT                        PASSWORD_GRACE_TIME              PASSWORD UNLIMITED
11g 부터는 default profile 의 PASSWORD_FILE_TIME 이 180 일입니다. 180일이 지나도록 패스워드를 바꿔주지 않으면 제대로 동작하지 않을 수 있으므로 DEFAULT PROFILE 의 PASSWORD_FILE_TIME 값을 UNLIMITED 로 변경하거나 별도 프로파일을 생성하여 지정하는 것이 좋습니다. 여기서는 편의상 DEFAULT PROFILE을 수정하였습니다.


4. APEX RESTful Service DB스키마 설치


SQL> @apex_rest_config.sql
.. 생략 ..
SQL> select username, created, account_status, lock_date from dba_users where created > trunc(sysdate) order by 2; USERNAME CREATED ACCOUNT_STATUS LOCK_DATE ------------------------- ------------------- -------------------------------- ------------------- APEX_PUBLIC_USER 2016-04-04 17:05:18 OPEN APEX_050000 2016-04-04 17:05:18 EXPIRED & LOCKED 2016-04-04 17:07:01 FLOWS_FILES 2016-04-04 17:05:18 EXPIRED & LOCKED 2016-04-04 17:07:01 APEX_REST_PUBLIC_USER 2016-04-04 20:31:53 OPEN APEX_LISTENER 2016-04-04 20:31:53 OPEN 5 rows selected.
1번 과정에서 압축해제한 설치파일 경로에서 apex_rest_config.sql 을 실행하면 APEX_REST_PUBLIC_USER 와 APEX_LISTENER 2개의 스키마가 생성됩니다. 생성 과정에서 DEFAULT TABLESPACE 는 미리 생성해둔 TBS_APEX 로 모두 지정하고 각각의 패스워드를 설정합니다. 이 패스워드는 바로 이어지는 ORDS 설치 시 입력해야 하므로 잘 기억해둡니다.


5. Oracle REST Data Service (ORDS) 설치 - Standalone Mode

ORDS Download 에서 다운로드 받고 압축을 해제하면 ords.war 파일이 나오는데  java -jar ords.war 명령어로 구동하면 됩니다. (노란색 음영 표시)

[root@testapp ords_testdb]# cd /home/public_html/dbtool/ords_testdb
[root@testapp ords_testdb]# unzip ords.3.0.1.177.18.02.zip
[root@testapp ords_testdb]#
[root@testapp ords_testdb]# ll합계 96572 drwxr-xr-x 3 root root 4096 2015-06-26 18:02 docs drwxr-xr-x 6 root root 4096 2015-06-26 18:06 examples drwxr-xr-x 2 root root 4096 2015-06-26 18:05 logs -rw-r--r-- 1 root root 52678336 2016-04-04 16:58 ords.3.0.1.177.18.02.zip -rw-r--r-- 1 root root 46155128 2015-06-26 18:05 ords.war drwxr-xr-x 2 root root 4096 2015-06-26 18:05 params -rw-r--r-- 1 root root 29870 2015-06-26 18:06 readme.html
[root@testapp ords_testdb]#
[root@testapp ords_testdb]# java -jar ords.war install advanced
이 Oracle REST Data Services 인스턴스는 아직 구성되지 않았습니다.
다음 프롬프트에 값을 입력하십시오.
구성 데이터를 저장할 위치를 입력하십시오.:/home/public_html/dbtool/ords_testdb
데이터베이스 서버의 이름을 입력하십시오. [localhost]:192.168.111.10
데이터베이스 수신 포트를 입력하십시오. [1521]:
데이터베이스 서비스 이름을 지정하려면 1을 입력하고, 데이터베이스 SID를 지정하려면 2를 입력하십시오. [1]:2
데이터베이스 SID를 입력하십시오. [xe]:ORATEST
Oracle REST Data Services 스키마를 확인/설치하려면 1을 입력하고, 이 단계를 건너 뛰려면 2를 입력하십시오. [1]:1
ORDS_PUBLIC_USER에 대한 데이터베이스 비밀번호를 입력하십시오.: New Password
비밀번호 확인:
Oracle REST Data Services 스키마를 확인하려면 SYSDBA 권한으로 로그인하십시오. 설치해야 할 수 있습니다.
설치를 확인하려면 SYSDBA 권한을 보유한 사용자 이름을 입력하십시오. [SYS]:
SYS에 대한 데이터베이스 비밀번호를 입력하십시오.:
비밀번호 확인:
4월 04, 2016 6:02:40 오후 oracle.dbtools.rt.config.setup.SchemaSetup addSchemaParams
정보:
Oracle REST Data Services 스키마가 존재하지 않으므로 생성됩니다.
ORDS_METADATA에 대한 기본 테이블스페이스을(를) 입력하십시오. [SYSAUX]:TBS_APEX
ORDS_METADATA에 대한 임시 테이블스페이스을(를) 입력하십시오. [TEMP]:
ORDS_PUBLIC_USER에 대한 기본 테이블스페이스을(를) 입력하십시오. [USERS]:TBS_APEX
ORDS_PUBLIC_USER에 대한 임시 테이블스페이스을(를) 입력하십시오. [TEMP]:
PL/SQL 게이트웨이를 사용하려면 1을 입력하고, 이 단계를 건너 뛰려면 2를 입력하십시오. [1]:2
Application Express RESTful Services 데이터베이스 사용자(APEX_LISTENER, APEX_REST_PUBLIC_USER)에 대한 비밀번호를 지정하려면 1을 입력하고, 이 단계를 건너 뛰려면 2를 입력하십시오. [1]:
APEX_LISTENER에 대한 데이터베이스 비밀번호를 입력하십시오.:
비밀번호 확인:
APEX_REST_PUBLIC_USER에 대한 데이터베이스 비밀번호를 입력하십시오.:
비밀번호 확인:
4월 04, 2016 6:03:20 오후 oracle.dbtools.common.config.file.ConfigurationFilesBase update
정보: Updated configurations: defaults, apex_pu
4월 04, 2016 6:03:20 오후 oracle.dbtools.installer.Installer installORDS
정보:
Oracle REST Data Services 버전 3.0.1.177.18.02을(를) 설치하는 중입니다.
... 로그 파일이 /home/public_html/dbtool/ords_stagedb/logs/ordsinstall_2016-04-04_180320_00126.log에 기록되었습니다.
... 데이터베이스 필요 조건이 확인되었습니다.
... Oracle REST Data Services 스키마가 생성되었습니다.
... Oracle REST Data Services 프록시 사용자가 생성되었습니다.
... Oracle REST Data Services에 권한이 부여되었습니다.
... Oracle REST Data Services 데이터베이스 객체가 생성되었습니다.
4월 04, 2016 6:03:30 오후 oracle.dbtools.installer.Installer installORDS
정보: Oracle REST Data Services 버전 3.0.1.177.18.02 설치가 완료되었습니다. 경과 시간: 00:00:10.396

독립형 모드를 시작하려면 1을 입력하고, 종료하려면 2를 입력하십시오. [1]:1
HTTP 포트를 입력하십시오. [8080]:8081
2016-04-04 18:09:42.586:INFO::main: Logging initialized @51500ms
4월 04, 2016 6:09:42 오후 oracle.dbtools.standalone.StandaloneJetty setupDocRoot
정보: Disabling document root because the specified folder does not exist: /home/public_html/dbtool/ords_stagedb/configdir/ords/standalone/doc_root
2016-04-04 18:09:43.408:INFO:oejs.Server:main: jetty-9.2.z-SNAPSHOT
4월 04, 2016 6:09:43 오후 oracle.dbtools.auth.crypto.CryptoKeysGenerator startup
정보: No encryption key found in configuration, generating key
4월 04, 2016 6:09:43 오후 oracle.dbtools.auth.crypto.CryptoKeysGenerator startup
정보: No mac key found in configuration, generating key
4월 04, 2016 6:09:43 오후 oracle.dbtools.common.config.file.ConfigurationFilesBase update
정보: Updated configurations: defaults
4월 04, 2016 6:09:43 오후 oracle.dbtools.auth.crypto.CryptoKeysGenerator startup
정보: Updated configuration with generated keys
2016-04-04 18:09:43.577:INFO:/ords:main: INFO: Using configuration folder: /home/public_html/dbtool/ords_stagedb/configdir/ords
2016-04-04 18:09:43.577:INFO:/ords:main: FINEST: |ApplicationContext [configurationFolder=/home/public_html/dbtool/ords_stagedb/configdir/ords, services=Application Scope]|
4월 04, 2016 6:09:43 오후 oracle.dbtools.common.config.db.DatabasePools validatePool
정보: Validating pool: apex_pu
4월 04, 2016 6:09:43 오후 oracle.dbtools.common.config.db.DatabasePools validatePool
정보: Pool: apex_pu is correctly configured
2016-04-04 18:09:43.844:INFO:/ords:main: INFO: Oracle REST Data Services initialized|Oracle REST Data Services version : 3.0.1.177.18.02|Oracle REST Data Services server info: jetty/9.2.z-SNAPSHOT|
2016-04-04 18:09:43.846:INFO:oejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@313b63e6{/ords,null,AVAILABLE}
2016-04-04 18:09:43.855:INFO:oejs.ServerConnector:main: Started ServerConnector@75338e4c{HTTP/1.1}{0.0.0.0:8081}
2016-04-04 18:09:43.855:INFO:oejs.Server:main: Started @52773ms
입력한 값들은 붉은 색으로 표시하였고 패스워드를 입력해야 하는 부분은 파란색으로 표시 하였습니다. DB서버 접속정보, ORDS 스키마 생성을  위한 SYS계정 정보, TABLESPACE 정보, 실행포트 등등 입력하라고 하는데 입력한 값들은 설정에 저장되어 이후에 ords.war 를 구동할 때는 입력하지 않고 바로 실행됩니다. SYS계정 정보는 ORDS스키마를 원격에서 생성하기 위해 일회성으로 입력 받은거라 저장되지 않습니다. "구성 데이터를 저장할 위치를 입력하십시오.:" 에서 지정한 경로를 보면 ords 라는 디렉토리가 생성되어 있는데 여기에 각종 설정 파일들이 저장되어 있습니다. 그리고 기본 포트는 8080 이지만 기존에 설치하 다른 인스턴스가 8080을 사용중이어서 여기서는 8081 로 설정했습니다. 별다른 에러 정보가 없다면 제대로 구동이 된 것이며 Ctrl+C 로 취소합니다. ORDS 설치된 다음 DB서버의 스키마 정보를 보면 아래와 같이 ORDS_METADATA, ORDS_PUBLIC_USER 2개의 DB서버에 생성된 것을 볼 수 있습니다.

SQL> select username, created, account_status, lock_date 
from dba_users 
where created > trunc(sysdate)
order by 2;

USERNAME                  CREATED             ACCOUNT_STATUS                   LOCK_DATE
------------------------- ------------------- -------------------------------- -------------------
APEX_PUBLIC_USER          2016-04-04 17:05:18 OPEN
APEX_050000               2016-04-04 17:05:18 EXPIRED & LOCKED                 2016-04-04 17:07:01
FLOWS_FILES               2016-04-04 17:05:18 EXPIRED & LOCKED                 2016-04-04 17:07:01
APEX_REST_PUBLIC_USER     2016-04-04 20:31:53 OPEN
APEX_LISTENER             2016-04-04 20:31:53 OPEN
ORDS_METADATA             2016-04-04 20:45:22 EXPIRED & LOCKED                 2016-04-04 18:03:22
ORDS_PUBLIC_USER          2016-04-04 20:45:23 OPEN

7 rows selected.




6. ORDS 기타 설정


[root@testapp standalone]#
[root@testapp standalone]# pwd
/home/public_html/dbtool/ords_testdb/ords/standalone
[root@testapp standalone]#
[root@testapp standalone]# ll
합계 8
drwxr-xr-x 3 root root 4096 2016-04-04 20:51 doc_root
-rw-r--r-- 1 root root  230 2016-04-05 14:17 standalone.properties
[root@testapp standalone]#
[root@testapp standalone]# cat standalone.properties
#Tue Apr 05 14:17:29 KST 2016
jetty.port=8081
standalone.context.path=/ords
standalone.doc.root=/home/public_html/dbtool/ords_testdb/ords/standalone/doc_root
standalone.static.context.path=/i
standalone.static.do.not.prompt=true
[root@testapp standalone]#
standalone.perperties 설정 정보에 있는 standalone.doc.root 의 경로 하위에 standalone.static.context.path 에 설정된 디렉토리로 이미지 파일들이 저장되어 있어야 하는데 여기서는 i 로 되어 있습니다.

1번 과정에서 설치한 DB서버의 apex 설치파일 경로에 보면 images 라는 디렉터리가 있는데 이 디렉터리 전체를 아래와 같이 doc_root 밑에 i  라는 이름으로 복사해와야 합니다.
[root@testapp standalone]#
[root@testapp standalone]# cd doc_root
[root@testapp doc_root]#
[root@testapp doc_root]# scp -r 192.168.111.10:/home/oracle/apex_5.0.1/images i
root@192.168.111.10's password:
...
...
...
[root@testapp doc_root]# ll
합계 40
drwxr-xr-x 33 root root 40960 2016-04-04 20:51 i
[root@testapp doc_root]#

conf  에는 DB 접속 정보가 xml 파일로 저장되어 있는데 apex.xml 파일이 없을 경우 아래와 같이 apex_pu.xml 파일을 카피해서 하나 만들어 줍니다.
[root@mptestagapp ords_testdb]#
[root@mptestagapp ords_testdb]# pwd
/home/public_html/dbtool/ords_testdb
[root@mptestagapp ords_testdb]#
[root@mptestagapp ords_testdb]# ll
합계 96704
-rw-r--r-- 1 root root        0 2016-04-05 14:17 derby.log
drwxr-xr-x 3 root root     4096 2015-06-26 18:02 docs
drwxr-xr-x 6 root root     4096 2015-06-26 18:06 examples
drwxr-xr-x 2 root root     4096 2015-06-26 18:05 logs
-rw------- 1 root root   130961 2016-04-08 16:36 nohup.out
drwxr-xr-x 4 root root     4096 2016-04-04 21:32 ords
-rw-r--r-- 1 root root 52678336 2016-04-04 20:48 ords.3.0.1.177.18.02.zip
-rw-r--r-- 1 root root 46155149 2016-04-04 20:49 ords.war
drwxr-xr-x 2 root root     4096 2015-06-26 18:05 params
-rw-r--r-- 1 root root    29870 2015-06-26 18:06 readme.html
[root@mptestagapp ords_testdb]#
[root@mptestagapp ords_testdb]# cd ords
[root@mptestagapp ords]#
[root@mptestagapp ords]# ll
합계 12
drwxr-xr-x 2 root root 4096 2016-04-04 21:32 conf
-rw-r--r-- 1 root root 1618 2016-04-04 21:32 defaults.xml
drwxr-xr-x 3 root root 4096 2016-04-04 20:51 standalone
[root@mptestagapp ords]#
[root@mptestagapp ords]# cd conf
[root@mptestagapp conf]#
[root@mptestagapp conf]# ll
합계 16
-rw-r--r-- 1 root root 325 2016-04-04 20:49 apex_al.xml
-rw-r--r-- 1 root root 328 2016-04-04 20:49 apex_pu.xml
-rw-r--r-- 1 root root 333 2016-04-04 20:49 apex_rt.xml
[root@mptestagapp conf]#
[root@mptestagapp conf]# cp apex_pu.xml apex.xml
[root@mptestagapp conf]#
[root@mptestagapp conf]# ll
합계 16
-rw-r--r-- 1 root root 328 2016-04-04 20:52 apex.xml
-rw-r--r-- 1 root root 325 2016-04-04 20:49 apex_al.xml
-rw-r--r-- 1 root root 328 2016-04-04 20:49 apex_pu.xml
-rw-r--r-- 1 root root 333 2016-04-04 20:49 apex_rt.xml




7. 접속

이제 모든 준비가 끝났고 아래와 같이 백그라운드로 구동 시키면 됩니다.
[root@testapp ords_testdb]# nohup java -jar /home/public_html/dbtool/ords_testdb/ords.war &
[1] 19079
[root@testapp ords_testdb]# nohup: ignoring input and appending output to `nohup.out'
[root@testapp ords_testdb]#
[root@testapp ords_testdb]#
[root@testapp ords_testdb]# ps -ef | grep ords
root     19079 49445 99 18:24 pts/3    00:00:04 java -jar /home/public_html/dbtool/ords_testdb/ords.war
root     19346 49445  0 18:24 pts/3    00:00:00 grep ords

http://host:8081 로 접속하여 아래와 같이 페이지가 제대로 뜨는지 확인합니다.



<참고>
Application Express Installation Guide
REST Data Services Installation and Configuration Guide
Oracle Application Express Troubleshooting