tomy_125: Note

tomy_125 の個人的なメモ

ADW+APEXで体重管理アプリ作成のマネをしてみる① ~ Workspace の作成まで~

進め方

体重管理アプリを作りたいなと思っていたところ、あ、これAlways FreeのApexでできるじゃんとなり、
少し検索したらやりたい事を、そのままやっている記事を見つけたので、
こちらの記事を参考(ほぼマネ)にしてADW+APEXのアプリを作成したいと思います。

qiita.com

また、この記事で参考にしているこちらの記事も、ちょくちょく参照します。 blog.s-style.co.jp

ADW作成

f:id:tomy_125:20220107013321p:plain
adwdb_001

Always Freeの範囲で使用したいので、「Always Free のみの構成オプションを表示」にします。迷わなくてすみますね。

f:id:tomy_125:20220107013615p:plain
adwdb_002

f:id:tomy_125:20220107013757p:plain
adwdb_003

f:id:tomy_125:20220107013848p:plain
adwdb_004

f:id:tomy_125:20220107013917p:plain
adwdb_005

作成!できた!参考記事にある通り、「APEXを開く」を押します。

f:id:tomy_125:20220107014244p:plain
adwdb_006

APEXログイン、管理ユーザ-の作成

別タブでAPEXのログイン画面がでます。

f:id:tomy_125:20220107014523p:plain
adwdb_007

ログインできました。

f:id:tomy_125:20220107014645p:plain
adwdb_008

Workspace IDはとりあえず指定しません。→作成!

f:id:tomy_125:20220107015003p:plain
adwdb_009

Wrokspaceもできました!、、が色々メニューがあります。

f:id:tomy_125:20220107015142p:plain
adwdb_010

管理ユーザ-でログイン

一旦、ログアウトしてみます。で、w_adminでログインしなおします。

f:id:tomy_125:20220107015300p:plain
adwdb_011

f:id:tomy_125:20220107015447p:plain
adwdb_012

f:id:tomy_125:20220107015532p:plain
adwdb_013

以上です。

OCI CLI から Compute Instance を作成する時に使用するコマンド

launch コマンド

以下を設定することで コンピュートを作成できる OCI_DISPLAY_NAME は インスタンスの"名前"

$ oci compute instance launch \
  --display-name ${OCI_DISPLAY_NAME} \
  --availability-domain ${OCI_AD} \
  --image-id ${OCI_IMAGE_ID} \
  --shape ${OCI_SHAPE} \
  --subnet-id ${OCI_SUBNET_ID} \
  --assign-public-ip ${OCI_BOOLEAN_PUBLIC_IP} \  -------- PUBLIC IP を付与する場合はTRUE
  --ssh-authorized-keys-file ${OCI_PUB_KEY}            -------- 公開鍵パスを指定

環境変数を設定するコマンド

$ export OCI_AD=`oci iam availability-domain list | jq -r '.data[0]["name"]'`
$ echo $OCI_AD
aefv:AP-TOKYO-1-AD-1

それぞれを OCIコマンドで確認する方法は以下

AD 確認

$ oci iam availability-domain list
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1..aaaaaaaafjv42qskxf4xmdv7qqcyfnjxnpkoaq33utfbxe6msltviwdyzcea",
      "id": "ocid1.availabilitydomain.oc1..aaaaaaaaaijs56nfsz2usbwsr6k6t5b3do7hns6ib2day6le5scrvvjpeceq",
      "name": "aefv:AP-TOKYO-1-AD-1"
    }
  ]
}

image 確認

# 戻りのjson key 確認
$ oci compute image list | jq -r '.data[0] | keys'
[
  "agent-features",
  "base-image-id",
  "billable-size-in-gbs",
  "compartment-id",
  "create-image-allowed",
  "defined-tags",
  "display-name",
  "freeform-tags",
  "id",
  "launch-mode",
  "launch-options",
  "lifecycle-state",
  "listing-type",
  "operating-system",  -- "Oracle Linux" など
  "operating-system-version",  -- "6.10", "7", "8" など
  "size-in-mbs",
  "time-created"
]

$ oci compute image list --operating-system "Oracle Linux" --operating-system-version "6.10" | jq -r '.data[] | {name:.["display-name"], oci_id:.["id"] }'
{
  "name": "Oracle-Linux-6.10-2021.03.17-0",
  "oci_id": "ocid1.image.oc1.ap-tokyo-1.aaaaaaaazklpkbg2reajttkezdzenx745sfbkps362q4lu7cas3piyynbr5q"
}
{
  "name": "Oracle-Linux-6.10-2021.02.19-0",
  "oci_id": "ocid1.image.oc1.ap-tokyo-1.aaaaaaaaps3c7pb2boenemaac2vsgzmnxi4arjlrantbpq46lhthzvpsuc6a"
}
{
  "name": "Oracle-Linux-6.10-2021.01.12-0",
  "oci_id": "ocid1.image.oc1.ap-tokyo-1.aaaaaaaafaxmn7edxrtd2lw6bfzjfqh4xvzdd4nz6xjyfk3xav4wbi6ukzyq"
}

