Micro Focus Server Express + CLUSTERPRO - 検証報告書 - 2003 年 12 月 16 日版 ターボリナックス株式会社
目次 目次 1. 概要...3 2. 対象システム...4 2.1. ハードウェア構成...4 3. CLUSTERPRO の構築...5 3.1. OS のインストール...5 3.2. Turbolinux 8 CLUSTERPRO SE...6 3.2.1. CLUSTERPRO インストール準備...6 3.2.2. CLUSTERPRO のインストール...6 3.2.3. クラスタの設定... 6 4. アプリケーションの設定...8 4.1. Server Express のインストール...8 4.2. Server Express のクラスタ設定...8 4.3. CLUSTERPRO の設定 ( アプリケーションの起動 / 停止 )...10 5. クラスタ構成の検証...13 5.1. 検証項目...13 5.2. 検証内容...13 6. 付録...14 6.1. 検証用プログラムコード...14
1. 概要 1. 概要 この文書は Server Express 2.2 J の動作環境を Turbolinux 8 CLUSTERPRO SE によるクラスタ上に作成し クラスタの動作検証を行った際の手順を記載するものである 郵便番号 : 住所 : 御担当者名 : 連絡先 : 作業日 : 作業場所 会社名 : マイクロフォーカス株式会社 ターボリナックス株式会社 作業者 この文章は Server Express を CLUSTERPRO によりクラスタ化するための設定例を示すことにより システムインテグレーション時の留意事項をまとめたものであり Server Express や CLUSTERPRO の動作保証をするものではありません Page 3
2. 対象システム 2. 対象システム 2.1. ハードウェア構成 対象システムのハードウェア構成 メーカー名 項目 DELL 製品名 PowerEdge 1300 プロセッサ 内容 メモリ CPU チップセット Pentium III 256MB クラスタの構成図 Page 4
3. CLUSTERPRO の構築 3. CLUSTERPRO の構築 クラスタの構築手順を記載する 3.1. OS のインストール 各サーバに次の OS 製品をインストール 製品名 Turbolinux Enterprise Server 8 powered by UnitedLinux ( SP2a 適用 Kernel 2.4.19-304 ) なお インストール時に インストールステップで表示される インストールの設定 画面で ソフトウェア を選択して 詳細な選択 (D) をクリックし [C/C++ Compiler コンパイラーとツール ] を選択してインストール Turbolinux Enterprise Server 8 のインストールに関する詳細は 以下の URL 内インストール手順書を参照 URL : http://www.turbolinux.co.jp/products/cluster/cpro8/trial.html 評価版ご利用時のご参考資料 Turbolinux Enterprise Server 8 簡易インストール手順書 ネットワークの設定 クラスタサーバ 1 項目 インターフェース - eth0 パブリック LAN IP アドレス 192.168.3.230 ネットワーク 192.168.3.0 / 255.255.255.0 インターフェース - eth1 ホスト名 IP アドレス 10.1.1.1 インターコネクト ネットワーク 10.1.1.0 / 255.255.255.0 qa-230 内容 クラスタサーバ 2 項目 インターフェース - eth0 パブリック LAN IP アドレス 192.168.3.231 ネットワーク 192.168.3.0 / 255.255.255.0 インターフェース - eth1 ホスト名 IP アドレス 10.1.1.2 インターコネクト ネットワーク 10.1.1.0 / 255.255.255.0 qa-231 内容 OS インストール後に Service Pack 2 をインストール # mount /media/cdrom # cd /media/cdrom #./install_update_rpms.sh Page 5
3. CLUSTERPRO の構築 3.2. Turbolinux 8 CLUSTERPRO SE 各サーバに次の CLUSTERPRO をインストール 製品名 Turbolinux 8 CLUSTERPRO SE 3.2.1. CLUSTERPRO インストール準備 共有ディスクにクラスタ用のパーティションを作成する ここでは共有ディスクへの接続設定は完了しているものとする 片方のマシンから fdisk コマンドを実行し CLUSTER パーティションおよび WAS 用 DB2 用パーティションを作成する # fdisk /dev/sdb CLUSTER パーティション /dev/sdc1 10MB Server Express 用切替パーティション /dev/sdc8 11GB 3.2.2. CLUSTERPRO のインストール 各サーバに CLUSTERPRO のパッケージ clusterpro-2.1-1.3 をインストール # mount /media/cdrom # cd /media/cdrom/linux/server/se/2.1 # rpm -ivh clusterpro-2.1-1.3.i386.rpm 各サーバに SP2a 用 CLUSTERPRO SE アップデートモジュールを適用する 以下の URL よりアップデートモジュールをダウンロード ダウンロード先 http://www.turbolinux.co.jp/update/ 3.2.3. クラスタの設定 クラスタの設定内容は以下の通り スーパークラスタ名 項目 ネットワークパーティション ディスク COM ポート - サブクラスタ サブクラスタ名 サーバ グループ SuperCluster ###NEC_NP1 SubCluster qa-230, qa-231 MFSE 内容 Page 6
3. CLUSTERPRO の構築 フェイルオーバグループの設定 Server Express 用フェイルオーバグループの設定内容は以下の通り フェイルオーバグループ名 フェイルオーバ ポリシー リソース 項目 MFSE qa-230 qa-231 内容 仮想 IP アドレス 192.168.3.232/255.255.255.0 切替パーティション名切替パーティションマウントポイント名切替パーティションサイズファイルシステムマウントオプション /dev/sdc8 /mnt/raid1 11GB ext3 rw トレッキングツールでクラスタ情報を生成し クラスタを構築する CLUSTERPRO 用 fstab は以下の通り /etc/clusterpro/fstab NP ###NEC_NP1 /dev/sdc1 SW sdc8 /dev/sdc8 /mnt/raid1 ext3 rw WD ###NEC_NP1 /dev/sdc1 WD sdc8 /dev/sdc8 :fsckopt -y :mnttimeout 300 Turbolinux 8 CLUSTERPRO SE のインストール / 設定 ( スクリプトを除く ) に関する詳細は 以下の URL 内簡易設定手順書を参照 URL : http://www.turbolinux.co.jp/products/cluster/cpro8/trial.html 評価版ご利用時のご参考資料 Turbolinux 8 CLUSTERPRO SE トライアル版簡易設定手順書 Page 7
4. アプリケーションの設定 4. アプリケーションの設定 各サーバに Server Express をインストールし クラスタの設定を行う 4.1. Server Express のインストール 各サーバに次の Server Express をインストール 製品名 Micro Focus Server Express 2.2 J 各サーバに Server Express をインストールする Server Express 本体はデフォルトのインストール先 /opt/lib/cobol を使用 ライセンスデータベースはデフォルトのインストール先 /opt/lib/mflmf を使用 /opt は各サーバのローカルディスクに持つ注 )Server Express のライセンスデータベースは共有ディスクに持つことができません ライセンスデータベースを共有ディスクに置くと 待機系への切り替えでディスクが再マウントされるときに ライセンスのコピープロテクションメカニズムが検知して データベースの破損とみなされます ライセンスを各サーバにインストールする Micro Focus COP Framework を /mnt/raid1( 共有ディスク ) にインストールする 以下の URL よりダウンロード ダウンロード先 http://www.microfocus.co.jp/support/xpacks/cop_framework.html /mnt/raid1( 共有ディスク ) 上の COP Framework の配下に COBOL アプリケーションプログラムと アプリケーションデータファイルを配備する 6.1 検証用プログラムコード の サーバ側 COBOL プログラム 参照 Windows クライアントの準備 COBOL を呼び出す Java GUI クライアントとして使用 Java GUI から値を入力し サーバ側 COBOL アプリケーションが正しく値を受け取っていることを確認する 6.1 検証用プログラムコード の Windows クライアント側 Java プログラム 参照 4.2. Server Express のクラスタ設定 クラスタで使用する COBOL Server 用スクリプトを 以下のディレクトリにコピーする クラスタの Server Express 用グループがアクティブなサーバからコピーを実行する スクリプトディレクトリパス COBOL Server 用スクリプト /mnt/raid1/mfdata StartUp.sh Page 8
4. アプリケーションの設定 スクリプト本検証で使用した COBOL Server 用スクリプトは以下の通り デフォルトのスタートアップスクリプトを編集して使用 "&" を付加してバックグラウンド処理にする ">> COBOLSrv.log" を付加してコンソール出力をログファイルに出力 StartUp.sh #!/bin/sh COBDIR=/opt/lib/cobol export COBDIR JH=/usr/java/jre1.3.1_08 export JH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$COBDIR/lib:$JH/lib/i386:$JH/lib/i386/client export LD_LIBRARY_PATH PATH=$PATH:$COBDIR/cobbin:$JH/bin export PATH TERM=vt100 export TERM export CLASSPATH=COPClient.jar:$JH/lib/rt.jar:$CLASSPATH echo COBOL Server Starting `date` >> COBOLSrv.log cobjrun -jar COPServer.jar $* >> COBOLSrv.log 2>> COBOLSrv.log & Page 9
4. アプリケーションの設定 4.3. CLUSTERPRO の設定 ( アプリケーションの起動 / 停止 ) 起動 / 停止用スクリプトを CLUSTERPRO マネージャから編集する 本検証では斜体文字部分を追記 COBOL Server の起動および停止のスクリプトを定義 start.bat #! /bin/sh #*************************************** #* START.BAT * #*************************************** if [ "$ARMS_EVENT" = "START" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "NORMAL1" MOUNTPOINT=`armlsmnt -l $ARMS_RESOURCELIST` cd $MOUNTPOINT/mfdata;./StartUp.sh if [ "$ARMS_SERVER" = "HOME" ] armlog "NORMAL2" armlog "ON_OTHER1" armlog "ERROR_DISK from START" elif [ "$ARMS_EVENT" = "RECOVER" ] armlog "RECOVER" elif [ "$ARMS_EVENT" = "FAILOVER" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "FAILOVER1" MOUNTPOINT=`armlsmnt -l $ARMS_RESOURCELIST` cd $MOUNTPOINT/mfdata;./StartUp.sh if [ "$ARMS_SERVER" = "HOME" ] armlog "FAILOVER2" armlog "ON_OTHER2" armlog "ERROR_DISK from FAILOVER" armlog "NO_ARM" armlog "EXIT" exit 0 Page 10
4. アプリケーションの設定 stop.bat #! /bin/sh #*************************************** #* STOP.BAT * #*************************************** arm_rel_path() while [ "$1"!= "" ] do armrelpath $1 > /dev/null 2>&1 relret=$? if [ "$relret" = "0" ] armlog "KILL NO PROCESS" elif [ "$relret" = "1" ] armlog "KILL SOME PROCESS" armlog "ARMRELPATH ERROR" done shift arm_rel_mntpoint() mntpoint=`armlsmnt -l $ARMS_RESOURCELIST` mntret=$? if [ "$mntret" = "0" ] if [ "$mntpoint"!= "" ] arm_rel_path $mntpoint armlog "NO MOUNT POINT" armlog "ARMLSMNT ERROR" if [ "$ARMS_EVENT" = "START" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "NORMAL1" killall -9 cobjrun if [ "$ARMS_SERVER" = "HOME" ] armlog "NORMAL2" armlog "ON_OTHER1" arm_rel_mntpoint armlog "ERROR_DISK from START" elif [ "$ARMS_EVENT" = "FAILOVER" ] if [ "$ARMS_DISK" = "SUCCESS" ] armlog "FAILOVER1" killall -9 cobjrun if [ "$ARMS_SERVER" = "HOME" ] Page 11
4. アプリケーションの設定 armlog "FAILOVER2" armlog "ON_OTHER2" arm_rel_mntpoint armlog "ERROR_DISK from FAILOVER" armlog "NO_ARM" armlog "EXIT" exit 0 stop.bat lines 53-89/89 (END) Page 12
5. クラスタ構成の検証 5. クラスタ構成の検証 Server Express のクラスタ構成での動作 およびリソースの引継ぎが正常に行われることを確認 5.1. 検証項目 クラスターサーバ上で稼働する Server Express に対して行った検証項目および 検証結果は以下の通り 内容は 5.2 検証内容 を参照 No 項目 結果 1 スタートアップスクリプトによる COBOL Server の起動 OK 2 CLUSTERPRO マネージャによるグループの移動 OK 3 Windows クライアントからの COBOL の呼び出し ( 稼働系 ) OK 4 Windows クライアントからの COBOL の呼び出し ( 待機系 ) OK 5.2. 検証内容 検証の内容は以下の通り 1. スタートアップスクリプトによる COBOL Server の起動 CLUSTERPRO のスタートアップスクリプトより COBOL Server の起動が正常に完了することを確認 2. CLUSTERPRO マネージャによるグループの移動 CLUSTERPRO マネージャからグループの移動を実行し 待機系で正常に稼働することを確認 3. Windows クライアントからの COBOL の呼び出し ( 稼働系 ) 稼働系で COBOL Server を起動し Windows 上の Java クライアントから COBOL の呼び出しができることを確認 4. Windows クライアントからの COBOL の呼び出し ( 待機系 ) Windows 上の同一の Java クライアントから 待機系の COBOL 呼び出しが正常に行えることを確認 Page 13
6. 付録 6. 付録 6.1. 検証用プログラムコード 本検証で使用したプログラムは以下の通り サーバ側 COBOL プログラム CustCob.cbl $set REENTRANT(2) FILE-CONTROL. SELECT CUST-MASTER ASSIGN TO "CUST.dat" ORGANIZATION INDEXED RECORD KEY FS-CUSTID ACCESS MODE RANDOM. DATA DIVISION. FILE SECTION. FD CUST-MASTER. 01 CUST-REC. 05 FS-CustId PIC X(4) COMP-5. 05 FS-CustName PIC X(30). 05 FS-CustCompany PIC X(30). 05 FS-CustEmail PIC X(30). LINKAGE SECTION. 01 OPCODE PIC X(4) COMP-5. 01 CustId PIC X(4) COMP-5. 01 CustName PIC X(30). 01 CustCompany PIC X(30). 01 CustEmail PIC X(30). PROCEDURE DIVISION USING OPCODE CustId CustName CustCompany CustEmail. 1. DISPLAY "IN: CustId = ", CustId. OPEN I-O CUST-MASTER. MOVE CustId TO FS-CustId. MOVE CustName TO FS-CustName. MOVE CustCompany TO FS-CustCompany. MOVE CustEmail TO FS-CustEmail. EVALUATE OPCODE WHEN 1 READ END-READ WHEN 2 WRITE END-WRITE WHEN 3 REWRITE END-REWRITE WHEN 4 DELETE END-DELETE END-EVALUATE. CLOSE CUST-MASTER INVALID CONTINUE CUST-REC INVALID CONTINUE CUST-REC INVALID CONTINUE CUST-MASTER INVALID CONTINUE CUST-MASTER. DISPLAY "OUT: CustName = ", CustName. MOVE FS-CustId TO CustId. MOVE FS-CustName TO CustName. MOVE FS-CustCompany TO CustCompany. MOVE FS-CustEmail TO CustEmail. EXIT PROGRAM. Page 14
6. 付録 Windows クライアント側 Java プログラム CustJava.java import java.awt.*; import java.awt.event.*; import com.microfocus.cobol.cop.*; import com.microfocus.cobol.cop.lang.*; import java.io.*; import java.net.*; public class CustJava extends Frame // 画面上のコントロール MenuBar ApplicationMenu = new MenuBar(); Menu menu1 = new Menu(); Menu menu2 = new Menu(); MenuItem menuitem1 = new MenuItem(); MenuItem menuitem3 = new MenuItem(); MenuItem menuitem4 = new MenuItem(); MenuItem menuitem5 = new MenuItem(); MenuItem menuitem6 = new MenuItem(); Label label1 = new Label(); Label label2 = new Label(); Label label3 = new Label(); Label label4 = new Label(); Label label5 = new Label(); Label label6 = new Label(); TextField tf3 = new TextField(); TextField tf4 = new TextField(); TextField tf5 = new TextField(); TextField tf6 = new TextField(); public static void main(string[] args) CustJava frame = new CustJava(); frame.validate(); frame.setvisible(true); public CustJava() try jbinit(); catch (Exception e) e.printstacktrace(); //Component initialization private void jbinit() throws Exception this.setsize(new Dimension(600, 200)); this.settitle(" 顧客管理デモ Java 画面 "); ApplicationMenu.setHelpMenu(menu2); menu1.setlabel(" ファイル "); menuitem1.setlabel(" 終了 "); menu2.setlabel(" 処理選択 "); label1.setfont(new Font("Dialog", 1, 16)); label1.setalignment(1); label1.settext(" 顧客マスターメンテナンス "); label2.setalignment(0); label2.settext(""); label3.setalignment(0); label3.settext(" 顧客 No."); label4.setalignment(0); label4.settext(" 顧客名 "); label5.setalignment(0); Page 15
6. 付録 label5.settext(" 会社名 "); label6.setalignment(0); label6.settext("email"); menuitem3.setlabel(" 参照 "); menuitem4.setlabel(" 追加 "); menuitem5.setlabel(" 更新 "); menuitem6.setlabel(" 削除 "); menuitem6.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) menuitem6_actionperformed(e); ); menuitem5.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) menuitem5_actionperformed(e); ); menuitem4.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) menuitem4_actionperformed(e); ); menuitem3.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) menuitem3_actionperformed(e); ); menuitem1.addactionlistener(new java.awt.event.actionlistener() public void actionperformed(actionevent e) menuitem1_actionperformed(e); ); this.setlayout(new GridLayout(6,2)); ApplicationMenu.add(menu1); ApplicationMenu.add(menu2); this.setmenubar(applicationmenu); menu1.add(menuitem1); this.add(label1, null); this.add(label2, null); this.add(label3, null); this.add(tf3, null); this.add(label4, null); this.add(tf4, null); this.add(label5, null); this.add(tf5, null); this.add(label6, null); this.add(tf6, null); menu2.add(menuitem3); menu2.add(menuitem4); menu2.add(menuitem5); menu2.add(menuitem6); WindowListener listener = new WindowListener(); addwindowlistener(listener); class WindowListener extends WindowAdapter WindowListener() super(); Page 16
6. 付録 public void windowclosing(windowevent e) System.exit(0); private int call_cobol(int opcode) Pointer ptr; ClientRequest cop = new ClientRequest(); try cop.setmachine(inetaddress.getbyname("qa-232")); // ホスト名 "qa-232" は クラスタの仮想 IP アドレス 192.168.3.232 // にマップして hosts に定義しておく // 各ノードのホスト名を指定してはならない cop.setport(9200); // ポート番号 9200 は COBOL Server のデフォルト値 cop.connect(); catch(exception e) System.err.println("COBOL Server connection error : " + e.getmessage() + "\n"); return 1; ParameterList inparams = new ParameterList(); inparams.add(opcode).add(new Integer(tf3.getText())); inparams.add(new Pointer(tf4.getText(), 30)); inparams.add(new Pointer(tf5.getText(), 30)); inparams.add(new Pointer(tf6.getText(), 30)); ParameterList outparams = new ParameterList(); try cop.cobcall("custcob", inparams, outparams); catch(exception e) System.err.println("COBOL calling error : " + e.getmessage() + "\n"); return 2; Integer custid = (Integer) outparams.getargument(1); tf3.settext(custid.tostring()); ptr = (Pointer) outparams.getargument(2); tf4.settext(new String(ptr.getBytes())); ptr = (Pointer) outparams.getargument(3); tf5.settext(new String(ptr.getBytes())); ptr = (Pointer) outparams.getargument(4); tf6.settext(new String(ptr.getBytes())); return 0; void menuitem1_actionperformed(actionevent e) System.exit(1); void menuitem3_actionperformed(actionevent e) call_cobol(1); void menuitem4_actionperformed(actionevent e) Page 17
6. 付録 call_cobol(2); void menuitem5_actionperformed(actionevent e) call_cobol(3); void menuitem6_actionperformed(actionevent e) call_cobol(4); void this_windowclosed(windowevent e) System.exit(0); Page 18