주요 기능 추가








Tagdata : Rollup Partition 테이블 교체

지금까지 Tagdata 테이블 의 Rollup Partition 테이블이 Log Table Type 이었습니다. 그래서 Partition 개수만큼 Log Table 이 많이 생성되어 있는 것과 같은 성능 부담을 가져왔습니다.

5.5 부터는 Rollup Partition 테이블 역시 Tagdata 테이블의 Partition Table Type 와 동일하게 변경되어, 낮은 CPU/메모리 비용으로 더욱 빠른 입력과 조회를 할 수 있습니다!













SELECT pd.start_time, pd.end_time, td.time, pd.name
FROM process_data pd, tag td
WHERE pd.name = td.name
 AND td.time BETWEEN pd.start_time AND pd.end_time
 AND td.name = '1';

 

 

 





Tagdata : 다른 테이블과 Join 가능

지금까지 Tagdata 테이블은, 단일 테이블로 태그 데이터를 빠르게 조회할 수 있는 성능에 집중했습니다.

이제는 편의성을 고려해, 다른 테이블과 Join 이 가능하도록 지원합니다. TAGNAME 이나 TAGTIME 과 Join 조건을 이루게 되면, 성능 저하를 최소화할 수 있도록 인덱스 기반 Join 을 수행하게 됩니다.










Tagdata : 다양한 Predicate 사용 가능

기존의 Tagdata 테이블 SELECT 구문의 조건은
TAGNAME Column = ? 과 TAGTIME 범위조건만 가능했습니다.

역시 편의성을 고려해서, 이제는 Tagdata 테이블에도 일반 테이블처럼 다양한 Predicate 을 사용할 수 있습니다. 다양한 표현으로 더 풍부해진 SELECT 쿼리를 해 보시기 바랍니다!








SELECT * FROM tag WHERE name LIKE 'TAG!%';










CREATE TAGDATA TABLE TAG (name VARCHAR(20) PRIMARY KEY, 
                          time DATETIME BASETIME, 
                          value DOUBLE SUMMARIZED);
INSERT INTO TAG METADATA VALUES ('TAG-A');

-- 아래 데이터를 APPEND 로 입력할 때엔, 
-- TAG-B 는 저장되어 있지 않지만 입력이 성공한다.
--   ('TAG-B', '2019-03-01 01:23:45', 36.5)







Tagdata : APPEND 시 TAGNAME 자동 생성

TAGDATA TABLE APPEND 할 때, TAGNAME 이 저장되어 있지 않은 경우에는 자동으로 TAGNAME 을 생성해서 Tag 데이터의 APPEND 를 속행할 수 있습니다.

제어할 수 있는 Property 는 TAGDATA_AUTO_NAME_INSERT_IN_APPEND 이며, 기본값은 1 (켜짐) 입니다.

현재는 APPEND 에서만 지원되며, INSERT 는 추후 패치를 통해 지원될 예정입니다.











Tagdata : INSERT INTO 에서 Bind 지원

CLI/ODBC 클라이언트를 통해 Tagdata 테이블에 입력할 경우, 지금까지는 Bind Variable 이 지원되지 않았습니다.

5.5 부터는 INSERT INTO 구문에 Bind Variable 을 사용해서 Tagdata 테이블 입력이 가능해졌습니다.





    if (SQLPrepare(sStmt, 
           (SQLCHAR *)"INSERT INTO TAG VALUES (?, '2010-01-01', 1.0)", 
           SQL_NTS) == SQL_ERROR) {
        printf("Prepare error\n");
    }

    if (SQLBindParameter(sStmt,
                         1,
                         SQL_PARAM_INPUT,
                         SQL_C_CHAR,
                         SQL_VARCHAR,
                         0,
                         0,
                         tagnameData,
                         0,
                         &tagnameDataSize) == SQL_ERROR) {
        printf("Bind error on tag name");
    }














    if (SQLPrepare(sStmt, 
           (SQLCHAR *)"SELECT * FROM tab1 DURATION ? SECOND", 
           SQL_NTS) == SQL_ERROR) {
        printf("Prepare error\n");
    }

    if (SQLBindParameter(sStmt,
                         1,
                         SQL_PARAM_INPUT,
                         SQL_C_UBIGINT,
                         SQL_INTEGER,
                         0,
                         0,
                         &sSecond,
                         0,
                         NULL) == SQL_ERROR) {
        printf("Bind error on duration second");
    }





DURATION 절에 Bind 지원

