Oracle Cloud Infrastructureのデータベース管理で実行計画をグラフィカルに表示してみた

Oracle Cloud Infrastructure(OCI)のデータベース管理(Database Management)サービス上で実行計画をグラフィカルに表示できると聞いたので試してみました。
今回はOCIのAutonomous Database(ADB)で試しました。

ADBインスタンスの作成

ADBインスタンスの作成、およびテストデータの生成は下記チュートリアルを参照してください。
Automatic Partitioning in Autonomous Database
上記のLab2まで実施します。

データベース管理の有効化

次に作成したADBのデータベース管理を有効化します。
ADBインスタンスの詳細画面の下段にある「関連付けられたサービス」に「データベース管理」という項目があります。
こちらが無効になっている場合「有効化」を選択します。
enable_dbm
しばらく経つと有効化されます。
経過を確認する場合は同じく詳細画面の左メニュー一覧にある「作業リクエスト」を選択します。
left_menu
表示される作業リクエスト一覧の「Enable Database Management」を選択すると作業経過を確認できます。
check_job

クエリの発行

実行計画を確認するためにクエリを発行します。
チュートリアル記載の通りクラウド・シェルのSQLclを使ってADBにログインします。

$ sql /nolog
SQL> set cloudconfig wallet.zip
SQL> connect admin/<your_password>@<your_service>

冒頭で作成したテストデータに対して適当なクエリを発行します。

SQL> select l.d, l.suma+r.sumb from
        (select d, sum(a) suma from apart group by rollup(d)) l,
        (select d, sum(b) sumb from apart group by rollup(d)) r
        where l.d=r.d;

実行計画の確認

ADBインスタンス詳細画面の「パフォーマンス・ハブ」を選択します。
performance_hub
するとEnterprise Manager(EM)をお使いの方には見慣れたアクティブ・セッション履歴(ASH)の画面が表示されます。
まずはクエリを実行した時間帯に最上段のフレームを合わせ、下段にある該当SQLのSQL IDを選択します。
choose_sql
選択したSQLの統計情報に関する画面へ遷移します。
実行計画を確認するには中段にあるタブから「実行統計」を選択します。
一般的な表形式の実行計画が表示されますので、右にあるプルダウンメニューから「グラフィカルな実行計画」を選択します。
ep
下記画像のように、実行計画の実行順序がぱっと見で分かるフォーマットに変わります。
tree_ep
また各ノードを選択することでノード毎の統計情報も確認できます。
leaf_ep

まとめ

データベース管理を使うと本来EMで実現していたようなモニタリングが、マネージドサービスとして手軽に利用できます。
また実行計画のグラフィカル表示といった、データベース管理ならではの機能もあります。
複雑な実行計画のチューニングに重宝しそうです。
なお今回はADBで試しましたが、オンプレのOracle Databaseや、OCIのその他のPaaSとして提供されているOracle Databaseでも利用できます。

OracleのマルチKubernetesクラスタ管理プラットフォーム「Verrazzano」を構築してみた

Oracleが提供しているマルチKubernetesクラスタ管理プラットフォーム「Verrazzano」を構築してみました。
Verrazzanoの特徴は以下の概要資料を参照ください。
OCI活用資料集 Verrazzano概要

下記にポイントを抜粋します。

  • クラウド/オンプレミスを含めた複数のKubernetes環境を管理
  • OSSベースで構成
  • Open Application Model (OAM) でアプリケーションを定義
  • 高いセキュリティ
  • WebLogic / Coherence / Helidonとの高い親和性
  • 無償(Community Edition)と有償(Enterprise Edition)が存在

Verrazzano上へOAMに則ってアプリケーションをデプロイするとGrafanaやPrometheus、Kiali等を使った監視・管理を簡単に構成できます。
なおVerrazzanoはKubernetes環境を構築してくれるものではありません。

Verrazzanoを導入する

Kubernetesの構築については割愛します。
今回はOracle Cloud InfrastructureのKubernetesサービスであるOKE上に環境を用意しました。
ローカル環境にVMを使って構成する際は、以前投稿した記事「Kubernetes環境をOVMでローカルに作る」を参考にしてみてください。

まずはVerrazzano Platform Operatorをインストールします。
今回は現時点の最新バージョン(v1.3.2)をインストールしました。

$ kubectl apply -f https://github.com/verrazzano/verrazzano/releases/download/v1.3.2/operator.yaml
customresourcedefinition.apiextensions.k8s.io/verrazzanomanagedclusters.clusters.verrazzano.io created
customresourcedefinition.apiextensions.k8s.io/verrazzanos.install.verrazzano.io created
namespace/verrazzano-install created
serviceaccount/verrazzano-platform-operator created
clusterrole.rbac.authorization.k8s.io/verrazzano-managed-cluster created
clusterrolebinding.rbac.authorization.k8s.io/verrazzano-platform-operator created
service/verrazzano-platform-operator created
deployment.apps/verrazzano-platform-operator created
validatingwebhookconfiguration.admissionregistration.k8s.io/verrazzano-platform-operator created

インストールできたことを確認します。

## デプロイステータス確認
$ kubectl -n verrazzano-install rollout status deployment/verrazzano-platform-operator
deployment "verrazzano-platform-operator" successfully rolled out

## pod確認
$ kubectl -n verrazzano-install get pods
NAME                                            READY   STATUS    RESTARTS   AGE
verrazzano-platform-operator-6df48794f7-h5555   1/1     Running   0          46s

