LoginSignup
1
0

ZD&T環境にIMS-to-Db2レプリケーションのテスト環境を構築する

Posted at

IMSの階層型DBは、CDC (Change Data Capture; 変更データキャプチャ)を嚙ませることで他のDBプラットフォームへレプリケーションすることができます。

たとえばDb2へ持っていく場合、

  1. IMS (ソースDB)
  2. Classic CDC (キャプチャー・サーバー:IMSDBのレコードやアクティビティーを読取って送信)
  3. CDC RE for Db2 (アプライ・サーバー:送信された情報を受け取ってDb2へ適用)
  4. Db2 (ターゲットDB)

と伝ってレプリケーションできます。
Db2がオープン環境にある場合、1. IMSと2. Classic CDCはホスト(メインフレーム)のz/OS上、3. CDC RE for Db2と4. Db2はオープン環境に置くことになります。

今回、ZD&Tを使ってこのホストIMSからオープンDb2へのレプリケーションをテストする小規模な環境を構築してみました。
下記のようなイメージです。

Picture2.png

ZD&T (IBM Z Development and Test Environment) はメインフレーム(z/OS)の開発環境をエミュレートする製品です。通常Zメインフレーム・ハードウェア上で稼働するz/OSディストリビューションをIntelマシンのLinux環境で稼働させることができます。
これによって単一のLinux区画だけでレプリケーション環境を構築できました。あと余談ですが、ZD&Tには最初からIMSが使える状態で入っているのでIMSのセットアップがほとんど不要だったのも大いに助かりました。

ZD&Tのセットアップではこちらの記事を参考にしました。

Classic CDCについて詳しくはこちらをご覧ください。

Classic CDC のインストール

Program Directoryに従います。

まずインストールファイルをzFSの/tmp/ccdcにアップロード。同梱されているJCL:GIMUNZIPを編集して実行、DOCLIB/RIMLIB/PGMDIRを展開します。ここではHLQ:CCDC113.下に展開。

CCDC113.RIMLIB(UNZIPJCL)を編集してCBCACHE.IBM.HABIB30.F2.pax.Zをunzipし、インストールサンプルJCLを得ます。
ここからはこれらのサンプルJCLを流していきます。

まずCACALA、JCL中の指示に合わせて適宜CSIデータセット名を編集して実行。

続いてCACALB、こちらも指示に従ってZONE名等を編集して実行。

次にインストールファイルをunzipし、製品のRECEIVEを行います。
RECEIVEする製品IDは下記の通り。

  • HABIB30: Classic Fed/Rep/EP Core (Base)
  • JABIB3H: Classic CDC Unique
  • JABIB3I: Classic CDC IMS

該当する製品IDをファイル名に持つインストールファイルをunzipし、JCL: CACRECV0, CACRECVH, CACRECVIを編集して実行します。

CACALLOCを編集/実行してターゲットライブラリーおよびディストリビューションライブラリーを作成。

CACDDDEFを編集/実行してDDDEFを登録。

CACAPPLYを編集/実行してRECEIVEした製品ライブラリーをAPPLYし、CACACCEPでACCEPTしたらインストールは完了です。

Classic CDCのセットアップ

APF登録

CCDCの実行ライブラリーCCDC113.SCACLOADをAPF登録します。上述の通り、CCDC113.は製品インストール時に指定したHLQです。
私の使ったZDT環境ではUSER.Z25C.PARMLIB(PROG00)が使われていたのでそこに追記し、動的APFリストにも突っ込みます。

SETPROG APF,ADD,DSN=CCDC113.SCACLOAD,VOLUME=CCDC00                  
CSV410I DATA SET CCDC113.SCACLOAD ON VOLUME CCDC00 ADDED TO APF LIST 

サンプルのアロケーション

CCDC113.SCACSAMP(CECCUSC1)をカスタマイズして実行。
CCDC113.USERSAMPおよびCCDC113.USERCONFを生成します。これらはともにCCDCの管理に使うJCLや制御ファイルのサンプルが入ります。