CLI/ODBC 클라이언트 프로그램에서 SELECT 구문을 사용할 경우, 마크베이스 독자적인 구절인 DURATION 절에는 Bind 를 지원하지 않았습니다.

5.5 에서는 DURATION 에도 Bind Variable 이 지원됩니다. 서버에 미리 쿼리문을 준비시킨 다음, 다양한 시간 구간을 빠르게 변경하여 효율적인 SELECT 쿼리가 가능합니다.










Disk Full 발생 시 알람 기능

마크베이스 서버가 위치한 디스크의 가용 공간의 일정 부분까지만 사용할 수 있습니다.

제어할 수 있는 Property 는 DISK_USED_RATIO_CAP 이며, 기본값은 0 (무제한) 입니다.

  • 해당 Property 는, 디스크의 사용 공간 비율(%) 을 나타냅니다.
  • Property 값이 설정되어 있는 경우, 해당 비율까지 디스크가 사용된 경우 다음의 현상이 발생합니다. 
    (이 디스크 사용은 마크베이스 서버의 사용과 무관할 수 있습니다.)
    • INSERT/APPEND 가 모두 실패하며, 디스크가 꽉 찼다는 에러 메시지를 반환합니다.
    • $MACHBASE_HOME/trc 의 machbase.trc 파일에, 디스크 사용량과 Property 값이 함께 출력됩니다.
    • $MACHBASE_HOME/trc 에 alert.trc 가 생성되며, 해당 파일에는 디스크의 사용량과 Property 값이 함께 저장되어 있습니다.





$ cat alert-2018_12_19_18_21_59.trc 

[2018-12-19 18:12:51]
[WARN] Storage space exhausted...
	1019Giga, 476Mega, 376832 bytes total.
	346Giga, 643Mega, 421888 bytes used.
	(34.0%) used, (66.0%) free, (34.0%) cap.

[2018-12-19 18:12:55]
[INFO] Storage space secured...
	1019Giga, 476Mega, 376832 bytes total.
	337Giga, 295Mega, 339968 bytes used.
	(33.1%) used, (66.9%) free, (34.0%) cap.

[2018-12-19 18:21:59]
[STARTUP]











Trace Log Level 추가

$MACHBASE_HOME/trc/machbase.trc 에 출력되는 로그의 레벨을 조정할 수 있는 Property 를 추가합니다.

제어할 수 있는 Property 는 TRACE_LOG_LEVEL 이며, 기본값은 0 입니다.

  • Level 0 : 기존 내용이 출력
  • Level 1 : Level 0 의 내용 + Cluster Edition 의 상세한 상태 출력
  • Level 2 : Level 1 의 내용 + 서버의 모든 입력/쿼리 수행에 대한 상세 경과 기록 (SELECT/APPEND/DML) + 세션 연결 시작/종료 기록
[2019-02-19 18:45:04 P-19295 T-139902498887424][INFO] Session is opened (Client IP : 192.168.0.31)
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (PREPARE): 0.173(ms) [insert into tag metadata values ('TAG_1', 'this is first!',  10, '192.168.0.1',  '2010-01-01')]
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (EXECUTE): 8.986(ms) [insert into tag metadata values ('TAG_1', 'this is first!',  10, '192.168.0.1',  '2010-01-01')]
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (PREPARE): 0.094(ms) [insert into tag metadata values ('TAG!_2', 'this is second.', 20, '192.168.1.20', '2009-01-02')]
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (EXECUTE): 9.128(ms) [insert into tag metadata values ('TAG!_2', 'this is second.', 20, '192.168.1.20', '2009-01-02')]
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (PREPARE): 0.093(ms) [insert into tag metadata values ('TAG!_4', 'this is fourth?',  40, null, '2008-01-03 12:00:00')]
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (EXECUTE): 9.223(ms) [insert into tag metadata values ('TAG!_4', 'this is fourth?',  40, null, '2008-01-03 12:00:00')]
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (PREPARE): 0.105(ms) [insert into tag metadata values ('TAG_5', null,  50, '192.168.2.50', null)]
[2019-02-19 18:45:05 P-19295 T-139902498887424][MM] Elapsed time (EXECUTE): 9.167(ms) [insert into tag metadata values ('TAG_5', null,  50, '192.168.2.50', null)]
[2019-02-19 18:45:05 P-19295 T-139902375159552][INFO] Session is opened (Client IP : 192.168.0.31)
[2019-02-19 18:45:05 P-19295 T-139902375159552][MM] Append Open. (TAG)
[2019-02-19 18:45:05 P-19295 T-139902375159552][MM] Append Close. (TAG)
[2019-02-19 18:45:05 P-19295 T-139902375159552][OK] Service Thread Finished !!
[2019-02-19 18:45:05 P-19295 T-139902375159552][INFO] Session is closed (Client IP : 192.168.0.31)