Verrazzano本体をインストールします。
インストール時にプロファイルを指定しますが、今回は開発環境向けの「dev」を指定します。
他には本番環境向けの「prod」、最小限のインストールのみ行う「managed-cluster」があります。
詳細は下記マニュアルを参照してください。
Installation Profiles

$ kubectl apply -f - <<EOF
> apiVersion: install.verrazzano.io/v1alpha1
> kind: Verrazzano
> metadata:
>   name: example-verrazzano
> spec:
>   profile: dev
> EOF
verrazzano.install.verrazzano.io/example-verrazzano created

インストールが完了したか確認します。

$ kubectl wait --timeout=20m --for=condition=InstallComplete verrazzano/example-verrazzano
  verrazzano.install.verrazzano.io/example-verrazzano condition met

Verrazzano関連のpodが起動していることを確認します。

$ kubectl get pods -n verrazzano-system
NAME                                               READY   STATUS    RESTARTS      AGE
coherence-operator-7b64c5c68d-th4rl                1/1     Running   1 (84m ago)   84m
fluentd-2ndmv                                      2/2     Running   0             82m
fluentd-94tvw                                      2/2     Running   0             82m
fluentd-9bzhl                                      2/2     Running   0             82m
oam-kubernetes-runtime-7dc657d586-7m5l2            1/1     Running   0             85m
verrazzano-application-operator-645789d9bd-t46ph   1/1     Running   0             84m
verrazzano-authproxy-8f4fdc998-7kh8p               2/2     Running   0             82m
verrazzano-console-7fb8f49c6f-57jc7                2/2     Running   0             82m
verrazzano-monitoring-operator-545767bf84-95t82    2/2     Running   0             83m
vmi-system-es-master-0                             2/2     Running   0             82m
vmi-system-grafana-5c5f46dcbd-5z92d                2/2     Running   0             82m
vmi-system-kiali-5b45579fb7-nmkv7                  2/2     Running   0             82m
vmi-system-kibana-5db57b9665-xlf6w                 2/2     Running   0             82m
vmi-system-prometheus-0-7ff598ccb-7kwpc            3/3     Running   0             79m
weblogic-operator-6b7cff9f7d-ndkjq                 2/2     Running   0             84m

Verrazzanoコンソールから各種ツールにアクセス

インストールできたらVerrazzanoコンソールへアクセスします。
アクセス先のURLは以下コマンド結果の「consoleUrl」から確認できます。

$ kubectl get vz -o jsonpath="{.items[].status.instance}" | jq .
{
"consoleUrl": "https://verrazzano.default.XX.XX.XX.XX.nip.io",
"elasticUrl": "https://elasticsearch.vmi.system.default.XX.XX.XX.XX.nip.io",
"grafanaUrl": "https://grafana.vmi.system.default.XX.XX.XX.XX.nip.io",
"keyCloakUrl": "https://keycloak.default.XX.XX.XX.XX.nip.io",
"kialiUrl": "https://kiali.vmi.system.default.XX.XX.XX.XX.nip.io",
"kibanaUrl": "https://kibana.vmi.system.default.XX.XX.XX.XX.nip.io",
"prometheusUrl": "https://prometheus.vmi.system.default.XX.XX.XX.XX.nip.io",
"rancherUrl": "https://rancher.default.XX.XX.XX.XX.nip.io"
}

ログイン画面に入力するパスワードはKubernetesのsecretから確認します。

$ kubectl get secret --namespace verrazzano-system verrazzano -o jsonpath={.data.password} | base64 --decode; echo

ユーザ名に「verrazzano」、パスワードに上記で出力された文字列を入力します。

login

トップ画面にGrafana、Prometheus等のURLが表示されています。
また下段にはVerrazzano上にデプロイされているアプリケーションが表示されています。
今回は事前にサンプルアプリケーションをデプロイしていたので、それが1件みえています。

verrazzano_top

ちなみにサンプルアプリのデプロイ方法は下記マニュアルを参照してください。
Oracle Verrazzanoの基本

トップ画面のURLからGrafanaへアクセスしてみます。
サンプルアプリはWebLogic、Helidon、Coherenceを使って構成されており、それぞれのメトリックを確認できます。

WebLogic
WebLogic

Helidon
Helidon

Coherence
Coherence

次にVerrazzanoのトップ画面からkialiにアクセスしてみます。
以下の通りサンプルアプリのサービスメッシュを確認できます。

kiali

簡単ですが以上になります。
Verrazzano上にOAMに従ってアプリケーションをデプロイすれば、GrafanaやPrometheus、Kialiといった運用管理ツールをすぐに使うことができ、個別に準備する必要はありません。
マルチKubernetesクラスタの運用を簡素化させたい場合に、有力なプラットフォームではないでしょうか。

KaggleのTitanicデータをOracle Analytics Cloudにロードして生存判定と相関関係のある特徴量を確認してみた

Oracle Analytics Cloud(以下 OAC)にはデータと相関関係のあるカラムを教えてくれる「Explain」という機能があります。
この機能が機械学習の特徴量調査で使えるのでは、と思いKaggleで有名なTitanicのデータを使って試してみました。
なお私自身はデータサイエンティストでも何でもないただの素人なので、その点はご了承ください。

まずはOACのトップ画面にて「作成」を押下し、「データセット」を選択します。

create_dataset

