この章では、TimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスについて説明します。環境でTimesTenClassicオブジェクトを作成するプロセスについて説明します。また、TimesTenデータベースのアクティブ・スタンバイ・ペアのプロビジョニングを監視する方法を示す例も提供します。この章では最後に、データベースに接続してデータベースで操作を実行する方法を示す例を説明します。
トピック:
TimesTenオペレータは、Kubernetes APIを拡張してTimesTenClassicオブジェクト・タイプを提供します。このタイプによって、TimesTenデータベースをKubernetesクラスタに正常にデプロイするために必要な定義が提供されます。これらの定義を特定の環境用にカスタマイズします。具体的には、YAMLファイルを作成し、その中にTimesTenClassicオブジェクトに必要なTimesTenClassic定義を指定します。これらの定義のフィールドに値を割り当てることにより、デプロイメント環境をカスタマイズおよび定義します。たとえば、storageClassNameフィールドにoci値を指定すると、使用する記憶域クラスの名前がオペレータに通知されます。オブジェクトの定義およびYAMLファイルで定義するフィールドについては、第11章「TimesTenClassicオブジェクト・タイプ」を参照してください。
YAMLファイルの例は、ConfigMapとシークレット、初期化コンテナおよびその他の構成オプションについて説明したときに以前に紹介しました。(ConfigMapおよびシークレットの詳細は、ConfigMapおよびシークレットの使用を参照してください。また、その他の構成オプションについては、初期化コンテナの使用およびその他の構成オプションを参照してください。)ただし、TimesTenClassicオブジェクトの定義および作成では、TimesTenClassicオブジェクトの定義方法を詳細に説明しています。
YAMLファイルで構成を指定した後、Linux開発ホストからkubectl createコマンドを使用して、対応するTimesTenClassicオブジェクトをクラスタに作成します。このコマンドを発行した後、TimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスが開始されます。このプロセスを表示するには、kubectl getコマンドとkubectl describeコマンドを発行します(kubectl get podsやkubectl describe timestenclassicなど)。データベースがデプロイされたら、アクティブ・データベースに接続して問合せを発行し、他の操作を実行してデータベースが正常に機能していることを確認できます。
環境を定義するには、環境用にカスタマイズされた属性を使用してTimesTenClassicオブジェクトを作成する必要があります。フィールドには、イメージ・プル・シークレットの名前、TimesTenイメージの名前、およびTimesTenデータベースを正常にデプロイするために必要なその他の定義が含まれます。TimesTenClassicタイプのオブジェクトの定義の詳細は、TimesTenClassicオブジェクト・タイプを参照してください。
TimesTenClassicオブジェクトを定義および作成するには、次のステップを実行します。
空のYAMLファイルを作成します。任意の名前を選択できますが、TimesTenClassicオブジェクトに使用した名前と同じ名前を使用することもできます。(この例では、sampleです。)YAMLファイルには、TimesTenClassicオブジェクトの定義が格納されています。このYAMLファイルで指定する必要があるフィールド、およびオプションのフィールドの詳細は、TimesTenClassicSpecSpecを参照してください。
この例では、次のものを置き換えます。(置き換えることができる値は太字で表示されています。)
name: sampleを、TimesTenClassicオブジェクトの名前に置き換えます。
storageClassName: ociを、TimesTenを保持するためのPersistentVolumesの割当てに使用される記憶域クラスの名前に置き換えます。
storageSize: 250Gを、各ポッドがTimesTenを保持するために要求する必要がある記憶域の量に置き換えます。(この例は、本番環境を想定しているため、250Gの記憶域を使用します。デモ用の場合は、50Gの記憶域を使用できます。詳細は、表11-3「TimesTenClassicSpecSpec」のstorageSizeエントリとlogStorageSizeエントリを参照してください)。
image: phx.ocir.io/youraccount/tt1814110:3は、イメージ・レジストリの場所(phx.ocir.io/youraccount)とTimesTenが含まれているイメージ(tt1814110:3)に置き換えます。
imagePullSecret: sekretを、KubernetesがTimesTenイメージをフェッチするために使用するイメージ・プル・シークレットに置き換えます。
dbConfigMap: この例では、db.ini、adminUserおよびschema.sqlメタデータ・ファイルに1つのConfigMap (sampleという名前)を使用します。このConfigMapはProjectedVolumeに組み込まれます。このボリュームはTimesTenコンテナに/ttconfigとしてマウントされます。ConfigMapの詳細は、ConfigMapおよびシークレットの使用および1つのConfigMapを使用する例を参照してください。
% vi sample.yaml apiVersion: timesten.oracle.com/v1 kind: TimesTenClassic metadata: name: sample spec: ttspec: storageClassName: oci storageSize: 250G image: phx.ocir.io/youraccount/tt1814110:3 imagePullSecret: sekret dbConfigMap: - sample
kubectl createコマンドを使用して、YAMLファイル(この例ではsample.yaml)のコンテンツからTimesTenClassicオブジェクトを作成します。これにより、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイするプロセスが開始されます。
% kubectl create -f sample.yaml timestenclassic.timesten.oracle.com/sample created
KubernetesクラスタにTimesTenClassicオブジェクトを正常に作成しました。TimesTenデータベースをデプロイするプロセスが開始されますが、まだ完了していません。
様々なkubectlコマンドを使用して、アクティブ・スタンバイ・ペアのデプロイメントの進行状況を監視できます。デプロイメントが完了して成功したら、データベースに接続して操作を実行し、正常に動作していることを確認できます。
kubectl getコマンドとkubectl describeコマンドを使用して、プロビジョニング時にアクティブ・スタンバイ・ペアの進捗状況を監視します。
|
ノート: kubectl get timestenclassicコマンドとkubectl describe timestenclassicの場合、かわりにkubectl get ttcとkubectl describe ttcをそれぞれ指定できます。timestenclassicとttcは、これらのコマンドで使用される場合同義であり、同じ結果を返します。この章の最初のkubectl getおよび最初のkubectl describeの例では、timestenclassicを使用しています。このマニュアルの残りの例では、簡略化のためにttcを使用しています。 |
kubectl getコマンドを使用して、STATEフィールドを確認します。値がInitializingであることを確認します。アクティブ・スタンバイ・ペアのプロビジョニングが開始しましたが、まだ完了していません。
% kubectl get timestenclassic sample NAME STATE ACTIVE AGE sample Initializing None 11s
kubectl describeコマンドを使用して、初期プロビジョニングを詳細に表示します。
% kubectl describe timestenclassic sample
Name: sample
Namespace: mynamespace
Labels: <none>
Annotations: <none>
API Version: timesten.oracle.com/v1
Kind: TimesTenClassic
Metadata:
Creation Timestamp: 2020-05-31T15:35:12Z
Generation: 1
Resource Version: 20231755
Self Link:
/apis/timesten.oracle.com/v1/namespaces/mynamespace/timestenclassics/sample
UID: 517a8646-a354-11ea-a9fb-0a580aed5e4a
Spec:
Ttspec:
Db Config Map:
sample
Image: phx.ocir.io/youraccount/tt1814110:3
Image Pull Policy: Always
Image Pull Secret: sekret
Storage Class Name: oci
Storage Size: 250G
Status:
Active Pods: None
High Level State: Initializing
Last Event: 3
Pod Status:
Cache Status:
Cache Agent: Down
Cache UID Pwd Set: false
N Cache Groups: 0
Db Status:
Db: Unknown
Db Id: 0
Db Updatable: Unknown
Initialized: true
Pod Status:
Agent: Down
Last Time Reachable: 0
Pod IP:
Pod Phase: Pending
Replication Status:
Last Time Rep State Changed: 0
Rep Agent: Down
Rep Peer P State: Unknown
Rep Scheme: Unknown
Rep State: Unknown
Times Ten Status:
Daemon: Down
Instance: Unknown
Release: Unknown
Admin User File: false
Cache User File: false
Cg File: false
High Level State: Down
Intended State: Active
Name: sample-0
Schema File: false
Cache Status:
Cache Agent: Down
Cache UID Pwd Set: false
N Cache Groups: 0
Db Status:
Db: Unknown
Db Id: 0
Db Updatable: Unknown
Initialized: true
Pod Status:
Agent: Down
Last Time Reachable: 0
Pod IP:
Pod Phase: Pending
Replication Status:
Last Time Rep State Changed: 0
Rep Agent: Down
Rep Peer P State: Unknown
Rep Scheme: Unknown
Rep State: Unknown
Times Ten Status:
Daemon: Down
Instance: Unknown
Release: Unknown
Admin User File: false
Cache User File: false
Cg File: false
High Level State: Unknown
Intended State: Standby
Name: sample-1
Schema File: false
Rep Create Statement: create active standby pair "sample" on
"sample-0.sample.mynamespace.svc.cluster.local", "sample" on
"sample-1.sample.mynamespace.svc.cluster.local" NO RETURN store "sample" on
"sample-0.sample.mynamespace.svc.cluster.local" PORT 4444 FAILTHRESHOLD 0
store "sample" on "sample-1.sample.mynamespace.svc.cluster.local" PORT 4444
FAILTHRESHOLD 0
Rep Port: 4444
Status Version: 1.0
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
- Create 50s ttclassic Secret tt517a8646-a354-11ea-a9fb-0a580aed5e4a
created
- Create 50s ttclassic Service sample created
- Create 50s ttclassic StatefulSet sample created
kubectl getコマンドを再度使用して、STATEフィールドの値が変更されているかどうかを確認します。この例では、この値はNormalで、データベースのアクティブ・スタンバイ・ペアがプロビジョニングされ、プロセスが完了したことを示しています。
% kubectl get ttc sample NAME STATE ACTIVE AGE sample Normal sample-0 3m5s
kubectl describeコマンドを再度使用して、アクティブ・スタンバイ・ペアのプロビジョニングを詳細に表示します。
ノート: この例では、now Normal行が独立した行に表示されています。実際の出力では、この行は独立した行として表示されるのではなく、前のStateChangeの行の最後に表示されます。
% kubectl describe ttc sample
Name: sample
Namespace: mynamespace
Labels: <none>
Annotations: <none>
API Version: timesten.oracle.com/v1
Kind: TimesTenClassic
Metadata:
Creation Timestamp: 2020-05-31T15:35:12Z
Generation: 1
Resource Version: 20232668
Self Link:
/apis/timesten.oracle.com/v1/namespaces/mynamespace/timestenclassics/sample
UID: 517a8646-a354-11ea-a9fb-0a580aed5e4a
Spec:
Ttspec:
Db Config Map:
sample
Image: phx.ocir.io/youraccount/tt1814110:3
Image Pull Policy: Always
Image Pull Secret: sekret
Storage Class Name: oci
Storage Size: 250G
Status:
Active Pods: sample-0
High Level State: Normal
Last Event: 35
Pod Status:
Cache Status:
Cache Agent: Not Running
Cache UID Pwd Set: true
N Cache Groups: 0
Db Status:
Db: Loaded
Db Id: 26
Db Updatable: Yes
Initialized: true
Pod Status:
Agent: Up
Last Time Reachable: 1590939597
Pod IP: 192.0.2.1
Pod Phase: Running
Replication Status:
Last Time Rep State Changed: 0
Rep Agent: Running
Rep Peer P State: start
Rep Scheme: Exists
Rep State: ACTIVE
Times Ten Status:
Daemon: Up
Instance: Exists
Release: 18.1.4.11.0
Admin User File: true
Cache User File: false
Cg File: false
High Level State: Healthy
Intended State: Active
Name: sample-0
Schema File: true
Cache Status:
Cache Agent: Not Running
Cache UID Pwd Set: true
N Cache Groups: 0
Db Status:
Db: Loaded
Db Id: 26
Db Updatable: No
Initialized: true
Pod Status:
Agent: Up
Last Time Reachable: 1590939597
Pod IP: 192.0.2.2
Pod Phase: Running
Replication Status:
Last Time Rep State Changed: 1590939496
Rep Agent: Running
Rep Peer P State: start
Rep Scheme: Exists
Rep State: STANDBY
Times Ten Status:
Daemon: Up
Instance: Exists
Release: 18.1.4.11.0
Admin User File: true
Cache User File: false
Cg File: false
High Level State: Healthy
Intended State: Standby
Name: sample-1
Schema File: true
Rep Create Statement: create active standby pair "sample" on
"sample-0.sample.mynamespace.svc.cluster.local", "sample" on
"sample-1.sample.mynamespace.svc.cluster.local" NO RETURN store "sample" on
"sample-0.sample.mynamespace.svc.cluster.local" PORT 4444 FAILTHRESHOLD 0
store "sample" on "sample-1.sample.mynamespace.svc.cluster.local" PORT 4444
FAILTHRESHOLD 0
Rep Port: 4444
Status Version: 1.0
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
- Create 4m43s ttclassic Secret
tt517a8646-a354-11ea-a9fb-0a580aed5e4a created
- Create 4m43s ttclassic Service sample created
- Create 4m43s ttclassic StatefulSet sample created
- StateChange 3m47s ttclassic Pod sample-0 Daemon Unknown
- StateChange 3m47s ttclassic Pod sample-0 CacheAgent Unknown
- StateChange 3m47s ttclassic Pod sample-0 RepAgent Unknown
- StateChange 3m47s ttclassic Pod sample-1 Daemon Unknown
- StateChange 3m47s ttclassic Pod sample-1 CacheAgent Unknown
- StateChange 3m47s ttclassic Pod sample-1 RepAgent Unknown
- StateChange 3m26s ttclassic Pod sample-0 Agent Up
- StateChange 3m26s ttclassic Pod sample-0 Release 18.1.4.11.0
- StateChange 3m26s ttclassic Pod sample-0 Daemon Down
- StateChange 3m26s ttclassic Pod sample-1 Agent Up
- StateChange 3m26s ttclassic Pod sample-1 Release 18.1.4.11.0
- StateChange 3m26s ttclassic Pod sample-1 Daemon Down
- StateChange 3m26s ttclassic Pod sample-0 Daemon Up
- StateChange 3m25s ttclassic Pod sample-1 Daemon Up
- StateChange 2m13s ttclassic Pod sample-0 RepState IDLE
- StateChange 2m13s ttclassic Pod sample-0 Database Updatable
- StateChange 2m13s ttclassic Pod sample-0 CacheAgent Not Running
- StateChange 2m13s ttclassic Pod sample-0 RepAgent Not Running
- StateChange 2m13s ttclassic Pod sample-0 RepScheme None
- StateChange 2m13s ttclassic Pod sample-0 Database Loaded
- StateChange 2m11s ttclassic Pod sample-0 RepAgent Running
- StateChange 2m10s ttclassic Pod sample-0 RepScheme Exists
- StateChange 2m10s ttclassic Pod sample-0 RepState ACTIVE
- StateChange 113s ttclassic Pod sample-1 Database Loaded
- StateChange 113s ttclassic Pod sample-1 Database Not Updatable
- StateChange 113s ttclassic Pod sample-1 CacheAgent Not Running
- StateChange 113s ttclassic Pod sample-1 RepAgent Not Running
- StateChange 113s ttclassic Pod sample-1 RepScheme Exists
- StateChange 113s ttclassic Pod sample-1 RepState IDLE
- StateChange 106s ttclassic Pod sample-1 RepAgent Running
- StateChange 101s ttclassic Pod sample-1 RepState STANDBY
- StateChange 101s ttclassic TimesTenClassic was Initializing,
now Normal
TimesTenデータベースのアクティブ・スタンバイ・ペアが(Normalで示されているように)正常にデプロイされました。アクティブ・スタンバイ・ペアとして構成された2つのTimesTenデータベースがあります。1つのデータベースがアクティブです。(この例では、Rep State ACTIVEで示されているように、sample-0がアクティブ・データベースです。)もう1つのデータベースはスタンバイです。(この例では、Rep State STANDBYで示されているように、sample-1はスタンバイ・データベースです。)アクティブ・データベースは、変更および問合せできます。アクティブ・データベースで行われた変更は、スタンバイ・データベースにレプリケートされます。アクティブ・データベースで障害が発生した場合、オペレータは自動的にスタンバイ・データベースをアクティブに昇格させます。以前のアクティブ・データベースは修復または置換され、スタンバイになります。
オペレータは、その他の基礎となるオブジェクトを自動的に作成します。これらのオブジェクトが作成されていることを確認します。
StatefulSet:
% kubectl get statefulset sample NAME READY AGE sample 2/2 8m21s
サービス:
% kubectl get service sample NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sample ClusterIP None <none> 6625/TCP 9m28s
ポッド:
% kubectl get pods NAME READY STATUS RESTARTS AGE sample-0 2/2 Running 0 10m sample-1 2/2 Running 0 10m timestenclassic-operator-5d7dcc7948-8mnz4 1/1 Running 0 11h
PersistentVolumeClaims (PVC):
% kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE tt-persistent-sample-0 Bound ocid1.volume.oc1.phx.abyhqljrbxcgzyixa4pmmcwiqxgqclc7gxvdnoty367w2qn26tij6kfpx 6qq 250Gi RWO oci 10m tt-persistent-sample-1 Bound ocid1.volume.oc1.phx.abyhqljtt4qxxoj5jqiskriskh66hakaw326rbza4uigmuaezdnu53qhh oaa 250Gi RWO oci 10m
kubectl execコマンドを実行して、ポッドのシェルを起動し、それらのポッドで実行されているTimesTenを制御できます。TimesTenは、ポッドでoracleユーザーとして実行されます。ポッドでシェルを確立したら、su - oracleコマンドを使用してoracleユーザーに切り替えます。oracleユーザーに切り替えた後、sampleデータベースに接続できること、およびメタデータ・ファイルの情報が正しいことを確認します。オプションで、データベースまたは他の操作に対して問合せを実行できます。
ポッドでシェルを確立し、oracleユーザーに切り替えます。
% kubectl exec -it sample-0 -c tt -- /usr/bin/su - oracle
sampleデータベースに接続します。メタデータ・ファイルの情報がデータベースに正しく存在していることを確認します。たとえば、scottユーザーとしてデータベースへの接続を試みます。200のPermSize値が正しいことを確認します。scott.emp表が存在することを確認します。
% ttIsql sample Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "DSN=sample"; Connection successful: DSN=sample;UID=oracle;DataStore=/tt/home/oracle/datastore/sample; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;PermSize=200; DDLReplicationLevel=3; (Default setting AutoCommit=1) Command> connect adding "uid=scott;pwd=tiger" as scott; Connection successful: DSN=sample;UID=scott;DataStore=/tt/home/oracle/datastore/sample; DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;PermSize=200; DDLReplicationLevel=3; (Default setting AutoCommit=1) scott: Command> tables; SCOTT.EMP 1 table found.