Tag Analyzer : 고정 X축 간격 설정

Zoom 을 할 때 마다 X축의 간격이 자동으로 설정되지만, 이 값을 고정할 수 있게 되었습니다.

설정 화면에서 Axes > X-axis Interval 을 정하면 됩니다.










Tag Analyzer : 여러 Tag 를 하나의 Series 로 표시

TAG-A 는 10시부터 11시까지, TAG-B 는 11시부터 12시까지의 센싱 정보를 가지고 있다면, 이를 연결해서 볼 수 있는 방법도 필요합니다.

5.5부터는 Tag Analyzer 에서 이 기능을 지원합니다.

설정 창에서 Data > Tags 에 있는 태그에 콤마로 연결된 태그 이름 목록을 입력하면 연결이 됩니다. 동일 시점에 중복된 데이터가 존재하면, 이름 목록에서 앞에 위치한 태그의 데이터가 우선 표시됩니다.














-- _arrival_time 이 가장 작은 레코드의 i1 값을 획득
select first(_arrival_time, i1) from t1;

-- _arrival_time 이 가장 작은 레코드의 i1 값과, 
-- _arrival_time 이 가장 큰 레코드의 i1 값을 획득
select first(_arrival_time, i1), last(_arrival_time, i1) from t1;





Aggregate Function : FIRST/LAST

SELECT 와 GROUP BY 로 생성한 각 Group 에서, 기준이 되는 컬럼 값이 순서상 가장 작은 (또는 순서상 가장 큰) 레코드의 다른 컬럼 값을 반환하는 집계 함수입니다.

이것으로, 레코드의 기준 값을 별도로 정렬하지 않고도 순서 상 첫 번째 (또는 마지막) 레코드의 값들을 더 효율적으로 조회할 수 있습니다.










DELETE Log : 자동 DELETE 기능

아래의 CREATE TABLE 구문과 같이, 입력 시점에 특정 조건을 만족하는지 확인한 후 DELETE 를 자동으로 수행하는 기능을 제공합니다.

  • 마지막 입력 시점과 현재 입력 시점 기간이 설정된 '대기 구간' 을 넘지 않았다면, DELETE 는 발생하지 않습니다.
  • 마지막 입력 시점과 현재 입력 시점 기간이 설정된 '대기 구간' 에 도달했거나 넘었다면, DELETE 를 수행합니다.
  • 이 기능으로 실제로 레코드가 삭제되었다면, trace log 에 관련 내용이 기록됩니다.





-- '입력 시점'에 다음을 검사한다.
--   >> 최근 삭제 시점보다 1시간 이상 경과한 경우, 
--      최근 2일치를 제외한 모든 레코드를 삭제한다.
CREATE TABLE t1 (...) KEEP 2 DAY AFTER APPEND INTERVAL 1 HOUR;












// Set the SQL_ATTR_PARAM_BIND_TYPE statement attribute to use 
// column-wise binding. 
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN, 0); 
 
// Specify the number of elements in each parameter array. 
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMSET_SIZE, ARRAY_SIZE, 0); 
 
// Specify an array in which to return the status of each set of 
// parameters. 
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAM_STATUS_PTR, ParamStatusArray, 0); 
 
// Specify an SQLUINTEGER value in which to return the number of sets of 
// parameters processed. 
SQLSetStmtAttr(hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, &ParamsProcessed, 0); 
 
// Bind the parameters in column-wise fashion. 
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 5, 0, 
                  PartIDArray, 0, PartIDIndArray); 
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DESC_LEN - 1, 0, 
                  DescArray, DESC_LEN, DescLenOrIndArray); 
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0, 
                  PriceArray, 0, PriceIndArray);





CLI : Array Binding

SQLBindParameter() 에서 하나의 값이 아닌 배열을 바인딩할 수 있는 기능을 사용할 수 있습니다.

여러 Bind - Execute 를 반복하게 되면 네트워크 비용을 불필요하게 소모하고 그만큼 유휴 시간이 늘어나 비효율적입니다.
반복적으로 값을 바인딩해야 한다면, 배열을 통째로 전달해서 효율적인 쿼리 연산을 할 수 있습니다.

현재는 열 단위 바인딩 (Column-wise binding) 만 지원합니다.










