Quantcast
Channel: Oracle Blogs 日本語のまとめ
Viewing all 760 articles
Browse latest View live

[Linux] Announcing the Unbreakable Enterprise Kernel Release 4 Update 6 for Oracle Linux

$
0
0
原文はこちら。
https://blogs.oracle.com/linux/announcing-the-unbreakable-enterprise-kernel-release-4-update-6-for-oracle-linux

Oracle Linuxオペレーティングシステムはオープンなクラウドインフラストラクチャ向けに設計されており、従来のエンタープライズアプリケーションだけでなく、エンタープライズSaaSおよびPaaSワークロードにも優れたパフォーマンス、スケーラビリティ、信頼性を提供します。Oracle Linux Supportでは、受賞実績のあるOracleサポート・リソースやLinuxサポート・スペシャリスト、Kspliceを使用したゼロダウンタイムアップデート、Oracle Enterprise Managerなどの追加の管理ツール、およびライフタイム・サポートを低コストで提供します。また、他の多くの商用Linuxディストリビューションとは異なり、Oracle Linuxは簡単にダウンロードでき、完全に無料で使用、配布、および更新できます。

What's New?

Unbreakable Enterprise Kernel Release 4 Update 6では 4.1.12-112.14.1 を利用しており、さまざまなサブシステムにわたるいくつかの新機能、機能、バグ修正が含まれています。

Notable changes

  • Automatic NUMA balancing is disabled by default
    このアップデートでは、NUMA(Non-uniform Memory Access)自動バランシングの自動有効化が無効になっています。この変更により、NUMAの自動分散が有効になっている複数のNUMAノードを持つシステムで発生したいくつかの問題が解決されます。報告された事象・症状には、D状態で監察された(Oracle DBプロセスのような)高いiowait時間と多数のプロセスがあり、これらがプロセススタック内でwait_on_page_bit()関数を動作させない状況になっていたものがありました。
  • Deferred compaction of Transparent Hugepages is enabled
    Transparent Huge Pages(THP)の遅延コンパクション機能がメインラインカーネルからバックポートされ、デフォルトのデフラグ動作がmadviseに設定されています。これにより、メモリ断片化が原因でTHPからのhuge pageのアロケーションに時間がかかる場合に、THPによってアプリケーションの停止が発生する可能性があるという問題を解決します。

Crypto API

  • Addition of the ccp driver
    ccp ドライバによって、AMD Cryptographic Coprocessor(CCP)がサポートされます。AMD CCPにより、ハードウェア暗号化、ハッシュ生成やその他の関連する操作が利用可能になります。
  • Jitter entropy RNG added
    Jitter Entropy Random Number Generator (RNG) はLinuxカーネルとのCPU時間の差異によってCPUタイミングのエントロピーを収集する機能です。

DTrace

  • I/O provider for NFS
    このアップデートで、NFSへのstartdonereadおよびwriteリクエスト用のDTrace I/Oプロバイダ・プローブが追加されました。 
  • lockstat provider added
    DTraceがlockstatをサポートしたことにより、カーネルのロックイベントの動的な追跡が可能になりました。これにはどのロックが最もよく使われるのか、どのロックが最も競合を示しているのか、どのロックが最も保持されているのか、といったものが含まれます。
  • Packaging changes
    Unbreakable Enterprise Kernel Release 4 Update 6のリリースから、dtrace-modulesdtrace-modules-provider-headersおよびdtrace-modules-shared-headersパッケージは配布されなくなりました。これらのパッケージが提供する機能は、現在、ベースのkernel-uekおよび関連するヘッダーパッケージに含まれています。
上記の内容ならびにその他の新機能や変更点に関する詳細は、リリースノートをご覧ください。
Oracle® Linux Release Notes for Unbreakable Enterprise Kernel Release 4 Update 6
https://docs.oracle.com/cd/E37670_01/E92390/html/index.html 

Supported upgrade path

お客様は既存のOracle Linux 6およびOracle Linux 7サーバをUnbreakable Linux NetworkやOracle Linux Yum Serverを使ってアップグレードできます。
Unbreakable Linux Network
http://linux.oracle.com/
Oracle Linux Yum Server
http://yum.oracle.com/

Software Download

Oracle Linuxは無料でダウンロード、利用、配布できます。そして、全てのアップデートおよびエラータも無料でご利用いただけます。
Oracle Linux
http://www.oracle.com/linux
Free Updates and Errata for Oracle Linux
https://blogs.oracle.com/linux/free-updates-and-errata-for-oracle-linux
https://orablogs-jp.blogspot.jp/2012/03/free-updates-and-errata-for-oracle.html 
このしくみを利用して、どのシステムでサポートを契約するかを決定できますので、Oracle Linuxは開発、テスト、本番システムのための理想的な選択肢となることでしょう。
Oracle Linux Support
http://www.oracle.com/us/technologies/linux/support/overview/index.html
すべてのシステムを最新かつ安全に保ちながら、サポート対象範囲をシステムごとに個別に最適なものに決めてください。Oracle Linux Premier Supportをご利用のお客様は、Oracle Kspliceを使用したゼロ・ダウンタイムのカーネル・アップデートやOracle OpenStackのサポートもご利用いただけます。
Ksplice : Zero Downtime Updates for Oracle Linux
http://www.oracle.com/us/technologies/linux/ksplice-datasheet-487388.pdf
Oracle OpenStack Release 3
http://www.oracle.com/technetwork/server-storage/openstack/linux/documentation/datasheet-oracle-openstack-2296038.pdf

Compatibility

UEK R4 Update 6は以前のUEK R4 Updateと完全な互換性があります。UEK R4のカーネルABIは初期リリースに続く全てのリリースで変わりません。このリリースでは、カーネルABIがUEK R3に対して変更があるため、システム上の3rdパーティーカーネルモジュールを再コンパイルする必要があります。Before installing UEK R4をインストールする前に、お使いのアプリケーションベンダーにサポート状況を確認してください。

Resources – Oracle Linux

Documentation

Software Download

Blogs

Community Pages

Social Media

Data Sheets, White Papers, Videos, Training, Support & more

Product Training and Education


[Docker, WLS] Docker Volumes in WebLogic

$
0
0
原文はこちら。
https://blogs.oracle.com/weblogicserver/docker-volumes-in-weblogic

Background Information

Dockerの世界では、コンテナは一時的(ephemeral)なものです。コンテナは破棄され、交換できます。コンテナ破棄後、コンテナに加えられたすべての変更はなくなります。コンテナのライフサイクルとは独立してデータを保持したい場合は、ボリュームを使用する必要があります。ボリュームは、コンテナファイルシステムの外部に存在するディレクトリです。

Docker Data Volume Introduction

このエントリでは、Dockerデータボリュームの概要を紹介します。なお、WebLogic Server 12.2.1.3イメージに基づいて記載しています。githubにあるスクリプトを使用してイメージを構築できます。
Oracle WebLogic Server on Docker
https://github.com/oracle/docker-images/tree/master/OracleWebLogic/dockerfiles/12.2.1.3
このエントリでは、この基本イメージをデータボリュームの使用方法を説明するためにのみ使用し、WebLogic Serverインスタンスは実際には実行しません。その代わりに、'sleep 3600'でコンテナは6分間稼働させた後に停止します。

Local Data Volumes

Anonymous Data Volumes

匿名データボリューム(anonymous data volume)は、(名前がないとはいえ)一意の名前が内部で自動生成されています。
以下の2方法で匿名データボリュームを作成できます。
  • '-v /container/fs/path'
    オプションを付けて
    docker create
    もしくは
    docker run
    でコンテナを作成もしくは開始する。
  • Dockerfile内でVOLUME命令を使う
    VOLUME ["/container/fs/path"]