shape確認

$ oci compute shape list | jq -r '.data[0] | keys '
[
  "baseline-ocpu-utilizations",
  "gpu-description",
  "gpus",
  "is-live-migration-supported",
  "local-disk-description",
  "local-disks",
  "local-disks-total-size-in-gbs",
  "max-vnic-attachment-options",
  "max-vnic-attachments",
  "memory-in-gbs",
  "memory-options",
  "min-total-baseline-ocpus-required",
  "networking-bandwidth-in-gbps",
  "networking-bandwidth-options",
  "ocpu-options",
  "ocpus",
  "platform-config-options",
  "processor-description",
  "shape"
]

$ oci compute shape list --region "ap-tokyo-1" --image-id "ocid1.image.oc1.ap-tokyo-1.aaaaaaaazklpkbg2reajttkezdzenx745sfbkps362q4lu7cas3piyynbr5q" | jq -r '.data[] | { shape : .["shape"], ocpus : .["ocpus"] , memory:.["memory-in-gbs"]}'

subnet id 確認

$ oci network subnet list | jq -r '.data[0] | keys'
[
  "availability-domain",
  "cidr-block",
  "compartment-id",
  "defined-tags",
  "dhcp-options-id",
  "display-name",
  "dns-label",
  "freeform-tags",
  "id",
  "ipv6-cidr-block",
  "ipv6-virtual-router-ip",
  "lifecycle-state",
  "prohibit-internet-ingress",
  "prohibit-public-ip-on-vnic",
  "route-table-id",
  "security-list-ids",
  "subnet-domain-name",
  "time-created",
  "vcn-id",
  "virtual-router-ip",
  "virtual-router-mac"
]

oci network subnet list | jq -r '.data[] | {display_name: .["display-name"], id : .["id"]}'

Oracle RACで接続先にVIPを指定する意味の確認

Oracle RACでは各nodeにVIPが作成されるので、Clientからの接続時にはそちらを指定して接続します。 ※SCANは使用しない前提としています。

接続にVIPを使用するのは障害時に、Clientが通信エラーを検知するまでの時間を短くするためですが、今回は、そのエラー検知までの時間を確認したいと思います。

例えば、2node RACで node2が障害により停止したケースで、接続時Failoverが行われる流れは以下ですが、今回計測するのは、2~4の部分になります。

  1. node1、node2を接続先として定義した接続文字列 (LOAD_BALANCE=ON、FAILOVER=ON)を使用
  2. ここでは、先にnode2への接続が試行されたとする
  3. node2 は障害により停止しているので、接続できない
  4. Clientに接続エラーが返る
  5. 接続時Failoverにより、node1へ接続が試行される
  6. node1は正常なため接続成功する

検証をする構成

  • Vitrual Box上の2node RAC、19c
  • node1 は起動、node2はOS停止(障害により停止したという想定)
  • IPアドレスの設定
## /etc/hosts
10.0.2.15    node1.local    node1
10.0.2.16    node2.local    node2
10.0.2.17    node1-vip.local    node1-vip
10.0.2.18    node2-vip.local    node2-vip
10.0.2.19    scan.local    scan

手順

  • node1から、node2の物理IPと、ノードVIPを指定し簡易接続を行う
  • どちらも、エラーとなりますがエラーとなるまでの時間を計測します
  • 計測にはtimeコマンドを使用します
  • sqlplusのオプションには -l を指定し、接続試行は1回としています

物理IPへ接続試行するコマンド

$ time (sqlplus -l APP_USER/oracle@10.0.2.16:1521/pdb1.local)

VIPへ接続試行するコマンド

$ time (sqlplus -l APP_USER/oracle@10.0.2.18:1521/pdb1.local)

結果

それぞれ、以下の様にエラーとなります。この時の real の値を確認します。

物理IPの場合

node2の物理IPへ到達できないため、
ORA-12543: TNS:destination host unreachable エラーとなります。

[oracle@node1 ~]$ time (sqlplus -l APP_USER/oracle@10.0.2.16:1521/pdb1.local)

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 13 16:13:30 2021
Version 19.3.0.0.0

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

ERROR:
ORA-12543: TNS:destination host unreachable


SP2-0751: Unable to connect to Oracle.  Exiting SQL*Plus

real    0m3.089s
user    0m0.009s
sys     0m0.007s

VIPの場合

node2のVIPは node1へFailoverしていますが、
node1のリスナーはnode2-vipではLISTENしていないため、
ORA-12541: TNS:no listener エラーとなります。

time (sqlplus -l APP_USER/oracle@10.0.2.18:1521/pdb1.local)

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Feb 13 16:17:09 2021
Version 19.3.0.0.0

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

ERROR:
ORA-12541: TNS:no listener


SP2-0751: Unable to connect to Oracle.  Exiting SQL*Plus

real    0m0.033s
user    0m0.009s
sys     0m0.013s

計測結果

それぞれ5回計測し、その時の realの値のみ抜粋しています。
総じて、物理IPへ接続を試行した方がエラーとるまでに時間がかかりました。