Cluster : Coordinator Role 변경

이전까진 Coordinator 가 Primary/Secondary 로 고정되어 있어, 안정성보다 발생하는 문제가 더욱 많았습니다.

5.5 에서는, 고정되어 있던 Coordinator 의 역할을 상황에 따라 변경될 수 있도록 수정했습니다.

이제는 Primary 가 사라지면 Secondary 가 Primary 로 바뀌며, 사라진 Primary 가 돌아와도 Secondary 로 바뀌면서 클러스터에 합류하게 됩니다.














$ machcoordinatoradmin --get-host-resource -i
-------------------------------------------------------------------------
     Machbase Coordinator Administration Tool
     Release Version - x.x.x.official
     Copyright 2014, MACHBASE Corp. or its subsidiaries
     All Rights Reserved
-------------------------------------------------------------------------
Host Name : 192.168.0.32
   CPU Info :
      Model Name          : Intel(R) Xeon(R) CPU E3-1231 v3 @ 3.40GHz
      Number of CPUs      : 8
      Number of CPU Cores : 4
      CPU Utilization     : 18.5%
      CPU IOWait Ratio    : 0.0%
   Memory Info :
      Physical Memory Utilization : 94.2%
      Virtual Memory Utilization  : 85.1%
   Network Info :
      Receive Bytes(per second)    : 35827
      Receive Packets(per second)  : 250
      Transmit Bytes(per second)   : 35716
      Transmit Packets(per second) : 248
   Disk Info :
      /dev/sda1 : 87.0%
         |-> 192.168.0.32:32110   /home/cumulus/work/nfx/test/nodes/coordinator1
         |-> 192.168.0.32:32310   /home/cumulus/work/nfx/test/nodes/broker1
         |-> 192.168.0.32:32410   /home/cumulus/work/nfx/test/nodes/active1_1
         |-> 192.168.0.32:32520   /home/cumulus/work/nfx/test/nodes/active2_2





Cluster : 호스트 자원 모니터링 기능

5.5 부터는 Cluster Edition 에서 각 Node 가 상주한 호스트의 자원을 모니터링할 수 있습니다. 다음은 수집할 수 있는 자원 정보를 나타냅니다.

  • CPU
  • Memory
  • Network
  • Disk

Coordinator 에 요청할 때, 각 호스트에서 주기적으로 수집한 정보를 제공합니다.

  • Command-line 을 통해 machcoordinatoradmin 에서 --get-host-resource명령을 입력해 요청 (plaintext 로 제공)
  • RESTful API (/Get-Host-Resource)를 통해 요청하거나 (JSON format 으로 제공)
# Coordinator host 에서 command-line 을 통해 요청
machcoordinatoradmin --get-host-resource -i

# Coordinator 의 HTTP Admin Host:Port 에서 RESTful API 요청
curl http://192.168.0.32:32112/Get-Host-Resource









그 외 변경사항


Tagdata : ROLLUP_ENABLE

ROLLUP_ENABLE Property 가 추가되었습니다.
Tagdata 테이블의 Rollup 기능을 끄고자 할 때 변경하면 됩니다.

  • 1로 두면 Rollup 기능을 사용하며, 0으로 두면 Rollup 기능을 사용하지 않습니다.
    (Rollup 테이블은 존재하며, 조회도 가능하지만 새로운 결과값이 없습니다.)
  • 기본값은 1 입니다.

CPU_AFFINITY_COUNT 음수 지원

CPU_AFFINITY_COUNT 에서 음수를 지원합니다. 사용 가능한 CPU Core 개수에서 해당 값을 뺀 나머지를 AFFINITY_COUNT 로 적용합니다.
이 때 CPU_AFFINITY_BEGIN_ID Property 값에서 출발하기 때문에, 주의해서 사용해야 합니다.

해당 Property 의 기본값은 여전히 0 (모두 사용) 입니다.


같은 테이블 DELETE 동시 수행 방지

DELETE 동시 수행을 요청하더라도, DELETE 는 순차적으로 진행되어 이후 SELECT 를 방해합니다.
따라서 DELETE 가 수행 중인 경우에는, 동시에 요청된 DELETE 는 모두 에러 메시지를 발행하도록 변경되었습니다.


Tagdata : TAGNAME 에도 UPDATE 가능

TAGNAME 은 인덱스가 있었기 때문에 불가능했던 UPDATE 구문이, 이제 가능해졌습니다.

UPDATE TAG METADATA SET NAME = 'TAG-AA' WHERE NAME = 'TAG-A';


