참고:

Oracle Cloud Infrastructure Streaming과 Oracle Database를 사용한 스트림 분석

소개

Oracle Cloud Infrastructure Streaming은 OCI(Oracle Cloud Infrastructure)의 확장성이 뛰어난 고가용성 스트리밍 서비스입니다. 스트림 서비스는 완벽한 서버리스이며 Apache Kafka와 호환되는 API입니다.

Kafka에 대한 Oracle SQL 액세스Oracle PL/SQL 패키지 및 외부 테이블 선행 프로세서입니다. Oracle Database를 사용하여 Oracle Database에서 Kafka 토픽의 이벤트와 메시지를 읽고 처리할 수 있습니다. Kafka의 데이터가 Oracle Database 테이블에 있거나 Oracle Database 뷰에서 표시되면 Oracle Database의 다른 모든 데이터와 마찬가지로 Oracle PL/SQL의 모든 기능을 사용하여 질의할 수 있습니다.

Kafka 지원 뷰에 대한 Oracle SQL 액세스로 데이터를 검색할 경우 데이터가 Oracle Database에 지속되지 않습니다. 그러나 Kafka 기반 테이블에 대한 Oracle SQL 액세스를 사용할 때는 Oracle Database에 보관됩니다. 따라서 Kafka에 대한 Oracle SQL 액세스를 통해 개발자는 Oracle Database의 스트리밍 데이터를 유연하게 유지할 수 있습니다. Kafka에 대한 Oracle SQL 액세스에 대한 자세한 개요 및 사용 사례는 Oracle SQL Access to Kafka Views를 사용한 데이터의 데이터 증가에 대한 통합 블로그 게시물을 참조하십시오.

간단히 말해 Kafka에 대한 Oracle SQL 액세스를 통해 Oracle PL/SQL을 사용하여 유휴 상태(Oracle Database 테이블 내부)와 함께 이동 중인 데이터를 처리할 수 있습니다. 따라서 응용 프로그램(예: JDBC)은 Java 데이터베이스 연결(JDBC)에서 Kafka 및 중요한 Oracle Database 데이터로부터 실시간 이벤트를 처리하여 ACID를 보장합니다. 애플리케이션이 Oracle Database에서 별도로 Kafka 이벤트와 데이터를 인출하면 이러한 작업이 용이하지 않습니다.

복리후생

  1. 고객은 Kafka에 대한 Oracle SQL 액세스를 사용하여 외부 데이터 저장소로 이동하지 않고도 스트림 서비스에서 데이터를 직접 읽어 Oracle PL/SQL을 사용하여 실시간 스트림 분석 작업을 실행할 수 있습니다.
  2. 또한 고객은 어떤 처리 과정도 없이 스트림 서비스에서 Oracle Database로 데이터를 이동하기 위해 Kafka에만 Oracle SQL로 접근할 수 있습니다.
  3. 응용 프로그램에서 제어하는 Oracle ACID 트랜잭션의 컨텍스트 내에서 스트림 처리 작업을 수행할 수 있습니다.
  4. Kafka에 대한 Oracle SQL 액세스는 Kafka 소비자로만 작동하며 Kafka 생산업체는 아닙니다. 전체 오프셋 관리는 OSaK에서 처리됩니다. 이 정보는 Oracle Database의 메타데이터 테이블에 저장됩니다. 따라서 Kafka에 대한 Oracle SQL 액세스는 Kafka 및 스트림 서비스에 대해 분할 영역 오프셋을 커밋하고, Oracle Database 트랜잭션을 단일 ACID 준수 Oracle Database 트랜잭션으로 애플리케이션 데이터를 Oracle Database에 커밋할 수 있으므로 정확한 처리 의미를 지원합니다. 이렇게 하면 스트리밍 레코드가 손실되거나 다시 읽지 않습니다.

사용 사례

스트리밍 데이터를 관계형 데이터와 연관시키거나 결합하려는 사용 사례를 가정해 보십시오.

  1. IoT 디바이스의 스트리밍 데이터를 고객 구내에 있는 대부분 고객 정보와 소스 관계형 Oracle Database에 저장된 관련 고객 정보를 결합하고 싶습니다.
  2. 스트림 서비스로 스트리밍되는 재고 가격에 대한 정확한 지수 이동 평균을 계산하려고 합니다. 이 작업은 정확한 의미 체계를 통해 수행해야 합니다. 이 데이터를 Oracle Database에 저장된 해당 재고에 대한 정적 정보(예: 이름, 회사 ID, 시가)와 결합하고자 합니다.

Kafka에 대한 Oracle SQL 액세스는 Oracle Server 호스트에 수동으로 설치해야 하는 PL/SQL 패키지이므로 자체 관리(온프레미스 또는 온프레미스) Oracle Database 설치에서만 작동할 수 있습니다. OCI(Oracle Cloud Infrastructure)상에서 Oracle Autonomous Database와 같은 서버리스 Oracle Database 오퍼링에는 효과가 없습니다.

스트림 서비스는 Kafka와 API 호환되므로 Kafka에 대한 Oracle SQL 접근과 원활하게 연동됩니다. Oracle SQL에서 Kafka Point of view에 접근한 스트림 서비스 스트림 풀은 Kafka 클러스터이고 스트림 서비스 스트림은 Kafka 클러스터의 한 주제입니다.

이 사용지침서에서는 Kafka에 대해 Oracle SQL 접근과 스트림 서비스를 간편하게 통합할 수 있는 방법을 보여줍니다.

주: Kafka, 스트림 서비스, Kafka에 대한 Oracle SQL 액세스를 이미 잘 알고 있으며, 스트림 서비스와 함께 Kafka에 대해 Oracle SQL 액세스를 사용하려는 경우 직접 Oracle Cloud Infrastructure Streaming Clusters for Oracle SQL 액세스를 Kafka 단계 2.1로 설정할 수 있습니다. 필요에 따라 자습서의 나머지 부분을 건너뜁니다.

필요 조건

