この付録では、KubernetesクラスタにあるTimesTenデータベースのアクティブ・スタンバイ・ペアをデプロイおよび実行するための完全なプロセスの例を示します。データベースが稼働した後の例では、オペレータによるデータベースの制御方法と管理方法を示します。アクティブ・データベースで障害が発生した場合、オペレータは必要なタスクを実行してスタンバイ・データベースにフェイルオーバーし、そのスタンバイ・データベースをアクティブ・データベースにします。この例では最後に、TimesTenデータベースを削除し、オペレータを停止する手順を説明します。
例を始める前に、次のことを確認してください。
前提条件を完了しました。必要な前提条件の詳細は、前提条件を参照してください。
環境を設定するには、Linux開発ホストから次のステップを実行します。
次のステップを実行して、TimesTenのフル・ディストリビューションをダウンロードし、その中に埋め込まれているTimesTenオペレータのディストリビューションを解凍します。すべてのステップをLinux開発ホストから実行します。
選択したディレクトリから次のことを実行します。
TimesTenのフル・ディストリビューションをダウンロードするサブディレクトリを1つ作成します。たとえば、installation_dir
サブディレクトリを作成します。(この章ではこれ以降、installation_dir
ディレクトリを使用します。)
TimesTenオペレータのディストリビューションを解凍する2つ目のサブディレクトリを作成します。たとえば、kube_files
サブディレクトリを作成します。(この章ではこれ以降、このkube_files
ディレクトリを使用します。)
% mkdir -pinstallation_dir
% mkdir -pkube_files
これで、TimesTenのフル・ディストリビューションをダウンロードして解凍する準備ができました。
installation_dir
に移動します。
% cd installation_dir
このディレクトリにTimesTenのフル・ディストリビューションをダウンロードします。例として、t
imesten1814110.server.linux8664.zip
ファイル(Linux 64ビットの18.1.4.11.0
フル・ディストリビューション)をダウンロードします。
installation_dir
から、ZIPユーティリティを使用してTimesTenのディストリビューションを解凍します。
% unziptimesten1814110
.server
.linux8664
.zip
Archive: /timesten/installation/timesten1814110.server.linux8664.zip creating: tt18.1.4.11.0/ creating: tt18.1.4.11.0/ttoracle_home/ ... creating: tt18.1.4.11.0/kubernetes/ ...
TimesTenのフル・ディストリビューションを正常に解凍しました。
installation_dir
/tt18.1.4.11.0/kubernetes
ディレクトリが作成されることに注意してください。operator.zip
ファイルは、このディレクトリにあります。たとえば、分散を解凍した後のディレクトリ構造の例を次に示します。
% pwd
installation_dir
/tt18.1.4.11.0
% dir
3rdparty include lib oraclescripts README.html ttoracle_home
bin info network PERL startup
grid kubernetes nls plsql support
kube_files
ディレクトリに移動し、operator.zip
ファイルをそのディレクトリに解凍します。この例では、installation_dir
/tt18.1.4.11.0/kubernetes
/operator.zip
ファイルを解凍します。
% cdkube_files
% unzipinstallation_dir
/tt18.1.4.11.0/kubernetes/operator.zip [...UNZIP OUTPUT...]
installation_dir
/tt18.1.4.11.0/kubernetes/operator.zip
ファイルをkube_files
ディレクトリに正常に解凍しました。
ディレクトリ構造を確認します。この章の後半で、これらのサブディレクトリ内のファイルをいくつか変更します。この例では、リリースごとに変更される可能性がある最も重要なサブディレクトリとファイルを示します。
README.md deploy/crd.yaml deploy/operator.yaml deploy/service_account.yaml operator/Dockerfile operator/timestenclassic-operator ttimage/agent2 ttimage/.bashrc ttimage/create1.sql ttimage/create2.sql ttimage/Dockerfile ttimage/get1.sql ttimage/pausecq.sql ttimage/repcreate.sql ttimage/repduplicate.sql ttimage/runsql,sql ttimage/starthost.pl ttimage/.ttdotversion ttimage/.ttdrop
ノート: このディレクトリ・ツリーは、TimesTenオペレータの存続期間中存続している必要があります。また、TimesTenのフル・ディストリビューション・ファイル(この例では
|
TimesTenオペレータのディストリビューションを正常にダウンロードし、展開しました。
オペレータは、Kubernetesサービス・アカウントを使用して実行されます。このサービス・アカウントにはネームスペースでの権限が必要です。これらの権限は、ロールを介して付与されます。s
ervice_account.yaml
ファイルは、サービス・アカウントとロールをネームスペースに追加し、ロールで指定された権限をサービス・アカウントに付与します。service_account.yaml
ファイルは、以前に解凍したoperator.zip
ファイルに含まれています。
ノート: 提供されたロールによって、timestenclassic-operator にネームスペース内の幅広い権限が付与されます。service_account.yaml ファイルで提供されている権限を調べて、権限を変更する必要があるかどうかを確認します。その場合は、この例のコマンドを実行する前に権限を変更してください。 |
次のステップを実行します。
kube_files
/deploy
ディレクトリに移動します。
% cd kube_files
/deploy
サービス・アカウントを作成します。
% kubectl create -f service_account.yaml role.rbac.authorization.k8s.io/timestenclassic-operator created serviceaccount/timestenclassic-operator created rolebinding.rbac.authorization.k8s.io/timestenclassic-operator created
service_account.yaml
ファイルによって、timestenclassic-operator
サービス・アカウントとtimestenclassic-operator
ロールがネームスペースに作成され、ロールで指定されている権限がサービス・アカウントに付与されました。
kube_files
/deploy
ディレクトリに移動し、kubectl
create
コマンドを使用して、TimesTenClassicのカスタマイズされたリソース定義(CRD)をKubernetesクラスタに作成します。
% cd kube_files
/deploy
% kubectl create -f crd.yaml
customresourcedefinition.apiextensions.k8s.io/
timestenclassics.timesten.oracle.com created
TimesTenClassicオブジェクト・タイプをKubernetesクラスタに正常に追加しました。
Kubernetesオペレータは、カスタマイズされたイメージを実行するポッドです。オペレータを実行する前に、このイメージを作成してイメージ・レジストリにプッシュする必要があります。
イメージの作成に必要なファイルは、kube_files
/operator
ディレクトリ(以前に解凍したZIPファイルの一部)にあります。kube_files
/operator
ディレクトリには、Dockerfile
およびオペレータ・イメージの作成に必要なバイナリがあります。
オペレータ・イメージを作成してレジストリにプッシュするには、次のステップを実行します。
kube_files
/operator
ディレクトリに移動し、TimesTenのディストリビューションをそのディレクトリにコピーします。この例は、installation_dir
ディレクトリにtimesten1814110.server.linux8664.zi
p
ディストリビューションをダウンロードしたと仮定しています。詳細は、TimesTenオペレータのダウンロードを参照してください。その次に、timesten1814110.server.linux8664.zi
p
ファイルがkube_files
/operator
ディレクトリにあることを確認します。
% cdkube_files
/operator % cpinstallation_dir
/timesten1814110.server.linux8664.zip . % ls -a Dockerfile timesten1814110.server.linux8664.zip timestenclassic-operator
kube_files
/operator
ディレクトリに移動し(まだこのディレクトリにない場合)、docker
コマンドを使用してオペレータ・イメージを作成します。ttclassic-operator:3
には任意の名前を選択できます(この例では太字で表示)。出力はリリースごとに変わる可能性があることに注意してください。
% cd kube_files
/operator
% docker build -t ttclassic-operator:3 .
Sending build context to Docker daemon 478.6MB
Step 1/7 : FROM container-registry.oracle.com/os/oraclelinux:7
---> d788eca028a0
Step 2/7 : ARG TT_DISTRO=timesten1814110.server.linux8664.zip
---> Using cache
---> a259a93fe906
Step 3/7 : RUN yum -y install openssl unzip && /usr/sbin/useradd -d
/tt-operator -m -u 1001 -s /bin/nologin -U tt-operator
---> Using cache
---> e3f1427246ab
Step 4/7 : COPY --chown=tt-operator:tt-operator timestenclassic-operator
/usr/local/bin/timestenclassic-operator
---> Using cache
---> 6ccad53230f0
Step 5/7 : COPY --chown=tt-operator:tt-operator $TT_DISTRO /tt-operator/
$TT_DISTRO
---> 5cd31705485a
Step 6/7 : USER tt-operator
---> Running in 6a773ddac5dd
Removing intermediate container 6a773ddac5dd
---> 875ee38ebc75
Step 7/7 : ENTRYPOINT ["/usr/local/bin/timestenclassic-operator"]
---> Running in fed0f6c94c2f
Removing intermediate container fed0f6c94c2f
---> 10dde79e1617
Successfully built 10dde79e1617
Successfully tagged ttclassic-operator:3
docker
コマンドを使用して、オペレータ・イメージにタグを付けます。
phx.ocir.io/youraccount
をイメージ・レジストリの場所に置き換えます。(この例では、phx.ocir.io/youraccount
は太字で表示されています。)
ttclassic-operator:3
を、前のステップで選択した名前に置き換えます。(この例では、ttclassic-operator
は太字で表示されています。)
% docker tag ttclassic-operator:3 phx.ocir.io/youraccount/ttclassic-operator:3
オペレータ・イメージをレジストリにプッシュするには、docker
コマンドを使用します。
phx.ocir.io/youraccount
をイメージ・レジストリの場所に置き換えます。(この例では、phx.ocir.io/youraccount
は太字で表示されています。)
ttclassic-operator:3
を、前のステップで選択した名前に置き換えます。(この例では、ttclassic-operator:3
は太字で表示されています。)
% docker push phx.ocir.io/youraccount/ttclassic-operator:3 The push refers to repository [phx.ocir.io/youraccount/ttclassic-operator] 46458e9fc890: Pushed 471a399f0540: Pushed 9e51a2b82af3: Pushed 2f915858a916: Layer already exists 3: digest: sha256:9b941f12e3d52298b9b38f7766ddcdfb1d011857a990ff01a8adafd32f3d3e8d size: 1166
オペレータ・イメージを正常に作成し、イメージ・レジストリにプッシュしました。
オペレータをデプロイするには、最初にネームスペースにあわせてカスタマイズしてからデプロイします。最後のステップとして、オペレータが実行されていることを確認できます。詳細は、オペレータのデプロイを参照してください。
ネームスペースのオペレータをカスタマイズするには、kube_files
/deploy
ディレクトリに移動し、operator.yaml
ファイルを編集します。このファイルは、以前に解凍したディストリビューションで提供されています。詳細は、TimesTenおよびTimesTenオペレータのダウンロードを参照してください。
太字で表示されている次のフィールド(次のoperator.yaml
ファイル内)を変更します。
replicas:
1
1
を、実行するオペレータのコピー数に置き換えます。開発およびテストには1
を使用できます。ただし、高可用性を確保する目的で、複数のレプリカを実行できます。
sekret
を、Kubernetesがレジストリからイメージを取得するために使用するイメージ・プル・シークレットの名前に置き換えます。
phx.ocir.io/youraccount
を、イメージ・レジストリの場所に置き換えます。
ttclassic-operator:3
を、前のステップで選択した名前に置き換えます。
% cd kube_files
/deploy
% vi operator.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: timestenclassic-operator
spec:
replicas: 1
selector:
matchLabels:
name: timestenclassic-operator
template:
metadata:
labels:
name: timestenclassic-operator
spec:
serviceAccountName: timestenclassic-operator
imagePullSecrets:
- name: sekret
containers:
- name: timestenclassic-operator
image: phx.ocir.io/youraccount/ttclassic-operator:3
command:
- timestenclassic-operator
imagePullPolicy: Always
env:
- name: WATCH_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: OPERATOR_NAME
value: "timestenclassic-operator"
- name: GODEBUG
value: "x509ignoreCN=0"
kubectl
create
コマンドを使用して、オペレータをネームスペースに定義し、オペレータを起動します。
% kubectl create -f operator.yaml deployment.apps/timestenclassic-operator created
オペレータをデプロイしました。これで、演算子が実行されます。
kubectl
get
pods
コマンドを使用して、オペレータが実行されていることを確認します。STATUS
フィールドの値がRunning
の場合、オペレータが実行されています。
% kubectl get pods NAME READY STATUS RESTARTS AGE timestenclassic-operator-f84766548-5bzch 1/1 Running 0 37s
オペレータが実行されていることを確認しました。
KubernetesクラスタでTimesTenを起動する前に、まずTimesTenをコンテナ・イメージとしてパッケージ化し、次にそのイメージをイメージ・レジストリにプッシュする必要があります。これを行う必要のあるファイルは、kube_files
ディレクトリ・ツリーに表示されます。詳細は、TimesTenイメージの作成を参照してください。
TimesTenコンテナ・イメージを作成するには、次のステップを実行します。
kube_files
/ttimage
ディレクトリに移動し、TimesTenのディストリビューションをそのディレクトリにコピーします。この例は、installation_dir
ディレクトリにtimesten1814110.server.linux8664.zi
p
ディストリビューションをダウンロードしたと仮定しています。詳細は、TimesTenオペレータのダウンロードを参照してください。その次に、timesten1814110.server.linux8664.zi
p
ファイルがkube_files
/ttimage
ディレクトリにあることを確認します。
% cdkube_files
/ttimage % cpinstallation_dir
/timesten1814110.server.linux8664.zip . % ls *.zip timesten1814110.server.linux8664.zip
kube_files
/ttimage
ディレクトリに移動します(まだこのディレクトリにない場合)。Dockerfile
を編集し、timesten1814110.server.linux8664.zip
をTimesTenのフル・ディストリビューションの名前に置き換えます。TimesTenのディストリビューションがtimesten1814110.server.linux8664.zip
の場合、変更の必要はありません。そうでない場合、必要な変更は太字で表示されます。ノート: TimesTenのフル・ディストリビューションは、18.1.4.11.0
以降であることが必要です。
% cd kube_files
/ttimage
% vi Dockerfile
# Copyright (c) 2019, 2021, Oracle and/or its affiliates.
FROM container-registry.oracle.com/os/oraclelinux:7
ARG TT_DISTRO=timesten1814110.server.linux8664.zip
RUN yum -y install tar gzip vim curl unzip libaio util-linux
RUN groupadd -g 333 oracle
RUN useradd -M -d /tt/home/oracle -s /bin/bash -u 333 -g oracle oracle
RUN install -d -m 0750 -o oracle -g oracle /home/oracle
COPY --chown=oracle:oracle $TT_DISTRO /home/oracle/
COPY --chown=oracle:oracle .bashrc starthost.pl .ttdrop .ttdotversion agent2
create1.sql create2.sql get1.sql repcreate.sql repduplicate.sql runsql.sql
pausecg.sql /home/oracle/
# Uncomment the following line if you are using the optional non-root
installation procedure.
# USER 333
ENTRYPOINT "/home/oracle/starthost.pl"
docker
コマンドを使用して、TimesTenコンテナ・イメージを作成します。tt1814110
を、選択した名前に置き換えます(次のdocker
build
コマンドで太字で表示)。出力はリリースごとに変わる可能性があることに注意してください。
% docker build -t tt1814110:3 . Sending build context to Docker daemon 445.8MB Step 1/9 : FROM container-registry.oracle.com/os/oraclelinux:7 ---> d788eca028a0 Step 2/9 : ARG TT_DISTRO=timesten1814110.server.linux8664.zip ---> Using cache ---> a259a93fe906 Step 3/9 : RUN yum -y install tar gzip vim curl unzip libaio util-linux ---> Using cache ---> ac676b5376f3 Step 4/9 : RUN groupadd -g 333 oracle ---> Using cache ---> ce16920f085c Step 5/9 : RUN useradd -M -d /tt/home/oracle -s /bin/bash -u 333 -g oracle oracle ---> Using cache ---> 0319814aca1c Step 6/9 : RUN install -d -m 0750 -o oracle -g oracle /home/oracle ---> Using cache ---> c8612b53398a Step 7/9 : COPY --chown=oracle:oracle $TT_DISTRO /home/oracle/ ---> 31cae98b71fd Step 8/9 : COPY --chown=oracle:oracle .bashrc starthost.pl .ttdrop .ttdotversion agent2 create1.sql create2.sql get1.sql repcreate.sql repduplicate.sql runsql.sql pausecg.sql /home/oracle/ ---> e50eb99c9b54 Step 9/9 : ENTRYPOINT "/home/oracle/starthost.pl" ---> Running in 0b41efd38837 Removing intermediate container 0b41efd38837 ---> 171245e546d5 Successfully built 171245e546d5 Successfully tagged tt1814110:3
docker
コマンドを使用して、TimesTenコンテナ・イメージにタグを付けます。次のdocker
tag
コマンドで太字で表示されている次のものを置き換えます。
tt1814110:3
: 前のステップで選択した名前に置き換えます。
p
hx.ocir.io/youraccount
: イメージ・レジストリの場所に置き換えます。
% docker tag tt1814110:3 phx.ocir.io/youraccount/tt1814110:3
TimesTenコンテナ・イメージをレジストリにプッシュするには、docker
コマンドを使用します。次のdocker
push
コマンドで太字で表示されている次のものを置き換えます。
p
hx.ocir.io/youraccount
: イメージ・レジストリの場所に置き換えます。
tt1814110:3
: 前に選択した名前に置き換えます。
% docker push phx.ocir.io/youraccount/tt1814110:3 The push refers to repository [phx.ocir.io/youraccount/tt1814110] 97a0f250b2fe: Pushed 650b003a3ad4: Pushed b8de51528854: Pushed 62192d26e325: Pushed 7dfe13e9b5a4: Pushed d8570fce965c: Pushed 2f915858a916: Layer already exists 3: digest: sha256:a6ac313394229eb2256d4a56fbcd8e2eda50ea2cc21991fa76f11701f2299710 size: 1788
TimesTenコンテナ・イメージを正常に作成しました。イメージ・レジストリにプッシュされます。
この項では、sample
ConfigMapを作成します。このConfigMapには、db.ini
、adminUser
およびschema.sql
メタデータ・ファイルが含まれます。このConfigMapはTimesTenClassicオブジェクトの定義時に参照されます。構成ファイルおよびConfigMap機能の詳細は、構成メタデータおよびKubernetes機能の理解を参照してください。
Linux開発ホストで、次のことを実行します。
選択したディレクトリから、メタデータ・ファイル用に空のサブディレクトリを作成します。この例では、cm_sample
サブディレクトリを作成します。(この例ではこれ以降、このディレクトリを示すためにcm_sample
ディレクトリを使用します。)
% mkdir -p cm_sample
ConfigMapディレクトリに移動します。
% cd cm_sample
このConfigMapディレクトリ(この例ではcm_sample
)にdb.ini
ファイルを作成します。このdb.ini
ファイルで、PermSize
接続属性とDatabaseCharacterSet
接続属性を定義します。
vi db.ini
PermSize=200 DatabaseCharacterSet=AL32UTF8
このConfigMapディレクトリ(この例ではcm_sample
)にadminUser
ファイルを作成します。このadminUser
ファイルで、tiger
パスワードを使用してscott
ユーザーを作成します。
vi adminUser
scott/tiger
このConfigMapディレクトリ(この例ではcm_sample
)にschema.sql
ファイルを作成します。このschema.sql
ファイルで、scott
ユーザーのs
順序とemp
表を定義します。オペレータはこれらのオブジェクト定義でデータベースを自動的に初期化します。
vi schema.sql
create sequence scott.s; create table scott.emp ( id number not null primary key, name char(32) );
ConfigMapを作成します。cm_sample
ディレクトリ内のファイルはConfigMapに組み込まれ、後でTimesTenコンテナで使用できます。
この例では次のとおりです。
ConfigMapの名前はsample
です。sample
を選択した名前に置き換えます(この例では、sample
は太字で表示されています)。
この例では、ConfigMapにコピーされるファイルが存在するディレクトリとしてcm_sample
を使用しています。別のディレクトリを使用する場合は、cm_sample
を使用するディレクトリの名前に置き換えます。(この例では、cm_sample
は太字で表示されています。)
kubectl
create
コマンドを使用して、ConfigMapを作成します。
% kubectl create configmap sample --from-file=cm_sample configmap/sample created
sample
ConfigMapを正常に作成し、デプロイしました。
kubectl
describe
コマンドを使用して、ConfigMapのコンテンツを確認します。(この例ではsample
。)
% kubectl describe configmap sample Name: sample Namespace: mynamespace Labels: <none> Annotations: <none> Data ==== adminUser: ---- scott/tiger db.ini: ---- PermSize=200 DatabaseCharacterSet=AL32UTF8 schema.sql: ---- create sequence scott.s; create table scott.emp ( id number not null primary key, name char(32) ); Events: <none>
この項では、TimesTenClassicオブジェクトを作成します。TimesTenClassicオブジェクトの詳細は、TimesTenClassicオブジェクトの定義および作成およびTimesTenClassicオブジェクト・タイプを参照してください。
次のステップを実行します。
空のYAMLファイルを作成します。任意の名前を選択できますが、TimesTenClassicオブジェクトに使用した名前と同じ名前を使用することもできます。(この例では、sample
です。)YAMLファイルには、TimesTenClassicオブジェクトの定義が格納されています。このYAMLファイルで指定する必要があるフィールド、およびオプションのフィールドの詳細は、TimesTenClassicSpecSpecを参照してください。
この例では、次のものを置き換えます。(置き換えることができる値は太字で表示されています。)
name
: sample
を、TimesTenClassicオブジェクトの名前に置き換えます。
storageClassName
: oci
を、TimesTenを保持するためのPersistentVolumesの割当てに使用される記憶域クラスの名前に置き換えます。
storageSize
: 250G
を、各ポッドがTimesTenを保持するために要求する必要がある記憶域の量に置き換えます。ノート: この例では、本番環境を想定していることから、storageSize
には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 configmap/sample created timestenclassic.timesten.oracle.com/sample created
KubernetesクラスタにTimesTenClassicオブジェクトを正常に作成しました。TimesTenデータベースをデプロイするプロセスが開始されますが、まだ完了していません。
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
はスタンバイ・データベースです。)アクティブ・データベースは、変更および問合せできます。アクティブ・データベースで行われた変更は、スタンバイ・データベースにレプリケートされます。アクティブ・データベースで障害が発生した場合、オペレータは自動的にスタンバイ・データベースをアクティブに昇格させます。以前のアクティブ・データベースは修復または置換され、スタンバイになります。
kubectl
describe
コマンドを使用して、基礎となるオブジェクトを確認します。
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.
この例では、アクティブTimesTenデータベースの障害をシミュレートします。これは、デモのみを目的としています。本番環境では実行しないでください。
kubectl
delete
pod
コマンドを使用して、アクティブ・データベース(この場合はsample-0
)を削除します
% kubectl delete pod sample-0
kubectl
describe
コマンドを使用して、オペレータがどのように障害からリカバリするかを確認します。オペレータは、スタンバイ・データベース(sample-1
)をアクティブに昇格させます。sample-0
データベースに接続されていたすべてのアプリケーションは、TimesTenによってsample-1
データベースに自動的に再接続されます。短時間の停止後、アプリケーションは引き続きデータベースを使用できます。アクティブ・スタンバイ・ペアの状態の詳細は、データベースのアクティブ・スタンバイ・ペアの状態の監視を参照してください。
ノート: この例では、3つの状態変更に対するMessage
列のテキストが2行に表示されています。ただし、これら3つの状態変更に対する実際の出力は1行に表示されます。
% kubectl describe ttc sample Name: sample ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- - StateChange 2m1s ttclassic TimesTenClassic sample: was Normal, now ActiveDown - StateChange 115s ttclassic Pod sample-1 Database Updatable: Yes - StateChange 115s ttclassic TimesTenClassic sample:was ActiveDown, now StandbyDown - StateChange 115s ttclassic Pod sample-1 RepState ACTIVE - StateChange 110s ttclassic Pod sample-0 High Level State Unknown - StateChange 63s ttclassic Pod sample-0 Pod Phase Running - StateChange 63s ttclassic Pod sample-0 Agent Up - StateChange 63s ttclassic Pod sample-0 Instance Exists - StateChange 63s ttclassic Pod sample-0 Daemon Up - StateChange 63s ttclassic Pod sample-0 Database None - StateChange 42s ttclassic Pod sample-0 Database Loaded - StateChange 42s ttclassic Pod sample-0 Database Updatable: No - StateChange 42s ttclassic Pod sample-0 RepAgent Running - StateChange 42s ttclassic Pod sample-0 CacheAgent Not Running - StateChange 42s ttclassic Pod sample-0 RepScheme Exists - StateChange 42s ttclassic Pod sample-0 RepState IDLE - StateChange 36s ttclassic Pod sample-0 High Level State Healthy - StateChange 36s ttclassic Pod sample-0 RepState STANDBY - StateChange 36s ttclassic TimesTenClassic sample:was StandbyDown, now Normal
Kubernetesは新しいsample-0
ポッドを自動的に生成し、削除したポッドに置き換えます。オペレータはそのポッド内でTimesTenを構成し、ポッドのデータベースを新しいスタンバイ・データベースとして起動します。データベースのレプリケート・ペアは、再び正常に機能します。
この例では、TimesTenClassicに関連付けられているデータベースおよびすべてのオブジェクトの削除を完了します。これらのステップは、例としてのみ使用されます。これらのステップを実行すると、TimesTenデータベースを実行しているポッドが終了し、TimesTenデータベース自体が削除されます。
ConfigMapオブジェクト(この例ではsample
)を削除します。
% kubectl delete configmap sample configmap "sample" deleted
TimesTenClassicオブジェクトと基礎となるオブジェクトを削除します。
% kubectl delete -f sample.yaml timestenclassic.timesten.oracle.com "sample" deleted
TimesTenデータベースを実行していたポッドが存在しないことを確認します。
% kubectl get pods NAME READY STATUS RESTARTS AGE timestenclassic-operator-5d7dcc7948-8mnz4 1/1 Running 0 5d23h
データベースの保持に使用する永続記憶域を削除します。これは手動で行う必要があります。
% kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE tt-persistent-sample-0 Bound ... tt-persistent-sample-1 Bound ... % kubectl delete pvc tt-persistent-sample-0 persistentvolumeclaim "tt-persistent-sample-0" deleted % kubectl delete pvc tt-persistent-sample-1 persistentvolumeclaim "tt-persistent-sample-1" deleted
オペレータが不要になった場合は、停止できます。/deplo
yディレクトリ(この例ではkube_files
/deploy
)に移動し、kubectl
delete
コマンドを使用してオペレータを停止します。
% cd kube_files
/deploy
% kubectl delete -f operator.yaml
deployment.apps "timestenclassic-operator" deleted