カスタマイズユーティリティー

パラメーターファイルCCDC113.USERSAMP(CECCUSPC)を適宜編集したのち、installation customization utility: CCDC113.USERSAMP(CECCUSC2)を実行。
CECCUSC2はパラメーターファイルを読み込んでオフラインでパラメーターをカスタマイズするユーティリティーです。
各パラメーターの説明はマニュアルを。パラメーターはいずれも後から変更できるので、よくわからなかったらデフォルトのままでいいと思います。

ログストリームの作成

CCDCはイベントログと診断ログ(diagnostic log)の書き出し先としてそれぞれ個別のz/OSログストリームを用います。CCDC113.USERSAMP(CECCDSLS)を編集・実行してz/OSログストリームを作成。併せてSMSデータクラスを定義。
z/OSログストリームはCF上に作成するかDASD上に作成するかという選択肢があるのですが、CCDCの場合複数システムで共有することはないためDASD上での作成が推奨されています。

ちなみにサイズ見積りのBest Practiceがマニュアル上で公開されていて、サンプルJCLで作成されるz/OSログストリームは小さすぎると言われています。ガチで環境構築するのならこちらを見ておくといいでしょう。

The shipped sizing for the diagnostic and event logs is generally too small.
Best practices - IBM Documentation

今回はゆるゆるテスト環境なのでサンプルの指定値そのままで。

zFSメタデータカタログを作成

CCDCがマッピング情報などのメタデータを管理するメタデータカタログを作成します。
カタログのフォーマットとしてzFSファイル, VSAM Linearデータセット, PSファイルが選択できるのですが、可能ならばzFSファイルを使うのが最も苦労が少なくおすすめです。
CCDC113.USERSAMP(CECCRZCT)を編集してVSAMデータセットCCDC113.ZFSを作成、アグリゲートします。
しかるのちに/opt/IBM/isclassic113/catalogをmkdirして先ほどのCCDC113.ZFSへマウント。
そしてCCDC113.USERSAMP(CECCDCAT)を流してメタデータカタログを作成します。

サブスクリプションとレプリケーション・マッピングのデータセットを作成

CCDC113.USERSAMP(CECCDSUB)によってVSAMデータセットCCDC113.CDCSRC.SUBCCDC113.CDCSRC.RMを作成。それぞれサブスクリプションとレプリケーション・マッピングが格納されます。

構成ファイル用データセットを作成

CCDC113.USERSAMP(CECCDCFG)によってCCDC113.CDCSRC.CACCFGDCCDC113.CDCSRC.CACCFGXを作成。構成(config)情報が格納されます。

ソースサーバー起動確認

CCDCソースサーバー起動JCLCCDC113.USERSAMP(CECCDSRC)を実行し、起動を確認します。
確認できたのでCECCDSRCをJES2起動用のPROCLIBUSER.Z25C.PROCLIBへコピーしました。

メタデータカタログの稼働確認

ここではインストール検査用のサンプルJCLCCDC113.USERSAMP(CECCDVCD)を流してメタデータカタログがちゃんと機能していることを確認するのですが、その前に準備が必要です。

メタデータカタログはDb2のような権限体系を持っており、ユーザーIDに権限が紐づけられます。このユーザーIDはRACFユーザーIDです。
今回はユーザーIDIBMUSER/パスワードIBMを使います。
管理ユーザーの割当てに先立って、管理ユーザーとして使うRACFユーザーIDのパスワードを暗号化します。
CCDC113.USERCONF(CACPWDIN)を編集し、以下のように書いておきました。

PASSWORD=IBM

次にCCDC113.USERSAMP(CACENCRP)を実行。すると先ほどのCCDC113.USERCONF(CACPWDIN)の中身が以下のようになっています。

PASSWORD=IBM                 
ENCRYPTED=x'5ca4ccab612297f6'

こうなったら暗号化成功です。

上記のインストール検査用JCLではメタデータカタログにアクセスするための接続情報としてCCDC113.USERCONF(CACMUCON)を参照しています。このメンバーを編集し、以下を書き足しておきます。