Oracle Cloud Infrastructure Streaming과 Kafka 통합에 대한 Oracle SQL 액세스

Oracle Cloud Infrastructure에서 스트림 풀 및 스트림 생성

  1. 다음과 같이 OCI 계정/테넌시에 로그인하고 이름이 StreampoolForOsak인 스트림 서비스 스트림 풀과 이름이 StreamForOsak인 스트림을 설정합니다.

    OCI에서 스트림 풀 생성

  2. 이제 방금 만든 스트림 풀 StreampoolForOsakStreamForOsak라는 스트림을 만듭니다.

    OCI에 스트림 생성

이러한 리소스 생성에는 기존 구획을 사용할 수 있습니다. 편의를 위해 이름이 OssOsakIntegration인 새 구획을 생성했으며 모든 리소스가 동일한 구획에 있습니다.

스트림 서비스 용어에서는 Kafka 주제를 스트림이라고 합니다. 따라서 Oracle SQL에서 Kafka Point of view에 액세스할 때 StreamForOsak 스트림은 세 개의 분할 영역이 있는 Kafka 토픽입니다.

이제는 스트림 서비스 스트림을 생성합니다. 그런 후에 Stream Service와 Kafka라는 용어는 서로 바꿔서 사용할 수 있습니다. 마찬가지로 Stream과 Kafka 토픽은 서로 바꿔서 사용할 수 있습니다.

Oracle Cloud Infrastructure에서 유저, 그룹 및 정책 생성

스트림 서비스 사용에 적합한 권한을 가진 기존 사용자가 이미 있는 경우 2단계를 완전히 건너뛸 수 있습니다.

  1. Oracle SQL에서 Kafka에 액세스할 수 있는 스트림 서비스 스트림을 사용하려면 새 OCI 사용자를 생성해야 합니다. 다음과 같이 OCI 웹 콘솔에서 사용자 이름 OssOsakUser로 이 용도로 새 사용자를 생성합니다.

    OCI 사용자 생성

  2. 사용자 OssOsakUser가 스트림 서비스(Kafka API 사용)로 자신을 인증하려면 다음과 같이 이 새 사용자에 대한 auth-token을 만들어야 합니다.

    사용자 인증 토큰 생성

    토큰을 생성한 후에는 먼저 auth-token을 확인하고 복사할 수 있습니다. 따라서 인증 토큰을 복사한 다음 나중에 액세스할 수 있는 위치에 안전하게 보관하십시오. 특히 Kafka에 대한 Oracle SQL 액세스를 위해 Kafka 클러스터를 구성할 때 이후 단계에 이 절차가 필요합니다. Kafka에 대한 Oracle SQL 액세스 권한은 내부적으로 Kafka 소비자 API를 사용하여 스트림 서비스에 액세스하기 위해 OssOsakUser 및 해당 인증 토큰을 사용합니다.

  3. 또한 스트림 서비스 클러스터에 액세스하려면 OssOsakUser에 적절한 권한 집합이 OCI IAM에 있어야 합니다.

    OCI에서 유저는 자신이 속한 유저 그룹에 할당된 정책을 사용하여 권한을 얻습니다. 따라서 OssOsakUser에 대한 그룹을 생성한 다음 해당 그룹에 대한 정책을 생성해야 합니다.

    다음과 같이 사용자 그룹을 만듭니다.

    사용자 그룹 생성

  4. 사용자 OssOsakUser을 사용자 그룹 OssOsakUserGroup에 추가합니다.

    그룹에 사용자 추가

  5. OssOsakUser에 스트림 서비스 스트림을 사용하도록 권한 부여하려면 특히 해당 스트림에서 메시지를 게시하고 읽도록 하려면 테넌시에 다음 정책을 생성해야 합니다. 이 정책은 생성된 후 그룹 OssOsakUserGroup의 모든 사용자에게 권한을 부여합니다. 사용자 OssOsakUser이 동일한 그룹에 있으므로 동일한 권한을 획득합니다.

    policy

    위의 동일한 정책에 대한 텍스트 조각은 다음과 같습니다.

    Allow group OssOsakUserGroup to manage streams in compartment OssOsakIntegration  
    Allow group OssOsakUserGroup to manage stream-push in compartment OssOsakIntegration   
    Allow group OssOsakUserGroup to manage stream-pull in compartment OssOsakIntegration  
    Allow group OssOsakUserGroup to manage stream-family in compartment OssOsakIntegration
    