画面上にKaggleのTitanic詳細ページからダウンロードした train.csv をドラッグ・アンド・ドロップします。

load_data

データの編集画面が出てきます。
各カラムの属性変更(数値 / 文字列の変更)や欠損値の編集、新規カラム追加はここで出来ます。
今回は何もせず右上の「追加」ボタンを押下します。

edit_data

データ追加が出来ましたら、左上のハンバーガーアイコンを押下し、「データ」を選択します。

menu

先程ロードしたtrainデータを右クリックし、「ワークブックの作成」を選択します。

create_workbook

データの分析画面に移りましたら、Survived 上で右クリックし「Survivedの説明」を選択します。

start_explain

Survivedカラムのデータと相関関係あり、と判断されたカラムが出てきます。

correlations

OACは以下のカラムについて関係性ありと判断したようです。

  • Name:搭乗者の名前
  • Sex:搭乗者の性別
  • Ticket:チケット番号
  • Cabin:客室番号
  • Embarked:乗船した港

チケット番号や客室番号は滞在していた部屋に関わりますので、逃げやすさに関係ありそうですね。
また乗船した港はその客の裕福度合いに関係あるらしく、裕福であれば良い部屋に泊まれていた、つまり逃げるのに有利な部屋にいた可能性があります。
精度の高い学習モデルを作るには、実際はここで提示された特徴量に加え、特徴量エンジニアリングで新たに特徴量を作成するなどの対応は必要になってくると思います。
ですが、そういったことを考え始める出発点としてこのExplain機能を使う、という方法はあるのかなと思いました。

ちなみにこの中から保存しておきたいグラフの右上のチェックマークを押下し、「選択項目の追加」を選択することでグラフを保存できます。

select_visualization

以下の通りワークブックに保存され、あとで見直したりグラフを編集できるようになります。

edit_graph

今回はOACの Explain 機能を試しました。
他にもクラスタリング分析や選んだカラムから最適なグラフを提示してくれる機能など色々揃っていますので、ご興味がありましたら是非お試しください。
以下からOracle Cloudの無料トライアルを申請できます!
https://www.oracle.com/jp/cloud/free/

OCI セキュリティ・リストによってドロップされたパケット数を確認する

OCI上で疎通できない通信があった際に、
セキュリティ・リストで弾かれているのか確認したいときってありませんか?
そんなときはOCI Monitoringのメトリックデータを採取すると役立ちそうです。
本記事ではOCI Monitoringからセキュリティ・リストによって
ドロップされたパケット数を確認する方法をご紹介します。

Webコンソールから確認する

以下の順で画面遷移します。
コンピュート >> インスタンス >> インスタンスの詳細 >> アタッチされたVNIC >> VNICの詳細

すると次のようなグラフでセキュリティ・リストによって
ドロップされたパケット数を確認できます。
graph

CLIツールから確認する

OCI CLIでも確認できます。
イングレスについては以下のコマンドで取得できます。

oci monitoring metric-data summarize-metrics-data --namespace oci_vcn --start-time '2020-02-11 11:00' --end-time '2020-02-11 11:30' --query-text "VnicIngressDropsSecurityList[1m]{resourceId = "ocid1.vnic.oc1.iad.xxxxxxxx"}.sum()" --compartment-id ocid1.compartment.oc1.yyyyyyyy

こんな感じで1分間隔のデータを取ってこれます。