USERID IBMUSER PASSWORD X'5ca4ccab612297f6'

最後にCCDC113.USERSAMP(CECCDSRC)を実行、RC=00ならば成功です。

IMS側のセットアップ

テスト用DBの準備

テスト用DBのDBDを編集し、以下のようにEXIT=ステートメントを書き足しておきます。

  DBD     NAME=APDB11,ACCESS=DEDB,RMNAME=DBFHDC40,                     X
               EXIT=(*,KEY,DATA,PATH,(CASCADE,KEY,DATA,PATH),LOG)       

細かい指定についてはIMS側のDBDステートメントのマニュアルに載っているのですが、基本的にCCDCによるIMS-to-RDBレプリケーションならこんな感じになるのではないかと思います。(IMS-to-IMSだと考えることが増えます)

DRAのセットアップ

CCDCはDRA(database resource adapter)接続によってIMSに対してDL/Iコールを発行し直接読取りを行うことができます。フルリフレッシュ機能はこの直接読取りを使用します。

まず、CCDCのSTEPLIBに入れておいてDRA接続に使用させるDRA startup tableモジュールを作成します。
MAXTHRD=には5、MINTHRD=には3以上を指定するようマニュアルに書かれているので従います。
私はこんな感じでモジュールDFSPZP01を作成しました:

//DFSPZPCM EXEC PROC=ASMDRA,MBR=DFSPZP01                                
//ASM.SYSIN DD *                                                        
PZP      TITLE 'DATABASE RESOURCE ADAPTER STARTUP PARAMETER TABLE'      
DFSPZP01 CSECT                                                          
         DFSPRP DSECT=NO,                                              X
               DDNAME=CCTLDD,     XXXXXXXX DDN FOR CCTL RESLIB DYNALOC X
               DSNAME=DFSF10.SDFSRESL,                                 X
               DBCTLID=IVP1,      NAME OF DBCTL REGION                 X
               USERID=,           XXXXXXXX NAME OF USER REGION         X
               MINTHRD=003,       XXX      MINIMUM THREADS             X
               MAXTHRD=005,       XXX      MAXIMUM THREADS             X
               TIMER=60,          XX       IDENTIFY TIMER VALUE - SECS X
               FPBUF=003,         XXX      FP FIXED BFRS PER THREAD    X
               FPBOF=005,         XXX      FP OVFLW BFRS PER THREAD    X
               SOD=X,             X        SNAP DUMP CLASS             X
               TIMEOUT=060,       XXX      DRATERM TIMEOUT IN SECONDS  X
               CNBA=0050,         XXX      TOTAL FP NBA BFRS FOR CCTL  X
               OPENTHRD=CCTL      XXX      OPEN THREAD DISABLE          
         END                                                            
//*                                                                     

次に、CCDCのDRATABLESUFFIXパラメーターに作成したモジュールのサフィックス(DFSPZPxxのxx部分)を指定します。

F CECCDSRC,SET,CONFIG,SERVICE=IMSDRA,DRATABLESUFFIX='01'               
CAC00200I SET,CONFIG,SERVICE=IMSDRA,DRATABLESUFFIX='01'                
CAC00243I SERVICE 'IMSDRA' OF SERVICE CLASS 'DRA' UPDATED SUCCESSFULLY.

上記はCCDC起動中にコマンドで指定した場合の例です。
上記「カスタマイズユーティリティー」の項のようにユーティリティーで設定しても、CCDC起動中にCDA(Classic Data Architect)から設定しても大丈夫です。

その後CCDCを再始動し、起動中のIMSに対してDRA接続に成功したことを確認しました。

CAC00136I DRA: CONNECTED TO IMS DBCTL 'IVP1'                       
CAC00138I DRA: CONNECTION USING OPEN THREAD TCB                    
/DIS CCTL ALL                                                      
DFS4445I CMD FROM MCS/E-MCS CONSOLE USERID=SUGI: DIS CCTL ALL IVP1 
DFS4444I DISPLAY FROM ID=IVP1 266                                  
    CCTL     PSEUDO-RTKN RECOVERY-TOKEN   REGID  PSBNAME   STATUS  
    DRAUSER                                                ATTACHED
     *23349/143709*                                                