Oracle Database 호스트에 Kafka에 대한 Oracle SQL 액세스 설치

  1. Kafka 키트에 대한 Oracle SQL 액세스는 널리 사용되는 SQL Developer의 일부로 제공됩니다.

    SQL Developer 링크를 사용하여 SQL Developer의 최신 버전을 다운로드합니다. 이 자습서의 작성 당시 최신 SQL Developer 버전은 20.4입니다.

    Oracle Database 호스트와 동일한 플랫폼에 대해 Oracle SQL Developer를 다운로드해야 합니다. Oracle SQL Developer for Oracle Linux RPM을 다운로드합니다(Oracle Database가 Oracle Linux Platform에서 실행 중이므로).

    다운로드가 완료되면 unzip 또는 tar 명령을 사용하여 임의의 디렉토리/폴더에 Oracle SQL Developer의 RPM/zip 파일 내용을 추출합니다.

    tar xvf sqldeveloper-20.4.0.379.2205-20.4.0-379.2205.noarch.rpm
    
  2. Oracle SQL Developer 내용이 추출된 디렉토리로 이동하여 다음과 같이 orakafka.zip라는 Kafka ZIP 파일에 대한 Oracle SQL 액세스를 찾습니다.

    $ find . -name 'orakafta*'  
    ./sqldeveloper/orakafta  
    ./sqldeveloper/orakafta/orakafta.zip
    

    Kafka 키트에 대한 Oracle SQL 액세스는 orakafka.zip 파일에 있습니다. 이 데모의 SQL 개발자의 나머지 내용에는 관심이 없습니다. Oracle SQL에서 Kafka로의 설치 및 사용 방법에 대해 알고 있는 바와 같이 orakafka.zip도 필요합니다.

  3. scp 명령 또는 GUI 기반 FTP 클라이언트(예: FileZilla)를 사용하여 orakafka.zip 파일을 Oracle Database 호스트에 복사합니다.

    SSH를 Oracle Database 노드로 이동하고 mv_ command를 사용하여 orakafka.zip/home/oracle(oracle 유저의 홈 디렉토리)로 이동합니다.

  4. Kafka에 Oracle SQL 액세스를 설치하기 위한 나머지 지침을 보려면 Oracle Database 호스트에서 oracle 사용자로 전환해야 합니다.

    현재 작업 디렉토리가 /home/oracle인지 확인합니다. 동일한 디렉토리에 orakafka.zip이 이미 있습니다.

    [opc@dbass ~]$ sudo su - oracle  
    Last login: Sat Feb 20 09:31:12 UTC 2021  
    [oracle@dbass ~]$ pwd  
    /home/oracle  
    [oracle@dbass ~]$ ls -al  
    total 3968  
    drwx------ 6 oracle oinstall    4096 Feb 19 17:39 .  
    drwxr-xr-x 5 root   root        4096 Feb 18 15:15 ..  
    -rw------- 1 oracle oinstall    4397 Feb 20 09:31 .bash_history  
    -rw-r--r-- 1 oracle oinstall      18 Nov 22  2019 .bash_logout  
    -rw-r--r-- 1 oracle oinstall     203 Feb 18 15:15 .bash_profile  
    -rw-r--r-- 1 oracle oinstall     545 Feb 18 15:20 .bashrc  
    -rw-r--r-- 1 oracle oinstall     172 Apr  1  2020 .kshrc  
    drwxr----- 3 oracle oinstall    4096 Feb 19 17:37 .pki  
    drwxr-xr-x 2 oracle oinstall    4096 Feb 18 15:20 .ssh  
    -rw-r--r-- 1 oracle oinstall 4002875 Feb 19 17:38 orakafka.zip
    
  5. orakafka.zip을 추출하거나 압축을 해제합니다. 이렇게 하면 orakafka-<version>라는 새 디렉토리가 추출됩니다. 이 경우 다음과 같이 orakafka-1.2.0입니다.

    [oracle@dbass ~]$ unzip orakafka.zip  
    Archive:  orakafka.zip 
    creating: orakafka-1.2.0/  
    

추출: orakafka-1.2.0/kit_version.txt
인플레이션: orakafka-1.2.0/orakafka_distro_install.sh
추출: orakafka-1.2.0/orakafka.zip
인플레이션: orakafka-1.2.0/README


6. Now we follow the instructions found in the _**orakafka-1.2.0/README**_ for the setup of Oracle SQL access to Kafka. We follow _simple install_ for single-instance Oracle Database. 

This README doc has instructions for Oracle SQL access to Kafka installation on Oracle Real Application Clusters (Oracle RAC) as well. By and large, in the case of Oracle RAC, we need to replicate the following steps on all nodes of Oracle RAC. Please follow the README for details.


[oracle@dbass ~]$ cd orakafka-1.2.0/
[oracle@dbass orakafka-1.2.0]$ ls -al
total 3944
drwxrwxr-x 2 oracle oinstall    4096 Feb 20 09:12 .
drwx—— 6 oracle oinstall    4096 Feb 19 17:39 ..
-rw-r–r– 1 oracle oinstall    6771 Oct 16 03:11 README 
-rw-r–r– 1 oracle oinstall       5 Oct 16 03:11 kit_version.txt
-rw-rw-r– 1 oracle oinstall 3996158 Oct 16 03:11 orakafka.zip
-rwxr-xr-x 1 oracle oinstall   17599 Oct 16 03:11 orakafka_distro_install.sh


tar xvf sqldeveloper-20.4.0.379.2205-20.4.0-379.2205.noarch.rpm


7. As per _./orakafka-1.2.0/README_, we install Oracle SQL access to Kafka on the Oracle Database host with the help of _./orakafka-1.2.0/orakafka\_distro\_install.sh_ script. Argument -p lets us specify the location or base directory for the Oracle SQL access to Kafka installation on this host. 

   We choose the newly created empty directory named ora\_kafka\_home as the OSaK base directory on this host. So the full path of the OSaK base directory will be _/home/oracle/ora\_kafka\_home_.

[oracle@dbass ~]$ ./orakafka-1.2.0/orakafka_distro_install.sh -p ./ora_kafka_home/
 
 Step Create Product Home::
————————————————————–
…../home/oracle/ora_kafka_home already exists..
Step Create Product Home: completed.
PRODUCT_HOME=/home/oracle/ora_kafka_home
 
 Step Create app_data home::
————————————————————–
….. creating /home/oracle/ora_kafka_home/app_data and subdirectories
……Generated CONF_KIT_HOME_SCRIPT=/home/oracle/ora_kafka_home/app_data/scripts/configure_kit_home.sh
……Generated CONF_APP_DATA_HOME_SCRIPT=/home/oracle/ora_kafka_home/configure_app_data_home.sh
Step Create app_data home: completed.
APP_DATA_HOME=/home/oracle/ora_kafka_home/app_data
 
 Step unzip_kit::