理由は、物理IPを指定した場合はTCP接続がエラーとなるまで待機してからClientにエラーが返るのに対し、VIPを指定した場合は、node2-vipはnode1にFailoverしているため、パケットはnode1へ到達し、そこでLISTNERがLISTNERが存在しない事に気きエラーとなるからです。

## node2の物理IPへ
---
$ time (sqlplus -l APP_USER/oracle@10.0.2.16:1521/pdb1.local)
---
1. real    0m3.089s
2. real    0m1.683s
3. real    0m0.224s
4. real    0m3.093s
5. real    0m1.087s

## node2のVIPへ
---
$ time (sqlplus -l APP_USER/oracle@10.0.2.18:1521/pdb1.local)
---
1. real    0m0.033s
2. real    0m0.032s
3. real    0m0.025s
4. real    0m0.024s
5. real    0m0.028s

まとめ

Oracle RACで接続先に物理IPを指定した場合、接続エラーとなるまでの時間が長い事が確認できました。
接続文字列でFAILOVERを有効にしていれば、障害時も正常nodeへ接続Failoverする事ができますが、仮に物理IPを指定していた場合、TCP応答が返り接続エラーとなってからFailoverするため、新規接続に時間を要する事になります。

その他

物理IPを指定した場合は、もう少し時間がかる(TCP接続timeoutの60s)ことを期待していましたが、それよりは、かなり早い結果となりました。
これは、検証を実施した環境ではTCP timeoutまで待機せずとも、物理IPへ接続できない事が確認されたため、その時点でエラーとなったものと想像しています。

参考

こちらの資料が、Failoverの説明としても分かり易いです。
https://blogs.oracle.com/otnjp/kusakabe-004

他、記事と関係ないですが、

Note - Setup Synology NAS

使いこなす機能が増えたら、書き足していく予定です

機器

  • Synology DiskStation DS220j/JP [2ベイ / クアッドコアCPU搭載 / 512MBメモリ搭載]
  • Seagate IronWolf 3.5" 3TB 内蔵HDD(CMR) 6Gb/s 64MB 5900rpm 24時間稼動 PC NAS向け ST3000VN007/FFP × 2

Synologyの良いところ

  • 写真のバックアップ、共有の用途
  • NASとして利用
  • RAIDが組める(ディスク2本で、RAID 1を組んでいる)
  • 無料の管理ソフト DSM(DiskStation Manager) が多機能
  • QuickConnect で、外部からも接続可能
  • モバイル版のアプリもあるので、スマフォからも写真アップロード可能( DS Photo)
  • スマフォからの自動バックアップができる
  • マルチユーザで権限管理できる
  • クラウド連携できる(まだやっていない)
  • 写真共有のクラウドアプリを使っている場合と比べて(個人的に) 良い点
    • サービス終了しない (代わりにHWの保守がある)
    • 料金が値上がりしない (代わりに電気代がかかる)
    • 写真のサイズが圧縮されない
    • 一眼レフから、まとめてバックアップする時にインターネットを介さない

初期設定

筐体を組み立てて、HDDを挿して、インターネット越しにDSMインストール。 細かい手順が記憶に残らない程度には簡単でした(忘れました)

管理画面

Webベースでこんな感じ f:id:tomy_125:20210129011713p:plain

家族、親族向けの写真共有(主に息子の写真)

やりたい事

  • 家族内では全ての写真を共有し、アップロードも自由にしたい
  • 親族内では一部のアルバムを共有したい

やっている設定

他にも良いやりかたが、あるとは思うので模索中....

ユーザ、アカウント
  • 家族には個人それぞれにアカウントを作成、管理者権限を持っている
  • 親族には、世帯ごとにアカウントを作成(参照用)した
    権限
  • DS Photo でアルバムを作成する際には、「公開アルバム」、「個人アルバム」、「パスワードつきアルバム」が選択できる
  • 「個人アルバム」は写真共有の管理画面(Photo Station) で権限を与えたユーザのみ操作ができる(参照、写真のアップ)、ただし管理者権限を持つユーザも操作ができる
  • 「公開アルバム」はすべてのユーザが参照できる(写真のアップはできない)
  • ユーザごとに細かく権限を与えたい場合(一方の親族に公開したい) は、Photo Stationの管理画面(PCから)で権限を付与する
    アルバムの作り方
  • 普段はアルバムを「個人アルバム」で作成するか「公開アルバム」で作成するかで、誰に見せるかを制御している
  • 家族内で共有するアルバムは「個人アルバム」で作成し、家族内の他のユーザは管理者権限を持っているので参照、写真もアップできる
  • 親族と共有するアルバムは「公開アルバム」で作成し、親族のアカウントからも参照できる
  • アルバムの作成と、アルバムの公開設定はスマフォアプリからでもできる
    写真のみかた
  • 家族、親族には DS Photo をインストールしてもらい、QuickConnect の機能でインターネット経由で写真など見てもらう

Tips

  • アルバム作成した時にデフォルトで、「公開アルバム」にするか「個人アルバム」にするか設定できる、「個人アルバム」にしておいた方が無難