{
  "data": [
    {
      "aggregated-datapoints": [
        {
          "timestamp": "2020-02-11T11:00:00+00:00",
          "value": 1.0
        },
        {
          "timestamp": "2020-02-11T11:01:00+00:00",
          "value": 2.0
        },
...

コマンドで使用している各オプションについて解説します。

オプション名 入力値
namespace こちらのマニュアルから確認します。「メトリックの概要: oci_vcn」が該当箇所です(ブロック・ボリュームなど他のメトリックも同じように確認できます)。
start-time メトリックデータの取得開始時間(UTC)を「YYYY-MM-DD HH24:MI」の形式で入力します。
end-time メトリックデータの取得終了時間(UTC)を「YYYY-MM-DD HH24:MI」の形式で入力します。
query-text MQLを入力します。MQLは次の図にある通り、前述したWebコンソールの画面からコピーできます。
compartment-id メトリックデータ取得対象vnicの属するコンパートメントIDを入力します。

mql

なおこちらの記事によると「VCN Flow Logs」なるものが
そろそろGAになるらしいです(本記事の執筆時点ではLimited Availability)。
より詳細なログを確認したい場合はこちらの機能に期待です。

ちなみにOCIのFWはセキュリティ・リストの他に
ネットワーク・セキュリティ・グループもありますが、
そちらによってドロップされたパケット数も確認できるのか気になりました。

OCIのAlways Free枠で効率良く遊ぶためのTerraformコード

皆さんOCIのAlways Free枠は活用してますか?
以下にある通りVMやLB、さらにはExadata基盤で動くDBを
永遠に無料で利用できちゃいます!
Details of the Always Free Resources

とは言うものの、手作業で何度も環境デプロイしながら遊ぶのは煩わしい…
ということで、Always Free枠のリソースを手軽にデプロイ/お掃除するための
Terraformコードを作りました!
良ければ参考にしてみてください。
※長いのでgistにまとめました。
https://gist.github.com/mago1chi/c3def31075817a1a5886db407b07a661

冒頭に定義している変数については、
自分の環境に応じて別途tfvarsファイルを用意してください。
なおこちらをデプロイすると以下のリソースが作成されます。

  • コンパートメント
  • ユーザ
  • グループ
  • ポリシー
  • VCN
  • サブネット
  • セキュリティ・リスト
  • インターネット・ゲートウェイ
  • ルートテーブル
  • ネットワーク・セキュリティ・グループ
  • ネットワーク・セキュリティ・ルール
  • インスタンス
  • ロードバランサ
  • バックエンドセット
  • バックエンド
  • リスナー
  • Autonomous Database (OLTPとDW)

ちなみにVCNやサブネットのCIDRは適当に切ってあるので、
利用する際は適宜変更してください。
セキュリティ・リストやネットワーク・セキュリティ・ルールも同様です。

ちなみに2019/12/15時点で、Tokyoリージョンに
Always Free枠のインスタンス(VM.Standard.E2.1.Micro)を
デプロイしようとすると以下エラーが出て失敗します。。
Service error:InternalError. Out of host capacity.. http status code: 500.

MOS 2416409.1 によるとADのリソース不足が原因みたいです。
残念ながらTokyoリージョンはADが一つなので、
確実に遊ぶならUSなどリソースが潤沢な場所を選ぶ方が良さそうです(-_-;)

OCIのIAMをより使いやすくするツール”OCI Plolicy Generator”を使ってみた

以下のブログでOracle Cloud Infrastructure (OCI) のIAM向けに
便利そうなツールが紹介されていたので、試しに使ってみました。

Automated Generation For OCI IAM Policies

こんなことをしてくれるみたいです。

  • IAMの構文をしらなくても入力条件に応じてポリシーを自動生成
  • コンパートメントやグループの一覧を取得し、候補として列挙
    • → コンソールなどを見に行かなくてもよくなる
  • リソースの一覧も候補として列挙
    • → マニュアルにリソース情報を見に行かなくてもよくなる

なお私は手軽に試したかったので、WSLのopenSUSE Leap 42.3上に入れました。

導入手順

OCI向けのCLIツールをインストールします。
手順は下記をご参照ください。
https://docs.cloud.oracle.com/iaas/Content/API/SDKDocs/cliinstall.htm#PromptsInstall

gradleをインストールします。

$ sudo zypper install gradle

最後にツール本体をインストールします。
ツール本体は以下からダウンロードできます。
https://github.com/recursivecodes/oci-policy-generator

ダウンロードしたzipを解凍し、
解凍したディレクトリ直下で下記コマンドを実行します。

$ gradle shadowJar

これでツール本体のjarファイルがビルドされます。

使い方

javaコマンドもしくはgroovyコマンドで実行します。
私はjavaコマンドを使いました。
解凍したディレクトリ直下で下記コマンドを使います。

$ java -jar build/libs/oci-policy-generator-0.3.jar

試してみました。

$ java -jar build/libs/oci-policy-generator-0.3.jar

   ____  __________   ____        ___               ______                           __
  / __ \/ ____/  _/  / __ \____  / (_)______  __   / ____/__  ____  ___  _________ _/ /_____  _____
 / / / / /    / /   / /_/ / __ \/ / / ___/ / / /  / / __/ _ \/ __ \/ _ \/ ___/ __ `/ __/ __ \/ ___/
/ /_/ / /____/ /   / ____/ /_/ / / / /__/ /_/ /  / /_/ /  __/ / / /  __/ /  / /_/ / /_/ /_/ / /
\____/\____/___/  /_/    \____/_/_/\___/\__, /   \____/\___/_/ /_/\___/_/   \__,_/\__/\____/_/
                                       /____/

OCI Policy Generator v0.3 is using OCI CLI version 2.5.3.

Any User (0), Group (1) or Service (2)? 0     # ★ ポリシーの適用先

Available Verbs:
0: inspect
1: read
2: use
3: manage
Select verb [0-3]: 3                          # ★ 与える権限

Available Resource Types:

 0: all-resources (includes all shown below)

 1: cluster-family (includes 2-4)
 2: clusters                     3: cluster-node-pools           4: cluster-work-requests

 5: database-family (includes 6-10)
 6: db-systems                   7: db-nodes                     8: db-homes
 9: databases                    10: backups

 11: autonomous-transaction-processing-family (includes 12-13)
 12: autonomous-database         13: autonomous-backup

 14: autonomous-data-warehouse-family (includes 15-16)
 15: autonomous-data-warehouse    16: autonomous-data-warehouse-backup

 17: dns (includes 18-20)
 18: dns-zones                   19: dns-records                 20: dns-traffic

 21: file-family (includes 22-24)
 22: file-systems                23: mount-targets               24: export-sets

 25: instance-family (includes 26-33)
 26: app-catalog-listing         27: console-histories           28: instance-configurations
 29: instance-console-connection    30: instance-images             31: instance-pools
 32: instances                   33: volume-attachments

 34: object-family (includes 35-37)
 35: objectstorage-namespaces    36: buckets                     37: objects

 38: virtual-network-family (includes 39-59)
 39: vcns                        40: subnets                     41: route-tables
 42: security-lists              43: dhcp-options                44: private-ips
 45: public-ips                  46: internet-gateways           47: nat-gateways
 48: service-gateways            49: local-peering-gateways      50: remote-peering-connections
 51: drgs                        52: drg-attachments             53: cpes
 54: ipsec-connections           55: cross-connects              56: cross-connect-groups
 57: virtual-circuits            58: vnics                       59: vnic-attachments

 60: volume-family (includes 61-65)
 61: volumes                     62: volume-attachments          63: volume-backups
 64: boot-volume-backups         65: backup-policies

 66: functions-family (none at this time)

 68: compartments                69: users
 70: groups                      71: dynamic-groups              72: policies
 73: identity-providers          74: tenancies                   75: tag-namespaces
 76: tagdefinitions              77: workrequest                 78: repos


Select resource type [0-78]: 38                # ★ 対象となるリソース

Available Locations:
0: tenancy
1: compartment
Tenancy (0) or Compartment (1)? 0              # ★ 適用するスコープ

For more info on conditions, see: https://docs.cloud.oracle.com/iaas/Content/Identity/Concepts/policysyntax.htm#Conditio
To add a condition, enter it as a string.
Ex: "target.group.name != 'Administrators'"
Leave blank for no condition(s):

Your generated policy is:
allow any-user to manage virtual-network-family in tenancy

Apply Policy? Yes (1) or No (0): 0
👍 You may copy and paste the policy generated above in the OCI Identity Console to create your new policy.

入力した条件 (★の箇所) に基づき
“allow any-user to manage virtual-network-family in tenancy”
という構文を作ってくれました。

今回はしませんでしたが、
頼めば最後に実環境への適用までしてくれるみたいです。

OCIには膨大なリソースが存在しており、
また構築過程で多様なコンパートメントが出来るため、
マニュアルやコンソールなど何も参照せずに
ポリシーを作ることはほぼ不可能です。
なので、こうした補助ツールがあると生産効率もあがって助かりますね。

Oracle Cloud Infrastructure (OCI) ベストプラクティス from OOW18

OOW18で聞いてきたOracle Cloud Infrastructure (以下OCI) の
ベストプラクティスについてメモします。
セッションではクラウド移行の考え方等にも触れられてましたが、
そちらは他クラウドサービスと大差ないため省略します。
本文ではOCIで提供されている各サービスの
ベストプラクティスについて記載します。

セキュリティ

サービス概要

  • Identity and Acccess Management (IAM)
    • クラウド上のリソースに対する各ユーザのアクセス権はIAMで制御
  • OCI Audit
    • テナント内における公開API経由でのアクセスは OCI Audit により過去365日まで遡って監視可能 (追加コストなし)
  • Oracle Cloud Infrastructure Key Management
    • オブジェクト・ストレージ、ブロック・ボリュームを暗号化し、暗号化キーを Key Management で管理
    • キーの保管は FIPS 140-2 Level 3 にサーティファイされたハードウェア・セキュリティ・モジュール (HSM) を使用
  • Oracle CASB Cloud Service for OCI
    • クラウド・リソースに対するポリシー変更時にアラート発泡
    • 安全性の低いリソース設定の検知
    • 機械学習による分析でセキュリティ脅威を検知
    • SIEM, ITSMシステムとの統合

ベストプラクティス

  • IAMのユーザ/グループ、コンパートメントを使用し、各リソースに最低限のアクセス権を付与
  • OCIサービスのAPIを利用するときはインスタンス・プリンシパルを用い、ユーザ認証を排除する
  • 論理的なコンテナであるコンパートメントを活用し、関連するクラウド・リソースの集約と分離を行う
  • 必要ない限り、オブジェクト・ストレージのバケットはパブリックにしないこと

Compute

サービス概要

  • ベアメタル、VMインスタンスを選択可能 (GPU付きもあり)
  • 最大で52コア、8GPU、768GB RAM、51TB local NVMe SSD、5M IOPS を利用可能

ベストプラクティス

  • 同じタスクを実行するインスタンス同士は Availability Domain (以下AD) を跨った構成にする
  • Anti-affinityを設定し、障害発生時の影響を減らす
    • Anti-affinityの設定には Fault Domains を利用
  • 余っているIPアドレスを有効活用する
  • インスタンス (カスタム・イメージ) とブロック・ボリュームのバックアップを取得する
  • 十分なパフォーマンスを発揮できる、最もコストの低いサイジングをする

Storage

サービス概要

  • ローカルのNVMe SSDストレージ
    • 非永続、高パフォーマンス (パフォーマンスはSLA保証付き)
    • Computeインスタンスのローカルに配置される
    • 最大51TB
  • ブロック・ボリュームストレージ
    • ネットワーク接続で使用するNVMe SSDブロックストレージ
    • 60 IOPS/GB (最大 25K IOPS), 1ボリュームあたり320 MB/s
    • 永続的で他Computeインスタンスに付け替え可能
    • 可用性が高くSLAにより保証された高いパフォーマンスを発揮
  • ファイル・ストレージ
    • エンタープライズ用途に向いた、ネットワーク接続により利用するNVMe SSDのファイル・ストレージ
    • 1TBあたり150 MB/s
    • 可用性、拡張性が高く、アプリケーション層向けに使える共有ファイルシステム
  • オブジェクト・ストレージ
    • インターネット接続で利用する、高いパフォーマンスと可用性をもつストレージ
    • ソフトウェア・ストレージ・ゲートウェイとデータ転送サービスを追加費用なしで利用可能
    • S3とHDFSに対する互換性あり

ベストプラクティス

  • アナリティクス、OLTP、HPC、コンテナ、Kubernetes
    • ローカルのNVMe SSDストレージ (VM Dense IO, Bare Metal Dense IO)
  • エンタープライズ向けアプリケーション、データベース、GPU、コンテナ、アプリケーション・ライフサイクル
    • ファイル・ストレージ、ブロック・ストレージ
  • HADOOP、ログ、バックアップ、アーカイブ
    • オブジェクト・ストレージ

Network

サービス概要

  • Virtual Cloud Network (VCN)
    • サブネット:VCNのCIDRをサブネットを作成することで細分化
    • ルート表:VCNとVCN外との通信ルールの定義
    • VCNピアリング:異なるVCN間の通信で利用
    • ローカルVCNピアリング:同一リージョンにあるVCN間のピアリングで利用
    • DRGによるVCN間ピアリング:別リージョンにあるVCN間のピアリングで利用
    • ロードバランサ:負荷分散機能の提供
    • DNS:サブネットごとにDNSの設定が可能
  • 安全で信頼性のある接続
    • IPsec VPN:顧客オンプレ環境とOCIを仮想的に同一LAN化
    • FastConnectによる専用線接続:顧客オンプレ環境とOCIを専用線で接続 (インターネット経由なし)
  • 低遅延なネットワーク
    • 同一AD内における25Gbps、100μ秒未満のレイテンシ
    • 500μ秒未満のAD間通信
    • Oracle管理のリージョン間ネットワーク

ベストプラクティス (VCN)

  • 複数のADを利用した高可用性の実現
  • VCNのレンジには将来の利用を考慮し、余裕をもったCIDRを設定
    • VCNのCIDRは一度作成すると二度と変更不可のため
  • VCNのCIDRは他のVCNやオンプレNWのレンジと重複させないこと
  • 将来の利用を考慮し、すべてのIPアドレスをアサインせず、未使用のIPを残すこと
  • VCN内外の通信が可能となるよう、ルート表にルートルールを定義
  • トラフィック制御のためにセキュリティ・リストを利用
    • セキュリティ・リストはサブネット単位で定義
    • 定義したセキュリティ・リストは同一サブネット内の全インスタンスに適用されることに注意

ベストプラクティス (VPN)

  • 複数に冗長化されたVPN接続を利用 (SPOFをなくすこと)
  • OCIの各IPsec VPNは冗長化された複数のIPsecトンネルで構成
  • オンプレ環境の顧客NW機器は複数のVPN接続を利用するよう設定
  • IPsec VPNとFastConnectを併用し、サービスレベルで冗長性を確保
    • FastConnectを利用した場合はIPsec VPNより優先して使用される

ベストプラクティス (FastConnect)

  • FastConnectでは接続に冗長性をもたせるオプションを利用可能
  • 可能な場合、冗長化のために複数のベンダを利用可能
  • FastConnect virtual circuitを利用する際は冗長化を考慮
    • 冗長化した際は、フェイルオーバーした場合も耐えられるよう十分なNW帯域をもたせること
  • 暗号化が必要な場合はDRGによるピアリングを利用し、IPsec接続を構成
  • FastConnectのパブリック・ピアリングとプライベート・ピアリングを活用し、OCIに対する複数の接続を構成

Oracle Cloudでは今年 (2019年) 中に東京と大阪の二拠点でDCができるそうです。
Oracle Cloudはクラウドサービスとしてかなり後発なものの、
今後マルチクラウド戦略が各ユーザ企業で推進されていくことを考えると、
特にDB分野ではOracle Cloudの利用も一考の余地あり、かと思います。
今のうちにOCIについて学んでおくのも有りかもしれないですね。

参考資料

Oracle Cloud Infrastructureドキュメント

Oracle Autonomous Transaction Processingにデータをインポートしてみた

前回はAutonomous Transaction Processing (ATP) のインスタンスを作成し、
Oracle ClientからDBに接続してみました。
今回は作成したインスタンスへData Pumpでデータを入れてみたいと思います。

データのエクスポート

今回はエクスポート済みのダンプファイルを利用したので、
実行手順は割愛します。
エクスポート時のコマンドは下記をご参照ください。
Export Your Existing Oracle Database to Import into Autonomous Transaction Processing

確認頂くと分かりますが、
通常のData Pumpの使い方でクスポートしています。

ダンプファイルのアップロード

エクスポートしたダンプファイルをObject Storageへアップロードします。
まずはObjectファイルを格納するためのBucketを作成します。
サイドメニューから”Object Storage”→”Object Storage”を選択します。

01_start_create_bucket

“Create Bucket”を押下します。

02_create_bucket

Bucket名やタイプを入力し、”Create Bucket”を押下します。

03_input_bucket_detail

以下のように作成したBucketを確認できますので、
作成したBucket名のリンクを押下して詳細画面へ行きます。

04_bucket_list

“Upload Object”を押下してアップロード画面へ遷移します。

05_start_ul

エクスポートしたダンプファイルを選択し、”Upload Object”を押下します。

06_select_ul_file

以下のようにObjectリストに表示されますので、
右のメニューアイコンから”Create Pre-Authenticated Request”を押下します。
上記により認証情報を新規作成し、
Object Storageへアクセスできるようにします。

07_create_auth

認証名や認証対象、アクセスタイプを選択し
“Create Pre-Authenticated Request”を押下します。

08_set_auth

すると以下のようにアクセスURLが発行されますので、
そのURLをメモしておきます。

09_check_auth_code

CredentialとDBユーザの作成

ATPからObject StorageへアクセスするにはCredentialが必要です。
ATPへ接続した状態で以下のように専用のプロシージャを実行し、
Credentialを作成します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'ATP_TEST',
    username => 'your user name',
    password => 'user password'
  );
END;
/

また必要に応じてインポートに必要なユーザを用意します。
今回はエクスポートしたデータの関係から、
以下のように”apps”ユーザを作成しました。

create user apps identified by OraTestUser#1;
grant create session to apps;
grant create table to apps;

データのインポート

クライアントからData Pumpを使ってインポートを実行します。
コマンドの内容は下記を参考にしました。

Import Data Using Oracle Data Pump Version 18.3 or Later

impdp admin/xxxxxx@wisteriaatp_low \
  directory=data_pump_dir \
  credential=ATP_TEST \
  dumpfile=https://objectstorage.eu-frankfurt-1.oraclecloud.com/p/xxxxxxx/n/wisteria22/b/atp_test/o/atp_test.dmp \
  parallel=16 \
  transform=segment_attributes:n \
  transform=dwcs_cvt_iots:y \
  transform=constraint_use_default_index:y \
  exclude=cluster,db_link

ATPに”LOW”で接続し、先程作成したCredentialを指定しています。
また”dumpfile”パラメータにはメモしておいたURLを記載しています。

なおATPへのインポートで使用するData Pumpですが、
Credentialの入力に対応しているのは
“12.2.0.1”より新しいバージョンとなります。
“12.2.0.1”以下のバージョンでインポートしたい場合は
下記マニュアルを参照ください。

Import Data Using Oracle Data Pump (Versions 12.2.0.1 and Earlier)

TerraformでOracle Cloud Infrastructure上にVMをたててみた

Terraformを使ってOracle Cloud Infrastructure (以下OCIと呼ぶ) 上にVMをたて、
sshでログインできるようにしてみました。
主なコードの構成は以下の通りです。

  • credential.tf:利用するOCIの認証情報
  • main.tf:IAMやVCN、VMの構成情報
  • oci.tfvars:コード中で使用する変数の値の情報

コードのざっくりとした流れですが、
コンパートメントやユーザ、グループを新規に作成し、
そのユーザが作成したコンパートメント内のリソースを管理できるように
IAMを定義します。
その後コンパートメント内にVCNやサブネット、ルート、
セキュリティリスト、ボリューム、VMを作成します。

以下が使用したHCLです。

credential.tf

provider "oci" {
  tenancy_ocid = "${var.tenancy_ocid}"
  user_ocid = "${var.user_ocid}"
  fingerprint = "${var.fingerprint}"
  private_key_path = "${var.private_key_path}"
  region = "${var.region}"
}

main.tf

## variables
variable "tenancy_ocid" {}
variable "user_ocid" {}
variable "fingerprint" {}
variable "private_key_path" {}
variable "region" {}
variable "ssh_public_key" {}

## compartment
resource "oci_identity_compartment" "test_compartment" {
    #Required
    compartment_id = "${var.tenancy_ocid}"
    description = "test compartment"
    name = "User1Compartment"
}

## user
resource "oci_identity_user" "test_user" {
    #Required
    compartment_id = "${var.tenancy_ocid}"
    description = "test user"
    name = "user1"
}

## group
resource "oci_identity_group" "test_group" {
    #Required
    compartment_id = "${var.tenancy_ocid}"
    description = "test group"
    name = "group1"
}

## mapping of users and groups
resource "oci_identity_user_group_membership" "test_user_group_membership" {
    #Required
    group_id = "${oci_identity_group.test_group.id}"
    user_id = "${oci_identity_user.test_user.id}"
}

## IAM
resource "oci_identity_policy" "test_policy" {
    #Required
    compartment_id = "${var.tenancy_ocid}"
    description = "test policy"
    name = "group1-test-policy"
    statements = ["Allow group ${oci_identity_group.test_group.name} to manage virtual-network-family in compartment ${oci_identity_compartment.test_compartment.name}",
      "Allow group ${oci_identity_group.test_group.name} to manage  volume-family in compartment ${oci_identity_compartment.test_compartment.name}",
      "Allow group ${oci_identity_group.test_group.name} to manage instance-family in compartment ${oci_identity_compartment.test_compartment.name}"]
}

## VCN
resource "oci_core_vcn" "test_vcn" {
    #Required
    cidr_block = "192.168.10.0/24"
    compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"

    #Optional
    display_name = "test_vcn"
    dns_label = "wisteriasec"
}

## availability domain
data "oci_identity_availability_domains" "test_availability_domains" {
    #Required
    compartment_id = "${var.tenancy_ocid}"
}

## security list
resource "oci_core_security_list" "test_security_list" {
    #Required
    compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"
    ingress_security_rules {
        #Required
        protocol = "6"
        source = "0.0.0.0/0"

        #Optional
        tcp_options {
            #Optional
            max = "22"
            min = "22"
        }
    }
    vcn_id = "${oci_core_vcn.test_vcn.id}"

    #Optional
    display_name = "test_security_list"
}

## internet gateway
resource "oci_core_internet_gateway" "test_ig" {
  compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"
  display_name   = "test_ig"
  vcn_id         = "${oci_core_vcn.test_vcn.id}"
}

## route table
resource "oci_core_route_table" "test_route_table" {
  compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"
  vcn_id         = "${oci_core_vcn.test_vcn.id}"
  display_name   = "test_route_table"

  route_rules {
    destination       = "0.0.0.0/0"
    destination_type  = "CIDR_BLOCK"
    network_entity_id = "${oci_core_internet_gateway.test_ig.id}"
  }
}

## subnet
resource "oci_core_subnet" "test_subnet" {
    #Required
    availability_domain = "${lookup(data.oci_identity_availability_domains.test_availability_domains.availability_domains[0], "name")}"
    cidr_block = "192.168.10.0/27"
    compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"
    security_list_ids = ["${oci_core_security_list.test_security_list.id}"]
    vcn_id = "${oci_core_vcn.test_vcn.id}"

    #Optional
    display_name = "wisteriasec_subnet1"
    dns_label = "subnet1"
    route_table_id = "${oci_core_route_table.test_route_table.id}"
}

## get oracle provided image
data "oci_core_images" "test_images" {
    #Required
    compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"

    #Optional
    operating_system = "Oracle Linux"
    operating_system_version = "7.5"
}

## volume
resource "oci_core_volume" "test_volume" {
    #Required
    availability_domain = "${lookup(data.oci_identity_availability_domains.test_availability_domains.availability_domains[0], "name")}"
    compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"

    #Optional
    display_name = "test_volume"
    size_in_gbs = "100"
}

## get shapes
data "oci_core_shapes" "test_shapes" {
    #Required
    compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"

    #Optional
    availability_domain = "${lookup(data.oci_identity_availability_domains.test_availability_domains.availability_domains[0], "name")}"
}

## instance
resource "oci_core_instance" "test_instance" {
    #Required
    availability_domain = "${lookup(data.oci_identity_availability_domains.test_availability_domains.availability_domains[0], "name")}"
    compartment_id = "${oci_identity_compartment.test_compartment.compartment_id}"
    shape = "${lookup(data.oci_core_shapes.test_shapes.shapes[0], "name")}"

    #Optional
    create_vnic_details {
        #Required
        subnet_id = "${oci_core_subnet.test_subnet.id}"

        #Optional
        display_name = "test_instance_vnic1"
        hostname_label = "wisteriasec"
        private_ip = "192.168.10.5"
    }
    display_name = "test_instance"
    hostname_label = "wisteriasec"
    metadata {
        ssh_authorized_keys = "${var.ssh_public_key}"
    }
    source_details {
        #Required
        source_id = "ocid1.image.oc1.eu-frankfurt-1.aaaaaaaaitzn6tdyjer7jl34h2ujz74jwy5nkbukbh55ekp6oyzwrtfa4zma"
        source_type = "image"

        #Optional
        boot_volume_size_in_gbs = "60"
    }
    preserve_boot_volume = false
}

## volume attachment
resource "oci_core_volume_attachment" "test_volume_attachment" {
    #Required
    attachment_type = "iscsi"
    instance_id = "${oci_core_instance.test_instance.id}"
    volume_id = "${oci_core_volume.test_volume.id}"
}

oci.tfvars

tenancy_ocid = "your tenancy ocid"
user_ocid = "your user ocid"
fingerprint = "your fingerprint like 32:c3:22:..."
private_key_path = "path to your local private key"
region = "your tenancy's region name"
ssh_public_key = "your public key to use api"

ちなみに oci.tfvars を埋めるための情報は管理コンソールで確認できます。
詳細は下記マニュアルをご覧ください。

Required Keys and OCIDs
https://docs.cloud.oracle.com/iaas/Content/API/Concepts/apisigningkey.htm

Oracle Autonomous Transaction Processingを使ってみた

DBAが不要になると最近話題の自律型データベース
Oracle Autonomous Transaction ProcessingをOracle Cloudの
Trialアカウントで使ってみました。

インスタンス作成

まずはWebコンソールからインスタンスを作りました。

“Create Autonomous Transaction Processing Database”を押下します。
01_start_create_inst

必要事項を記入します。
02_create_inst

画像の下段にある通り、ライセンスタイプは

  • BYOL (既存ライセンスの持ち込み)
  • DBライセンスとクラウドサービスのサブスクリプション

の二通りがあります。

実行すると1時間くらいで払い出された気がします。
なお作成完了したら通知が飛んできます。

インスタンスが出来たらOracle Clientから接続してみましょう。
接続するには下記の通りWalletファイルをダウンロードする必要があります。

“DB Connection”ボタンを押下します。
03_db_connection

“Download”ボタンを押下します。
04_wallet_download

Wallet用のパスワードを入力します。
05_input_pw

ダウンロードしたzipには以下のファイルが含まれています。
ご覧の通り”tnsnames.ora”も入っており、
こちらに記載されているサービス名を使用して接続します。
06_wallet_contents

例えば”LOW”のリソース割り当てでATPを使用する場合、
sqlplusでは以下のように接続します。

$ sqlplus admin/<admin password>@<db name>_low

なおDBのバージョンですが、18cかと思いきや12cR2でした。

SQL> select version from v$instance;

VERSION
----------------------------------
12.2.0.1.0

また初期化パラメータやユーザ権限の一覧は以下のようになっていました。
※長いのでgistに保存しました。

次回はATPにデータをインポートしてみたいと思います。

参考資料

“HIGH”、”MEDIUM”、”LOW”といったリソース割り当ての概要は
下記マニュアルをご参照ください。

Managing Priorities on Autonomous Transaction Processing