————————————————————–
…..checking for existing binaries in /home/oracle/ora_kafka_home/orakafka
…..unzip kit into /home/oracle/ora_kafka_home/orakafka
Archive:  /home/oracle/orakafka-1.2.0/orakafka.zip
   creating: /home/oracle/ora_kafka_home/orakafka/
 extracting: /home/oracle/ora_kafka_home/orakafka/kit_version.txt
  inflating: /home/oracle/ora_kafka_home/orakafka/README
   creating: /home/oracle/ora_kafka_home/orakafka/doc/
  inflating: /home/oracle/ora_kafka_home/orakafka/doc/README_INSTALL
   creating: /home/oracle/ora_kafka_home/orakafka/jlib/
  inflating: /home/oracle/ora_kafka_home/orakafka/jlib/osakafka.jar
  inflating: /home/oracle/ora_kafka_home/orakafka/jlib/kafka-clients-2.5.0.jar
  inflating: /home/oracle/ora_kafka_home/orakafka/jlib/slf4j-simple-1.7.28.jar
  inflating: /home/oracle/ora_kafka_home/orakafka/jlib/lz4-java-no-jni-1.7.1.jar
  inflating: /home/oracle/ora_kafka_home/orakafka/jlib/snappy-java-no-jni-1.1.7.3.jar
  inflating: /home/oracle/ora_kafka_home/orakafka/jlib/zstd-no-jni-1.4.4-7.jar
  inflating: /home/oracle/ora_kafka_home/orakafka/jlib/slf4j-api-1.7.30.jar
   creating: /home/oracle/ora_kafka_home/orakafka/bin/
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/orakafka_stream.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/orakafka.sh
   creating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/removeuser_cluster.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/setup_all.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/remove_cluster.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/verify_install.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/add_cluster.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/config_util.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/test_views.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/install.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/set_java_home.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/list_clusters.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/adduser_cluster.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/uninstall.sh
  inflating: /home/oracle/ora_kafka_home/orakafka/bin/scripts/test_cluster.sh
   creating: /home/oracle/ora_kafka_home/orakafka/conf/
  inflating: /home/oracle/ora_kafka_home/orakafka/conf/orakafka.properties.template
   creating: /home/oracle/ora_kafka_home/orakafka/sql/
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/orakafkatab.plb
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/catnoorakafka.sql
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/catorakafka.sql
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/pvtorakafkaus.plb
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/orakafka_pkg_uninstall.sql
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/orakafkab.plb
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/pvtorakafkaub.plb
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/orakafka_pkg_install.sql
  inflating: /home/oracle/ora_kafka_home/orakafka/sql/orakafkas.sql
   creating: /home/oracle/ora_kafka_home/orakafka/lib/
  inflating: /home/oracle/ora_kafka_home/orakafka/lib/libsnappyjava.so
  inflating: /home/oracle/ora_kafka_home/orakafka/lib/libzstd-jni.so
  inflating: /home/oracle/ora_kafka_home/orakafka/lib/liblz4-java.so
Step unzip_kit: completed.
 
Successfully installed orakafka kit in /home/oracle/ora_kafka_home

8. Configure JAVA\_HOME for Oracle SQL access to Kafka. We find the Java path on the node as follows:

[oracle@dbass ~]$ java -XshowSettings:properties -version 2>&1 > /dev/null | grep 'java.home'
java.home = /usr/java/jre1.8.0_271-amd64
[oracle@dbass ~]$ export JAVA_HOME=/usr/java/jre1.8.0_271-amd64


   To set Java home for OSaK, we use the script _/home/oracle/ora\_kafka\_home/orakafka/bin/orakafka.sh_ script, with _set\_java\_home_ option.

[oracle@dbass bin]$ pwd
/home/oracle/ora_kafka_home/orakafka/bin
[oracle@dbass bin]$ ./orakafka.sh set_java_home -p $JAVA_HOME
 
Step1: Check for valid JAVA_HOME
————————————————————–
Found /usr/java/jre1.8.0_271-amd64/bin/java, JAVA_HOME path is valid.
Step1 succeeded.
 
Step2: JAVA version check
————————————————————–
java version “1.8.0_271”
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
Java version >= 1.8
Step2 succeeded.
 
Step3: Creating configure_java.sh script
————————————————————–
Wrote to /home/oracle/ora_kafka_home/app_data/scripts/configure_java.sh
Step3 succeeded.
 
Successfully configured JAVA_HOME in /home/oracle/ora_kafka_home/app_data/scripts/configure_java.sh
 
The above information is written to /home/oracle/ora_kafka_home/app_data/logs/set_java_home.log.2021.02.20-04.38.23
 
[oracle@dbass bin]$

9. Verify installation of OSaK with _verify\_install_ option of script _orakafka.sh_ as follows:

[oracle@dbass ~]$ cd ora_kafka_home/
[oracle@dbass ora_kafka_home]$ cd orakafka/bin/
[oracle@dbass bin]$ ./orakafka.sh verify_install
모든 파일/dirs 소유권을 확인합니다. 통과됨
디렉토리 권한 확인 - 통과됨
필요한 실행 파일 확인 - 통과됨

위 정보는 /home/oracle/ora_kafka_home/app_data/logs/verify_install.log.2021.02.19-18.10.15에 기록됩니다.


### Set Up Oracle Cloud Infrastructure Stream Clusters for Oracle SQL Access to Kafka

1. Under _ora\_kafka\_home_, that is _/home/oracle/ora\_kafka\_home_, we have two more READMEs as follows:

[oracle@dbass ~]$ find ora_kafka_home/ -name "README*"
ora_kafka_home/orakafka/README
ora_kafka_home/orakafka/doc/README_INSTALL


   _~/ora\_kafka\_home/orakafka/README_ is the readme for this release of OSaK that we have installed. Please read through this readme.

   And _ora\_kafka\_home/orakafka/doc/README\_INSTALL_ is the README for the actual setup of a Kafka cluster for Oracle SQL access to Kafka. The rest of the steps 2 onwards below follow this README by and large. As per the same, we will leverage _~/ora\_kafka\_home/orakafka/bin/orakafka.s_h script, for adding a Kafka cluster, adding an Oracle Database user for using the Kafka cluster in the next steps.

2. Add our Stream service stream pool to Oracle SQL access to Kafka.

   As mentioned earlier, from the Oracle SQL access to Kafka point of view, the Stream service stream pool is a Kafka cluster.

   We use the _add\_cluster_ option of the _orakafka.sh_ script to add the cluster to OSaK. We use the _\-c_ argument to name the cluster as _kc1_.

