この章では、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.