余談:DRA startup tableの指定FPバッファー数が多すぎたときのこと

CCDCを立ち上げると自動で行われるはずのDRA接続が完了せず、リトライし続けていました。
診断ログ(デフォルトではClassic CDCサーバー領域のSYSPRINTにも書かれます)を見てみると、下記のエラーが出ていました。

2023-12-15-14.21.03.631758 RC(04), SpcRC(00570082), Data(00000000,00000000)              
   Node(34), Task(9217984)                                                               
   *ALL*, func DRAmain, line 607 in SYS22032.T144226.RA000.CACBLDC0.PH41278.H02(MSLCIDRA)
   'The DRA initialization failed.                                    '                  
   'DRA INIT PAPLSFNC=2(x02),PAPLRCOD=5(x05),                         '                  
   'PAPLRETC=-2147483592(x80000038)                                   '                  

IMSのマニュアルReason codes from DRA to the control exitPAPLSFNC=2(x02),PAPLRCOD=5(x05)を引いてみると「DBCTL returned an IMS abend code.」とあるのでIMSのアベンドコードを見に行きます。x0038=0056を見てみると、CCTLがFPバッファーの獲得に失敗したそうな。

テスト環境のIMSに割当てられているFPバッファー総量に対してDRAスタートアップ・テーブルで要求したFPバッファーの数が多すぎたのが原因でした。

FPバッファー数(FPBUF=/FPBOF=/CNBA=)を減らしてDRAスタートアップ・テーブルを再作成したところ、無事DRA接続に成功しました。

CAC00136I DRA: CONNECTED TO IMS DBCTL 'IVP1'                       
CAC00138I DRA: CONNECTION USING OPEN THREAD TCB                    
/DIS CCTL ALL                                                      
DFS4445I CMD FROM MCS/E-MCS CONSOLE USERID=SUGI: DIS CCTL ALL IVP1 
DFS4444I DISPLAY FROM ID=IVP1 266                                  
    CCTL     PSEUDO-RTKN RECOVERY-TOKEN   REGID  PSBNAME   STATUS  
    DRAUSER                                                ATTACHED
     *23349/143709*                                                

さて、ここからは仮想z/OSの外での作業です。ここから先はあまり筆者を信用しないでください。

Db2のインストール

こちらの記事をありがたく参考にさせていただきました。
【備忘録】Db2 インストール手順まとめ(Linux)

CDC for Db2のインストールとセットアップ

製品インストール

適当なディレクトリを掘り、DLした"IBM InfoSphere Data Replication V11.4 CDC for all Linux x86 Agents Multilingual"を放り込んで解凍。
セットアップモジュールsetup-iidr-11.4.0.0-5001-linux-x86.binを実行します。
マニュアル"Installing the CDC Replication Engine for Db2® Database using an interactive installation (UNIX and Linux)"を参考にしながら…

  • 「ロケールの選択」で「2- 日本語」を選択。
  • 「データ・ストア・タイプの選択」で「2- IBM DB2」を選択。
  • 「オファリングの選択」で「4- IBM InfoSphere Data Replication」を選択。
  • 最後に「構成ツールを起動しますか?」に対して「1=はい」を選択。

CDCインスタンス作成

新規インスタンスの名前はなんでもいいのですが、今回は「idrdb2」としました。
ポート番号はデフォルトの10901をそのまま使います。
ターゲットとするDb2インスタンスおよびデータベースを選択、ターゲットDb2データベースへのアクセスに使用するユーザー名やメタデータ表のスキーマを選択します。