[oracle@dbass bin]$ pwd
/home/oracle/ora_kafka_home/orakafka/bin
[oracle@dbass bin]$ ./orakafka.sh add_cluster -c kc1

Step1: 파일 시스템 클러스터 구성 디렉토리 만들기
---------------------
파일 시스템 클러스터 디렉토리 만들기가 완료되었습니다.
/home/oracle/ora_kafka_home/app_data/clusters/KC1/conf/orakafka.properties에서 보안 속성을 구성합니다.
Step1 성공.

Step2: 클러스터 구성 DB 디렉토리 생성을 위한 DDL 생성
---------------------
sysdba
로 연결된 상태에서 다음 SQL 스크립트를 실행하여 클러스터 구성 데이터베이스 디렉토리를 생성합니다.
@/home/oracle/ora_kafka_home/app_data/scratch/orakafka_create_KC1_CONF_DIR.sql
Step2 스크립트를 성공적으로 생성했습니다.

****SUMMARY*****

TODO 작업:

  1. /home/oracle/ora_kafka_home/app_data/clusters/KC1/conf/orakafka.properties에서 보안 속성 구성
  2. sysdba로 연결된 상태에서 다음 SQL을 실행합니다.
    @/home/oracle/ora_kafka_home/app_data/scratch/orakafka_create_KC1_CONF_DIR.sql

위의 정보는 /home/oracle/ora_kafka_home/app_data/logs/add_cluster.log.2021.02.20-05.23.30에 기록됩니다.

[oracle@dbass bin]$


   We get two TODO tasks as per output from the above execution of the _add\_cluster_ command. 

   1. For the first task, we add security properties for our Stream service stream to `/home/oracle/ora_kafka_home/app_data/clusters/KC1/conf/orakafka.properties`. 

      Where to get Kafka-compatible security configs for the Stream service cluster also known as (AKA) streampool? We get these security configs from the OCI web console as shown below.

      Please take note of the bootstrap server endpoint(_cell-1.streaming.ap-mumbai-1.oci.oraclecloud.com:9092_ from the screenshot below) as well. It is not related to the security configs of the cluster, but we need it in later steps for connecting to our Stream service and Kafka cluster. 

      ![](images/bsend.png " ")

      We write the above config values to OSaK in the following format, to `/home/oracle/ora_kafka_home/app_data/clusters/KC1/conf/orakafka.properties` file using any text editor like say vi. 

      ![](images/osakosssec.png " ")

      For clarity, we have the same configs in text format as follows:

      ```
      security.protocol=SASL_SSL  
      sasl.mechanism=PLAIN  
      sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="<YOUR_TENANCY_NAME>/<YOUR_OCI_USERID_HERE>/<YOUR_OCI_STREAMPOOL_OCID>" password=" YOUR_AUTH_TOKEN";  
      sasl.plain.username="<YOUR_TENANCY_NAME>/<YOUR_OCI_USERID_HERE>/<YOUR_OCI_STREAMPOOL_OCID>"  
      sasl.plain.password ="YOUR_AUTH_TOKEN";
      ```

      **Note:** default Kafka Consumer Configs are already pre-populated in _orakafka.properties_ for this cluster. If there is a need, one can modify these configs.

   2. For the second TODO task, do SQL script execution as follows: 

      ```
      [oracle@dbass ~]$ sqlplus / as sysdba  
      SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 20 05:37:28 2021  
      Version 19.9.0.0.0   
      Copyright (c) 1982, 2020, Oracle.  All rights reserved.
      Connected to:  
      Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
      Version 19.9.0.0.0   
      SQL> alter session set container=p0;  
      Session altered.  
      SQL> @/home/oracle/ora_kafka_home/app_data/scratch/orakafka_create_KC1_CONF_DIR.sql  
      Creating database directory "KC1_CONF_DIR"..  
      Directory created.  
      The above information is written to /home/oracle/ora_kafka_home/app_data/logs/orakafka_create_KC1_CONF_DIR.log  
      Disconnected from Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
      Version 19.9.0.0.0
      ```

      Take note of directory object _KC1\_CONF\_DIR_ created by the above SQL script.

      **Note:** As dictated in add\_cluster output, we run the SQL script as a _SYSDBA_ user, inside the PDB of our interest (_p0_ PDB here).

   3. To make sure that the cluster configuration is working, we can leverage the _test\_cluster_ option of script _orakafka.sh_.

      We pass cluster name with -c argument and bootstrap server with -b argument. We have from bootstrap server info from step 4.2.1.

      ```
      [oracle@dbass bin]$ pwd  
      /home/oracle/ora_kafka_home/orakafka/bin  
      [oracle@dbass bin]$ ./orakafka.sh test_cluster -c kc1 -b cell-1.streaming.ap-mumbai-1.oci.oraclecloud.com:9092  
      Kafka cluster configuration test succeeded.  
         
      Kafka cluster configuration test - "KC1"  
      ------------------------------------------------------  
      KAFKA_BOOTSTRAP_SERVERS=cell-1.streaming.ap-mumbai-1.oci.oraclecloud.com:9092  
      LOCATION_FILE="/home/oracle/ora_kafka_home/app_data/clusters/KC1/logs/orakafka_stream_KC1.loc"  
      ora_kafka_operation=metadata  
      kafka_bootstrap_servers=cell-1.streaming.ap-mumbai-1.oci.oraclecloud.com:9092  
         
      List topics output:  
      StreamForOsak,3  
      ...  
      For full log, please look at /home/oracle/ora_kafka_home/app_data/clusters/KC1/logs/test_KC1.log.2021.02.20-09.01.12  
      Test of Kafka cluster configuration for "KC1" completed.  
         
      The above information is written to /home/oracle/ora_kafka_home/app_data/logs/test_cluster.log.2021.02.20-09.01.12  
         
      [oracle@dbass bin]$
      ```

      As you can see our Kafka cluster configuration test succeeded! We get the list of topics, AKA the Stream service streams in the output here. Topic names are followed by the number of partitions for that stream. Here we have the number of partitions as three, as the Stream service stream StreamForOsak has exactly three partitions.