$ docker run --name c1 -v /mydata -d weblogic-12.2.1.3-developer 'sleep 3600'
$ docker inspect c1 | grep Mounts -A 10
[        "Mounts": [
{
"Name": "625672972c137c2e29b85f1e6ae70d6d4eb756002062792721a5ac0e9d0f1421",
"Source": "/scratch/docker/volumes/625672972c137c2e29b85f1e6ae70d6d4eb756002062792721a5ac0e9d0f1421/_data",
"Destination": "/mydata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
# ここでボリュームにランダムに生成された名前が付いていることがわかります。
625672972c137c2e29b85f1e6ae70d6d4eb756002062792721a5ac0e9d0f1421
$ docker volume inspect 625672972c137c2e29b85f1e6ae70d6d4eb756002062792721a5ac0e9d0f1421
[
{
"Name": "625672972c137c2e29b85f1e6ae70d6d4eb756002062792721a5ac0e9d0f1421",
"Driver": "local",
"Mountpoint": "/scratch/docker/volumes/625672972c137c2e29b85f1e6ae70d6d4eb756002062792721a5ac0e9d0f1421/_data",
"Labels": null,
"Scope": "local"
}
]

Named Data Volumes

名前付きデータボリューム(Named data volumes)はDocker 1.9.0以後で利用できます。
名前付きデータボリュームは以下の2方法で作成できます。
  • docker volume create --name volume_name
    を使う
  • -v volume_name:/container/fs/path
    を付けて、
    docker create
    もしくは
    docker run
    でコンテナを生成もしくは実行する
$ docker volume create --name testv1
$ docker volume inspect testv1
[
{
"Name": "testv1",
"Driver": "local",
"Mountpoint": "/scratch/docker/volumes/testv1/_data",
"Labels": {},
"Scope": "local"
}
]

Mount Host Directory or File

既存のホストディレクトリをコンテナに直接マウントできます。
コンテナ稼働中にホストを直接マウントするには
  • docker create もしくは docker runで
    -v /host/path:/container/path
    を付けてコンテナを作成もしくは実行する
同様の方法でホストのファイルをマウントできます。
  • docker create もしくは docker runで
    -v /host/file:/container/file
    を付けてコンテナを作成もしくは実行する
マウントされたホストディレクトリやファイルはDockerが管理している実際のデータボリュームではないため、docker volume lsを実行しても表示されないこと、また、Dockerfileでホストディレクトリやファイルをマウント出来ないことにご注意ください。
$ docker run --name c2 -v /home/data:/mydata -d weblogic-12.2.1.3-developer 'sleep 3600'
$ docker inspect c2 | grep Mounts -A 8
"Mounts": [
{
"Source": "/home/data",
"Destination": "/mydata",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],

Data Volume Containers

データボリュームコンテナはデータ専用コンテナです。データボリュームコンテナが作成後、そのコンテナを起動する必要はありません。他のコンテナは--volumes-fromを使用して共有データにアクセスできます。
# step 1: create a data volume container 'vdata' with two anonymous volumes
$ docker create -v /vv/v1 -v /vv/v2 --name vdata weblogic-12.2.1.3-developer

# step 2: run two containers c3 and c4 with reference to the data volume container vdata
$ docker run --name c3 --volumes-from vdata -d weblogic-12.2.1.3-developer 'sleep 3600'
$ docker run --name c4 --volumes-from vdata -d weblogic-12.2.1.3-developer 'sleep 3600'

Data Volume Plugins

Docker 1.8以降では、ボリュームプラグインをサポートしています。これにより、新しいボリュームドライバでDockerを拡張できます。例えばボリュームプラグインを使用して、iSCSI、NFS、FCなどの共有ストレージサーバーにリモートフォルダを直接マウントできます。別のホストで動作している別のコンテナから同じストレージに同じ方法でアクセスできます。 異なるホストのコンテナが同じデータを共有できます。
さまざまなストレージタイプに対応したプラグインがあります。ボリュームプラグインについては、以下のDockerのドキュメントを参照してください。
Volume plugins
https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

WebLogic Persistence in Volumes

WebLogic ServerをDockerで実行する場合、データボリュームの利用にあたって基本的に2つのユースケースがあります。
  1. WebLogic Serverのライフサイクルからデータを分離するため、WebLogic Serverコンテナが破棄され、後で再起動または移動された後でもデータを再利用可能
  2. 異なるWebLogic Serverインスタンス間でデータを共有するため、(サービス移行時に)必要に応じて相互のデータを復元可能
以下のWebLogic Serverのアーティファクトでデータボリュームの利用が考えられます。
  • ドメインホーム・ディレクトリ
  • サーバーログ
  • JMSやJTAなどの永続ファイルストア
  • アプリケーション・デプロイメント
下表にWebLogic Serverのサブシステムが格納するデータを纏めました。
Subsystem or Service格納されているもの詳細情報
Diagnostic Serviceログレコード
データイベント
収集されたメトリック
Understanding WLDF Configuration (Configuring and Using the Diagnostics Framework for Oracle WebLogic Server
JMS Messages永続メッセージと恒久サブスクライバUnderstanding the Messaging Models (Developing JMS Applications for Oracle WebLogic Server
JMS Paging StoreJMSサーバごとに1個
永続メッセージと非永続メッセージをページング
Main Steps for Configuring Basic JMS System Resources (Administering JMS Resources for Oracle WebLogic Server
JTA Transaction Log (TLOG)完了していない可能性がある、サーバーがコーディネートしたコミット済みトランザクションに関する情報
TLOGはデフォルトの永続ストアまたはJDBC TLOGストアに格納可能
Managing Transactions (Developing JTA Applications for Oracle WebLogic Server
Using a JDBC TLog Store (Developing JTA Applications for Oracle WebLogic Server)
    Path Serviceメッセージ・リソースへのメッセージ・グループのマッピングUsing the WebLogic Path Service (Administering JMS Resources for Oracle WebLogic Server
    Store-and-Forward (SAF) Service Agents受信SAFエージェントへの再送信のための送信SAFエージェントからのメッセージUnderstanding the Store-and-Forward Service (Administering the Store-and-Forward Service for Oracle WebLogic Server
    Web Services信頼性のあるWebLogic Web Serviceの呼び出しによるリクエストおよびレスポンスSOAPメッセージUsing Reliable SOAP Messaging (Programming Advanced Features of JAX-RPC Web Services for Oracle WebLogic Server
    EJB Timer ServicesEJBタイマーオブジェクトUnderstanding Enterprise JavaBeans (Developing Enterprise JavaBeans, Version 2.1, for Oracle WebLogic Server
    WebLogic Serverの各インスタンスをそれぞれのコンテナで実行し、データボリューム内のドメイン構成を共有することをお勧めします。これは、WebLogic Serverでのデータボリュームの基本的な使用例です。ドメインホームが外部ボリュームにある場合、サーバーログもまた既定で外部ボリュームにあります。ただ、サーバーログにはドメインホーム内の他のファイルよりも機密性の高いデータが含まれており、アクセス管理を必要とするため、サーバーログを別のボリュームに配置するよう明示的に構成可能です。
    JMSやJTAなどのファイルストアは、外部ボリュームに配置し、共有ディレクトリを使用する必要があります。これは、サービス移行を機能させるためです。インスタンス毎に自動的にファイル名を一意に装飾するため、同一ドメイン内のすべてのデフォルトストアとカスタムストアで同じ共有ディレクトリを使用できます。しかし異なるドメインの場合、ファイル名が衝突する可能性があるため、同じディレクトリの場所を共有できません。同様に、2つの実行中の重複ドメインは、同じディレクトリの場所を共有できません。ファイルが衝突すると、通常はファイルロックエラーが発生し、その結果データが破損する可能性があります。
    ファイルストアは、さまざまな目的のために多数のファイルを作成します。 キャッシュファイルとページングファイルは、コンテナファイルシステムにローカルに格納できます。種々のファイルと場所の詳細については、次の表を参照してください。
    ストアのタイプディレクトリ構成未構成のストア・パス相対ストア・パス絶対ストア・パスファイル名
    defaultWebLogic Serverデフォルトストア上に構成されたディレクトリ(Using the Default Persistent Storeを参照)<domainRoot>/servers/<serverName>/data/store/default<domainRoot>/<relPath><absPath>_WLS_<serverName>NNNNNN.DAT
    custom fileカスタムファイルストア上に構成されたディレクトリ(Using Custom File Storesを参照)<domainRoot>/servers/<serverName>/data/store/<storeName><domainRoot>/<relPath><absPath><storeName>NNNNNN.DAT
    cacheDirectWriteWithCache同期書き込みポリシーを持つデフォルトもしくはカスタムファイルストア上に構成されたキャッシュディレクトリ(Tuning Performance of Oracle WebLogic Serverの Tuning the WebLogic Persistent Store を参照)${java.io.tmpdir}/WLStoreCache/${domainName}/<storeUuid><domainRoot>/<relPath><absPath><storeName>NNNNNN.CACHE
    pagingThe paging directory configured on a SAFエージェントもしくはJMSサーバ上に構成されたページング・ディレクトリ(Tuning Performance of Oracle WebLogic Serverの Paging Out Messages To Free Up Memory を参照)<domainRoot>/servers/<serverName>/tmp<domainRoot>/<relPath><absPath><jmsServerName>NNNNNN.TMP
    <safAgentName>NNNNNN.TMP
    外部ボリューム内のデータを適切に保護するためには、管理者の責任でこれらのディレクトリに対して適切な権限を設定する必要があります。WebLogic Serverプロセスがボリューム内のデータにアクセスできるようにするには、コンテナを実行しているユーザがボリュームフォルダへの適切なアクセス権を持っている必要があります。

    Summary

    • ローカルボリュームの利用
      • Docker 1.8.x以前では、(匿名データボリュームを持つ)データボリューム・コンテナの利用を推奨
      • Docker 1.9.0以後では、名前付きデータボリュームの利用を推奨
      • 複数のボリュームを持つ場合、複数コンテナ間で共有するためには、名前付きデータボリュームを持つデータボリュームコンテナの利用を推奨
    • 異なるホスト間でデータを共有するためには、まず共有ストレージサーバのフォルダをマウントし、その後一つのボリュームプラグインを選択して、Dockerにマウントする
    WebLogic Serverドメインホームをデータボリュームに外出しすることをお勧めします。外出ししたドメインホームは、それぞれが独自のコンテナで実行されている管理サーバーと管理対象サーバーによって共有されている必要があります。高可用性を実現するには、すべての管理対象サーバーが共有データボリューム内のストアを読み書きする必要があります。選択されるデータボリュームの種類は、ストア、ログ、および診断ファイルの永続性を考慮して選択する必要があります。

    [WLS] Customize your ZDT Patching Workflows Using “Hooks”

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/weblogicserver/customize-your-zdt-patching-workflows-using-%E2%80%9Chooks%E2%80%9D

    WebLogic Server 12.2.1.3.0で、事前定義済みの場所(拡張ポイント)でフックされ得るユーザー定義のスクリプトを追加することで、既存のパッチ適用ワークフローのロジックを拡張できるという、ZDT Patchingの新機能が利用できるようになりました。これらのユーザー定義スクリプト(extensionとしても知られます)をワークフローとともに実行します。
    このカスタムフック機能を使うと、ビジネス要件に固有ではあるものの、基礎のパッチ適用ワークフローに含めるには適切でない任意の追加タスクをワークフローで実行できます。ワークフローの各ノードにチェックを追加して、Oracle Homeのロールアウトに十分なディスク・スペースがあることを確認したり、追加のアプリケーションのデプロイや再デプロイといった管理タスクをワークフローで実行したり、カスタム・ロジックを定義して電子メールでアップグレードの状況を通知するしたり、といったことができます。

    この機能では、カスタムスクリプトやリソースを挿入できる、マルチテナントおよび非マルチテナントワークフローのための7個の拡張ポイントを提供します。カスタムフックを実装して、任意のパッチ適用ワークフローを簡単な5ステップで変更しましょう。
    1. 利用可能な事前定義済み拡張ポイントのリストの中から、extension(これは拡張ロジックに他なりません)を実装したいワークフロー内の拡張ポイントを決定します。拡張ポイントは、ワークフローのさまざまなステージで使用できます。例えば、ep_OnlineBeforeUpdateを使用して、各ノードでパッチ適用の処理が始まる前に任意のロジックを実行できます。このep_OnlineBeforeUpdateは、通常、前提条件チェックを実行可能な拡張ポイントです。マルチテナントおよび非マルチテナントワークフローで利用可能な拡張ポイントの完全なリストは、以下のドキュメントをご覧ください。
      Oracle® Fusion Middleware Administering Zero Downtime Patching Workflows 12c (12.2.1.3.0)
      About Extension Points
      https://docs.oracle.com/middleware/12213/wls/WLZDT/customhooks.htm#WLZDT-GUID-FA78C4FC-BB5C-4C3D-A0EE-14FB3AEA685E
    2. 拡張スクリプトを作成してカスタムロジックを定義します。このスクリプトは、UNIXのシェルスクリプトもしくはWindowsのバッチスクリプトです。必要に応じて、スクリプトでこの機能が提供する定義済みの環境変数を使用できます。
    3. extensionConfiguration.json ファイルにextensionを指定します。しかし、この機能を使うと、指定extensionを複数の方法で指定できるため、様々なレベルで柔軟にパラメータのオーバーライドやカスタマイズが可能です。これらのオプションの詳細配下のドキュメントをご覧ください。
      Oracle® Fusion Middleware Administering Zero Downtime Patching Workflows 12c (12.2.1.3.0)
      Specifying Extensions to Modify the Workflow
      https://docs.oracle.com/middleware/12213/wls/WLZDT/customhooks.htm#WLZDT-GUID-04D475B0-DAF4-4140-A417-26F54B55048B
    4. extensionConfiguration.jsonファイルを作成し、拡張スクリプトにカスタムロジックを定義したら、それらを特定のディレクトリ構造を持つJARファイルにパッケージする必要があります。extensionのJARファイルのディレクトリ構造は、ドキュメントに記載があります。この時点で、ロールアウトの前に全ノードにパッチ適用されたOracleホームが配置されるのと類似の方法で、extension JARファイルが全ノードに配置されることを覚えておいてください。
    5. WLSTもしくはWebLogic Server管理コンソールを使ってワークフローを構成し、アップデートのために作成したJARファイルの名前を指定します。
    利用可能な拡張ポイントの完全な詳細や、カスタムフック機能の利用方法は、以下のドキュメントをご覧ください。
    Oracle® Fusion Middleware Administering Zero Downtime Patching Workflows 12c (12.2.1.3.0)
    Modifying Workflows Using Custom Hooks
    https://docs.oracle.com/middleware/12213/wls/WLZDT/customhooks.htm#WLZDT-GUID-FA78C4FC-BB5C-4C3D-A0EE-14FB3AEA685E

    [Docker, Linux] Announcing Oracle Container Services 1.1.8 for use with Kubernetes

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/linux/announcing-oracle-container-services-118-for-use-with-kubernetes

    OracleはOracle Container Servicesが新しいCertified Kubernetes Conformanceプログラムを通ったことを発表できうれしく思っています。
    Cloud Native Computing Foundation Launches Certified Kubernetes Program with 32 Conformant Distributions and Platforms
    https://www.cncf.io/announcement/2017/11/13/cloud-native-computing-foundation-launches-certified-kubernetes-program-32-conformant-distributions-platforms/
    "The new Certified Kubernetes Conformance Program gives enterprise organizations the confidence that workloads that run on any Certified Kubernetes Distribution or Platform will work correctly on any other version,"said Dan Kohn, Executive Director, Cloud Native Computing Foundation. "The interoperability that this program ensures is essential to Kubernetes meeting its promise of offering a single open source software stack supported by many vendors that can deploy on any public, private or hybrid cloud."

    (Cloud Native Computing FoundationのExecutive DirectorであるDan Kohnは次のように述べています。「このCertified Kubernetes Conformance Programは、エンタープライズ企業に対し、Certified Kubernetes DistributionまたはPlatform上で動作するワークロードが他のバージョンでも正常に動作するというお墨付きを与えます。このプログラムが保証する互換性は、Kubernetesがパブリック、プライベート、またはハイブリッドクラウドにデプロイ可能な、多くのベンダーがサポートする単一のオープンソースソフトウェアスタック提供の約束を果たすために不可欠なものです」)

    Release Information

    Oracle Container Services 1.1.8 for use with Kubernetesは、アップストリームでリリースされたKubernetesバージョン1.8.4に基づいています。これはOracle Linux 7で使用でき、Oracleが提供およびサポートするOracle Container Runtime for Dockerと統合するように設計されています。Oracle Container Services for use with Kubernetesは一連のDockerコンテナで実行され、これらのイメージはOracle Container Registryから入手できます。
    Oracle Container Registry
    https://container-registry.oracle.com/

    Oracleでは、kubeadm-setup.sh(クラスタ構成ユーティリティ)を利用するセットアップおよび構成スクリプトを用意しています。このスクリプトを使用すると、ネットワーク、ファイアウォール、プロキシ、初期クラスタの構成、バックアップとリカバリのサポートの追加といったOracle Linuxの設定が簡単になります。

    Notable updates from the previous release


    Oracle Container Services 1.1.8 for use with Kubernetesは、アップストリームのKubernetes 1.8.4ベースで、Kubernetes Dashboardを含んでいます。

    Installation and Update


    Oracle Container Services 1.1.8 for use with Kubernetesは、Oracle Linux Yum Serverから無料でダウンロードできます。お客様は、Oracle Linux Yum ServerやOracle Unbreakable Linux NetworkでリリースされているOracle Container Serviceの最新アップデートの使用をお勧めします。標準のyum updateコマンドを使用してアップグレードを実行できます。
    Oracle Linux Yum Server
    http://yum.oracle.com/
    Unbreakable Linux Network
    https://linux.oracle.com/ 
    Oracle Container Services for use with Kubernetesのインストールや構成方法に関する詳細情報はユーザーガイドをご覧ください。
    Oracle® Container Services for use with Kubernetes User's Guide
    https://docs.oracle.com/cd/E52668_01/E88884/html/index.html

    Resources – Oracle Linux

    Documentation

    Software Download

    Blogs

    Community Pages

    Social Media

    Data Sheets, White Papers, Videos, Training, Support & more

    Product Training and Education


    コミュニティ・ベースのサポートをお求めの場合、Oracle Technology Network CommunityのOracle Linuxスペースにアクセスしてください。
    Space - Oracle Linux
    https://community.oracle.com/community/server_&_storage_systems/linux/oracle_linux
    Oracle Technology Network Community
    https://community.oracle.com/welcome

    [misc.] Tech Deep Dive #0

    $
    0
    0
    先日(2017/12/20)Tech Deep Dive #0を開催しました(#0の理由は、#1だと次が無いときに格好悪いからです。#0で終わると、1回もやってないって嘯くことができますw)。
    Tech Deep Dive #0
    https://connpass.com/event/72517/
    たくさんの方にご参加いただきました。ありがとうございました。Wi-Fiの調子が悪くて申し訳ありませんでした。#0では、 @chiroitoさんによる、「Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか」でした。「キャッシュは麻薬」は名言でしたね。 @chiroitoさんありがとうございました。
    @yamadamnさんがTogetterにも纏めてくださっています。ありがとうございます!
    Tech Deep Dive #0 #oratdd (Togetter)
    https://togetter.com/li/1182047
    2017/12/22 12:00現在、セッションで紹介したアプリケーション等のソースコードは既に公開済みです。セッションスライドは近々公開される予定です。
    ソースコード
    https://github.com/chiroito/High-Performance-WebApplication

    イベントのコンセプト

    上記ページにも記載している通りで、アプリケーション開発者向けの勉強会では新技術をテーマにしたものは多いのですが、それだと某サイトのように「○●やってみた」レベルで終わってしまうことになりかねず、「面白かったけど、で、どこで役立つの?」ってことに陥ったり、単なる製品紹介+デモだとつまらないな、と思いまして、
    • 今現場で必要とされているテクノロジーの話で、入門編ではない、もっと深い濃い話ができる場があればいいなー
    • ケーススタディを基に、システム全体を俯瞰した設計や実装について議論できる場があればいいなー
    • 要素技術についてとことん濃い話をする場があるといいなー 
    って場を作ろう、と考えました(あと、ロジ子は裏方に徹し、基本前説するぐらいのアシスタントディレクター、ってのも重要なお約束です)。

    # 他社だとこういう類いのイベントはあるのですが、弊社だとあまりなかったので、かなり実験的な企画だった、というのは内緒。

    今後どうするの

    #0のアンケートの結果、非常に好評でした。偏に @chiroitoさまのおかげでございます(ありがたやありがたや)。なんとか#1を開催できそうです(これが一番うれしい!)。

    Tech Deep Diveで取り扱う技術領域は制限していませんが、(個人的な興味関心とアンケート結果から)ミドルウェアの視点からみたアーキテクチャやJava、コンテナ、ストリーム処理などの話が多くなるのでは、と見ています。システム連携のあれこれやAPI Management、BlockChainなどもテーマにするかもしれません。種々のナイトセミナーのコンテンツと被らないよう調整しながら、2ヶ月に1回を目安に開催する予定です。

    # データベースを取り扱うことも吝かではありませんが、既にTech Nightというイベントが継続開催されていますし、社内ではステルス性を発揮しまくるロジ子がしばちょーさんやゆっきー、みなみんといった有名人に近づくのは畏れ多くてそりゃあもう…。

    あと、東京以外でご要望の多い地域に訪問して開催することを検討しています。既に以下のアンケートをご覧になったり、回答された方もいらっしゃるかもしれませんが、興味を持ってくださった方のうち、まだ回答されていない場合には、是非ご意見をお寄せください。

    #1のテーマを何にするか決めるところが結構大変なのですが、是非次回以後もご興味あるトピックであればご参加ください!

    [Database, Integration] Oracle Databaseのプロキシ認証をJCA Adapter for Databaseから利用する

    $
    0
    0
    この内容はJPOUG Advent Calendar 2017の12月23日版です。
    JPOUG Advent Calendar 2017
    https://jpoug.doorkeeper.jp/events/67051
    12月22日は@mogmetさんの「まだbondingで消耗しているの?HAIPでインターコネクト冗長化の時代が来たよ!」でした。
    まだbondingで消耗しているの?HAIPでインターコネクト冗長化の時代が来たよ!
    http://blog.mogmet.com/oracle-interconnect-haip/ 
    今日は、Oracle Databaseのプロキシ認証をOracle SOA Suiteで利用可能なOracle JCA Adapter for Databaseでも利用可能、というお話です(本当ならコンテナ関連の話にしたかったのですが、イケメン敏腕エバンジェリストのチェックが厳しいので、やめておきますw)。

    背景

    プロキシ認証を多用されているOracle Databaseユーザーから、「JDBCドライバではプロキシ認証サポートしているけど、Oracle SOA Suite/Service Busで利用できるOracle JCA Adapter for Databaseではサポートしているの?」という問い合わせを受けました。ドキュメントにもサポートしていると明記されているので、「Yes」で終わりなのですが、「本当なの?」という疑いの眼差しが刺さったことでちょいとお手伝いしました。
    JCA Adapter for DatabaseはオンプレミスのSOA Suite/Service Busだけでなく、SOA Cloud Serviceでもご利用いただけます。設定はドキュメントに記載があるので、ドキュメントに沿って実施するだけです。
    Oracle® Fusion Middlewareテクノロジ・アダプタの理解 12c (12.2.1.2.0)
    プロキシ認証のサポート
    https://docs.oracle.com/cd/E84527_01/adapters/develop-soa-adapters/GUID-B03AD33F-2383-4E53-BF58-09D284CDDE97.htm#GUID-11B2D79B-714A-43EA-97D0-3AD64A0C7DFD
    Oracle® Fusion Middleware Understanding Technology Adapters 12c (12.2.1.3.0)
    Proxy Authentication Support
    https://docs.oracle.com/middleware/12213/adapters/develop-soa-adapters/overview7.htm#TKADP1337
    JDBCドライバのドキュメントでのプロキシ認証に関する記述はこちら。
    Oracle® Database JDBC開発者ガイド 12cリリース2 (12.2)
    プロキシ認証
    https://docs.oracle.com/cd/E82638_01/JJDBC/proxy-authentication.htm
    Oracle® Database JDBC Developer's Guide 12c Release 2 (12.2)
    Proxy Authentication
    https://docs.oracle.com/database/121/JJDBC/proxya.htm#JJDBC28352 

    データベースの設定


    前提として、Databaseにはuser1、user2というユーザーが存在し、user1、user2には同じ名前、同じ構成の表があるものとします(今回はSHIPという表を使いますが、特に意味はありません)。
    SHIPはこんな感じの表です。
    名前               NULL?     型
    ------------------ --------- ---------------
    ORDERID NOT NULL VARCHAR2(100)
    STATUS VARCHAR2(100)
    CREATEDDATE DATE
    UPDATEDDATE DATE
    ISCHECKED NOT NULL VARCHAR2(1)
    その上で、プロキシユーザーproxy_user1を作成します。権限は最小限のものを付与します。
    CREATE USER proxy_user1 IDENTIFIED BY welcome1;
    GRANT CONNECT, RESOURCE, CREATE ANY DIRECTORY, DROP ANY DIRECTORY TO proxy_user1;
    プロキシユーザーにuser1、user2として接続できるよう権限を付与します。今回は簡単のため、ロールは使いませんでしたが、単にユーザーだけで通すのはよろしくないので、パスワードで認証するようにしました(証明書を使った認証も可能です)。
    ALTER USER user1 GRANT CONNECT THROUGH proxy_user1 authenticated using password;
    ALTER USER user2 GRANT CONNECT THROUGH proxy_user1 authenticated using password;
    これでデータベース側の設定は終わりです。

    Application Serverの設定

    データソースとJCA Adapter for Databaseの設定が必要です。

    1) データソースの作成
    WebLogic Server管理コンソールに管理者としてログインし、ドメイン>サービス>データ・ソースとたどり、データソースを作成します。今回は汎用データ・ソースを選択しています。Database接続ユーザーはproxy_user1を使うことにご注意ください。


    2)JCA Adapter for Databaseの設定
    WebLogic Server管理コンソールで、ドメイン>デプロイメントを開き、DbAdapterをクリック、[構成]>[アウトバウンド接続プール]をクリックして[新規]を押し、新規アウトバウンド接続プールを作成します。プロパティのDataSourceName(XAドライバを使っている場合にはXADataSourceName)にデータソースのJNDI名を指定します。以下は設定例です。

    Adapterの設定が終了すると、再デプロイするように求められるので、更新しておきましょう。
    これでApplication Serverの設定は終了です。

    JCA Adapter利用時の設定

    今回は、Oracle Service BusでJCA Adapter for Databaseを構成しました(SOA Infraを選ばなかった深い理由はありません)。処理自体は非常にシンプルで、キーであるORDERIDを使って表のレコードを取得する、というものです。SOAPだけだと面白くないのでRESTでも呼べるようにしています。

    プロキシユーザーのままアクセスするわけにはいかないので、実際のユーザーとパスワードを指定する必要があります。ルーティングのリクエスト・アクションに[トランスポート・ヘッダー]アクティビティを配置し、
    jca.db.ProxyUserName
    jca.db.ProxyPassword
    という2個のプロパティにそれぞれユーザーとパスワードを指定します。今回は簡単のためにリテラルで指定していますが、実際にはHTTPヘッダーやリクエストメッセージ中に含めて渡すことになるでしょうし、エラー処理も全く入れていないので、実運用時にはエラーハンドラを設定する必要があります。

    設定が終わればデプロイします。これでOracle Service Busでの設定は終了です。

    試してみる

    では、試してみます。まず、USER1でSHIP表の内容を(みんな大好き)SQL*Plusで確認します。
    SQL> select * from ship;

    ORDERID           STATUS        CREATEDD UPDATEDD I
    ----------------- ------------- -------- -------- -
    P0001             COMPLETED     17-12-19 17-12-19 C
    AX0001            STARTED       17-12-19 17-12-19 C
    A0001             STARTED       17-12-19 17-12-19 C
    USER2のSHIP表はこんな感じ。
    SQL> select * from ship;

    ORDERID STATUS CREATEDD UPDATEDD I
    ----------------- ------------- -------- -------- -
    AX0001 COMPLETED 17-12-22 17-12-22 C
    先ほどのService Busで作成したRESTサービスでデータを呼び出します。ORDERIDはAX0001を使うことにしましょう。user1ならSTARTEDが出てくるはずです。

    user2の場合は、STATUSはCOMPLETEDで、日付が違うはずです。
     user2のパスワードを間違えて指定した場合、当然ながらエラーになってしまいます。Web APIとして利用するなら、当然エラー処理をして素のエラーメッセージを隠し、わかりやすいエラーメッセージに変更する必要があります。

    まとめ

    ドキュメントに記載の通り、JCA Adapter for Databaseでも問題なくプロキシ認証が動作することがわかりました。この機能を実際のシステムで使うかどうかはよくわかりませんが…。
    なお、Oracle Integration CloudのIntegration(旧Integration Cloud Service)にもOracle Database Adapterがありますが、こちらではプロキシ認証はサポートされていませんのでご注意ください。

    明日(2017/12/24) は吉田もとたか@OracleACEさんです。それでは、Happy Holiday!

    [Linux, Cloud] A Simple Guide to Nested KVM Virtualization on Oracle Cloud Infrastructure

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/cloud-infrastructure/nested-kvm-virtualization-on-oracle-iaas

    Why KVM Nested Virtualization?

    Nested virtualizationを使えば、物理ホストのハードウェアアクセラレーションを使いつつ、仮想マシン(VM)を別のVM内で実行できます。簡単なプロビジョニングプロセスで、エンタープライズや通常のユーザーに対し、ワークロードの要件に基づいて低コストかつ大きな柔軟性を提供します。このエントリでは、Oracle Cloud Infrastructure(OCI)KVMハイパーバイザー仮想マシンの上にKVMゲストをインストール、構成、および使用する手順を紹介します。このプロセスは、Nested KVM Virtualizationとも呼ばれます。

    Getting Started

    以下は、KVMハイパーバイザーホストとして利用できる現在のシェイプオプションです(注:原文執筆時(2017/10/27)の情報は古いため、最新情報のためにURLに差し替えています)。 環境で使用できる現行のオプションと機能については、Oracle Cloud Infrastructureのパブリック・ドキュメントを参照した後、作業負荷要件に基づいて仮想マシン・シェイプを選択し、プロビジョニングしてから手順を薦めてください。
    Oracle Compute Infrastructure - Launching an Instance
    https://docs.us-phoenix-1.oraclecloud.com/Content/Compute/Tasks/launchinginstance.htm
    Bare Metal Shapes
    https://cloud.oracle.com/infrastructure/compute/bare-metal/features
    VM Shapes
    https://cloud.oracle.com/en_US/infrastructure/compute/virtual-machine/features

    Requirements

    • Oracle Linux 7.xを実行する仮想マシンインスタンス(KVMをサポートしている限り、他のLinuxディストリビューションも使用できます)
    • サード・パーティのアプリケーション・ライセンスをOracle Cloud Infrastructureに持ち込む場合、KVM Server Instance上で使用しているサード・パーティのOS/アプリケーション・ベンダーとのライセンス義務を負います
    • ゲストVMのインストールのために、KVM VM OSのISOファイルをKVMサーバインスタンスにアップロードする必要があります
    • 追加のブロックストレージボリュームをNested KVM Serverインスタンスに接続し、KVM VM qcow2ディスクイメージファイルを保持することを推奨します。また、KVM VM qcow2ディスクイメージファイル用に、iSCSIブロックストレージをアタッチせず、NVMeディスク付きのVM.DenseIOシェイプも利用できます。

    Installing KVM

    KVMハイパーバイザー用に利用する仮想マシンをプロビジョニング後、以下のコマンドを実行して最新のqemuパッケージをvirt-managerと共にインストールします。
    $ sudo yum -y install qemu-kvm qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer

    Installing VNC and Xorg packages for GUI Remote Connection

    以下のコマンドを実行して、VNCとXorgパッケージをインストールします。これらのパッケージを使って仮想マシンのGUIを使ってKVMゲストを管理できます。
    $ sudo yum groupinstall "Server with GUI" -y

    $ sudo yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-utils tigervnc-server -y
    vncserver@.serviceを vncserver@:1.serviceにコピーします。
    $ cd /lib/systemd/system

    $ sudo cp vncserver@.service vncserver@:1.service

    $ sudo vi vncserver\@\:1.service
    vncserver@1.service のをユーザー名 "opc"に置き換え、vncserver@.serviceで定義済みのopcユーザー用のVNCパスワードを設定します。
    ### run the following command as opc user

    $ vncpasswd

    Password:

    Verify:

    $ exit
    VNC接続を許可するようfirewallサービスを構成します。
    $ sudo firewall-cmd --permanent --zone=public --add-service vnc-server
    再起動時に自動起動するようにVNCサービスを有効化します。
    $ sudo systemctl daemon-reload

    $ sudo systemctl enable vncserver@:1.service

    $ sudo systemctl start vncserver@:1.service

    Preparing the KVM Server for IOMMU Passthrough and Nested Virtualization

    Nested KVMサーバーを実行するには、まず仮想NICのパススルー(IOMMU)オプションを使用する機能を有効にした上で、Nested VMハイパーバイザーでNested KVMを有効化する必要があります。
    How to assign devices with VT-d in KVM
    https://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM
    Oracle Linux 7.xのNested KVM仮想マシンインスタンスでは、以下の操作をします。
    ### Backup Grub File

    $ sudo cp /etc/default/grub /etc/default/grub.bck

    ### Edit grub and include the following opitons

    $ sudo vi /etc/default/grub

    ### Append the following parameters in GRUB_CMDLINE_LINUX line

    intel_iommu=on  kvm-intel.nested=1

    ### Below is an example of how grub file should look like:

    $ sudo cat /etc/default/grub |grep CMDLINE

    GRUB_CMDLINE_LINUX="crashkernel=auto LANG=en_US.UTF-8 console=tty0 console=ttyS0,9600 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 ip=dhcp netroot=iscsi:169.254.0.2::::iqn.2015-02.oracle.boot:uefi iscsi_param=node.session.timeo.replacement_timeout=6000 intel_iommu=on kvm-intel.nested=1"
    保存してviを終了してから、以下のコマンドを実行します。
    ### Enable tuned

    $ sudo systemctl enable tuned

    $ sudo systemctl start tuned

    $ sudo tuned-adm profile virtual-host

    ### Recreate grub to validate all the changes

    $ sudo cp /boot/efi/EFI/redhat/grub.cfg /boot/efi/EFI/redhat/grub.cfg.orig

    $ sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
    Using the OCIコンソールを使い、仮想クラウドネットワークセキュリティリストを編集し、(利用中のVNCで使っているポートが5901/tcpである場合)5901/tcpを有効化します。環境に応じてVNCポート番号を変更してください。
    Source: 0.0.0.0/0

    IP Protocol: TCP

    Source Port Range: All

    Destination Port Range: 5901

    Allows: TCP traffic for ports: 5901
    OCI Nested KVM VMインスタンスを再起動して、KVMカーネルモジュール、VNCおよびXorgサービスをロードします。 VMがオンラインに戻ったら、vncviewerのようなVNCアプリケーションを使用してKVM VMハイパーバイザーインスタンスに接続します。
    RealVNC Viewer
    https://www.realvnc.com/en/download/viewer/
    Screen Shot 2017-08-04 at 4.28.09 PM.png

    Creating an Oracle Cloud Infrastructure Secondary vNIC

    続いてセカンダリvNICを作成し、それをKVM Nested VMインスタンスにアタッチします。このセカンダリvNICは、Nested VMゲストで使用します。OCIダッシュボードを使って、KVM Nested VMインスタンスの詳細をクリックし、[Attached vNIC]を選択し、[Create vNIC]をクリックします。以下の例では、アベイラビリティ・ドメイン1(AD1)でNew-BM-172と呼ばれるVirtual Cloud Network(VCN)を使用しています。

    vNIC作成後、以下のような表示が出ます。後で使用するため、MACアドレスとIPアドレス情報を覚えておいてください。
    Screen Shot 2017-10-04 at 10.44.13 AM.png

    Associating OCI Secondary vNIC with the KVM Guest VM

    ゲストをインストールする前に、KVM VM Hypervisorで以下のコマンドを実行します。
    $ sudo ip link

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT

        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP mode DEFAULT qlen 1000

        link/ether 00:00:17:01:16:5d brd ff:ff:ff:ff:ff:ff

    3: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000

        link/ether 00:00:17:01:ce:47 brd ff:ff:ff:ff:ff:ff

    4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT

        link/ether 52:54:00:40:76:12 brd ff:ff:ff:ff:ff:ff

    5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN mode DEFAULT qlen 500

        link/ether 52:54:00:40:76:12 brd ff:ff:ff:ff:ff:ff
    以前の手順で作成したOCIセカンダリvNIC MACアドレスに一致するインターフェイスを特定します。上記のように、インタフェースens4は、KVMゲストのインストールプロセスで使用するインタフェースです。次の手順でKVMゲストVMをプロビジョニングし、上記のvNIC情報を追加します。

    Creating a KVM guest instance

    コマンドラインまたはグラフィカルツールでKVMを管理できますが、ここでは、GUIツールを中心に説明します。VNCを使用してOCI KVM Hypervisorインスタンスに接続し、gnome-terminalを開いて次のコマンドを実行します。
    $ sudo virt-manager
    virt-managerを初めて実行する場合、ローカルのQEMU/KVM接続を作成する必要があります。作成完了後、"Create a new Virtual Machine"ボタンをクリックし、図のように必要なオプションに従います。Requirementsの章に記載の通り、OSファイルはまずKVM Nested VMにアップロードする必要があります。SCPコマンドライン(MacまたはLinuxワークステーション)またはwinscp(Windowsワークステーション )を使うなどの方法でアップロードします。OS ISOファイルのアップロードが終了したら、KVM Guestのインストールプロセスを続行します。
    Oracle® Linux Administrator's Guide for Release 7
    Using scp and sftp to Copy Files Between Systems
    https://docs.oracle.com/cd/E52668_01/E54669/html/ol7-s9-openssh.html
    WinSCP - Uploading Files
    https://winscp.net/eng/docs/task_upload

    1- KVM Guestインストールを選択
    Screen Shot 2017-08-04 at 4.42.27 PM.png

    2- セットアップに基づく情報を選択


    3- KVMゲストVM上で利用するサービスワークロードに基づいてメモリやCPU設定を選択


    4- ストレージのサイズおよび場所を設定


    5- "Customize Configuration before install"を選択していることを確認して、finishをクリック


    6- virt-managerのゲスト作成プロセスで追加されたデフォルトのNICをクリックしてPassthrough(パススルー)に変更し、識別したOCIセカンダリvNIC MACアドレスを正しいネットワークインターフェイス名(つまりens4)と一緒に追加します。
    Screen Shot 2017-10-04 at 11.15.09 AM.png
    7- "Apply"をクリックして"Begin Installation"ボタンをクリックしてからは、通常のOSインストールプロセスに従います。

    (注意)インストール中またはインストール後にネットワーク情報を追加する必要があるため、ネットワーク構成として静的IP(上記で作成したセカンダリvNICに基づくIP情報を使用)とDNS(サーバーと検索ドメインオプション)、ゲートウェイIPを設定することをお忘れなく。
    Screen Shot 2017-10-04 at 11.19.37 AM.png

    Additional Security Recommendations

    • SSHパスワード認証を無効にし、SSH鍵認証を有効にする(/home/opc/.ssh/authorized_keysファイルにssh公開鍵を追加)
    • KVMゲストファイアウォールを有効にしておき、必要なポートだけを開ける
    • KVMゲストVMに定期的にパッチを適用する
    • 可能であればVPNを使用する
    • VNCポートをブロックしたままにし、 "ssh -L"(SSHポートフォワード)を使用して、OCI Nested KVM VMハイパーバイザーとローカルホスト間にトンネルを作成し、暗号化されたチャネルを介してVNCを使用できるようにする

    Conclusion

    Oracle Cloud InfrastructureでNested KVMハイパーバイザーを設定する方法を説明しました。これは、旧バージョンのKVM上で実行中のアプリケーションに対処したり、オンプレミスのインフラストラクチャコストを削減して、KVM環境をクラウドに移行するのに最適な方法です。Oracle Cloud Infrastructureは、仮想マシンやベアメタル・シェイプ上で直接実行するための完全なKVMサポートを備えていますし、別のユースケースには、既存のKVM環境の移行および管理においてRavelloも適しています。
    Ravello Service - Oracle Cloud
    https://cloud.oracle.com/ja_JP/ravello

    [Linux] Tracing NFS: Beyond tcpdump

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/linuxkernel/tracing-nfs%3a-beyond-tcpdump

    このブログエントリはLinuxカーネル開発者のChuck Leverによるものです。歴史的に、tcpdumpとrpcdebugはNFSクライアントのトラブルシューティングで使われてきましたが、さすがに古くなってきました。Oracleでは、既存のツールをチェックし、タイミングに影響を与えたり、キャプチャ情報の損失を招くことなく、高負荷のワークロードや高性能ネットワーク・ファブリック上でNFSクライアントの動作を監視できる新しいツールを提供したいと考えています。

    Historical NFS and RPC Debugging Facilities

    ネットワークトラフィックが暗号化されていない限り、NFSの操作はNFSクライアントとNFSサーバーの間でネットワークをスヌーピングするすべての人から見えてしまいます。NFSの操作は、tcpdump、wireshark、またはsnoopなどを使い、クライアントまたはサーバーのいずれかで利用できるスヌーピングツールで取得できます。これらのツールには、ネットワークキャプチャやpcapファイルに含まれるNFSの操作を解析し、後で解析するためにファイルに保存したり、人間が読める解析形式で表示する機能があります。

    これはNFS開発者が使用できる最も貴重なツールの1つですが、いくつかの欠点があります。
    • 最も有用なデータをキャプチャするためには、問題が発生したときに、ツールが実行されている必要があります。問題が発生した後にキャプチャされたデータは、一般に役に立ちません。
    • キャプチャツールは膨大な量のデータを非常に迅速に生成できます。パケット・フィルタリングとパケット・キャプチャを旨く使ってファイルに束ねることで、解析対象のデータを軽減できます。
    • データレートが高いため、このツールではキャプチャ実行中のシステムに大きなオーバーヘッドが発生する可能性がありますが、問題の再現を避けるため、タイミングを変更できます。そうしない場合、システムが追いつくのに十分なパフォーマンスがないために、重要なパケットがキャプチャされない可能性があります。
    • ユーザーデータもこのツールでキャプチャされるため、結果として得られるキャプチャファイルのサイズが大きくなり、機密データの保存にNFSを使用している場合にはプライバシーの問題が発生します。
    正確なキャプチャ構成の権利を取得し、適切な環境で根本的な問題をきれいにキャプチャできるようになるまで、キャプチャを繰り返し実行する必要があります。

    Linuxには、NFSクライアントとRPCクライアントとサーバースタックに組み込まれた内部トレースメカニズムがあります。これは "rpcdebug"ファシリティとして知られています。これを有効にすると、NFS READの送信やRPCの各実行ステップなどの特定のイベントに対するメッセージをカーネルログ(通常は/var/log/messages)に追加します。

    このメカニズムは、ネットワークキャプチャと同様の欠点を抱えています。より批判的に言えば、ユーザファイルではなくカーネルログやシステムコンソールに書き込むため、以下のような重大な欠点があります。
    • システムコンソールは、実際のシリアルポートであることことが多々あるため、デバッグメッセージの生成速度が制限され、NFS操作が遅くます。大量のNFSワークロードを実行している本番システムでrpcdebugを使用することは適切ではありません。
    • 最近のLinuxディストリビューションでは、カーネルログにレート制限が組み込まれているため、短期間に数百のデバッグメッセージが表示された後、レートリミッタによって新しいメッセージが送信されます。問題の再現時には、問題が再現される前にレート制限が頻繁に発生します。
    さらに、デバッグレベルの細かさももちろん関係します。たとえば、各NFS GETATTR操作を確認するには、すべてのNFS操作でデバッグメッセージを有効にする必要があり、結果として大量のデータが生成されます。

    Introducing static trace points

    大規模なワークロードや、NFSの同時ユーザーが多いシステム、またはますます高速なネットワークでNFSを頻繁に使用する場合、従来のデバッグ・メカニズムはもはや実行可能ではなく、代わりに、低いオーバヘッドと柔軟なイベント・フィルタリングを持つメカニズムが必要です。Linux NFSコミュニティは、この目的のために静的トレースポイントを採用しています。

    これらのトレースポイントは、開発者がソースコードの固定部分に追加した、重要な情報(RPC XID、ユーザーID、I/Oのサイズ、エラーコードなど)を取得できるポイントです。トレースポイントは常に使用可能であり、有効にしてもオーバーヘッドは低いままです。さらに、必要に応じて個々のトレースポイントのオン/オフを切り替えることができます。トレース・データはユーザー・ファイルに送られ、コンパクトな形式で保管されます。ユーザーデータはトレースポイントで公開されないので、キャプチャデータのサイズはずっと小さくなります。

    LinuxカーネルのNFSクライアントには、すでに複数のNFSトレースポイントがあり、NFSクライアントおよびRPC層の操作のさまざまな運用時の情報を取得します。しかし、Oracleは最近、特にNFS I/O操作をキャプチャする一連のトレース・ポイントを提供しました。新しいトレースポイントは、v4.14 LinuxカーネルのNFSクライアントで初めて登場しました。

    これには、すべてのNFS READ、WRITE、COMMIT操作の開始と操作の引数(データペイロードを除く)、終了、そしてそれぞれの操作で発生したエラーが含まれます。これらの6つのトレースポイントのそれぞれを個別に有効にすることも、一度に有効にすることもできます。生成される各イベントには、タイムスタンプ情報と、操作を要求したCPUコアおよびプロセスに関する情報が含まれます。

    これらのトレースポイントを以下のような洗練された方法で使用できます。
    • 一連の個々のNFS READ操作を記録し、記録されたタイムスタンプを使用して外れ値分析を生成する
    • 本番ワークロードで、特定のエラー状態のNFS WRITE結果を監視する
    • 負荷の大きいワークロードでも、サーバーの再起動時にNFS COMMITが正しく動作することを確認する
    • NFSv4の状態回復がNFS I / O操作に与える影響を調べる
    NFSトレースポイントは、カーネルの他の静的トレースポイントと同様に、trace-cmdツールを使用して制御します。以下のコマンド
    trace-cmd list | grep nfs:
    を使用して、カーネルNFSクライアントに関連するトレースポイントを検出します。v4.14のNFSクライアントに導入されたトレースポイントには以下のものが含まれます。
    • nfs:nfs_initiate_read
    • nfs:nfs_readpage_done
    • nfs:nfs_initiate_write
    • nfs:nfs_writeback_done
    • nfs:nfs_initiate_commit
    • nfs:nfs_commit_done
    Oracleは、NFS導入を担当するシステム管理者にとって、優れたトラブルシューティングおよび監視ツールがどれほど重要であるかを認識しています。私たちは、通常の操作を妨げずに深い可視性を提供するLinuxに機能を引き続き提供することを意図しています。

    [Cloud] Announcing Open Source Jenkins Plugin for Oracle Cloud Infrastructure

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/developers/announcing-open-source-jenkins-plugin-for-oracle-cloud-infrastructure

    Jenkinsは、ソフトウェアプロジェクトを継続的に構築およびテストするために使用できる continuous integration と continuous delivery のためのアプリケーションです。Jenkins OCI PluginはGithubからご利用いただけます。そしてユーザーはこのプラグインを使ってJenkinsからOracle Cloud Infrastructureリソースにアクセスし管理できます。Jenkins OCI Pluginを使うJenkinsマスター・インスタンスでは、Oracle Cloud Infrastructure内のスレーブ(インスタンス)をオンデマンドで起動し、ジョブ完了後自動的にスレーブを削除できます。
    Oracle Cloud Infrastructure
    https://cloud.oracle.com/cloud-infrastructure
    Jenkins OCI Pluginをインストール後、OCI Cloudオプションと必要なシェイプ、イメージ、ドメインといったテンプレートを追加できます。テンプレートには、Jenkinsジョブで使用できるラベルがあり、複数のテンプレートをサポートしています。[テンプレート]オプションには、ラベル、ドメイン、資格証明、シェイプ、イメージ、スレーブリミット、およびタイムアウトが含まれます。

    以下でプラグインのビルドとインストール手順をご紹介しますが、この内容はGitHubでもご覧いただけます。
    Jenkins Plugin for Oracle Cloud Infrastructure (Compute)
    https://github.com/oracle/jenkins-oci-plugin

    Installing the Jenkins OCI Plugin

    以下のセクションで、Jenkins OCI Pluginのコンパイルとインストールについて説明します。

    Plugins required:

    • credentials v2.1.14以上
    • ssh-slaves v1.6以上
    • ssh-credentials v1.13以上

    Compile and install OCI Java SDK:

    以下のIssueページを参照してください。Maven 3.3.9および3.5.0でテスト済みです。
    Maven release #25
    https://github.com/oracle/oci-java-sdk/issues/25

    Step 1 – Download plugin

    $ git clone https://github.com/oracle/oci-java-sdk
    $ cd oci-java-sdk
    $ mvn compile install

    Step 2 – Compile the Plugin hpi file

    $ git clone https://github.com/oracle/jenkins-oci-plugin
    $ cd jenkins-oci-plugin
    $ mvn compile hpi:hpi

    Step 3 – Install hpi

    • Option 1 – Manage Jenkins > Manage Plugins と辿りAdvancedタブをクリック、Upload Pluginを選択して、Choose Fileをクリックしてファイルを選択し、Uploadをクリックする
    • Option 2 – Copy the ダウンロード済みの.hpiファイルをJenkinsマスターのJENKINS_HOME/pluginsに配置する
    Jenkinsを再起動すると、Manage PluginsInstalledセクションでOCI Pluginが現れるはずです。

    OCI Jenkins Pluginの設定の詳細については、GitHubのドキュメントを参照ください。
    Jenkins Plugin for Oracle Cloud Infrastructure (Compute) - Configuration
    https://github.com/oracle/oci-compute-jenkins-plugin#configuration
    また、問題や質問がある場合は、Issuesタブから送信して開発チームにお問い合わせください。
    Jenkins Plugin for Oracle Cloud Infrastructure (Compute) - Issues
    https://github.com/oracle/jenkins-oci-plugin/issues

    Related content

    [Database, Node.js] node-oracledb 2.0 with pre-built binaries is on npm

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/opal/node-oracledb-20-with-pre-built-binaries-is-on-npm

    Release announcement

    Oracle Database用のNode.jsアドオンであるnode-oracledb 2.0.15がnpmからご利用頂けるようになりました。
    node-oracledb
    https://www.npmjs.com/package/oracledb 

    Top features: Pre-built binaries, Query fetch improvements

    変化を起こす時がやってきました。node-oracledb version 1は安定していましたが、node-oracledb 2をご提供できることを誇りに思っています。コードとドキュメント全体を改善し、このリリースはよいものになっています。現在、3000を超える機能テストと、Oracle社内テストインフラストラクチャの下さまざまな環境で実行するストレステストを実施してきました。
    全ての変更は変更履歴をご覧ください。
    Change Log
    https://github.com/oracle/node-oracledb/blob/master/CHANGELOG.md
    node-oracledb 1.13から2.0への移行は、以下のURLをご覧ください。
    Migrating from node-oracledb 1.13 to node-oracledb 2.0
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#migratev1v2

    node-oracledb v2 highlights

    • node-oracledb 2.0は、便利のために既製バイナリを持つ最初のリリースです。特にWindowsユーザーの方々にとってかなり簡単になっています。

      Node.js 4、6、8、9のバイナリは、Windows 64ビット、macOS 64ビット、およびLinux 64ビット(Oracle Linux 6上に構築)で使用できます。
      package.jsonの依存関係にoracledbを追加するか、手動で以下のコマンドでインストールしてください。
      npm install oracledb
      (もちろんOracle Clientはまだ別途必要です。これらは全て重労働です)。
      バイナリが利用できないときにはエラーメッセージが表示され、
      require('oracledb')
      で失敗したときにメッセージが改善されましたが、古いglibcライブラリを持つLinuxユーザの場合、Linuxランタイムエラーが発生する可能性がありますので、この場合は以前と同様ソースからnode-oracledbをビルドする必要があります。以下を参照してください。
      独自の内部Webサーバーにバイナリパッケージをホスティングするためのサポートがあります。これは、多数のデプロイメントを持つユーザーに最適です。以下のREADMEをご覧ください。
      node-oracledb/package/README.md
      https://github.com/oracle/node-oracledb/blob/master/package/README.md
      node-oracledb 2.0は、Pythonのcx_Oracle 6.x APIや他の言語のサードパーティ製APIでも使用されているODPI-C抽象化レイヤーを使用する最初のリリースです。
      Oracle Database Programming Interface for Drivers and Applications
      https://github.com/oracle/odpi
      このODPIの利用がnode-oracledb 2.0バイナリを配布できる主な変更です。ODPI-C利用の別の結果として、任意のnode-oracledb 2バイナリは、再コンパイルを必要とせずにOracleクライアント11.2,12.1または12.2ライブラリのいずれかで実行できます。これにより、マシン間でnode-oracledbビルドをコピーするときの移植性が向上します。利用可能なOracleの機能はOracle Client(およびOracle Database!)のバージョンによって異なるため、意図したデプロイメント環境を使用してアプリケーションをテストすることが重要です。
    • 必要であれば、ソースコードからドライバを構築できます。コンパイルはバージョン1より簡単になりました。Oracleヘッダー・ファイルは不要になり、環境変数OCI_INC_DIRまたはOCI_LIB_DIRも不要です。
      ソースからビルドする場合、GitHubブランチまたはタグからコードを取得する必要があります。一般に、必要なのは最新のリリースタグです。
      node-oracledb Releases
      https://github.com/oracle/node-oracledb/releases
      Python 2.7、 gitユーティリティ、コンパイラがあることを確認し、package.jsonの依存関係にoracle/node-oracledb.git#v2.0.15を追加するか、手動でインストールを実行します。
      npm install oracle/node-oracledb.git#v2.0.15
      gitを有していないユーザーや、ODPIサブモジュールコードをpullしない古いバージョンのNodeのユーザーは、ソースパッケージを使用できます。
      npm install https://github.com/oracle/node-oracledb/releases/download/v2.0.15/oracledb-src-2.0.15.tgz
      コンパイル開始前にGitHubがソースをダウンロードするのが少し遅くなる可能性があることがわかりました。
    • クエリ処理の改善
      • 直接フェッチを拡張して無制限の行数をフェッチできるようにしたり、このデフォルト・メソッドが取得する行数のデフォルト行数を無制限に変更できるようにしました。大量の行数を取り扱う場合において今なお既存のResultSetやStreamingメソッドの利用を推奨します。
      • ODPI-Cが内部的に「プリフェッチ」の代わりに「配列フェッチ」を使用しています(どちらも、バッファリングが行われる場所のみが異なるバッファリング/チューニングのための基礎となるメソッドで、どちらもアプリケーションには透過的です)ため、prefetchRowsを新しい同等のプロパティfetchArraySizeで置き換えました。
      • より良いパフォーマンスを得るために、getRow()のバッファリングや行をJavaScriptに移動しました。もはや、より低いレイヤーへの頻繁な呼び出しは不要です。
      いくつかのTipsを以下のエントリでご紹介しています。
      Node-oracledb v2 Query Methods and Fetch Tuning
      https://blogs.oracle.com/opal/node-oracledb-v2-query-methods-and-fetch-tuning
      https://orablogs-jp.blogspot.jp/2018/01/node-oracledb-v2-query-methods-and.html
    • アプリケーションがリソースリークしないように、リソース処理を強化しました。LOBまたはResultSetが開いているときに誤って接続をクローズしようとすると、新しいエラーDPI-1054が送出されます。
    • LOBのfetchAsStringおよびfetchAsBufferの問合せ、およびLOBバインドにおけるnode-oracledbのサイズ制限ですが、node-oracledb version 1では、Oracle 11gR2クライアントライブラリが使用されている場合にこれらの値が特に低いため、Oracleクライアントを更新していない人にとってはこれは歓迎されることでしょう。Node.jsおよびV8ではサイズが制限されるため、引き続きラージLOBに対してStreamインタフェースを使用します。
    • ROWIDとUROWIDをサポートするようになりました。データは文字列として取得します。
    • LONG(String型としてデータを取得)およびLONG RAW(Buffer型としてデータを取得)型の列をサポートするようになりました。
    • TIMESTAMP WITH TIME ZONEの日付型をサポートするようになりました。これらはLOCAL TIME ZONEを使ってnode-oracledbのDateオブジェクトにマップされます。TIME ZONEコンポーネントは、Dateオブジェクトでは使用できません。
    • NCHAR、NVARCHAR2、NCLOB 列のクエリサポートを追加しました。Database Character SetとDatabase National Character Setによっては、DMLとのバインドはデータを正しくインサートしない可能性があります。

    Plans for Version 1

    これまでに言明した計画では、Node.js 4のLTS保守が2018年4月で終了すると、バージョン1の正式サポートを中止するとしていました。
    Node-oracledb 1.x and 2.x: Plans for 2017 #601
    https://github.com/oracle/node-oracledb/issues/601
    1.13.1がしばらく安定していたことを嬉しく思っており、例外的な状況が発生しない限り、node-oracledb 1リリースを追加する必要はないと考えています。

    Plans for Version 2

    現在、Node.js 4、6、8、9でテストしています。新しいnode.jsのバージョンがリリースされると、このリストはもちろん変更されます。既製バイナリも変更され、可用性は保証されません。
    ODPI-Cは、node-oracledbを拡張するための強固な基盤を形成します。また、ODPI-CをベースにしたPython cx_Oracle 6のユーザーは、利用可能な詳細のOracle機能を理解しています。これらの機能の多くは、node-oracledbユーザーからも要求されてきました。他のオープンソースプロジェクトと同様に、node-oracledbのためのしっかりした保証はありませんが、私たちが向けるべき一般的な方向とご理解いただいて結構です。プルリクエストは大歓迎です。
    気付かないかもしれませんが、Oracle Databaseの次期メジャーリリースをテストしています(作成を手助けしています)。そのため、node-oracledbの作業から離れて、Oracle Database全体にあわせて動く必要があったこともあります。クライアントおよびサーバーのいずれの場合でも、今後のリリースでは素晴らしいものをお届けできると思っています。

    Resources

    node-oracledbのインストール手順
    Installing node-oracledb Version 2
    https://github.com/oracle/node-oracledb/blob/master/INSTALL.md
    node-oracledbのドキュメント
    node-oracledb 2.0 Documentation for the Oracle Database Node.js Add-on
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md
    node-oracledbの変更履歴
    Change Log
    https://github.com/oracle/node-oracledb/blob/master/CHANGELOG.md
    node-oracledb 1.13から2.0への移行は、以下のURLをご覧ください。
    Migrating from node-oracledb 1.13 to node-oracledb 2.0
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#migratev1v2
    node-oracledbに関する問題や質問はGitHubにお寄せください。
    node-oracledb - issues
    https://github.com/oracle/node-oracledb/issues
    最後に、node-oracledbへの貢献は大歓迎です。以下のURLをご覧ください。
    Contributing to node-oracledb
    https://github.com/oracle/node-oracledb/blob/master/CONTRIBUTING.md

    [Database, Node.js] Node-oracledb v2 Query Methods and Fetch Tuning

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/opal/node-oracledb-v2-query-methods-and-fetch-tuning

    Node.js node-oracledb v2 add-on for Oracle Databaseでは、より低レベルのデータ・アクセス・レイヤーを改訂して、スタンドアロン・プロジェクトODPI-Cとして仕立てました。これは、他のいくつかの言語APIによって再利用されています。
    oracledb
    https://www.npmjs.com/package/oracledb
    Oracle Database Programming Interface for C (ODPI-C)
    https://oracle.github.io/odpi/
    ODPI-Cによって、node-oracledbの内部クエリ処理コードの一部を簡素化する理由と機会を手にしました。
    要約すると、node-oracledbには、Oracle Databaseに対するクエリ実行する4つの方法があります。これらはバージョン1とバージョン2で同じです。
    • 直接フェッチ
      非ResultSetやqueryStream()を使わないデータ取得方法です。すべての行は1つの大きな配列で返され、maxRows(v2では無制限の配列サイズが許されます)に制限されています。
    • ResultSet getRow()
      すべての行が返されるまで各呼び出しで1つの行を戻します。
    • ResultSet getRows(numRows)
      すべての行が返されるまで各呼び出しの行のバッチを返します。
    • queryStream()
      すべての行が返されるまで行をストリームします。
    node-oracledb v2での変更点は以下の通りです。
    • 無制限の行数をフェッチできるように拡張された直接フェッチをデフォルトにしました。 これはmaxRows=0の場合の挙動です。
    • 新しいプロパティfetchArraySizeprefetchRows(以前内部フェッチバッファリングとチューニングに使用していました)を置き換えました。デフォルトのサイズは100です。fetchArraySizeは、直接フェッチ、ResultSet getRow()およびqueryStream()に影響します。
    • getRows(numRows, ...)の内部フェッチバッファリングはnumRows値によってのみ調整できます。以前は、prefetchRowsも内部バッファリングに影響する可能性がありました。
    • queryStream()は、内部バッファのサイジングにfetchArraySizeを使用します。
    • パフォーマンスを向上させるためにJavaScriptでgetRow()が実装され、内部バッファサイズのチューニングのためにfetchArraySizeを使用します。
    ここで説明したいv2の変更は、「直接フェッチ」における内部バッファリング方法です。

    直接フェッチで無制限の行数をフェッチできるように、データをfetchArraySizeサイズのバッチでOracle Databaseから内部的にフェッチし、その後連結されてコールバックで戻される大きな結果配列を形成します。これゆえ、fetchArraySizeを使用してフェッチのパフォーマンスをチューニングできます。node-oracledb v1では、データベースからデータをフェッチする前に、maxRowsサイズの1つの大きな配列が割り当てられていました(node-oracledb v2では、本当に必要ならば、fetchArraySize=maxRowsmaxRows>0と設定して同じ挙動を実現できます)。
    fetchArraySizeが100(デフォルト)と1000の場合に50000行をフェッチするという2つの異なるシナリオを見てみましょう。コードはこのエントリの最後にあります。
    Direct fetch:        rows: 50000, batch size: 100, seconds: 4.054

    Direct fetch: rows: 50000, batch size: 1000, seconds: 1.643
    この場合(ローカルデータベース使用時)fetchArraySizeを増やすとパフォーマンスが向上することがわかります。これにはさまざまな要因があるかもしれませんが、共通するのは、レコードのバッチを取得するための「ラウンドトリップ」が少ないため、ネットワークコストの削減とデータベースの負荷の削減です。各クエリと環境は異なるため、独自のチューニングが必要です。
    直接フェッチにfetchArraySizeを使用する利点は次のとおりです。
    • データのバッチ処理とネットワーク転送のパフォーマンスを調整できます。
    • クエリ結果の行数が不明であるか、または実行ごとに変化する場合、使用メモリは徐々に増加します。(v1でのmaxRowsに基づく)1つの大きなメモリチャンクを、「最悪の場合」を考慮して多数の行を処理するために事前に割り当てる必要はありません。
    直接フェッチには2つの欠点があります。
    • 結果を格納する1つの大きな配列が必要です。 これはv1とv2で同じです。
    • レコードのバッチを連結すると、最終結果の配列より多くのメモリーを使用する可能性があり、断片化を引き起こす可能性があります。
    すべてのクエリメソッドのタイミングを見てみましょう。これは1回の実行です。 スクリプトを実行するたびに変動が予想されました。「バッチサイズ」の数値は、getRows(numRows)呼び出し時はnumRows、それ以外のfetchメソッドの場合はfetchArraySizeです。
    Direct fetch:        rows: 50000, batch size: 100, seconds: 4.054
    ResultSet getRow(): rows: 50000, batch size: 100, seconds: 1.625
    ResultSet getRows(): rows: 50000, batch size: 100, seconds: 1.586
    queryStream(): rows: 50000, batch size: 100, seconds: 1.691

    Direct fetch: rows: 50000, batch size: 1000, seconds: 1.643
    ResultSet getRow(): rows: 50000, batch size: 1000, seconds: 1.471
    ResultSet getRows(): rows: 50000, batch size: 1000, seconds: 1.327
    queryStream(): rows: 50000, batch size: 1000, seconds: 1.415
    ResultSetとqueryStream()メソッドは、一度にすべての行をメモリに格納する必要がないため、メモリ管理が少なくて済みます。明らかに最初の結果が外れ値です。メモリの小さなまとまりを連結するというメモリ管理の結果大きくなっています。これを少し改善するためにnode-oracledbでできることについていくつかアイデアがありますが、これらのアイデアは将来のプロジェクトで調査すべきものであり、最終的にすべての行を同時にメモリに保持しなければならないという同じメモリに保持しなければならないという最初の欠点を解決できるものではありません。
    結論として、ResultSetを使用するか、多数の行を扱う場合にはストリーミングを使うことが推奨されます。これは私たちがv1でお知らせしたものと同じです。
    少数の行の場合、さまざまなクエリメソッドはほとんど同じように機能します。 タイミングは非常に短いので、以下に示す実行結果の違いをノイズとして扱うことができます。ここで各クエリは1行だけを返しました。
    Direct fetch:        rows: 1, batch size: 100, seconds: 0.011
    ResultSet getRow(): rows: 1, batch size: 100, seconds: 0.012
    ResultSet getRows(): rows: 1, batch size: 100, seconds: 0.013
    queryStream(): rows: 1, batch size: 100, seconds: 0.013

    Direct fetch: rows: 1, batch size: 1, seconds: 0.012
    ResultSet getRow(): rows: 1, batch size: 1, seconds: 0.012
    ResultSet getRows(): rows: 1, batch size: 1, seconds: 0.013
    queryStream(): rows: 1, batch size: 1, seconds: 0.013
    あまりないかもしれませんが、特に、行数がわかっている場合(1行など)、少数の行をクエリする場合は、小さなfetchArraySizeまたはnumRowsを使用することをお勧めします。これにより、node-oracledb、Oracleクライアント・ライブラリ、およびデータベース全体に割り振られる必要のあるメモリ量が少なくて済みます。

    References

    node-oracledbのドキュメントは以下にあります。
    node-oracledb 2.0 Documentation for the Oracle Database Node.js Add-on
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md
    If you are currently using node-oracledb v1を現在お使いの場合、移行のためのドキュメントに関心をお持ちかもしれません。
    Migrating from node-oracledb 1.13 to node-oracledb 2.0
    https://github.com/oracle/node-oracledb/blob/master/doc/api.md#migratev1v2

    Code

    以下は筆者が使用した基本的なテストスクリプトがあります。ResultSetのコードは、以下のv1のサンプルに由来しています。
    An Overview of Result Sets in the Node.js Driver
    https://jsao.io/2015/07/an-overview-of-result-sets-in-the-nodejs-driver/
    config.jsファイルは最後にあります。dbconfig.jsファイルは、以下のURLにある例と同じです。
    node-oracledb/examples/dbconfig.js
    https://github.com/oracle/node-oracledb/blob/master/examples/dbconfig.js
    タイミングには、DB内の文の実行が含まれますが、これはnode-oracledbによって制御されません。直接フェッチの場合、クエリ実行コストとfetchArraySizeが制御するデータフェッチコストを区別する方法はJavaScriptにはありません。

    Direct Fetch

    // direct fetch

    var oracledb = require('oracledb');
    var dbConfig = require('./dbconfig.js');
    var config = require('./config.js');

    oracledb.getConnection(
      dbConfig,
      function(err, connection) {
        if (err) throw err;

        var rowsProcessed = 0;
        var startTime = Date.now();

        connection.execute(
          'select * from all_objects where rownum <= :mr',
          [ config.maxRows ],
          { fetchArraySize: config.batchSize },
          function(err, results) {
            if (err) throw err;

            rowsProcessed = results.rows.length;

            // do work on the rows here

            var t = ((Date.now() - startTime)/1000);
            console.log('Direct fetch:        rows: ' + rowsProcessed +
                        ', batch size: ' + config.batchSize + ', seconds: ' + t);
            
            connection.release(function(err) {
              if (err) console.error(err.message);
            });
          });
      });

    ResultSet getRow()

    // ResultSet getRow()

    var oracledb = require('oracledb');
    var dbConfig = require('./dbconfig.js');
    var config = require('./config.js');

    oracledb.getConnection(
      dbConfig,
      function(err, connection) {
        if (err) throw err;

        var rowsProcessed = 0;
        var startTime = Date.now();

        connection.execute(
          'select * from all_objects where rownum <= :mr',
          [ config.maxRows ],
          {
            resultSet: true,
            fetchArraySize: config.batchSize
          },
          function(err, results) {
            if (err) throw err;

            function processResultSet() {
              results.resultSet.getRow(function(err, row) {
                if (err) throw err;
                if (row) {
                  rowsProcessed++;

                  // do work on the row here

                  processResultSet(); // try to get another row from the result set
                  return; // exit recursive function prior to closing result set
                }

                var t = ((Date.now() - startTime)/1000);
                console.log('ResultSet getRow():  rows: ' + rowsProcessed +
                            ', batch size: ' + config.batchSize + ', seconds: ' + t);
                
                results.resultSet.close(function(err) {
                  if (err) console.error(err.message);

                  connection.release(function(err) {
                    if (err) console.error(err.message);
                  });
                });
              });
            }

            processResultSet();
          }
        );
      }
    );

    ResultSet getRows()

    // ResultSet getRows()

    var oracledb = require('oracledb');
    var dbConfig = require('./dbconfig.js');
    var config = require('./config.js');

    oracledb.getConnection(
      dbConfig,
      function(err, connection) {
        if (err) throw err;

        var rowsProcessed = 0;
        var startTime = Date.now();

        oracledb.fetchArraySize = 1;
        connection.execute(
          'select * from all_objects where rownum <= :mr',
          [ config.maxRows ],
          { resultSet: true },
          function(err, results) {
            var rowsProcessed = 0;

            if (err) throw err;

            function processResultSet() {
              results.resultSet.getRows(config.batchSize, function(err, rows) {
                if (err) throw err;

                if (rows.length) {
                  rows.forEach(function(row) {
                    rowsProcessed++;

                    // do work on the row here
                  });

                  processResultSet(); // try to get more rows from the result set

                  return; // exit recursive function prior to closing result set
                }

                var t = ((Date.now() - startTime)/1000);
                console.log('ResultSet getRows(): rows: ' + rowsProcessed +
                            ', batch size: ' + config.batchSize + ', seconds: ' + t);
                
                results.resultSet.close(function(err) {
                  if (err) console.error(err.message);

                  connection.release(function(err) {
                    if (err) console.error(err.message);
                  });
                });
              });
            }
            processResultSet();
          });
      });

    queryStream()

    // queryStream()

    var oracledb = require('oracledb');
    var dbConfig = require('./dbconfig.js');
    var config = require('./config.js');

    oracledb.getConnection(
      dbConfig,
      function(err, connection) {
        if (err) throw err;

        var rowsProcessed = 0;
        var startTime = Date.now();

        var stream = connection.queryStream(
          'select * from all_objects where rownum <= :mr',
          [ config.maxRows ],
          { fetchArraySize: config.batchSize }
        );

        stream.on('data', function (data) {
          // do work on the row here
          rowsProcessed++;
        });

        stream.on('end', function () {
          var t = ((Date.now() - startTime)/1000);
          console.log('queryStream():       rows: ' + rowsProcessed +
                      ', batch size: ' + config.batchSize + ', seconds: ' + t);
          
          connection.close(
            function(err) {
              if (err) { console.error(err.message); }
            });
        });
      });

    The Configuration File

    // config.js

    var maxRows;      // number of rows to query
    var batchSize;    // batch size for fetching rows

    maxRows = 50000;
    batchSize = 1000

    exports.maxRows = maxRows;
    exports.batchSize = batchSize;

    [Linux] hugetlbfs: Not just for databases anymore!

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/linuxkernel/hugetlbfs%3a-not-just-for-databases-anymore

    仮想メモリを実装するオペレーティングシステムは、仮想アドレスから物理アドレスへの変換を行う必要があります。このような変換はソフトウェアによって完全に達成できますが、現代のプロセッサメモリ管理ユニット(MMU)はこのプロセスを高速化するメカニズムを提供しています。これは、Translation Lookaside Buffer(TLB)と呼ばれるもので、最近使用された仮想メモリから物理メモリへの変換をキャッシュに保持することで実現します。TLBのサイズは限られているため、TLB内に変換がない場合はパフォーマンスが低下します。Huge Pageを使用するとTLBミスを回避できます。同じ量のデータを含めるのに必要なページ数を少なくすることで、限られた数のTLBエントリで競合が少なくなります。
    Linuxは、2002年にv2.5.36カーネルでhuge pageをサポートしました。この初期のサポートはhugetlbfsと呼ばれ、すべてがファイルである従来のUnixモデルに従っていました。hugetlbfsを使用するには、明示的にhugetlbfsファイルシステムをマウントする必要がありました。さらに重要なのは、huge pageの可用性を保証するために、起動時または直後に事前に割り当てる必要がありました。さらに、アプリケーションプログラムは、hugetlbfsのhuge pageを使用するように変更する必要がありました。これらのすべての要求事項ゆえに、hugetlbfsは平均的なアプリケーションでは使用されません。 hugetlbfsがニッチな場所を見つけたのは、大量のメモリに対処し、可能な限り最高のパフォーマンスを望むデータベースです。データベースは、hugetlbfsを活用する最初のタイプのアプリケーションの1つであり、現在でも大きなユースケースとして残っています。

    hugetlbfsで必要な構成とアプリケーションの変更の問題に対処するために、Transparent Huge Pages (THP)と呼ばれる新たなhuge pageモデルが開発されました。この名前が示すように、通常THPでは、huge pageを利用するための設定やアプリケーションの変更を必要としません。アプリケーション内のマッピングでhuge pageを利用出来る場合、カーネルはそれらのマッピングにhuge pageを使用しようとします。この機能は、ほとんどのLinuxディストリビューションではデフォルトで有効になっており、可能であれば、プログラムはhuge pageを透過的に使用します。


    今日、Linuxでのhuge page開発の大半はTHPが中心です。最近のTHPへの追加には、ext4ファイルシステムへのサポートを追加しようとしているページキャッシュのサポートが含まれます。このアイデアは、より多くのマッピングをTHPと互換性を持たせて、huge pageの使用が透過的に広がるようにするというものです。Linuxではhuge pageといえばTHPではありますが、まだhugetlbfsに対していくつかの変更が加えられています。少ないながらもいくつかの重要なアプリケーションでは、引き続きhugetlbfsに依存しています。対象とするこれらのアプリケーションとシステムでは、hugetlbfsが提供する制御と予測可能性を考慮すると、構成とアプリケーションの変更の要件は受け入れ可能です。データベースに加えて、仮想化、高頻度取引(High Frequency Trading)の分野や、さらにはJavaアプリケーションでは、今日もなおhugetlbfsを採用しています。以下は、これらのユースケースで採用されている、あまり知られていないhugetlbfsの機能の一部です。
    • 複数のhuge pageサイズhugetlbfsを使うと、ハードウェアとカーネルでサポートされているすべてのhuge pageサイズを使用できます。x86システムでは、1GBのhuge pageとデフォルトの2MBのサイズを使用できます。PowerPCのようなアーキテクチャの場合、512KB、1MB、2MB、8MB、16MB、1GB、および16GBといった、ずっと多くのhuge pageサイズを備えています。メモリ使用量とアクセスパターンを明示的に認識しているアプリケーションでは、最適なhuge pageサイズを選択できます。最近のカーネルでは、ほとんどのアーキテクチャがデフォルトですべてのhuge pageサイズを有効にしています。mmap(2)システムコールでは、hugetlbfsマッピングの背景とするためにhuge pageサイズを指定できます。
    • huge pagesの動的割り当て
      ほとんどのhugetlbfsのユーザーは、アプリケーションが必要とするhuge pageが、アプリケーションが必要なタイミングで利用できる保証が必要です。このため、通常はhuge pageがブート時に事前に割り当てられます。事前割り当ては、huge pageが利用可能であることの保証に備えていますが、事前割り当てしたhuge pageの場所を保証するものではありません。事前割り当て時に、メモリポリシーを介してhuge pageの位置を指定できます。しかし、事前割り当て時よりもはるかに後に実行されているアプリケーションがhuge pageの場所を判定するのは困難です。結果として、いくつかのhugetlbfs使用モデルでは、mmap(2)またはページフォルト時のhuge page動的割り当てを利用してきました。これにより、アプリケーションはhuge pageの配置をより詳細に制御できます。ただし、huge pageの動的に割り当てるを保証するものではありません。したがって、アプリケーションはmmap(2)呼び出し時の障害に対処するか、未解決ページフォルトが原因で発生するSIGBUSを受け取る準備が必要です。
    • fallocateのサポート
      これはデータベースからの要求で追加されました。事前割り当て機能は、huge pageを予約する単純なmmap(2)呼び出しでhugetlbfsファイルをあらかじめ割り当てることができるので、それほどエキサイティングではありません。興味深い機能はhole punchです。以前ファイルに割り当てられたhuge pageを削除できます。huge pageは一般的に希少なものなので、この機能を使って、インテリジェントなアプリケーションが不要になったページを解放して他の目的に使用できます。
    • userfaultfdのサポート
      userfaultfdの最初の使用例は、fallocateのhole punchで作成されたホールへのアクセスを捕まえることでした。インテリジェントなアプリケーションが再度使用しないためにページをリリースした場合、それはエラーを示すため、後続のアクセスをキャッチしたかったのです。しかし、サポートが追加された後、hugetlbfsのuserfaultfdはQEMUのpost copyライブマイグレーションで使用できることが判明しました。ベースページサイズのページは、以前はライブマイグレーションに使用されていましたが、十分なネットワーク帯域幅では、より大きいhugetlbfsページを使用するとマイグレーションを高速化できます。
    • memfd_createとファイルシーリング
      Oracle Javaは新しいガベージ・コレクション・スキームを策定しました。このスキームを容易にするために、メモリヒープのために複数のマッピングが必要でした。ヒープは匿名メモリとして割り当てられます。Linuxでは、memfd_create(2)システムコールを使用して、匿名メモリを使用するtmpfsファイルを作成できます。この匿名メモリへの複数のマッピングを作成するために、memfd_create(2)が返すファイルディスクリプタを利用でき、この新しいスキームでうまく機能します。ただし、JVMには現在、ヒープを戻すためにhuge pageを使用することもできます。この状況を助けるために、hugetlbfsサポートがmemfd_create(2)に追加されました。これにより、huge pageを背景とする匿名メモリの複数のマッピングを作成できます。この機能が追加された直後に、別のユースケースが浮上しました。hugetlbfsのmemfd_create(2)は、QEMUがDPDK vHostユーザーのサポートに使用できます。
    Linuxは現在THPに重点を置いているため、今日重要なアプリケーションでhugetlbfsが使用されていることが忘れられてしまいがちですが、新しい機能が追加されると、新しいユースケースが浮上します。hugetlbfsは、15年以上前に導入されたときと同じく有用であり、これはデータベースだけで使われるものではありません。

    [Database, Cloud] Introducing Data Hub Cloud Service to Manage Apache Cassandra and More

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/developers/introducing-data-hub-cloud-service-to-manage-apache-cassandra

    本日、Oracle Data Hub Cloud Serviceの一般提供をご案内します。
    Oracle Data Hub Cloud Service
    https://cloud.oracle.com/ja_JP/datahub
    開発者は、Oracle Data Hub Cloud Serviceを使用しApache Cassandraクラスタをオンデマンドで初期化および実行できます。Cassandraクラスタのバックアップ、パッチ適用、およびスケーリングを管理する必要はありません。
    Apache Cassandra
    https://cassandra.apache.org/
    Oracle Data Hubは、今後MongoDB、Postgresなどのデータベースの基盤となるものです。 OpenWorld 2017で発表されたプレスリリースをお読みください。
    Oracle Delivers Major Innovations to Oracle Cloud Platform’s Application Development Portfolio
    https://www.oracle.com/corporate/pressrelease/oow17-major-innovations-container-native-100217.html
    Data Hub Cloud Serviceには以下のような利点があります。
    • Dynamic Scalability
      ユーザはAPIやWebコンソールインターフェイスにアクセスし、わずか数分の簡単な操作でスケールアップやスケールダウン、スケールアウトやスケールインといった操作をして、必要に応じてクラスタサイズを調整できます。
    • Full Control
      開発チームがオンプレミス環境からクラウドに移行しても、データベースクラスタをホストしている基盤となる仮想マシン(VM)への完全なセキュアシェル(ssh)アクセスが引き続き可能なので、これまでオンプレミスで実施してきたのと同様にログインして管理タスクを実行することができます。
    開発者は、アプリケーションのためにRDBMS以上のものを探しているかもしれません。MySQLとOracle DatabaseはすでにOracle Cloud上ですでにありますが、アプリケーション開発者は、アプリケーション内で使用するデータモデルに従ってデータベーステクノロジを選択する柔軟性を求めています。
    MySQL Cloud Service
    https://cloud.oracle.com/ja_JP/mysql
    Database Cloud Service
    https://cloud.oracle.com/ja_JP/database
    このユース・ケース固有のアプローチにより、こうした開発者は、必要に応じてOracle Database Cloud Serviceを選択したり、他の場合には、MySQLやMongoDB、Redis、Apache Cassandraなどの他のデータベース・テクノロジを選択することができます。
    このような多言語開発環境では、エンタープライズITは、組織内のオープンソースデータベース技術をサポートするだけでなく、管理のためのTCO (Total Cost of Ownership) をどのように低減するかという大きな課題に直面します。これこそが、特にOracle Data Hub Cloud Serviceが解決する課題です。

    How to Use Data Hub Cloud Service

    Data Hub Cloud Serviceを使ったApache Cassandraデータベースクラスタのプロビジョニング、管理、監視は、非常に簡単です。次の2つの簡単な手順で、必要な数だけノードを持つApache Cassandraデータベースクラスタを作成できます。
    • Step 1
      • Oracle Cloud InfrastructureおよびOracle Cloud Infrastructure Classicリージョンの中から選択する
      • Apache Cassandraデータベースの最新バージョン(3.11)と安定版(3.10)のどちらかを選択する
    • Step 2
      • クラスタサイズ、コンピュート・シェイプ(プロセッサコア)とストレージサイズを選択する。この段階で正しい値を選ぶことに過度な心配は不要で、追加のコンピューティングパワーまたはストレージが必要な場合は、いつでも動的にサイズを変更可能
      • シェルアクセス情報を提供して、データベースクラスタを完全に制御できるようにする

    Flexibility to choose the Database Version

    クラスタを作成すると、Apache Cassandraのバージョンを柔軟に選択できます。さらに、Cassandraバージョンで使用できるようになると、最新バージョンに簡単にアップデートできます。パッチの適用を選択すると、サービスはダウンタイムを最小限に抑えるために、クラスタ内でこのパッチをローリング方式で適用します。

    Dynamic Scaling

    プロビジョニング中には、クラスタ内のすべてのノードのクラスタサイズ、コンピュート・シェイプ(プロセッサ・コアとメモリ)、およびストレージサイズを柔軟に選択できます。この柔軟性により、ワークロードとパフォーマンスの要件をよりよく満たすコンピュート・シェイプとストレージ・シェイプを選択できます。
    クラスタにノードを追加(スケールアウト)したり、クラスタのノードにストレージを追加したりする場合は、Data Hub Cloud ServiceAPIまたはコンソールを使用して簡単に追加できます。したがって、プロビジョニング時にワークロードのサイジングについて心配する必要はありません。

    Full Control

    クラスタ内のすべてのノードに対する完全なシェル・アクセスが可能なので、基盤となるデータベースとそのストレージを完全に制御できます。また、これらのノードにログインして、スケーラビリティとパフォーマンスの要件を満たすようにデータベースインスタンスを構成することができます。

    Createを選択すると、サービスはコンピュート・インスタンスを作成し、ブロックボリュームをノードにアタッチし、クラスタ内の各ノード内にApache Cassandraバイナリを配置します。Oracle Cloud Infrastructure Classicプラットフォームでは、ネットワーク・アクセス・ルールも自動的に有効になり、ユーザーはCQL(Cassandra Query Language)ツールを使用してCassandraデータベースを作成できるようになります。Oracle Cloud Infrastructureプラットフォームでは、仮想クラウド・ネットワーク(VCN)の特定のサブネット内でこのクラスタを作成するための完全な制御と柔軟性があります。

    Getting Started

    このサービスは、すでにUniversal Creditsでご契約頂いているユーザーであれば、Oracle My Servicesダッシュボードでアクセスできます。
    Oracle My Services Dashboard
    https://myservices.oraclecloud.com/ 
    また、Oracle Cloudをまだご利用になっていない場合は、無料のCloudクレジットで開始してサービスを調査できます。
    Try for free
    https://cloud.oracle.com/ja_JP/tryit

    Additional Reference

    [WLS, Docker] WebLogic Server on Kubernetes Data Volume Usage

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/weblogicserver/weblogic-server-on-kubernetes-data-volume-usage

    Kubernetes上でのWebLogic Serverの動作検証の一環として、Kubernetes環境で実行されているWebLogic Server Pod間でファイルデータを共有するためのベストプラクティスを特定しました。このエントリでは、通常共有ストレージを活用して構成するWebLogic Serverのサービスとファイルをチェックし、ダウンロードして実行可能な完全なエンドツーエンドのサンプルを提供します。このサンプルはKubernetesがオーケストレーションするWebLogicドメイン用にマウントする共有ストレージを示します。

    WebLogic Server Persistence in Volumes

    Kubernetes上でWebLogic Serverを実行する場合、データボリュームを使用する利点については、以下のエントリをご覧ください。
    Docker Volumes in WebLogic
    https://blogs.oracle.com/weblogicserver/docker-volumes-in-weblogic
    https://orablogs-jp.blogspot.jp/2017/12/docker-volumes-in-weblogic.html
    また、このエントリでは、これらのデータボリュームへの永続化対象となりうるWebLogic Serverの成果物も示しています。

    Kubernetes Solutions

    Kubernetes環境では、Podは一時的なものです。 データを保持するために、Kubernetesではボリューム抽象化、PersistentVolume(PV)API、PersistentVolumeClaim(PVC)APIリソースを提供します。

    公式のKubernetesの定義[Kubernetes Volumes と Kubernetes Persistent Volumes and Claims]に基づき、PVはクラスタ内の管理者がプロビジョニングしたストレージの一部であり、PVCはユーザーによるストレージのリクエストです。したがって、PVおよびPVCは、ポッドの外部の独立したエンティティです。PodはKubernetesクラスタ内のPod間のファイル永続性およびファイル共有のためにPVおよびPVCを簡単に参照できます。
    Kubernetes Volumes
    https://kubernetes.io/docs/concepts/storage/volumes
    Kubernetes Persistent Volumes and Claims
    https://kubernetes.io/docs/concepts/storage/persistent-volumes/#lifecycle-of-a-volume-and-claim
    Kubernetes上でWebLogic Serverを実行する場合、以下の理由で共有ストレージを処理するためにPVとPVCを使用することをお勧めします。
    • 通常、WebLogic Serverインスタンスは、共有PVへのアクセスを必要とする複数のノード上のPodで実行されます。 WebLogic Serverインスタンスのライフサイクルは、単一のPodに限定されません。
    • PVとPVCはより多くの制御を提供できます。たとえば、同時読み取り/書き込み管理のアクセスモード、ボリュームプラグインが提供するマウントオプション、ストレージ容量要件、リソースの再利用ポリシーなどを指定できます。

    Use Cases of Kubernetes Volumes for WebLogic Server

    サンプルの詳細を確認したり、ローカルで実行したりするには、サンプルをダウンロードし、以下の手順に従ってください。

    Software Versions

    • Host machine: Oracle Linux 7u3 UEK4 (x86-64)
    • Kubernetes v1.7.8
    • Docker 17.03 CE

    Prepare Dependencies

    1. Dockerfileとスクリプトに基づいて、ローカルで oracle/weblogic:12.2.1.3-developer イメージをビルドする
      Oracle WebLogic Server on Docker
      https://github.com/oracle/docker-images/tree/master/OracleWebLogic/dockerfiles/12.2.1.3/
    2. 以下のURLからWebLogic Kubernetsドメインのサンプルソースコードをダウンロードし、ダウンロードしたソースコードをwls-k8s-domainという名前のローカルフォルダに配置する
      WebLogic Sample on Kubernetes with Shared Domain Home
      https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/wls-k8s-domain
    3. WebLogicドメインイメージをDockerfileとスクリプトに基づいてローカルでビルドする
      $ cd wls-k8s-domain
      $ docker build -t was-k8s-domain .
    4. ユースケース2のため、以下のコマンドを入力してNFSサーバーと共有ディレクトリを準備します(この例ではマシン10.232.128.232を使用しています)。ユースケース1ではNFSではなくホストパスを使用するため、この手順は必要ありません。
      # systemctl start rpcbind.service
      # systemctl start nfs.service
      # systemctl start nfslock.service
      $ mkdir -p /scratch/nfsdata
      $ chmod o+rw /scratch/nfadata
      # echo /scratch/nfsdata *(rw,fsid=root,no_root_squash,no_subtree_check) >> /etc/exports
      デフォルトでは、WebLogicドメインwls-k8s-domainでは、WebLogic Serverインスタンスを含むPod内のすべてのプロセスが、ユーザーID 1000およびグループID 1000で実行されます。ユーザーID1000およびグループID1000に対し、NFSボリュームに対する読み取りおよび書き込みの許可を持たせるため、外部NFS共有ディレクトリに適切なアクセス権を設定する必要があります。この例ではアクセス許可管理を簡素化のため、他のユーザーにも共有ディレクトリに対する読み取りと書き込みのアクセス許可を与えています。

    Use Case 1: Host Path Mapping at Individual Machine with a Kubernetes Volume

    WebLogicドメインは、管理サーバーと複数の管理対象サーバーで構成され、それぞれが独自のPod内で稼働します。すべてのPodには、物理マシン上のフォルダに直接マウントされたボリュームがあります。ドメインホームは、管理サーバーポッドが最初に起動されたときに共有フォルダに作成されます。

    実行時に、Administration Serverを含むすべてのWebLogic Serverインスタンスは、マウントされたボリュームを介して同じドメインホームディレクトリを共有します。

    (注意)この例は単一のマシンまたはノード上で稼働しますが、この方法は複数のマシン間でWebLogicドメインを実行する場合でも同様です。複数のマシンで実行する場合、各WebLogic Serverインスタンスは同じディレクトリを共有する必要があります。次に、ホストパスはこのディレクトリを参照できるため、ボリュームへのアクセスは、背後の共有ディレクトリによって制御されます。既に共有ディレクトリで設定済みの一連のマシンがあれば、この方法はNFSクライアントを設定するよりも簡単です(移植可能ではないかもしれませんが)。

    このサンプルを実行するためには、以下の手順を全て実行する必要があります。
    1. WebLogic管理サーバー用のymlファイルを準備する。ホストのフォルダ /scratch/data を管理サーバーのPod内のホストのフォルダ /u01/wlsdomain にマウントするようにwls-admin.yml を編集する。
      apiVersion: apps/v1beta1
      kind: Deployment
      metadata:
      name: admin-server
      spec:
      replicas: 1
      template:
      metadata:
      labels:
      app: admin-server
      spec:
      containers:
      - name: admin-server
      image: wls-k8s-domain
      imagePullPolicy: Never
      command: ["sh"]
      args: ["/u01/oracle/startadmin.sh"]
      readinessProbe:
      httpGet:
      path: /weblogic/ready
      port: 8001
      initialDelaySeconds: 15
      timeoutSeconds: 5
      ports:
      - containerPort: 8001

      env:
      - name: WLUSER
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: username
      - name: WLPASSWORD
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: password
      volumeMounts:
      # name must match the volume name below
      - name: domain-home
      mountPath: "/u01/wlsdomain"

      volumes:
      - name: domain-home
      hostPath:
      path: /scratch/data
      type: Directory
    2. 管理対象サーバー用のymlファイルを準備する。ホストのフォルダ /scratch/data を管理対象サーバーのPod内のホストのフォルダ /u01/wlsdomain にマウントするようにwls-stateful.yml を編集する。
      >apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1
      kind: StatefulSet
      metadata:
      name: managed-server
      spec:
      serviceName: wls-subdomain
      replicas: 2
      template:
      metadata:
      name: ms
      labels:
      app: managed-server
      spec:
      subdomain: wls-subdomain
      containers:
      - name: managed-server
      image: wls-k8s-domain
      imagePullPolicy: Never
      command: ["sh"]
      args: ["/u01/oracle/startms.sh"]
      readinessProbe:
      httpGet:
      path: /weblogic/ready
      port: 8011
      initialDelaySeconds: 15
      timeoutSeconds: 5
      ports:
      - containerPort: 8011
      env:
      - name: JAVA_OPTIONS
      value: "-Dweblogic.StdoutDebugEnabled=true"
      - name: USER_MEM_ARGS
      value: "-Xms64m -Xmx256m "
      - name: MY_POD_IP
      valueFrom:
      fieldRef:
      fieldPath: status.podIP
      - name: MY_POD_NAME
      valueFrom:
      fieldRef:
      fieldPath: metadata.name
      - name: DNS_DOMAIN_NAME
      value: "wls-subdomain"
      - name: WLUSER
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: username
      - name: WLPASSWORD
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: password

      volumeMounts:
      # name must match the volume name below
      - name: domain-home
      mountPath: "/u01/wlsdomain"

      volumes:
      - name: domain-home
      hostPath:
      path: /scratch/data
      type: Directory
    3. 共有ボリュームを使って管理サーバーPodと管理対象サーバーPodを作成する。これらのWebLogic Serverインスタンスはマウントされたドメインの場所から起動される。
      $ kubectl create -f wls-admin.yml
      $ kubectl create -f wls-stateful.yml

    Use Case 2: NFS Sharing with Kubernetes PV and PVC

    この例では、1つの管理サーバと複数の管理対象サーバインスタンスを持つWebLogic Serverクラスタがあり、各サーバは専用Podに格納されています。すべてのPodには、Podが到達可能な物理マシンにある中央のNFSサーバーにボリュームがマウントされています。管理サーバーPodが初めて起動されると、WebLogicドメインを共有NFSフォルダに作成します。実行時に、管理サーバーを含むすべてのWebLogic Serverインスタンスは、PVおよびPVCによってマウントされたボリューム経由で同じドメインホームディレクトリを共有します。
    1. このサンプルでは、ホスト10.232.128.232にNFSサーバーがあり、このサーバーの/scratch/nfsdataを、すべての外部ホストに対し読み取り/書き込み可能でエクスポート済みである
    2. PVを準備する。各WebLogic ServerインスタンスがNFS共有フォルダに読み取り/書き込みできるように pv.yml を編集する。
      kind: PersistentVolume
      apiVersion: v1
      metadata:
      name: pv1
      labels:
      app: wls-domain
      spec:
      storageClassName: manual
      capacity:
      storage: 10Gi
      accessModes:
      - ReadWriteMany
      persistentVolumeReclaimPolicy: Recycle # Retain, Recycle, Delete
      nfs:
      # Please use the correct NFS server host name or IP address
      server: 10.232.128.232
      path: "/scratch/nfsdata"
    3. PVCを準備し、pvc.yml を編集する
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
      name: wlserver-pvc-1
      labels:
      app: wls-server
      spec:
      storageClassName: manual
      accessModes:
      - ReadWriteMany
      resources:
      requests:
      storage: 10Gi
      Kubernetesは、PVCに合ったPVを見つけてバインドします。
      Lifecycle of a volume and claim
      https://kubernetes.io/docs/concepts/storage/persistent-volumes/#lifecycle-of-a-volume-and-claim
    4. PVとPVCを作成する
      $ kubectl create -f pv.yml
      $ kubectl create -f pvc.yml
      PVC のステータスを確認し、PVにバインドされていることを確認する
      $ kubectl get pvc
      NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE
      wlserver-pvc-1 Bound pv1 10Gi RWX manual 7s
    5. 管理サーバー用の yml ファイルを準備する。これはPVC wlserver-pvc-1 への参照を有する。NFS共有フォルダをWebLogic Server管理サーバーPodの/u01/wlsdomainにマウントするようにwls-admin.ymlを編集する。
      apiVersion: apps/v1beta1
      kind: Deployment
      metadata:
      name: admin-server
      spec:
      replicas: 1
      template:
      metadata:
      labels:
      app: admin-server
      spec:
      containers:
      - name: admin-server
      image: wls-k8s-domain
      imagePullPolicy: Never
      command: ["sh"]
      args: ["/u01/oracle/startadmin.sh"]
      readinessProbe:
      httpGet:
      path: /weblogic/ready
      port: 8001
      initialDelaySeconds: 15
      timeoutSeconds: 5
      ports:
      - containerPort: 8001

      env:
      - name: WLUSER
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: username
      - name: WLPASSWORD
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: password
      volumeMounts:
      # name must match the volume name below
      - name: domain-home
      mountPath: "/u01/wlsdomain"

      volumes:
      - name: domain-home
      persistentVolumeClaim:
      claimName: wlserver-pvc-1
    6. 管理対象サーバ用の yml ファイルを準備する。このファイルはPVC wlserver-pvc-1への参照を有する。NFS共有フォルダを各管理対象サーバーPodの /u01/wlsdomain にマウントするようにwls-stateful.yml を編集する。
      apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1
      kind: StatefulSet
      metadata:
      name: managed-server
      spec:
      serviceName: wls-subdomain
      replicas: 2
      template:
      metadata:
      name: ms
      labels:
      app: managed-server
      spec:
      subdomain: wls-subdomain
      containers:
      - name: managed-server
      image: wls-k8s-domain
      imagePullPolicy: Never
      command: ["sh"]
      args: ["/u01/oracle/startms.sh"]
      readinessProbe:
      httpGet:
      path: /weblogic/ready
      port: 8011
      initialDelaySeconds: 15
      timeoutSeconds: 5
      ports:
      - containerPort: 8011
      env:
      - name: JAVA_OPTIONS
      value: "-Dweblogic.StdoutDebugEnabled=true"
      - name: USER_MEM_ARGS
      value: "-Xms64m -Xmx256m "
      - name: MY_POD_IP
      valueFrom:
      fieldRef:
      fieldPath: status.podIP
      - name: MY_POD_NAME
      valueFrom:
      fieldRef:
      fieldPath: metadata.name
      - name: DNS_DOMAIN_NAME
      value: "wls-subdomain"
      - name: WLUSER
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: username
      - name: WLPASSWORD
      valueFrom:
      secretKeyRef:
      name: wlsecret
      key: password

      volumeMounts:
      - name: domain-home
      mountPath: "/u01/wlsdomain"

      volumes:
      - name: domain-home
      persistentVolumeClaim:
      claimName: wlserver-pvc-1
    7. NFS共有ボリュームを使用して管理サーバーおよび管理対象サーバーのPodを作成する。各WebLogic Serverインスタンスは、マウントされたドメインの場所から開始される。
      $ kubectl create -f wls-admin.yml
      $ kubectl create -f wls-stateful.yml

    Summary

    このエントリでは、Kubernetes環境でWebLogicドメインを実行する際のKubernetesデータボリュームの設定に関するベストプラクティスについて説明しています。Kubernetes Podは一時的なものゆえ、ログ、ストアなどのファイルだけでなく、ボリュームにWebLogicドメインを永続化することをお勧めします。Kubernetesは、永続的なボリュームと永続的なボリュームクレームを提供して、状態の外部化と重要なデータのボリュームへの永続化をを簡素化します。ここで2個のユースケースを提供します。その一つは、Kubernetesノードが稼働しているホストマシンにボリュームをマップする方法、もう一つはNFS共有ボリュームの使用方法をそれぞれ紹介しています。どちらのユースケースでも、すべてのWebLogic Serverインスタンスは、これらのボリュームにマップされているファイルにアクセスできる必要があります。

    [Docker, WLS] Patching WebLogic Server in a Kubernetes Environment

    $
    0
    0
    原文はこちら。
    https://blogs.oracle.com/weblogicserver/patching-weblogic-server-in-a-kubernetes-environment

    ソフトウェアシステムの最適なパフォーマンスとセキュリティを提供する上で最も重要な作業の1つが、システムの可用性の低下を最小限に抑えながら、確実に最新のソフトウェアアップデートを速やかにインストール、テスト、ロールアウトすることは論を待ちません。Oracleでは、Patch Set Update、Security Patch Update、One-Off patchなど、WebLogic Server用に異なるタイプのパッチを提供しています。インストールするパッチとインストール方法は、カスタムニーズと環境によって異なります。

    Kubernetes上で実行されているWebLogic Serverに関して、最近、Kubernetes Volumeにマップされた共有ドメインのホームディレクトリを持つWebLogic Serverインスタンスを作成する手順をGithubで共有しました。
    WebLogic Sample on Kubernetes with Shared Domain Home
    https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/wls-k8s-domain
    Kubernetes、Docker、および社内環境では、同じOPatchツールを使用してWebLogic ServerにPatchを適用しますが、Kubernetesがクラスタをオーケストレーションしている場合、StatefulSetコントローラのupdate strategyオプションを利用して、アップデート済みのWebLogic Serverイメージからパッチをロールアウトできます。このエントリでは、その方法を紹介します。

    Prerequisites

    1. 以下のURLで提供している手順に基づいて、Kubernetesで稼働するWebLogic Server環境を作成する。以下に示すパッチ適用プロセスは作成した環境に基づく。
      WebLogic Sample on Kubernetes with Shared Domain Home
      https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/wls-k8s-domain
    2. 1.で作成した環境からWebLogic ServerのOne-off PatchもしくはPatch Set Updateにアクセスできるようにしておく。

    Patch Set Updates and One-Off Patches

    • Patch Set Updateは、セキュリティ修正プログラムと重要な修正プログラムを含む累積的な修正プログラムです。Patch Set UpdateはOracle WebLogic Serverだけにパッチを適用するために利用され、定期的にリリースされます。Patch Set Updateに関する追加情報については、以下のURLを参照してください。
      Oracle® Fusion Middleware Patching with OPatch 12c (12.2.1.3)
      https://docs.oracle.com/middleware/12213/lcm/OPATC/GUID-56D6728D-5EDC-482B-B2E4-DDB20A64FA32.htm#OPATC143
    • One-Off patchは既知の問題もしくは機能強化の追加を目的としています。One-Off patchのダウンロードに関してはMy Oracle Supportを参照してください。
      My Oracle Support
      https://www.oracle.com/support/index.html

    Kubernetes Update Strategies for StatefulSets

    StatefulSetには、以下のタスクに使用できる3個の異なるupdate strategyオプションがあります。
    • コンテナイメージの自動ローリングアップデートの設定および無効化
    • リソースのリクエスト、制限、またはその両方の構成
    • Podのラベルと注釈の設定
    StatefulSetのupdate strategyに関する詳細は、以下のUpdate StatefulSetsの項をご覧ください。
    Updating StatefulSets
    https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/#updating-statefulsets
    これらのupdate strategyは以下のようなものです。
    • 削除時
      • 環境設定に基づいて、任意の順序でPodを手動で削除します。KubernetesはPodの削除を検出すると、そのStatefulSetで定義された仕様に基づいて新しいPodを作成します。これは、StatefulSet作成時のデフォルトのupdate strategyです。
      • ローリングアップデート
        • クラスタ内のすべてのPodに対しローリングアップデートを実行します。 Kubernetesは、一度に1つずつStatefulSetコントローラで定義されたすべてのPodを削除して再作成しますが、その順序は削除時とは逆です。

      • ローリングアップデート+パーティション
        • ローリング・アップデートをパーティション化することもできます。この場合、StatefulSetに対して定義された仕様のパーティション値によって決定されます。たとえば、クラスタに4つのPodがあり、パーティションの値が2の場合、2つのポッドのみが更新されます。他の2つのPodは、パーティション値が4に設定されている場合、またはパーティション属性が仕様から削除されている場合にのみ更新されます。

        Methods for Updating the StatefulSet Controller

        StatefulSetには、ロールアウトする前に検証が必要な3つの属性(imageimagePullPolicy、およびupdateStrategy)があります。これらの属性のいずれかは、in-place updateアプローチを使用して更新できます。以下のin-placeオプションがあります。
        1. kubectl apply
        • 新しい設定をKubernetesクラスタに展開するための
          kubectl apply -f <statefulset yml file>
          を実行するようにStatefulSetの作成に使用するyamlファイルを更新する。
        • 以下は更新されたyamlファイルのサンプル

        1. kubectl edit
        • 以下のコマンドで直接属性値を更新する。
          kubectl edit statefulset <statefulset name>
          以下はStatefulSetの編集例

        1. kubectl patch
        • 以下のコマンドで直接属性値を更新する。
          kubectl patch
          以下はupdateStrategyRollingUpdateに更新する際のコマンド例

        • updateStrategyからpartitionオプション付きのRollingUpdateに更新するコマンド例

        • JSON フォーマットを使いimage属性をwls-k8s-domain-v1に更新するコマンド例

        1. Kubernetes Dashboard
        メニューパスから特定のStatefulSetまでドリルダウンし、imageimagePullPolicy、およびupdateStrategyの値を更新します。

        Steps to Apply One-Off Patches and Patch Set Updates with an External Domain Home

        以下の手順で新しいOne-Off patchを適用したWebLogicイメージを作成し、全てのPodに適用します。
        1. パッチ適用済みのWebLogicイメージを作成するには、GithubのWLSドメイン付きイメージ例の手順を全て実行する。
          Example of Image with WLS Domain
          https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/12211-patch
        2. Kubernetesクラスタが複数のノードで構成されていて、新たに作成したイメージがDockerレジストリで使用できない場合は、docker saveおよびdocker loadで提供されている手順を実行して、クラスタ内のすべてのノードにイメージをコピーする。
          docker save
          https://docs.docker.com/engine/reference/commandline/save/
          docker load
          https://docs.docker.com/engine/reference/commandline/load/
        3. "Methods for Updating the StatefulSet Controller"の章に記載の3つの方法のいずれかを使用して、コントローラ定義を更新する。KubernetesがStatefulSetのすべてのPodに新しいイメージを自動的に適用するようにするには、updateStrategyの属性値をRollingUpdateに設定する。
        4. 管理サーバーPodに新しいイメージを適用する。クラスタには管理サーバーが1つしかないため、RollingUpdate update strategyオプションの利用を推奨する。変更をStatefulSetコントローラにコミットすると、Kubernetesは管理サーバーPodを自動的に削除して再作成する。
        5. 管理対象サーバーStatefulSetに定義した全てのPodに新規イメージを適用する
          1. OnDeleteの場合、クラスタ内のPodのリストを取得し、updateStrategyvalueOnDeleteに変更する。以下のコマンドを使用して、クラスタ内のすべてのPodを手動で削除して新しいイメージを展開する必要がある。
          2. RollingUpdateオプションの場合、updateStrategy値をRollingUpdateに変更した後、Kubernetesは管理対象サーバーインスタンス用に作成されたPodをローリング方式で削除し、再作成する(図1)。
          3. Partition属性がRollingUpdate値に追加されている場合、ローリングアップデートの順序はパーティションの値によって異なる。Kubernetesは、orderがpartitionの値以上の序数を持つPodに新しいイメージを展開する。
        Fig.1 Before and After Patching the Oracle Home Image Using the Kubernetes Statefulset RollingUpdate Strategy

        Roll Back

        パッチをロールバックする必要がある場合、新しいイメージを適用するときと同じ手順を使用します。すなわち、image値を元のimage値に変更します。レジストリに少なくとも2つまたは3つのバージョンのイメージを保持する必要があります。

        Monitoring

        WebLogicドメインのローリングアップデートの進行状況を監視するには、いくつかの方法があります。
        1. コマンドを使用してポッドのステータスを確認する。例えば以下の出力は、2個の管理対象サーバーPodのローリングアップデートを実行するときに生成されるものである。
        2. kubectl get pod -o wide
          kubectl rollout status statefulset
        3. REST APIを使用し、管理サーバーを照会して、ローリングアップデート中の管理対象サーバーの状態を監視できる。REST APIを使用してWebLogic Serverを監視する方法については、以下の記事を参照。
          Oracle WebLogic RESTful Management Services:
          From Command Line to JavaFX
          http://www.oracle.com/technetwork/articles/soa/oliveira-wls-rest-javafx-1723982.html
        • 以下のコマンド例を使って、管理サーバーの状態を照会する。
        • 前述のコマンドで、以下のような出力が現れるはず。
      • アップデートの状況を監視するためにWebLogic Server管理コンソールを利用できる。
        • サーバーインスタンス wls-domain-ms-1 を停止。
        •  wls-domain-ms-1でのアップデートが完了すれば、 wls-domain-ms-0に切り替える。
      • 4個目の方法が、Kubernetes Dashboardの利用である。ブラウザから https:<hostname>:<nodePort> にアクセスする。
      • Summary

        KubernetesでWebLogic ServerにOne-Off PatchまたはPatch Set Updateを適用するプロセスは、ベアメタル環境で実行している場合と同じです。KubernetesのStatefulsetを使用する場合は、イメージを以前のバージョンで拡張して最新のパッチ適用イメージを作成してから、環境に最適なアップデート戦略(OnDelete、RollingUpdate、または "RollingUpdate + partition")を使用することをお勧めします。

        今後のエントリで、Kubernetes Operatorで利用可能なパッチオプションについて検討します。上記で共有した手作業の手順のいくつかをOperatorと統合して、Kubernetesで動作しているときのWebLogic Serverのパッチ適用プロセス全体をさらに簡略化することができます。

        [Docker, WLS] Best Practices for Application Deployment on WebLogic Server Running on Kubernetes

        $
        0
        0
        原文はこちら。
        https://blogs.oracle.com/weblogicserver/best-practices-for-application-deployment-on-weblogic-server-running-on-kubernetes-v2

        Overview

        WebLogic ServerとKubernetesはそれぞれ、アプリケーションのデプロイをサポートする豊富な機能を提供します。Kubernetes上でのWebLogic Serverの動作保証のための検証プロセスの一環として、KubernetesおよびDocker環境で動作するWebLogic ServerインスタンスにJava EEアプリケーションをデプロイするためのベストプラクティスを確認したので、その内容を説明します。このベストプラクティスには、以下のドキュメントにて説明されている一般的な推奨事項と、Kubernetesで提供されているアプリケーションデプロイメント機能が含まれています。
        Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
        Understanding WebLogic Server Deployment
        https://docs.oracle.com/middleware/12213/wls/DEPGD/understanding.htm#DEPGD114

        Application Deployment Terminology

        WebLogic ServerとKubernetesは、管理するリソースに同じ用語を使用しますが、意味は異なります。具体的には、アプリケーションまたはデプロイメントの概念はわずかに異なる意味を持つため、混乱を招く可能性があります。 下表は、このエントリで使用する重要な用語と、WebLogic ServerとKubernetesでの定義内容の違いを示しています。 Kubernetes用語集のリストを含む標準化された用語集は、以下のURLをご覧ください。
        Standardized Glossary
        https://kubernetes.io/docs/reference/glossary/?tool=true
        Table 1 Application Deployment Terminology
        WebLogic ServerKubernetes
        アプリケーションJava EE仕様に従って構成された、Java EEアプリケーション(エンタープライズアプリケーションまたはWebアプリケーション)またはスタンドアロンJava EEモジュール(EJBやリソースアダプタなど)。
        アプリケーションユニットには、Webアプリケーション、エンタープライズアプリケーション、EJB、リソースアダプタ、Webサービス、Java EEライブラリ、またはオプションパッケージが含まれる。
        アプリケーションユニットには、JDBC、JMS、WLDFモジュール、またはクライアントアプリケーションアーカイブが含まれることがある。
        Kubernetesがクラスタ環境でコンテナ化して管理するソフトウェア。 WebLogic ServerはKubernetesアプリケーションの一例。
        アプリケーション・デプロイメントWebLogic Serverでクライアントリクエストを処理するためにJava Enterprise Edition(Java EE)アプリケーションまたはモジュールを使用可能にするプロセス。クラスタ化された環境でコンテナ化されたアプリケーションをパッケージ化し、インスタンス化し、実行し、通信する方法。
        Kubernetesには、複製されたアプリケーションを管理するDeploymentというAPIオブジェクトもある。
        デプロイメント・ツール
        • weblogic.Deployerユーティリティ
        • 管理コンソール
        • WebLogic Scripting Tool (WLST)
        • wldeploy Ant task
        • weblogic-maven-plugin Maven plug-in
        • WebLogic Deployment API
        • Auto-deployment機能
        • kubeadm
        • kubectl
        • minikube
        • Helm Chart
        • kops
        クラスタWebLogicクラスタは複数のWebLogic Serverインスタンスで構成され、拡張性と信頼性を向上するために同時に稼働・連携する。クラスタはクライアントからは、単一のWebLogic Serverインスタンスのように見える。クラスタを構成するサーバーインスタンスは、同じマシン上で実行することも、別のマシン上に配置することもできる。既存のマシンのクラスタにサーバーインスタンスを追加するか、追加サーバーインスタンスをホストするためにマシンをクラスタに追加して、クラスタの容量を増やすことも可能。クラスタ内の各サーバインスタンスは、同じバージョンのWebLogic Serverを実行する必要がある。Kubernetesクラスタは、マスタノードと一連のワーカーノードで構成される。本番環境では、これらは複数ノード上の分散配置で実行される。テスト目的では、すべてのコンポーネントを同じノード(物理ホストまたは仮想マシン)で実行可能。
        このエントリでは、以下の定義を使用します。
        • このエントリ内で述べるアプリケーションはJava EEアプリケーションを指す。
        • このエントリ内で述べるアプリケーションデプロイメントは、WebLogic Serverへのアプリケーションデプロイメントを指す。
        • KubernetesアプリケーションはKubernetesが管理するソフトウェアを指す(例えばWebLogic Server)。

        Summary of Best Practices for Application Deployment in Kubernetes

        このエントリの、Kubernetesで動作するWebLogic Serverのアプリケーションデプロイメントのベストプラクティスには、複数のパートに分かれています。
        • Java EEアプリケーションデプロイメントファイルをKubernetes環境に配布し、Pod内のWebLogic Serverコンテナがデプロイメントファイルにアクセスできる。
        • Kubernetes環境のJava EEアプリケーションをデプロイすると、アプリケーションはPod内のWebLogic Serverコンテナで利用可能になり、クライアントリクエストを処理できるようになる。
        • KubernetesアプリケーションとReadyAppフレームワークを統合して、Kubernetesアプリケーションの準備状況を確認する。

        General Java EE Application Deployment Best Practices Overview

        ベストプラクティスの詳細を掘り下げて説明する前に、一般的なJava EEアプリケーション・デプロイメントのベストプラクティスについて簡単に説明します。この内容は、以下のドキュメントに記載があります。
        Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
        https://docs.oracle.com/middleware/12213/wls/DEPGD/toc.htm
        一般的なJava EEアプリケーションのデプロイメントプロセスは複数のパートから構成されています。
        1. Java EEアプリケーションまたはモジュールの準備
          Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
          Preparing Applications and Modules for Deployment
          https://docs.oracle.com/middleware/12213/wls/DEPGD/deployunits.htm#DEPGD141
          Handling Unsupported FastSwap Changes
          https://docs.oracle.com/middleware/12213/wls/DEPGD/deployunits.htm#DEPGD163
        2. デプロイメントのためのJava EEアプリケーションまたはモジュールの構成
          Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
          Configuring Applications for Production Deployment
          https://docs.oracle.com/middleware/12213/wls/DEPGD/config.htm#DEPGD165
          Application Usage
          https://docs.oracle.com/middleware/12213/wls/DEPGD/config.htm#DEPGD193
        3. 新環境にデプロイするためのJava EEアプリケーションまたはモジュールのエクスポート
          Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
          Exporting an Application for Deployment to New Environments
          https://docs.oracle.com/middleware/12213/wls/DEPGD/export.htm#DEPGD195
          Validating the Exported Deployment Configuration
          https://docs.oracle.com/middleware/12213/wls/DEPGD/export.htm#DEPGD211
        4. Java EEアプリケーションもしくはモジュールのデプロイ
          Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
          Deploying Applications and Modules with weblogic.Deployer
          https://docs.oracle.com/middleware/12213/wls/DEPGD/deploy.htm#DEPGD212
          Best Practices for Deploying Applications
          https://docs.oracle.com/middleware/12213/wls/DEPGD/deploy.htm#DEPGD253
        5. Java EEアプリケーションもしくはモジュールの再デプロイ
          Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
          Redeploying Applications in a Production Environment
          https://docs.oracle.com/middleware/12213/wls/DEPGD/redeploy.htm#DEPGD258

        Distributing Java EE Application Deployment Files in Kubernetes

        WebLogic ServerインスタンスがKubernetesおよびDocker環境に展開されていると仮定します。WebLogic ServerインスタンスにJava EEアプリケーションをデプロイする前に、EAR、WAR、RARファイルなどのJava EEアプリケーションデプロイメントファイルを、Pod内のWebLogic Serverインスタンスがアクセスできる場所に配布する必要があります。Kubernetesでは、デプロイメントファイルはDockerイメージを使用して配布することも、管理者が手作業で配布することもできます。

        Pre-distribution of Java EE Applications in Docker Images

        Dockerイメージには、1つ以上のJava EEアプリケーションがデプロイされている、事前構築済みのWebLogic Serverドメインのホームディレクトリを含めることができます。同じDockerイメージを使用してPod内のコンテナを作成、起動すると、すべてのコンテナに同じJava EEアプリケーションが配備されているはずです。
        Dockerイメージ内のJava EEアプリケーションを新しいバージョンに更新する場合、Figure 1に示すように、現在の既存のDockerイメージ上に新しいDockerイメージを作成できます。
        しかしながら、より新しいアプリケーションのバージョンを導入するにつれ、イメージ内に追加のレイヤーが必要になりますが、これによりディスクスペースなどのより多くのリソースを消費します。したがって、Dockerイメージに過剰な数のレイヤーを持たせるのはお勧めしません。
        Figure 1 Pre-distribution of Java EE Application in layered Docker Images

        Using Volumes in a Kubernetes Cluster

        Podのアプリケーションボリュームディレクトリをホスト上の外部ディレクトリにマッピングすることによって、アプリケーションファイルをすべてのPod内のすべてのコンテナ間で共有できます。これにより、アプリケーションファイルはPod内のすべてのコンテナからアクセスできるようになります。ボリュームを使用する場合は、アプリケーションファイルをホスト上のディレクトリに一度だけコピーする必要があります。各Podにファイルをコピーする必要はありません。これにより、特に大規模なアプリケーションの場合、ディスクスペースとデプロイ時間を節約できます。Kubernetes上で実行しているWebLogic ServerインスタンスにJava EEアプリケーションを配布する場合は、ボリュームの使用をお勧めします。
        Figure 2 Mounting Volumes to an External Directory
        Figure 2に示すように、3つのPodの各コンテナには、アプリケーションボリュームディレクトリ(/shared/applications)があります。これらのディレクトリはそれぞれ、ホスト上の同じ外部ディレクトリ(/host/apps)にマップされています。管理者がアプリケーションファイル(simpleApp.war)をホスト上の /host/apps ディレクトリに置くと、各Podのコンテナは /shared/applications ディレクトリからこのファイルにアクセスできます。
        Kubernetesは異なるボリュームタイプをサポートします。使用するボリュームの種類の決定、ボリュームディレクトリの作成、バックアップするメディアの決定、およびボリュームの内容の特定については、KubernetesのドキュメントのVolumesの項をご覧ください。
        Volumes
        https://kubernetes.io/docs/concepts/storage/volumes/

        Best Practices for Distributing Java EE Application Deployment Files in Kubernetes

        • ボリュームを使用してアプリケーションファイルを保存し、すべてのPodのコンテナに共有する。
        • コンテナ内のディスク上のファイルは一時的(ephemeral)なので、Dockerイメージで事前構築済みのWebLogic Serverドメインホームを使用する場合、ボリュームを使用してドメインホームディレクトリをホスト上に格納する。事前構築されたWebLogic Serverドメインホームディレクトリを含むサンプルWebLogicドメインwls-k8s-domainは、GitHubから入手可能。
          WebLogic Sample on Kubernetes with Shared Domain Home
          https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/wls-k8s-domain
        • アプリケーションファイルは、ホスト上のドメインホームのボリュームディレクトリとは別の場所に格納する
        • WebLogic Serverにデプロイ済みの既存のJava EE Webアプリケーション用に生成されたデプロイメントプランも、ボリュームに格納できる。デプロイメント・プランの使用方法の詳細は、以下のチュートリアルを参照。
          Oracle WebLogic Server 12c: Creating and Using a Deployment Plan
          http://www.oracle.com/webfolder/technetwork/tutorials/obe/fmw/wls/12c/09-DeployPlan--4464/deployplan.htm
        • デフォルトでは、WebLogic Server Pod内のすべてのプロセスは、ユーザID 1000およびグループID 1000で実行される。そのため、ユーザID 1000またはグループID 1000がアプリケーションボリュームディレクトリへの読み取りおよび書き込みアクセス権を持つように、アプリケーションボリュームディレクトリに対し、アクセス権が適切に設定されていることを確認する。

        Java EE Application Deployment in Kubernetes

        アプリケーション・デプロイメント・ファイルをKubernetesクラスタ全体に配置した後、Pod内のコンテナにJava EEアプリケーションを展開するためのWebLogic Serverデプロイメントツールが数種類あります。
        WebLogic Serverは、Java EEアプリケーションのデプロイ、アンデプロイ、リデプロイのための以下のデプロイメント・ツールをサポートします。
        • WebLogic管理コンソール
        • WebLogic Scripting Tool (WLST)
        • weblogic.Deployerユーティリティ
        • REST API
        • wldeploy Ant タスク
        • Javaクラスを使ってプログラムでデプロイメント・タスクを実行できるWebLogic Deployment API
        • 自動デプロイ機能。 自動デプロイを有効にすると、管理サーバの /autodeploy ディレクトリにアプリケーションをコピーすれば、そのアプリケーションが自動的にデプロイされる。自動デプロイは、開発環境での評価またはテスト目的で使用されることを意図している。
        これらのデプロイメントツールの使用の詳細は、以下のドキュメントを参照してください。
        Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
        https://docs.oracle.com/middleware/12213/wls/DEPGD/toc.htm
        これらのツールは、Kubernetesでも使用できます。以下は、WebLogicクラスタmyClusterにアプリケーションsimpleApp.warをデプロイおよびアンデプロイする方法の例です。
        • DockerfileでのWLSTの利用
        • weblogic.Deployerユーティリティの利用
        • REST APIの利用
        (注意)デプロイメントコマンドを実行する環境は、以下のGitHubにあるサンプルWebLogicドメインwls-k8s-domainに基づいて作成されています。
        WebLogic Sample on Kubernetes with Shared Domain Home
        https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/wls-k8s-domain
        この環境では
        • サンプルのWLS 12.2.1.3ドメインとクラスタは、Oracle WebLogic developerインストールイメージを拡張し、Kubernetesで実行して作成されます。WebLogicドメイン(例えば、base_domain)は、WebLogicクラスタmyClusterで実行されている管理サーバーといくつかの管理対象サーバーで構成されています。各WebLogic Serverはコンテナ内で起動されます。各PodにはWebLogic Serverコンテナが1つあります。wls-k8s-domainサンプルの詳細については、GitHubのページを参照してください。
          Sample WebLogic 12.2.1.3 domain image orchestrated in Kubernetes
          https://github.com/oracle/docker-images/pull/665/commits/676b878abcf4887b374759a8d6a767f1b7b85197
        • 各Podには、1つのドメインホームボリュームディレクトリ(例えば/u01/wlsdomain)があります。このドメインホームボリュームディレクトリは、外部ディレクトリ(例えば、/host/domain)にマップされます。サンプルのWLS 12.2.1.3ドメインは、この外部ディレクトリの下に作成されます。
        • 各Podには、ドメインホームボリュームディレクトリと同じ方法で作成されたアプリケーションボリュームディレクトリ(例えば、/shared/applications)があります。このアプリケーションボリュームディレクトリは、外部ディレクトリ(例えば、/host/apps)にマップされています。Java EEアプリケーションは、この外部ディレクトリに配布できます。

        Sample of Using Offline WLST in a Dockerfile to Deploy a Java EE Application

        このサンプルでは、Dockerfileを使い、アプリケーションDockerイメージを構築しています。このアプリケーションのDockerイメージは、wls-k8s-domainというサンプルドメインを作成するwls-k8s-domainイメージを拡張しています。また、このDockerfileは、wls-k8s-domainサンプルドメインの構成をオフラインモードで新しいアプリケーションデプロイメントでアップデートするPythonスクリプトを使ってWLSTを呼び出します。
        # Dockerfile
        # Extends wls-k8s-domain
        FROM wls-k8s-domain

        # Copy the script files and call a WLST script.
        COPY container-scripts/* /u01/oracle/

        # Run a py script to add a new application deployment into the domain configuration
        RUN wlst /u01/oracle/app-deploy.py
        スクリプト app-deploy.py を呼び出し、オフラインWLST APIを使ってアプリケーション simpleApp.war をデプロイします。
        # app-deploy.py
        # Read the domain
        readDomain(domainhome)

        # Create application
        # ==================
        cd('/')
        app = create('simpleApp', 'AppDeployment')
        app.setSourcePath('/shared/applications/simpleApp.war')
        app.setStagingMode('nostage')

        # Assign application to cluster
        # =================================
        assign('AppDeployment', 'simpleApp, 'Target', 'myCluster')

        # Update domain. Close It. Exit
        # =================================
        updateDomain()
        closeDomain()
        exit()
        アプリケーションは、アプリケーションのDockerイメージ構築フェーズでデプロイされます。WebLogic Serverコンテナが起動されると、simpleAppアプリケーションが起動され、クライアントリクエストを処理できる状態になります。

        Sample of Using weblogic.Deployer to Deploy and Undeploy a Java EE Application in Kubernetes

        このサンプルでは、アプリケーションsimpleApp.warは、Using External Volumes in Kubernetes Clusterに記載の通り、ホスト上の /host/appsという外部ディレクトリに存在します。
        以下のコマンドは、管理サーバーPodでwebloigc.Deployerユーティリティを実行している様子を示したものです。
        # Find the pod id for Admin Server pod: admin-server-1238998015-f932w
        > kubectl get pods
        NAME READY STATUS RESTARTS AGE
        admin-server-1238998015-f932w 1/1 Running 0 11m
        managed-server-0 1/1 Running 0 11m
        managed-server-1 1/1 Running 0 8m

        # Find the Admin Server service name that can be connected to from the deployment command.
        # Here the Admin Server service name is admin-server which has a port 8001.
        > kubectl get services
        NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
        admin-server 10.102.160.123 <nodes> 8001:30007/TCP 11m
        kubernetes 10.96.0.1 <none> 443/TCP 39d
        wls-service 10.96.37.152 <nodes> 8011:30009/TCP 11m
        wls-subdomain None <none> 8011/TCP 11m

        # Execute the /bin/bash in the Admin Server pod
        > kubectl exec -it admin-server-1238998015-f932w /bin/bash

        # Once in the Admin Server pod, setup a WebLogic env, then run weblogic.Deployer
        # to deploy the simpleApp.war located in the /shared/applications directory to
        # the cluster "myCluster"
        ]$ cd /u01/wlsdomain/base_domain/bin
        ]$ . setDomainEnv.sh
        ]$ java weblogic.Deployer -adminurl t3://admin-server:8001 -user weblogic -password weblogic1 -name simpleApp -targets myCluster -deploy /shared/applications/simpleApp.war
        以下のコマンドでWebLogicクラスタへのJava EEアプリケーションのデプロイメントが無事完了していることを確認します。
        # Kubernetes routes the traffic to both managed-server-0 and managed-server-1 via the wls-service port 30009.
        http://<hostIP>:30009/simpleApp/Scrabble.jsp
        以下のコマンドは、weblogic.Deployerユーティリティを使ってアプリケーションをアンデプロイしています。デプロイメントと類似の手順であることにご注意ください。
        # Execute the /bin/bash in the Admin Server pod
        > kubectl exec -it admin-server-1238998015-f932w /bin/bash

        # Undeploy the simpleApp
        ]$ cd /u01/wlsdomain/base_domain/bin
        ]$ . setDomainEnv.sh
        ]$ java weblogic.Deployer -adminurl t3://admin-server:8001 -user weblogic -password weblogic1 -undeploy -name simpleApp

        Sample of Using REST APIs to Deploy and Undeploy a Java EE Application in Kubernetes

        このサンプルでは、アプリケーションsimpleApp.warはすでにホストディレクトリ/host/appsにあります。このホストディレクトリは、admin-server-1238998015-f932wというPodのアプリケーションボリュームディレクトリ/shared/applicationsにマウントされます。

        以下のサンプルでは、admin-server-1238998015-f932wというPodでcurlコマンドを実行しています。このcurlコマンドはNodePort 30007を使用してAdminstration ServerにRESTリクエストを送信し、WebLogicクラスタmyClusterにsimpleAppをデプロイします。
        # deploy simpleApp.war file to the WebLogic cluster
        > kubectl exec admin-server-1238998015-f932w -- curl -v --user weblogic:weblogic1 \
                  -H X-Requested-By:MyClient \
                  -H Content-Type:application/json \
                  -d "{ name: 'simpleApp', \
                        sourcePath: '/shared/applications/simpleApp.war', \
                        targets: [ { identity: [ 'clusters', 'myCluster' ] } ] }" \
                  -X POST http://<hostIP>:30007/management/weblogic/latest/edit/appDeployments
        以下のコマンドはREST APIを使ってアプリケーションをアンデプロイします。
        # undeploy simpleApp.war file from the WebLogic cluster
        > kubectl exec admin-server-1238998015-f932w -- curl -v --user weblogic:weblogic1 \
                  -H X-Requested-By:MyClient \
                  -H Accept:application/json \
                  -X DELETE http://<hostIP>:30007/management/wls/latest/deployments/application/id/simpleApp

        Best Practices for Deploying Java EE Applications in Kubernetes

        • 個々のWebLogic Serverインスタンスではなく、WebLogicクラスタにJava EEアプリケーションまたはモジュールをデプロイする。これにより、デプロイメント戦略の変更をしなくて済むため、後のWebLogicクラスタのスケーリングが簡単になる。
        • WebLogic Serverデプロイメントツールは、Kubernetes環境で使用可能。
        • アプリケーション更新時は、前述の手順に従ってアプリケーションを配布しデプロイする。
        • Dockerイメージで事前構築済みのWebLogic Serverドメインホームを使用する場合、アプリケーションをドメインへデプロイすると、ドメイン構成を自動的に更新する。ただし、この方法でアプリケーションをデプロイすると、Pod内のドメイン構成はDockerイメージのドメイン構成と同期しなくなる。この同期の問題は、必要なアプリケーションをDockerイメージの事前構築済みドメインホームに含めることで、可能な限り避けることが可能。この方法で、後の追加の展開手順を回避できる。

        Integrating ReadyApp Framework in Kubernetes Readiness Probe

        Kubernetesは、サービスデプロイメント方法の詳細からクライアントを隔離する上で、ロードバランサとフロントエンドを構成する柔軟なアプローチを提供します。このアプローチの一環として、Kubernetesは、コンテナがトラフィックを受け入れる準備ができたかどうかを判断するreadinessProbeを実行して対応します。
        一方、WebLogic Serverでは、WebLogic Serverインスタンスの起動が完了し、クライアントリクエストを処理できる状態かどうかを報告するReadyAppフレームワークが利用できます。
        ReadyAppフレームワークは、READYとNOT READYの2つの状態を使用します。READY状態は、WebLogic Serverインスタンスが実行中であることだけでなく、WebLogic Serverインスタンスにデプロイされているすべてのアプリケーションがリクエストを処理できる状態にあることを意味します。NOT READY状態の場合、WebLogic Serverインスタンスの起動は不完全で、トラフィックを受け入れることができません。
        Kubernetes環境でWebLogic Serverコンテナを起動する場合は、KubernetesのreadinessProbeを使用してWebLogic ServerのReadyAppフレームワークにアクセスできます。ReadyAppフレームワークがWebLogic Serverコンテナ起動のREADY状態を報告すると、readinessProbeはWebLogic Serverコンテナがトラフィック受け入れ可能であることをKubernetesに通知します。
        以下は、readinessProbeに統合されたReadyAppフレームワークを使用して、ポート8011上で実行されているWebLogic Serverコンテナがトラフィックを受け入れる準備ができているかどうかを判断する例です。
        apiVersion: apps/v1beta1
        kind: StatefulSet
        metadata:
        [...]
        spec:
          [...]
          template:
            [...]
            spec:
              containers:
                [...]
                readinessProbe:
                  failureThreshold: 3
                  httpGet:
                  path: /weblogic/ready
                  port: 8011
                  scheme: HTTP
        [...]
        WebLogic ServerのReadyAppフレームワークには、以下のURLからアクセスできます。
        http://<hostIP>:<port>/weblogic/ready
        WebLogic Serverが実行されている場合、このURLはステータス200(READY)または503 (NOT READY)を返します。WebLogic Serverが実行されていない場合は、エラー404ページが表示されます。
        WebLogic Serverと同様に、他のKubernetesアプリケーションはReadyAppフレームワークに登録し、readinessProbeを使用してKubernetesアプリケーションでReadyAppフレームワークの状態をチェックできます。 ReadyAppフレームワークにアプリケーションを登録する方法については、以下のドキュメントをご覧ください。
        Oracle® Fusion Middleware Deploying Applications to Oracle WebLogic Server
        Using the ReadyApp Framework
        https://docs.oracle.com/middleware/12213/wls/DEPGD/managing.htm#DEPGD-GUID-C98443B1-D368-4CA4-A7A4-97B86FFD3C28

        Best Practices for Integrating ReadyApp Framework in Kubernetes Readiness Probe

        ReadyAppフレームワークを使用してKubernetesアプリケーションを登録し、アプリケーションがサービスリクエストを受け入れ可能かどうかを判断するReadyAppフレームワークの状態をチェックするためにreadinessProbeを使うことをお奨めします。ReadyAppフレームワークの状態がREADY状態である場合にのみ、KubernetesはこれらのKubernetesアプリケーションにトラフィックをルーティングします。

        Conclusion

        WebLogic ServerをKubernetes環境とDocker環境に統合する場合、既存の強力なWebLogic Serverデプロイメントツールを使用して、Kubernetesで動作するWebLogic ServerインスタンスにJava EEアプリケーションをデプロイできますし、Kubernetesの機能を使用してWebLogic Serverを管理することもできます。Kubernetesの機能を使用してWebLogic Serverを管理することもできます。具体的には、ボリュームを使用して、Kubernetesクラスタ内のすべてのPodのすべてのコンテナでアプリケーションファイルを共有し、readinessProbeを使っておよびWebLogic Serverの起動状態を監視するといった具合です。この統合により、自社のビジネスプラクティスに適合する柔軟なデプロイメントシナリオをサポートできるだけでなく、WebLogic Serverをクラウド環境に素早いデプロイ、素早いオートスケール、シームレスな更新も可能です。

        [Docker, WLS] Automatic Scaling of WebLogic Clusters on Kubernetes

        $
        0
        0
        原文はこちら。
        https://blogs.oracle.com/weblogicserver/automatic-scaling-of-weblogic-clusters-on-kubernetes-v2

        WebLogic ServerクラスタのElasticity(拡張度、スケールアップまたはスケールダウン)により、お客様のアプリケーションの信頼性向上とリソース使用率の最適化を実現します。ElasticityはWebLogic Server 12.2.1で導入され、Elasticサービスフレームワークと動的クラスタの概念を基に作られました。
        Oracle® Fusion Middleware Oracle WebLogic Serverクラスタの管理 12c (12.2.1.2.0)
        動的クラスタ
        https://docs.oracle.com/cd/E84527_01/wls/CLUST/dynamic_clusters.htm
        Oracle® Fusion Middleware Administering Clusters for Oracle WebLogic Server 12c (12.2.1.3.0)
        Dynamic Clusters
        http://docs.oracle.com/middleware/12213/wls/CLUST/dynamic_clusters.htm#CLUST678
        [訳注]
        日本語ドキュメントでは、拡張度や拡張度フレームワークという表現を使っていますが、耳なじみがないと思いますので、このエントリでは英語のまま、つまりElasticityやElasticをそのまま使います。

        Elasticity in WebLogic ServerにおけるElasticityは以下のいずれかによって達成されます。
        • WebLogic Server管理コンソールまたはWebLogic Scripting Tool(WLST)を使用して動的なWebLogic Serverクラスタ内の実行中のサーバインスタンスを手動で追加または削除(オンデマンドスケーリング)
        • 動的クラスタを拡大または縮小する条件を設定するWLDFスケーリングポリシーや、スケーリング処理自体を定義するアクションを設定する。スケーリングポリシーで定義された条件が発生すると、対応するスケーリング動作が自動的にトリガされる。
        スケーリングアクションが発生すると、WebLogic Serverノードマネージャを使用して管理対象サーバーインスタンスを起動および停止します。ノードマネージャは、管理対象サーバーインスタンスのライフサイクル(起動、シャットダウン、再起動)を管理するWebLogic Serverユーティリティです。
        WebLogic Serverチームは、Kubernetesクラウド環境でのWebLogic Serverの稼働に投資しています。WebLogic診断フレームワーク(WLDF)が提供するリソースメトリックに基づき、Podの数を増やす(または減らす)ことで、WebLogic Serverクラスタを自動的に拡大/縮小できます。以下のエントリのサンプルデモを使い、Kubernetesクラウド環境でのWebLogic Serverクラスタの自動スケールを説明します。
        WebLogic on Kubernetes, Try It!
        https://blogs.oracle.com/weblogicserver/weblogic-on-kubernetes,-try-it
        https://orablogs-jp.blogspot.jp/2017/10/weblogic-on-kubernetes-try-it.html
        従来のWebLogic Serverデプロイメント環境と比較して、Kubernetesクラウド環境のサンプルデモにおけるelasticityの効果には、いくつかの重要な違いがあります。
        1. サンプルデモでは、静的に構成されたクラスタを使用しますが、elasticityは従来のデプロイメントでは動的クラスタと連動します。今後のエントリでは、Kubernetesクラウド環境におけるWebLogic Serverクラスタのelasticityについて説明します。
        2. サンプルデモでは、スケーリングアクションによってKubernetes APIサーバーへのリクエストが呼び出され、Podをスケールしますが、従来のデプロイメントではNode Managerへのリクエストを呼び出します。
        このブログエントリでは、WLDFが提供するメトリックに基づいて、Kubernetes環境でWebLogic Serverクラスタを自動的に拡大または縮小する方法を説明します。

        WebLogic on Kubernetes Sample Demo

        以下では、「WebLogic on Kubernetes, Try It!」のエントリで説明したKubernetes上で稼働するWebLogicドメインを使います。
        WebLogic on Kubernetes, Try It!
        https://blogs.oracle.com/weblogicserver/weblogic-on-kubernetes,-try-it
        https://orablogs-jp.blogspot.jp/2017/10/weblogic-on-kubernetes-try-it.html

        Kubernetesクラスタで実行されているWebLogicドメインは、以下のもので構成されています。
        1. 独自のポッド(Pod 1)内のDockerコンテナで実行されている管理サーバー(AS)インスタンス。
        2. 管理サーバー(Pod 1)と同じPodにある独自のDockerコンテナで実行されるwebhookの実装。
          Webhookとは、軽量なHTTPサーバーで、複数のエンドポイント(フック)を使ってシェルスクリプトなどの設定済みコマンドを実行可能です。サンプルデモで使用しているwebhookの詳細については、以下のURLを参照してください。
          webhook is a lightweight configurable incoming webhook server which can execute shell commands
          https://github.com/adnanh/webhook/
          (注意)「WebLogic on Kubernetes, Try It!」にあるように、WLDFをトリガーとするスケールを実行するための前提条件として、Webhook Dockerイメージ(oow-demo-webhook)のビルドおよびインストールが必要です。
        3. 一連の管理対象サーバーインスタンスで構成されているWebLogic Serverクラスタ。各インスタンスはDockerコンテナ内で動作し、それぞれ個別のPodにある(Pod 2からPod 6)。

        WebLogic Diagnostic Framework

        WebLogic Diagnostics Framework(WebLogic診断フレームワーク、WLDF)は、サーバとアプリケーションのパフォーマンスを可視化するメトリックを収集し浮かび上がらせるサービスとAPIの集合です。動的クラスタの自動スケーリングをサポートするため、WLDFにはポリシー(Policy)とアクション(Action)というコンポーネントが用意されています。このコンポーネントを使用すると、動的クラスタで自動的にスケーリング操作を実行するポリシー式を記述できます。これらのポリシーは、メモリ、アイドルスレッド、CPU負荷など、1つ以上の種類のWebLogic Serverメトリックを監視します。ポリシー内に設定したしきい値を満たすと、ポリシーが呼び出され、対応するスケーリングアクションを実行します。WLDFと診断ポリシーとアクションの詳細については、以下のドキュメントをご覧ください。
        Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用 12c (12.2.1.2.0)
        ポリシーとアクションの構成
        https://docs.oracle.com/cd/E84527_01/wls/WLDFC/config_watch_notif.htm#WLDFC188
        Oracle® Fusion Middleware Configuring and Using the Diagnostics Framework for Oracle WebLogic Server 12c (12.2.1.3.0)
        Configuring Policies and Actions
        https://docs.oracle.com/middleware/12213/wls/WLDFC/config_watch_notif.htm#WLDFC188
        ポリシーは、以下のデータに基づいています。
        • 特定の時間間隔中の平均値の変化のような、時間経過に伴う傾向または履歴データ。例えば、特定のしきい値を超える平均JVMヒープ使用量に基づきポリシーを設定できる。
        • 1つのサーバーインスタンスだけでなく、クラスタ内のすべてのサーバーインスタンスに関連する実行時メトリック
        • 一緒に考慮すべき複数のサービスからのデータ。例えばロードバランサが報告する応答時間メトリックとメッセージキューからのメッセージバックログメトリックに基づいたポリシーを設定できる。
        • カレンダーベースのスケジュール。ポリシーは、スケーリングアクションを実行する必要がある時間帯や曜日などの特定のカレンダー時刻を識別できる。
        • ログルールまたはイベントデータルール。

          Automatic Scaling of a WebLogic Server Cluster in Kubernetes

          WLDFを使用してKubernetes環境でWebLogic Serverクラスタの自動スケーリングを実現する方法を紹介しますが、ここでは自動スケーリングに関連する設定変更についてのみ説明します。サンプルデモの設定と実行の手順については、「WebLogic on Kubernetes, Try It!」のエントリをご覧ください。
          まず、KubernetesでのWebLogic Serverクラスタの自動スケーリングの動作を簡単に説明します。
          サンプルデモでは、WebLogic ServerクラスタをKubernetesクラスタで実行し、WebLogic Server管理対象サーバーインスタンスはKubernetes Podに1対1でマッピングされています。PodはStatefulSetコントローラが管理しています。ReplicaSetsとDeploymentsと同様、StatefulSetは、レプリケーションコントローラの一種で、目的のレプリカ・カウント・フィールド(replica count field)を増減するだけで拡張できます。ポリシーとスケーリングアクションは、WebLogic Serverクラスタ用に構成されています。WebLogic Serverクラスタの稼働中、WLDFはWebAppComponentRuntimeMBeanのOpenSessionsCurrentCount属性など、さまざまな実行時メトリックを収集して監視します。ポリシーで定義された条件が発生すると、ポリシーが呼び出され、対応するスケーリングアクションが実行されます。 Kubernetes環境で実行されているWebLogic Serverクラスタの場合、スケーリング処理では、目的のレプリカカウントフィールドを設定して、対応するStatefulSetをスケーリングします。これにより、StatefulSetコントローラは、必要なレプリカ数に一致するように、ポッドの数(WebLogic Server管理対象サーバインスタンス)を増減させます。
          StatefulSetは管理対象サーバーインスタンスが稼働しているPodを管理しているため、kubectlなどのツールを使用して、以下のようにWebLogic Serverクラスタをオンデマンドでスケーリングすることもできます。
          $ kubectl scale statefulset ms --replicas=3

          WLDF Policies and Actions

          WLDFのポリシーとアクションコンポーネントの設定については、以下のドキュメントを参照してください。
          Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用
          12c (12.2.1.2.0)
          ポリシーとアクションの構成
          https://docs.oracle.com/cd/E84527_01/wls/WLDFC/config_watch_notif.htm#WLDFC188
          Oracle® Fusion Middleware Configuring and Using the Diagnostics Framework for Oracle WebLogic Server 12c (12.2.1.3.0)
          Configuring Policies and Actions
          https://docs.oracle.com/middleware/12213/wls/WLDFC/config_watch_notif.htm#WLDFC188
          このサンプルでは、ポリシーとアクションをWLDF診断システムモジュール内で構成します。対応するリソース記述子ファイル(Module-0-3905.xml)は以下の通りです。
          <?xml version='1.0' encoding='UTF-8'?>
          <wldf-resource xmlns="http://xmlns.oracle.com/weblogic/weblogic-diagnostics" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-diagnostics http://xmlns.oracle.com/weblogic/weblogic-diagnostics/2.0/weblogic-diagnostics.xsd">
            <name>Module-0</name>
            <watch-notification>
              <watch>
                <name>myScaleUpPolicy</name>
                <enabled>true</enabled>
                <rule-type>Harvester</rule-type>
                <rule-expression>wls:ClusterGenericMetricRule("DockerCluster",
          "com.bea:Type=WebAppComponentRuntime,ApplicationRuntime=OpenSessionApp,*",
          "OpenSessionsCurrentCount","&gt;=",0.01,5,"1 seconds","10 seconds")
                </rule-expression>
                <expression-language>EL</expression-language>
                <alarm-type>AutomaticReset</alarm-type>
                <schedule>
                  <minute>*</minute>
                  <second>*/15</second>
                </schedule>
                <alarm-reset-period>60000</alarm-reset-period>
                <notification>RestScaleUpAction</notification>
              </watch>
              <rest-notification>
                <name>RestScaleUpAction</name>
                <enabled>true</enabled>
                <timeout>0</timeout>
                <endpoint-url>http://${OPERATOR_ENDPOINT}/hooks/scale-up</endpoint-url>
                <rest-invocation-method-type>PUT</rest-invocation-method-type>
                <accepted-response-type>application/json</accepted-response-type>
                <http-authentication-mode>None</http-authentication-mode>
                <custom-notification-properties></custom-notification-properties>
              </rest-notification>
            </watch-notification>
          </wldf-resource> 
          ポリシーとアクションを定義するための基本要素は<watch-notification>です。ポリシーは<watch>要素で定義します。アクションは、アクションタイプに対応する名前の要素で定義します。 例えば、RESTアクションの要素は<rest-notification>です。

          前述のリソース記述子ファイルで指定されているポリシーとアクションに関する主要な構成の詳細を説明します。利用可能なすべてのアクションタイプの詳細については、以下のドキュメントを参照してください。
          Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用
          12c (12.2.1.2.0)
          ポリシーとアクションの構成
          https://docs.oracle.com/cd/E84527_01/wls/WLDFC/config_notifications.htm#WLDFC204
          Oracle® Fusion Middleware Configuring and Using the Diagnostics Framework for Oracle WebLogic Server 12c (12.2.1.3.0)
          Configuring Actions
          https://docs.oracle.com/middleware/12213/wls/WLDFC/config_notifications.htm#WLDFC204 

          Policies:

          サンプルデモには、myScaleUpPolicyという名前のポリシーが含まれています。このポリシーには、以下のようなポリシー式があり、WebLogic Server管理コンソールで確認できます。

          myScaleUpPolicyのポリシー式では、ClusterGenericMetricRuleというスマートルールを使っています。このスマートルールの設定は以下のようです。
          DockerClusterクラスタでは、WLDFがOpenSessionAppアプリケーションのためにWebAppComponentRuntimeMBeanのOpenSessionsCurrentCount属性を監視します。OpenSessionsCurrentCountがクラスタ内の管理対象サーバインスタンスの5%で0.01%以上に達する場合、ポリシーをtrueと評価します。サンプリングレートを1秒としてメトリックを収集し、サンプルデータは保存ウィンドウの時間の指定された10秒間で平均化されます
          スマートルールに関する詳細は、以下のドキュメントをご覧ください。
          Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用
          12c (12.2.1.2.0)
          スマート・ルールのリファレンス
          https://docs.oracle.com/cd/E84527_01/wls/WLDFC/appendix_smartrules.htm
          Oracle® Fusion Middleware Configuring and Using the Diagnostics Framework for Oracle WebLogic Server 12c (12.2.1.3.0)
          Smart Rule Reference
          https://docs.oracle.com/middleware/12213/wls/WLDFC/appendix_smartrules.htm

          Actions:

          アクションは、ポリシー式がtrueと評価されたときに実行される操作です。従来のWebLogic Serverデプロイメントでは、スケーリングアクション(スケールアップおよびスケールダウン)は、動的クラスタをスケーリングするためのポリシーに関連付けられています。Elasticアクションは、ノードマネージャと対話することで、動的クラスタ内の管理対象サーバーインスタンスを拡張します。

          WLDFではその他の種類の診断アクションも数多くサポートしています。
          • Java Management Extensions (JMX)
          • Java Message Service (JMS)
          • Simple Network Management Protocol (SNMP)
          • Simple Mail Transfer Protocol (SMTP)
          • 診断イメージのキャプチャ
          • REST
          • WebLogicロギングシステム
          • WebLogic Scripting Tool (WLST)
          • ヒープダンプ
          • スレッドダンプ
          サンプルでは、RESTアクションを使用して、RESTエンドポイントを呼び出してスケーリング操作を開始する様子を示しています。Kubernetes環境ではノードマネージャを実行しておらず、Kubernetes APIとAPIサーバーを使用してPodをスケーリングしているため、ElasticアクションではなくRESTアクションを選択しました。WLDFでサポートされるすべての診断アクションの詳細については、以下のドキュメントを参照してください。
          Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用
          12c (12.2.1.2.0)
          アクションの構成
          https://docs.oracle.com/cd/E84527_01/wls/WLDFC/config_notifications.htmOracle® Fusion Middleware Configuring and Using the Diagnostics Framework for Oracle WebLogic Server 12c (12.2.1.3.0)
          Configuring Actions
          http://docs.oracle.com/middleware/12213/wls/WLDFC/config_notifications.htm
          • ポリシーmyScaleUpPolicyに関連付けられたRESTアクションは、WebLogic Server管理コンソールのポリシー設定ページの[アクション]タブで設定されました。

          • アクションを送信するRESTエンドポイントURLは診断システムモジュールのリソース記述子ファイルの<endpoint-url>要素によって設定します。
          RESTアクションの構成要素を見ると、REST呼び出しでは認証無しでエンドポイントに空のPUTリクエストを送信することがわかります。必要に応じて、<http-authentication-mode>属性をBasicに設定するだけで基本認証付きRESTリクエストを送信することもできます。

          注目すべきその他のWLDFリソース記述子の構成設定は以下のとおりです。
          1. WLDFリソース記述子のファイル名は任意です。サンプルデモでは、WebLogic Server管理コンソールを使用してWLDFポリシーとRESTアクションを構成する際にModule-0-3905.xmlが生成されました。
          2. WebLogicドメインdemoでは、container-scripts/add- app-to-domain.pyスクリプトを使用してWLDF診断システムモジュールを作成しました。
          # Configure WLDF
          # ============-=
          as_name = sys.argv[3]

          print('Configuring WLDF system resource');
          cd('/')

          create('Module-0','WLDFSystemResource')
          cd('/WLDFSystemResources/Module-0')
          set('DescriptorFileName', 'diagnostics/Module-0-3905.xml')

          cd('/')
          assign('WLDFSystemResource', 'Module-0', 'Target', as_name)
          スクリプトから以下のことがわかります。
          • Module-0という名前のWLDF診断システムモジュールが作成されます。
          • WLDFリソース記述子ファイル(Module-0-3905.xml)は、Module-0に関連付けられています。
          • 診断システムモジュールは、システム引数として渡されるas_nameで指定された管理サーバーをターゲットにしています。この診断システムモジュールは、そのポリシーにClusterGenericMetricRuleスマートルールが含まれているため、管理サーバーをターゲットとしていました。このルールは、クラスタ全体から見える必要があるため、管理サーバーから実行する必要があります。 スマートルールとそのターゲットの詳細については、以下のドキュメントを参照してください。
          Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用
          12c (12.2.1.2.0)
          スマート・ルールのリファレンス
          https://docs.oracle.com/cd/E84527_01/wls/WLDFC/appendix_smartrules.htm
          Oracle® Fusion Middleware Configuring and Using the Diagnostics Framework for Oracle WebLogic Server 12c (12.2.1.3.0)
          Smart Rule Reference
          https://docs.oracle.com/middleware/12213/wls/WLDFC/appendix_smartrules.htm

          Demo Webhook

          サンプルデモでは、webhookを使用してWLDFからREST通知を受信し、StatefulSetを拡張して、WebLogic Serverクラスタを拡張します。以下のフックはwebhooks/hooks.jsonで定義されています。
          [
            {
              "id": "scale-up",
              "execute-command": "/var/scripts/scaleUpAction.sh",
              "command-working-directory": "/var/scripts",
              "response-message": "scale-up call ok\n"
            }
          scale-upと命名されたこのフックは、REST通知で指定された<endpoint-url>に対応します。
          <endpoint-url>http://${OPERATOR_ENDPOINT}/hooks/scale-up</endpoint-url> 
          エンドポイントURLに環境変数 ${OPERATOR_ENDPOINT} が含まれていることに注意してください。この環境変数は、管理サーバー起動時にWebHookの正しいホストとポートに置き換えられます。
          Webフックのエンドポイントが呼び出されると、 "execute-command"プロパティで指定されたコマンドが実行されます。今回の場合、シェルスクリプト /var/scripts/scaleUpAction.shが呼び出されます。
          #!/bin/sh
          echo "called">> scaleUpAction.log
          num_ms=`curl -v --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -X GET https://kubernetes/apis/apps/v1beta1/namespaces/default/statefulsets/${MS_STATEFULSET_NAME}/status | grep -m 1 replicas| sed 's/.*\://; s/,.*$//'`
          echo "current number of servers is $num_ms">> scaleUpAction.log
          new_ms=$(($num_ms + 1))
          echo "new_ms is $new_ms">> scaleUpAction.log
          curl -v --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" -X PATCH -H "Content-Type: application/strategic-merge-patch+json" -d '{"spec":{"replicas":'"$new_ms"'}}' https://kubernetes/apis/apps/v1beta1/namespaces/default/statefulsets/${MS_STATEFULSET_NAME} 
          このスクリプトでは、Kubernetes APIサーバーのRESTエンドポイントに「curl」でリクエストを発行し、JSONのレスポンスを解析しています。最初のリクエストは、StatefulSetの現在のreplica数の取得です。続いて、replica数を1つ増やして、リクエストボディのreplicasプロパティに新しい値を入れてPATCHリクエストを送信し、StatefulSetをスケールアップします。

          Wrap Up

          WLDFのポリシーおよびアクションコンポーネントを使用する簡単な設定を使えば、Kubernetes環境で静的に構成されたWebLogic Serverクラスタに対して自動スケーリング機能を利用できます。WLDFはWebLogic Serverとの緊密に統合されているので、スケールの決定に使用可能な非常に包括的な一連のWebLogicドメイン固有の(カスタム)メトリックを利用できます。WLDF通知を受け取るためのRESTエンドポイントとしてwebhookを使用しましたが、サンプルデモでWebLogic Serverクラスタを拡張するため、Kubernetesクラスタで実行されている別のKubernetesオブジェクトまたはサービスを簡単に実装できました。例えば、WebLogic Serverチームは、Kubernetes環境でWebLogic Serverを統合するためKubernetes Operatorパターンも調査しています。Kubernetes Operatorは、「複雑なアプリケーションのインスタンスを作成、構成、管理するためのKubernetes APIを拡張するアプリケーション固有のコントローラ」です。Operatorの詳細については、以下のエントリをご覧ください。
          Introducing Operators: Putting Operational Knowledge into Software
          https://coreos.com/blog/introducing-operators.html
          WebLogic ServerおよびKubernetesとの統合に関連する今後のエントリご期待ください。WebLogic Serverのクラスタリングに関連する次回のエントリは、KubernetesのWebLogic Serverの動的クラスタあたりを予定しています。

          [WLS, Docker] Run Standalone WebLogic JMS Clients on Kubernetes

          $
          0
          0
          原文はこちら。
          https://blogs.oracle.com/weblogicserver/run-standalone-weblogic-jms-clients-on-kubernetes

          Overview

          JMSアプリケーションは、JMSサービスを使用してメッセージを送受信するアプリケーションです。WebLogic JMSアプリケーションには、サーバーサイドのJMSアプリケーションとスタンドアロンのJMSクライアントの2種類があります。サーバーサイドアプリケーションは、WebLogic Serverまたはクラスタ上で実行されているアプリケーションで、通常はMDB、サーブレットなどのJava EEアプリケーションです。スタンドアロンJMSクライアントは、外部EEサーバー、デスクトップアプリケーション、またはマイクロサービスで実行されるアプリケーションです。直近のエントリ「Run a WebLogic JMS Sample on Kubernetes」で、Kubernetes上で稼働するJava EEアプリケーション間でWebLogic JMS通信の説明をいたしました。
          Run a WebLogic JMS Sample on Kubernetes
          https://blogs.oracle.com/weblogicserver/run-a-weblogic-jms-sample-on-kubernetes
          https://orablogs-jp.blogspot.jp/2017/12/run-weblogic-jms-sample-on-kubernetes.html
          その際、ファイルベースのメッセージ永続性を使用しました。このエントリでは、前回のエントリから一歩進めて、WebLogic JMSサービスを使用して相互に通信するスタンドアロンJMSクライアントを説明します。今回はデータベースベースのメッセージ永続性を使用します。
          最初に、GitHubにあるサンプルWebLogicドメインをベースにして、管理サーバー、およびWebLogicクラスタをもつWebLogicドメインを作成します。
          WebLogic Sample on Kubernetes with Shared Domain Home
          https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/wls-k8s-domain
          次に、データソース、JDBCストア、およびJMSリソースをKubernetesクラスタ上のWebLogicドメインにデプロイします。WebLogic JMSサービスの準備ができて稼働した後、WebLogic JMS宛先との間でメッセージを送受信するために、同じKubernetesクラスタにJavaマイクロサービスを作成してデプロイします。

          REST APIを使用して、管理サーバーPodに対してスクリプトを実行して、クラスタをターゲットとするリソースをデプロイします。

          Creating WebLogic JMS Services on Kubernetes

          Preparing the WebLogic Base Domain and Data Source

          「Run a WebLogic JMS Sample on Kubernetes」のエントリの説明に従って、ドメインの作成、MySQLデータベースの設定、データソースの作成という手順を完了していれば、次のセクションに進むことができます。それ以外の場合は、「Run a WebLogic JMS Sample on Kubernetes」のエントリの以下のセクションの手順を完了する必要があります。
          Run a WebLogic JMS Sample on Kubernetes
          https://blogs.oracle.com/weblogicserver/run-a-weblogic-jms-sample-on-kuberneteshttps://orablogs-jp.blogspot.jp/2017/12/run-weblogic-jms-sample-on-kubernetes.html
          1. "Creating the WebLogic Base Domain"
          2. "Setting Up and Running MySQL Server in Kubernetes"
          3. "Creating a Data Source for the WebLogic Server Domain"
          今回は、Kubernetesクラスタ上で実行されるbaseというWebLogicドメインと、同じKubernetesクラスタ内で実行されるMySQLデータベースに接続するデータソースを設定しておく必要があります。

          Deploying the JMS Resources with a JDBC Store

          まず、1つのデータベースストア、1つのJMSサーバー、および1つのJMSモジュールの定義を含むJSONデータファイルを準備します。ファイルはPythonスクリプトで処理され、WebLogic Server REST APIを使ってリソースを1つずつ作成します。
          File jms2.json:
          {"resources": {  
          "jdbc1": {
          "url": "JDBCStores",
          "data": {
          "name": "jdbcStore1",
          "dataSource": [
          "JDBCSystemResources",
          "ds1"
          ],
          "targets": [{
          "identity":["clusters", "myCluster"]
          }]
          }
          },

          "jms2": {
          "url": "JMSServers",
          "data": {
          "messagesThresholdHigh": -1,
          "targets": [{
          "identity":["clusters", "myCluster"]
          }],
          "persistentStore": [
          "JDBCStores",
          "jdbcStore1"
          ],
          "name": "jmsserver2"
          }
          },

          "module": {
          "url": "JMSSystemResources",
          "data": {
          "name": "module2",
          "targets":[{
          "identity": [ "clusters", "myCluster" ]
          }]
          }
          },

          "sub2": {
          "url": "JMSSystemResources/module2/subDeployments",
          "data": {
          "name": "sub2",
          "targets":[{
          "identity": [ "JMSServers", "jmsserver2" ]
          }]
          }
          }
          }}
          続いて、JMSモジュールファイルを準備します。これには接続ファクトリ、分散キュー、分散トピックが含まれています。
          File module2-jms.xml:
          <?xml version='1.0' encoding='UTF-8'?>
          <weblogic-jms xmlns="http://xmlns.oracle.com/weblogic/weblogic-jms" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-jms http://xmlns.oracle.com/weblogic/weblogic-jms/1.1/weblogic-jms.xsd">
          <connection-factory name="cf2">
          <default-targeting-enabled>true</default-targeting-enabled>
          <jndi-name>cf2</jndi-name>
          <transaction-params>
          <xa-connection-factory-enabled>true</xa-connection-factory-enabled>
          </transaction-params>
          <load-balancing-params>
          <load-balancing-enabled>true</load-balancing-enabled>
          <server-affinity-enabled>false</server-affinity-enabled>
          </load-balancing-params>
          </connection-factory>
          <uniform-distributed-queue name="dq2">
          <sub-deployment-name>sub2</sub-deployment-name>
          <jndi-name>dq2</jndi-name>
          </uniform-distributed-queue>
          <uniform-distributed-topic name="dt2">
          <sub-deployment-name>sub2</sub-deployment-name>
          <jndi-name>dt2</jndi-name>
          <forwarding-policy>Partitioned</forwarding-policy>
          </uniform-distributed-topic>
          </weblogic-jms>
          これらの2ファイルを管理サーバーのPodにコピーしてから、管理サーバーPodでPythonスクリプトを実行し、すべてのJMSリソースを作成します。
          $ kubectl exec $adminPod -- mkdir /u01/wlsdomain/config/jms/
          $ kubectl cp ./module2-jms.xml $adminPod:/u01/wlsdomain/config/jms/
          $ kubectl cp ./jms2.json $adminPod:/u01/oracle/
          $ kubectl exec $adminPod -- python /u01/oracle/run.py createRes /u01/oracle/jms2.json
          WebLogic Server管理コンソール(http://<hostIP>:30007/console)を開き、すべてのJMSリソースが正常に動作していることを確認します。宛先 dq2 の監視ページに移動して、2個のメンバー(jmsserver2@managed-server-0@dq2 と jmsserver2@managed-server-1@dq2)の存在を確認します。



          これでWebLogic JMSサービスの準備は完了です。このサービスに送信されたJMSメッセージはMySQLデータベースに格納されます。

          Running the WebLogic JMS Client

          JMSクライアントPodは、WebLogicクライアントJARファイルとともにパッケージされたopenjdk8イメージに基づくJavaマイクロサービスです。クライアント関連のスクリプト(Dockerfile、JMSクライアントJavaファイル、およびyamlファイルを含む)はGitHubにあります。
          JMS Client関連のスクリプト
          https://github.com/lilyhe123/jms-client/
          (注意)インストール済みのWebLogicディレクトリ($WL_HOME/server/lib)からwlthint3client.jarを取得し、jms-client/container-scripts/lib>フォルダに入れる必要があります。

          (Step 1)JMSクライアントのDockerイメージをビルドします。イメージには、直接実行可能なコンパイル済みのJMSクライアントクラスが含まれます。
          $ cd jms-client
          $ docker build -t jms-client .
          (Step 2)JMSクライアントPodを作成します。
          $ kubectl create -f jmsclient.yml
          Javaプログラムを実行してWebLogic JMSの宛先からメッセージを送受信します。$clientPodwith を実際のJMSクライアントPod名に置き換えてください。

          送信プログラムを実行して宛先dq2にメッセージを送信します。
          $ kubectl exec -it $clientPod java samples.JMSSender


          デフォルトで、送信側は実行毎に10個のメッセージを送信します。これらのメッセージは宛先dq2の2個のメンバーに分配されます。管理コンソールで確認してみましょう。

          受信プログラムを実行して宛先dq2からメッセージを受け取ります。
          $ kubectl exec -it $clientPod java samples.JMSReceiver dq2
          受信プログラムは、WebLogicのJMSDestinationAvailabilityHelper APIを使用して分散キューのメンバーシップの変化に関する通知を取得します。それゆえ、受信プログラムはdq2の両方のメンバーからメッセージを受信できます。詳細な使用方法については、以下のドキュメントをご覧ください。
          Oracle® Fusion Middleware Oracle WebLogic Server JMSアプリケーションの開発 12c (12.2.1.2.0)
          JMS宛先の可用性ヘルパーAPIを使用した分散宛先に関する拡張プログラミング
          https://docs.oracle.com/cd/E84527_01/wls/JMSPG/dahelper.htm#GUID-516D21A5-EEE5-4397-806F-DB9DB28AD1E8
          Oracle® Fusion Middleware Developing JMS Applications for Oracle WebLogic Server 12c (12.2.1.3.0)
          Advanced Programming with Distributed Destinations Using the JMS Destination Availability Helper API
          https://docs.oracle.com/middleware/12213/wls/JMSPG/dahelper.htm#JMSPG928

          Summary

          このエントリでは、「Run a WebLogic Sample on Kubernetes」のサンプルを拡張して、外部JMSクライアントを使った、Kubernetesクラスタで動作しているWebLogic JMSサービスとの通信を説明しました。
          Run a WebLogic JMS Sample on Kubernetes
          https://blogs.oracle.com/weblogicserver/run-a-weblogic-jms-sample-on-kubernetes
          https://orablogs-jp.blogspot.jp/2017/12/run-weblogic-jms-sample-on-kubernetes.html
          基本的なKubernetesの機能を利用してWebLogic Serverのライフサイクルを管理し、データベースベースのメッセージ永続性(JDBCストア)を使用して、Podのライフサイクルを超えてデータを保持しました。今後、将来予定されている完全に動作保証されたWebLogic KubernetesのオペレータベースのKubernetes環境を使用して、WebLogic JMSクラスタをホストする方法を紹介する予定です。また、WebLogic JMSの自動サービス移行を使用して、JMSインスタンスをシャットダウンされたPodから実行中のPodに移行する方法についても紹介する予定です。

          [Java] Updates for Java SE Platform

          $
          0
          0
          原文はこちら。
          https://blogs.oracle.com/java/java-se-8-9

          Java SE 9.0.4はJava Platformの最新のアップデートです。このリリースは発表済みのCritical Patch Update(以下CPU)の一部であり、重要なバグ修正が含まれています。このリリースのJRE(version 9.0.4)は次回のCPUリリースで有効期限が切れますので、Java 8をお使いのすべての方がこのリリースにアップデートされることをOracleは強く推奨します。
          Release Notes for JDK 9 and JDK 9 Update Releases
          http://www.oracle.com/technetwork/java/javase/9all-relnotes-3704433.html
          Java SE Downloads
          http://www.oracle.com/technetwork/java/javase/downloads/index.html
          Critical Patch Updates, Security Alerts and Bulletins
          https://www.oracle.com/technetwork/topics/security/alerts-086861.html
          Java CPU and PSU Releases Explained
          http://www.oracle.com/technetwork/java/javase/cpu-psu-explained-2331472.html
          [訳注]
          リリースノートにあるとおり、2018/1のCPUでは2種類のJDK 9バンドルがリリースされています。
          • Oracle JDK 9.0.4 :商用機能(deploy、installerなど)を含む
          • OpenJDK 9.0.4:OpenJDKソースコードからビルドしたもの
          リリースノートは両方のバンドルを対象にしていますが、いずれかのバンドル固有の内容の場合、タイトルにOpenJDKもしくはOracle JDKが明示されています。明示されていない場合には両バンドルともに関係する内容です。
          このリリースはJDK 9の最終リリースの予定ですので、2018年3月から次回のCPUリリース(2018年4月)までの間にJDK 10にアップデートされることを推奨します。

          Java SE 8u161/162 (Java SE 8 update 161 および Java SE 8 update 162) がご利用いただけるようになりました。
          Java SE Development Kit 8 Downloads
          http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 
          Java SE 8u162はPSU(Patch Set Update)で、8u161を包含し、さらに追加機能を含んでいます。Java SEをご利用のほとんどの方が、重要なセキュリティ修正を含む最新のJava 8アップデートにアップグレードされることをOracleは強く推奨します。このリリースに含まれる新機能やバグ修正の情報は、以下のリリースノートをご覧ください。
          JDK 8u161 Update Release Notes
          http://www.oracle.com/technetwork/java/javase/8u161-relnotes-4021379.html
          JDK 8u162 Update Release Notes
          http://www.oracle.com/technetwork/java/javase/8u162-relnotes-4021436.html
          Oracle Java SE Embedded Version 8 Update 161もご利用いただけるようになりました。
          Oracle Java SE Embedded Downloads
          http://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/index.html
          JRECreateツールを使いカスタマイズしたJREを作成できます。始めるには、対象とするプラットフォームに適したeJDKバンドルをダウンロードし、アプリケーションのニーズにあうJREを以下の手順に従って作成します。
          Java Platform, Standard Edition (Java SE) 8 - Oracle Java SE Embedded: Developer's Guide
          Create Your JRE with jrecreate
          http://docs.oracle.com/javase/8/embedded/develop-apps-platforms/jrecreate.htm#JEMAG270
          Oracle Java SE 8 EmbeddedはOracle Java SE Embedded製品の最終メジャーリリースです。JDK 9からは、Oracleは個別のJava SE Embedded製品のダウンロードを提供する予定はありません。
          Java SE 7u171、Java SE 6u181もリリースされましたが、いずれもOracle Java SE Supportの契約が必要です。
          Java SE 7 Advanced and Java SE 7 Support (formerly known as Java for Business 7) Release Notes
          Java™ SE Development Kit 7, Update 161 (JDK 7u171)
          http://www.oracle.com/technetwork/java/javaseproducts/documentation/javase7supportreleasenotes-1601161.html#R170_171
          Java SE 6 Advanced and Java SE 6 Support (formerly known as Java SE for Business 6) Release Notes
          Java™ SE Development Kit 6, Update 171 (JDK 6u181)
          http://www.oracle.com/technetwork/java/javase/overview-156328.html#R160_181

          Related Blogs

          Java 9 Release Now Available!
          https://blogs.oracle.com/java/java-9-release-now-available
          https://orablogs-jp.blogspot.jp/2017/09/java-9-release-now-available.html
          Java Magazine Issue: More Java 9
          https://blogs.oracle.com/java/java-magazine-more-java-9
          https://orablogs-jp.blogspot.jp/2017/09/new-java-magazine-issue-more-java-9.html
          Java Magazine Issue: Inside Java 9
          https://blogs.oracle.com/java/java-magazine-inside-java-9
          https://orablogs-jp.blogspot.jp/2017/07/new-java-magazine-issue-inside-java-9.html

          [Docker, WLS] How to... WebLogic Server on Kubernetes

          $
          0
          0
          原文はこちら。
          https://blogs.oracle.com/weblogicserver/how-to-weblogic-server-on-kubernetes

          WebLogic Serverチームは、KubernetesでオーケストレーションされるWebLogicドメインの動作保証に取り組んでいます。この作業の一環として、ユーザーからもらう可能性のある質問に対する回答のための一連のブログエントリを公開します。これらは、KubernetesでWebLogic Serverを実行するためのベストプラクティスについて説明しています。これらのエントリでは、セキュリティのベストプラクティス、監視、ログ、メッセージング、トランザクション、クラスタのスケーリング、ボリュームの状態の外部化、パッチ適用、アプリケーションの更新などのトピックを扱います。最初のエントリでは、GitHubのサンプルを使ってすぐに試すことができます。みなさまがフォローしやすいように、このブログエントリのリストを更新し続けていきますので、ご期待ください。
          Viewing all 760 articles
          Browse latest View live


          Latest Images

          <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>
          <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596344.js" async> </script>