この章では、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コマンドを使用して、プロビジョニング時にアクティブ・スタンバイ・ペアの進捗状況を監視します。
| ノート: kubectlgettimestenclassicコマンドとkubectldescribetimestenclassicの場合、かわりにkubectlgetttcとkubectldescribettcをそれぞれ指定できます。timestenclassicとttcは、これらのコマンドで使用される場合同義であり、同じ結果を返します。この章の最初のkubectlgetおよび最初のkubectldescribeの例では、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.