3. Configure an Oracle Database user for the added Kafka cluster.

   We already have created an Oracle Pluggable Databases (PDB) level Oracle Database user with username books\_admin, for the PDB named _p0_.  We use the _adduser\_cluster_ option to grant required permissions for user books\_admin on Kafka cluster _kc1_. 

[oracle@dbass bin]$ ./orakafka.sh adduser_cluster -c kc1 -u books_admin


   
Step1: Generate DDL to grant permissions on cluster configuration directory to "BOOKS_ADMIN"
--------------------------------------------------------------------------------------------

Execute the following script while connected as sysdba  
to grant permissions on cluster conf directory :  
 @/home/oracle/ora_kafka_home/app_data/scratch/orakafka_adduser_cluster_KC1_user1.sql  
Step1 successfully generated script.  
   
***********SUMMARY************  
   
TODO tasks:  
 
1. Execute the following SQL while connected as sysdba:  
      @/home/oracle/ora_kafka_home/app_data/scratch/orakafka_adduser_cluster_KC1_user1.sql  
      
   The above information is written to /home/oracle/ora_kafka_home/app_data/logs/adduser_cluster.log.2021.02.20-10.45.57  
      
   [oracle@dbass bin]$

이전 단계와 마찬가지로 수행할 TODO 작업이 하나 있습니다.

출력에 따라 자동 생성된 SQL 스크립트가 있습니다. Oracle Database 사용자 books_admin 권한을 클러스터 kc1의 클러스터 구성 디렉토리에 부여하려면 이 스크립트를 실행해야 합니다(sysdba).

이 디렉토리는 /home/oracle/ora_kafka_home/app_data/clusters/KC1입니다.


[oracle@dbass ~]$ sqlplus / as sysdba  
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 20 10:56:17 2021  
Version 19.9.0.0.0  
Copyright (c) 1982, 2020, Oracle.  All rights reserved.  
   
Connected to:  
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
Version 19.9.0.0.0  
   
SQL> alter session set container=p0;  
Session altered.  
SQL> @/home/oracle/ora_kafka_home/app_data/scratch/orakafka_adduser_cluster_KC1_user1.sql  
   