Tagdata : DISK_KEYVALUE_DELETE_LOCKFREE

DISK_KEYVALUE_DELETE_LOCKFREE Property 를 통해, 다양한 현장 상황에서 요구사항을 만족할 수 있도록 제어할 방법을 마련했습니다.

기본적으로 Tagdata Table 은 가장 최신 파일 데이터에 대한 DELETE 를 진행하지 않는데, 다음 가정을 산정하고 있기 때문입니다.

  • 사용자는 기본적으로 오래된 데이터를 삭제한다.
  • 일반적으로 사용자가 입력하는 최신 데이터는, 삭제할 과거 시점의 데이터가 들어오지 않을 것이라고 가정한다.

다음 가정을 기반으로, 생성 중인 최신 파일 데이터에 대한 DELETE 를 수행하지 않음으로써 데이터 삭제와 입력/조회가 동시에 들어와도 성능 저하가 발생하지 않습니다. 하지만 다음 가정을 만족하지 못하는 환경이라면 (e.g. Batch 로 과거 데이터를 자주 이전하는 현장) 비즈니스 요구사항에 부합하지 않는 작동 방식입니다.

따라서, 해당 Property 값을 변경해 최신 파일 데이터에 대해서도 DELETE 를 수행하도록 할 수 있습니다.

  • 1 로 두면, 최신 파일 데이터에 대해 DELETE 를 하지 않습니다. 0으로 두면, 최신 파일 데이터에 대해서도 DELETE 를 수행합니다.
  • 기본값은 1입니다. 위의 가정을 만족하지 못하는 환경이라면 0으로 변경해야 합니다.


DATE_TRUNC() 시간 범위 제한 해제

각 시간 단위마다, 시간 범위가 제한되었던 문제가 해결되었습니다. 
예를 들어, 초 단위인 경우에는 resolution 값이 45초를 넘을 수 없었지만, 지금은 86400 초 까지 사용 가능합니다.

second86400
minute1440
day1
month1
year1


Cluster Edition : DDL 부분 실패해도, Cluster 서비스를 계속함

부분적으로 몇몇 Node 가 DDL 이 실패하게 되면, Cluster 전체가 서비스를 못 하는 상황이 발생했었습니다.
이제는 DDL 이 실패하더라도, 성공한 Node 만으로 Cluster 서비스를 계속하도록 수정했습니다.

실패한 Node 는 DDL-incompleted 상태가 되며, 별도 조치가 필요하거나 Remove-Node 로 삭제해야 합니다.


Explain 명칭 변경

SELECT 쿼리의 Plan Node 를 확인하기 위한 explain 키워드를 사용하면, 알아보기 힘든 Node 이름으로 나왔습니다.

5.5 에서는 좀 더 직관적인 이름으로 출력하도록 변경되었습니다.

~5.15.5


explain select count(*) from tag;
PLAN
---------------------------------
 QPN_NODE_TYPE_PROJ              
  QPN_NODE_TYPE_TAG_READ (RAW)   
   QPN_NODE_TYPE_COUNTSTAR 



explain select count(*) from tag;
PLAN                             
---------------------------------
 PROJECT                         
  TAG READ (RAW)                 
   COUNTSTAR         



디스크 사용량 조회 기능

DISK_USED_RATIO_CAP Property 로 디스크 사용량을 감지하고 있기 때문에, Fixed table 로 관련 정보를 공유할 수 있습니다.

Table 이름은 V$STORAGE_USAGE 입니다.

Mach> SELECT * FROM V$STORAGE_USAGE;
TOTAL_SPACE  USED_SPACE   USED_RATIO                  RATIO_CAP                   
---------------------------------------------------------------------------------------
461GB        196GB        42.5806                     100                         
[1] row(s) selected.
Elapsed time: 0.001
Mach>


SYS 와 일반 사용자의 권한 조정

권한을 다루는 SQL (GRANT, REVOKE) 는 지원하지 않습니다만, 적어도 관리자 계정인 SYS 와 그 외 계정의 권한 분리는 필요하다고 판단했습니다.

따라서 5.5 부터는 다음의 권한 정책이 적용됩니다. 간단히 말씀드리면, SYS 는 전부 가능하고 일반 사용자는 각자의 테이블에만 권한이 있습니다. 


SYS일반 사용자
다른 사용자의 테이블 조회OX
다른 사용자의 테이블 입력OX
machsql show tables 명령모든 테이블 조회현재 사용자 테이블만 조회