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
CLUSTERPRO 作業報告書
1. 概要
1.
概要
この文書は、
Server Express 2.2 J の動作環境を Turbolinux 8 CLUSTERPRO SE によるクラスタ上に作成し、クラスタの動作
検証を行った際の手順を記載するものである。
作業場所
作業場所
郵便番号
:
住所
:
御担当者名
:
連絡先
:
作業日
:
作業者
作業者
会社名
:
マイクロフォーカス株式会社
ターボリナックス株式会社
この文章は
Server Express を CLUSTERPRO によりクラスタ化するための設定例を示すことにより、システムインテグレーショ
ン時の留意事項をまとめたものであり、
Server Express や CLUSTERPRO の動作保証をするものではありません。
CLUSTERPRO 作業報告書
2. 対象システム
2. 対象システム
2.1. ハードウェア構成
対象システムのハードウェア構成
項目
項目
内容
内容
メーカー名
DELL
製品名
PowerEdge 1300
プロセッサ
CPU
Pentium III
チップセット
メモリ
256MB
CLUSTERPRO 作業報告書
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
CLUSTERPRO 作業報告書
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. クラスタの設定
クラスタの設定内容は以下の通り。
項目
項目
内容
内容
スーパークラスタ名
SuperCluster
ネットワークパーティション
ディスク
###NEC_NP1
COM ポート
-
サブクラスタ
サブクラスタ名
SubCluster
サーバ
qa-230 , qa-231
グループ
MFSE
CLUSTERPRO 作業報告書
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/fstabNP ###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
CLUSTERPRO 作業報告書
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/fixpacks/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 用グループがアクティブなサーバからコピーを実行する。
スクリプト ディレクトリパス
/mnt/raid1/mfdata
COBOL Server 用スクリプト
StartUp.sh
CLUSTERPRO 作業報告書
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 &
CLUSTERPRO 作業報告書
4. アプリケーションの設定
4.3. CLUSTERPRO の設定(アプリケーションの起動/停止)
起動
/停止用スクリプトを CLUSTERPRO マネージャから編集する。
※本検証では斜体文字部分を追記。
COBOL Server の起動および停止のスクリプトを定義。
start.bat #! /bin/sh #*************************************** #* START.BAT * #*************************************** if [ "$ARMS_EVENT" = "START" ] then if [ "$ARMS_DISK" = "SUCCESS" ] then armlog "NORMAL1"MOUNTPOINT=`armlsmnt -l $ARMS_RESOURCELIST`
cd $MOUNTPOINT/mfdata; ./StartUp.sh
if [ "$ARMS_SERVER" = "HOME" ] then armlog "NORMAL2" else armlog "ON_OTHER1" fi elsearmlog "ERROR_DISK from START" fi
elif [ "$ARMS_EVENT" = "RECOVER" ] then
armlog "RECOVER"
elif [ "$ARMS_EVENT" = "FAILOVER" ] then if [ "$ARMS_DISK" = "SUCCESS" ] then armlog "FAILOVER1"
MOUNTPOINT=`armlsmnt -l $ARMS_RESOURCELIST`
cd $MOUNTPOINT/mfdata; ./StartUp.sh
if [ "$ARMS_SERVER" = "HOME" ] then armlog "FAILOVER2" else armlog "ON_OTHER2" fi elsearmlog "ERROR_DISK from FAILOVER" fi else armlog "NO_ARM" fi armlog "EXIT" exit 0
CLUSTERPRO 作業報告書
4. アプリケーションの設定
stop.bat #! /bin/sh #*************************************** #* STOP.BAT * #*************************************** arm_rel_path() { while [ "$1" != "" ] doarmrelpath $1 > /dev/null 2>&1 relret=$?
if [ "$relret" = "0" ] then
armlog "KILL NO PROCESS" elif [ "$relret" = "1" ]
then
armlog "KILL SOME PROCESS" else
armlog "ARMRELPATH ERROR" fi shift done } arm_rel_mntpoint() { mntpoint=`armlsmnt -l $ARMS_RESOURCELIST` mntret=$? if [ "$mntret" = "0" ] then if [ "$mntpoint" != "" ] then arm_rel_path $mntpoint else
armlog "NO MOUNT POINT" fi
else
armlog "ARMLSMNT ERROR" fi } if [ "$ARMS_EVENT" = "START" ] then if [ "$ARMS_DISK" = "SUCCESS" ] then armlog "NORMAL1"
killall -9 cobjrun
if [ "$ARMS_SERVER" = "HOME" ] then armlog "NORMAL2" else armlog "ON_OTHER1" fi arm_rel_mntpoint elsearmlog "ERROR_DISK from START" fi
elif [ "$ARMS_EVENT" = "FAILOVER" ] then if [ "$ARMS_DISK" = "SUCCESS" ] then armlog "FAILOVER1"
killall -9 cobjrun
if [ "$ARMS_SERVER" = "HOME" ]CLUSTERPRO 作業報告書
4. アプリケーションの設定
armlog "FAILOVER2" else armlog "ON_OTHER2" fi arm_rel_mntpoint elsearmlog "ERROR_DISK from FAILOVER" fi else armlog "NO_ARM" fi armlog "EXIT" exit 0
CLUSTERPRO 作業報告書
5. クラスタ構成の検証
5. クラスタ構成の検証
Server Express のクラスタ構成での動作、およびリソースの引継ぎが正常に行われることを確認。
5.1. 検証項目
クラスターサーバ上で稼働する
Server Express に対して行った検証項目および、検証結果は以下の通り。
内容は 「
5.2 検証内容」 を参照。
No
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 の呼び出し(待機系)
CLUSTERPRO 作業報告書
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 CUST-MASTER INVALID CONTINUE END-READ WHEN 2 WRITE CUST-REC INVALID CONTINUE END-WRITE WHEN 3 REWRITE CUST-REC INVALID CONTINUE END-REWRITE WHEN 4 DELETE CUST-MASTER INVALID CONTINUE END-DELETE END-EVALUATE. CLOSE 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.
CLUSTERPRO 作業報告書
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("顧客名");
CLUSTERPRO 作業報告書
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);
CLUSTERPRO 作業報告書
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)