PL/SQL procedure successfully completed.   
Granting permissions on "KC1_CONF_DIR" to "BOOKS_ADMIN"  
Grant succeeded.`

`The above information is written to /home/oracle/ora_kafka_home/app_data/logs/orakafka_adduser_cluster_KC1_user1.log  
Disconnected from Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
Version 19.9.0.0.0  
[oracle@dbass ~]$

  1. 이제 orakafka.shinstall 옵션을 활용합니다. 추가된 Kafka 클러스터의 OSaK 작업과 관련된 이 사용자의 데이터에 대해 상위 디렉토리(-p 인수 포함)를 전달합니다.

    이 명령은 다음과 같이 두 개의 DDL(데이터 정의어) 스크립트를 자동으로 생성합니다.
     

       [oracle@dbass bin]$ ./orakafka.sh install -u books_admin -r /home/oracle/ora_kafka_home/books_admin_user_data_dir  
       
    Step1: Creation of filesystem location and default directories  
    --------------------------------------------------------------  
    Created filesystem location directory at /home/oracle/ora_kafka_home/books_admin_user_data_dir/orakafka_location_dir  
    Created filesystem default directory at /home/oracle/ora_kafka_home/books_admin_user_data_dir/orakafka_default_dir  
    Step1 succeeded.  
       
    Step2: Generate DDL for creation of DB location and default directories  
    --------------------------------------------------------------  
    Execute the following SQL script while connected as sysdba  
    to setup database directories:  
     @/home/oracle/ora_kafka_home/app_data/scratch/setup_db_dirs_user1.sql  
    On failure, to cleanup location and default directory setup, please run "./orakafka.sh uninstall -u 'BOOKS_ADMIN'"  
    Step2 successfully generated script.  
       
    Step3: Install ORA_KAFKA package in "BOOKS_ADMIN" user schema  
    --------------------------------------------------------------  
    Execute the following script in user schema "BOOKS_ADMIN" to  
    install ORA_KAFKA package in the user schema  
     @/home/oracle/ora_kafka_home/app_data/scratch/install_orakafka_user1.sql  
    On failure, to cleanup ORA_KAFKA package from user schema, please run "./orakafka.sh uninstall -u 'BOOKS_ADMIN'"  
    Step3 successfully generated script.  
       
    ***********SUMMARY************  
       
    TODO tasks:  
       
    1. Execute the following SQL while connected as sysdba:  
       @/home/oracle/ora_kafka_home/app_data/scratch/setup_db_dirs_user1.sql  
    2. Execute the following SQL in user schema:  
       @/home/oracle/ora_kafka_home/app_data/scratch/install_orakafka_user1.sql  
       
    The above information is written to /home/oracle/ora_kafka_home/app_data/logs/install.log.2021.02.20-11.33.09  
       
    [oracle@dbass bin]
    
  2. 첫번째 작업은 SQL 스크립트를 실행하여 Oracle DB에 /home/oracle/ora_kafka_home/books_admin_user_data_dir/orakafka_location_dir/home/oracle/ora_kafka_home/books_admin_user_data_dir/orakafka_default_dir
    라는 두 디렉토리를 디렉토리 객체로 등록합니다.

    출력에 설명된 대로 SYSDBA 권한으로 실행해야 합니다(예:

       [oracle@dbass ~]$ sqlplus / as sysdba  
    SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 20 11:46:04 2021  
    Version 19.9.0.0.0  
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.  
    Connected to:  
    Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
    Version 19.9.0.0.0  
       
    SQL> alter session set container=p0;  
       
    Session altered.  
       
    SQL> @/home/oracle/ora_kafka_home/app_data/scratch/setup_db_dirs_user1.sql  
    Checking if user exists..  
       
    PL/SQL procedure successfully completed.  
    Creating location and default directories..  
    PL/SQL procedure successfully completed.  
    Directory created.  
    Directory created.  
    Grant succeeded.  
    Grant succeeded.  
    Creation of location dir "BOOKS_ADMIN_KAFKA_LOC_DIR" and default dir "BOOKS_ADMIN_KAFKA_DEF_DIR" completed.  
    Grant of required permissions on "BOOKS_ADMIN_KAFKA_LOC_DIR","BOOKS_ADMIN_KAFKA_DEF_DIR" to "BOOKS_ADMIN" completed.  
    The above information is written to /home/oracle/ora_kafka_home/app_data/logs/setup_db_dirs_user1.log  
    Disconnected from Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
    Version 19.9.0.0.0  
    [oracle@dbass ~]$
    

    위의 SQL 스크립트(BOOKS_ADMIN_KAFKA_LOC_DIRBOOKS_ADMIN_KAFKA_DEF_DIR)에서 만든 디렉토리 객체를 기록해 둡니다.

    이제 두 번째 TODO 작업으로 이동합니다.

  3. 여기서 p0 PDB에서 books_admin(sysdba가 아닌)로 다른 SQL 스크립트를 실행합니다. 이 스크립트는 books_admin에 속한 스키마에서 Kafka 패키지 및 객체에 대한 Oracle SQL 액세스를 설치합니다.

       [oracle@dbass ~]$ sqlplus books_admin@p0pdb #p0pdb is tns entry for p0 pdb  
    SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 20 11:52:33 2021  
    Version 19.9.0.0.0  
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.  
    Enter password:  
    Last Successful login time: Fri Feb 19 2021 14:04:59 +00:00  
    Connected to:  
    Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
    Version 19.9.0.0.0  
       
    SQL> ALTER SESSION SET CONTAINER=p0;  
    Session altered.  
       
    SQL> @/home/oracle/ora_kafka_home/app_data/scratch/install_orakafka_user1.sql  
    Verifying user schema..  
       
    PL/SQL procedure successfully completed.  
       
    Verifying that location and default directories are accessible..  
       
    PL/SQL procedure successfully completed.  
       
    Installing ORA_KAFKA package in user schema..  
    .. Creating ORA_KAFKA artifacts  
       
    Table created.  
    Table created.  
    Table created.  
    Table created.  
    Package created.  
    No errors.  
    Package created.  
    No errors.  
    Package body created.  
    No errors.  
    Package body created.  
    No errors.  
    The above information is written to /home/oracle/ora_kafka_home/app_data/logs/install_orakafka_user1.log  
    Disconnected from Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production  
    Version 19.9.0.0.0  
    [oracle@dbass ~]$
    

스트림에 대한 스트림 서비스 클러스터를 Oracle Database에 등록하고 뷰 생성

이 단계에서는 Oracle Database와 함께 kc1 클러스터를 사용하고 StreamForOsak 스트림에 대한 뷰를 생성합니다.

이 단계에 대한 모든 SQL 질의는 사용자 books_admin 및 p0 PDB로 실행됩니다.

  1. Kafka 프로시저 ORA_KAFKA.REGISTER_CLUSTER에 대해 Oracle SQL 액세스로 클러스터를 등록합니다.

BEGIN  
ORA_KAFKA.REGISTER_CLUSTER  
('kc1', -- cluster name  
'cell-1.streaming.ap-mumbai-1.oci.oraclecloud.com:9092', -- fill up your bootstrap server here   
'BOOKS_ADMIN_KAFKA_DEF_DIR', -- default directory for external table created in previous steps  
'BOOKS_ADMIN_KAFKA_LOC_DIR', -- this directory object too is created in previous steps  
'KC1_CONF_DIR', --config dir for cluster  
'Registering kc1 for this session'); --description   
END;  
/

  1. Kafka 항목 StreamForOsak의 메시지와 동일한 스키마를 가져야 하는 Oracle Database 테이블 rows를 생성합니다.

CREATE TABLE BOOKS ( -- reference table. It is empty table. Schema of this table must correspond to Kafka Messages  
id int,  
title varchar2(50),  
author_name varchar2(50),  
author_email varchar2(50),  
publisher varchar2(50)  
);  
/

  1. 다음과 같이 Oracle SQL에서 Kafka 패키지 viz CREATE_VIEWS에 액세스하는 도움말 저장 프로시저를 사용하여 StreamForOsak 항목에 대한 뷰를 생성합니다.

DECLARE  
 application_id VARCHAR2(128);  
 views_created INTEGER;  
BEGIN  
ORA_KAFKA.CREATE_VIEWS  
('kc1', -- cluster name  
'OsakApp0', -- consumer group name that OSS or Kafka cluster sees.  
'StreamForOsak', -- Kafka topic aka OSS stream name  
'CSV', -- format type  
'BOOKS', -- database reference table  
views_created, -- output  
application_id); --output  
dbms_output.put_line('views created  = ' || views_created);  
dbms_output.put_line('application id = ' || application_id);  
END;  
/

Kafka에 대한 Oracle SQL 액세스는 Kafka 메시지, CSV 및 JSON의 두 가지 형식을 지원합니다. 여기에서는 CSV를 사용하고 있습니다. 따라서 BOOKS 테이블 스키마를 준수하는 예제 Kafka 메시지는 101, Famous Book, John Smith, john@smith.com, First Software일 수 있습니다.


tar xvf sqldeveloper-20.4.0.379.2205-20.4.0-379.2205.noarch.rpm

  1. 위의 단계에서는 항목의 각 분할 영역에 대한 뷰를 생성합니다. 항목 StreamForOsak에는 세 개의 분할 영역이 있으므로 세 개의 뷰가 있습니다. 각 뷰의 이름은 KV_<CLUSTER_NAME>_<GROUP_NAME>_TOPIC_<NUM_OF_PARTITION> 형식입니다.

여기서는 각 분할 영역에 대해 하나씩 아래에 세 개의 뷰가 있습니다.

따라서 KV_KC1_OSAKAPP0_STREAMFOROSAK_0 뷰는 분할 영역 0에 매핑되고, KV_KC1_OSAKAPP0_STREAMFOROSAK_2 뷰는 분할 영역 1에 매핑되며, 마지막으로 KV_KC1_OSAKAPP0_STREAMFOROSAK_0는 StreamForOsak 항목의 분할 영역 2에 매핑됩니다.

스트림으로 데이터 생성

  1. 아래 표시된 것처럼 OCI(Oracle Cloud Infrastructure) 웹 콘솔에서 테스트 메시지 생성 단추를 사용하여 StreamForOsak을 스트리밍할 테스트 메시지를 생성합니다.

테스트 메시지 생성을 누르면 아래와 같이 테스트 메시지를 입력하는 필드가 있는 창이 표시됩니다.

아래 메시지를 입력하겠습니다.

200, Andrew Miller Part 1, MS Brown, mb@example.com, First Software

는 스트림 서비스 스트림에 대한 메시지를 생성하기 위해 Java/Python 또는 OCI SDK에서 표준 Kafka Producer API를 사용할 수도 있습니다.

  1. 위 창에서 생성을 누르면 StreamForOsak 스트림에 메시지가 게시됩니다. 메시지 로드 유틸리티를 사용하여 메시지가 연관된 분할 영역을 확인할 수 있습니다.

위에 표시된 것처럼 StreamForOsak 항목의 분할 영역 2에 메시지가 배치되어 있습니다.

Oracle SQL에서 Kafka 내장 프로시저에 대해 설정한 데이터베이스 뷰를 사용하여 스트림 서비스 메시지 검색

간단한 SQL 질의를 실행할 수 있습니다.


SELECT * FROM KV_KC1_OSAKAPP0_STREAMFOROSAK_2_

또는 아래와 같이 뷰 SQL 개발자를 열어 KV_KC1_OSAKAPP0_STREAMFOROSAK_2 뷰에서 데이터를 볼 수 있습니다.

StreamForOsak 스트림의 분할 영역 2에 해당하므로 KV_KC1_OSAKAPP0_STREAMFOROSAK_2 보기를 선택합니다. 따라서 이 뷰에 대해 SELECT SQL 질의를 실행할 때마다 연관된 항목의 해당 분할 영역으로 이동하고 커밋되지 않은 새 메시지(소비자 그룹 OsakApp0에 대한)를 뷰의 행으로 가져옵니다. 각 메시지는 뷰에서 고유한 행을 가져옵니다. 이러한 뷰의 데이터는 지속되지 않습니다.

또한 Oracle SQL에서 Kafka 인출에 액세스하고 추가 열에 메시지, 해당 분할 영역 및 시간 기록과 같은 메타데이터 정보를 저장할 수 있습니다.

대부분의 경우 이 뷰를 다시 질의하고 각 질의 실행에 대해 뷰가 스트림에서 순차적으로 이동하도록 할 수 있습니다. 다음 표준 코드 조각을 통해 쉽게 이 작업을 수행할 수 있습니다.


LOOP
ORA_KAFKA.NEXT_OFFSET(‘_KV_KC1_OSAKAPP0_STREAMFOROSAK_2_’);

SELECT * FROM KV_KC1_OSAKAPP0_STREAMFOROSAK_2_;

ORA_KAFKA.UPDATE_OFFSET(‘_KV_KC1_OSAKAPP0_STREAMFOROSAK_2_’);

COMMIT;
END LOOP;

앞에서 설명한 것처럼 Kafka에 Oracle SQL 액세스를 사용하면 스트림 오프셋은 스트림 서비스가 아닌 Oracle Database로 관리됩니다. KV_KC1_OSAKAPP0_STREAMFOROSAK_2 뷰에서 액세스하는 모든 분할 영역에 대한 오프셋 위치를 추적하는 시스템 테이블에 상주합니다.

NEXT_OFFSET 호출은 단순히 KV_KC1_OSAKAPP0_STREAMFOROSAK_2 뷰를 뷰에 의해 액세스되는 Oracle Cloud Infrastructure Streaming 분할 영역에 상주하는 새 데이터를 나타내는 새 오프셋 집합으로 바인딩합니다. UPDATE_OFFSET는 각 분할 영역에 대해 읽은 행 수를 전달하고 오프셋을 새 위치로 이동합니다.

COMMIT은 이 작업 단위가 ACID를 준수하도록 보장합니다.

결론

이 사용지침서에서는 Oracle SQL에서 Kafka에 접근하여 스트림 서비스와 함께 사용하는 방법에 대해 중점적으로 다룹니다. 스트림 서비스는 Kafka와 호환되므로 Kafka에 대한 Oracle SQL 액세스를 위한 Kafka 클러스터와 같습니다.

여기에 Oracle SQL에서 Kafka 기능에 대해 제공하는 기능이 궁금해짐에 따라 여기에서는 표면에 거의 종속되지 않습니다. Kafka에 대한 Oracle SQL 액세스는 매우 구성 가능합니다. 뷰와 달리 디스크에 지속되는 Oracle Database 테이블에 스트리밍 데이터를 저장할 수도 있습니다. 자세한 내용은 Oracle SQL 액세스에서 Kafka 설치에 제공하는 README 파일과 아래 참조를 참조하십시오.

  1. Kafka에 대한 Oracle SQL 액세스를 위한 Oracle PL/SQL 개발자 설명서
  2. Oracle 블로그 on Oracle SQL access to Kafka
  3. Oracle Big Data SQL에서 Kafka로의 Oracle SQL 접근
  4. Oracle Cloud Infrastructure Streaming
  5. 스트림 서비스 Kafka API 호환성

감사의 글

````

추가 학습 자원

docs.oracle.com/learn에서 다른 실습을 찾아보거나 Oracle Learning YouTube channel에서 무료 학습 콘텐츠에 액세스할 수 있습니다. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer로 변경하십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.