私はDb2インストール時に作ったdb2inst1を使ったのですが、詳しい人が見たらけしからんことをしているかもしれません。ごめんね。

    インスタンス idrdb2 が正常に作成されました。

    インスタンス idrdb2 を今すぐ開始しますか (y/n)?y

    インスタンス idrdb2 を開始しています。 お待ちください...

    インスタンス idrdb2 が正常に開始されました。 Enter キーを押してメインメニューに移動してください...


    メインメニュー
    --------------
    1. 現行インスタンスのリスト
    2. インスタンスの追加
    3. インスタンスの編集
    4. インスタンスの削除
    5. インスタンスの統合
    6. 終了

    番号を入力してください:1


    現行インスタンスのリスト
    ------------------------

    名前      サーバー・ポート データベース  スキーマ    状況
    --------- ---------------- ------------- ----------- ------------
    idrdb2    10901            testdb        db2inst1    実行中

Access Serverのインストール

レプリケーションの定義や操作はManagement Consoleというワークステーション上のコンソールからリモートで行うことができるのですが、これらのクライアントに対してレプリケーションの定義や操作を提供するのがAccess Serverです。ソース/ターゲットと散らばる種々のレプリケーション・サーバーおよびそれらの間のレプリケーションを横断的に管理することができます。

これまたワークディレクトリーに放り込んだセットアップモジュールiidraccess-11.4-10014-linux-x86-setup.binを実行し、To install Access Server (UNIX and Linux)を見ながら、基本的にデフォルトを選択していきます。ポート番号もデフォルトの10101を使用。

インストールが完了したら以下のようにAccess Serverを始動し、

[ibmsys1@zvirsh work]$ /opt/IBM/InfoSphereDataReplication/AccessServer/bin/dmaccessserver &
[1] 751786

ユーザーアカウントを作成します。

[ibmsys1@zvirsh work]$ cd /opt/IBM/InfoSphereDataReplication/AccessServer
[ibmsys1@zvirsh AccessServer]$ bin/dmcreateuser admin admin admin-user admin SYSADMIN TRUE FALSE FALSE

構文はマニュアルにちゃんと載っていますが、上記の例はadminというユーザーを作成し、初期パスワードはadminです。

iptables設定

さて、ポート番号10901を使用するCDCインスタンスと10101を使用するAccess Serverをセットアップしたわけですが、ローカルのManagement ConsoleからAccess Serverへアクセスする前にiptablesをしかるべく設定してあげないといけません。

筆者の使用した環境はポートフォワードによって特定ポート以外は仮想z/OSへフォワードされるようになっていたので、

  • INPUTフィルタで10101と10901をACCEPTして、
  • 両者をポートフォワードから外す

という設定を施しました。

ZD&T環境のネットワーク構成については下記の記事に詳しいです。
クラウド上でのメインフレーム開発環境構築 - (7) ネットワーク構成補足

設定後、Management Consoleから環境の10101番ポートへ接続し、上記の「ユーザーアカウントを作成します」で作成したadminユーザーへログオンできれば成功です。

おわりに

z/OSのテスト環境やLinuxのテスト環境は持っていてもネットワーク的な問題で気軽に両者間のレプリケーションをテストできないというシチュエーションは少なくないのではないでしょうか。筆者はまさにその状況でした。そうしたときにLinux上で仮想z/OSをエミュレートできるZD&Tは願ったりでした。

実際はこのあとCCDC側でIMSDBのマッピングをしてManagement Consoleからサブスクリプションを作ってという過程を経てレプリケーションのテストをしました。それ以降もちょっとした機能テストやスキルトランスファーに役立ってくれています。

なおZD&T自体については筆者も大変お世話になった下記の記事シリーズでとても丁寧に解説されています。冒頭でもリンクしましたが再掲とともに改めてお礼申し上げます。

ZD&Tにはいくつかエディションがありますが、ZD&T Enterprise Edition(ZD&T EE)はクラウド環境で稼働させることができるので、実際にIBM Cloudの仮想サーバー(IaaS)を使ってZD&Tを動かすということをやってみたいと思います。
クラウド上でのメインフレーム開発環境構築 - (1) 仮想サーバー作成

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0