ETERNUS SF AdvancedCopy Manager 運用手引書 13.2 - Microsoft(R) Windows(R) 2000 - - Microsoft(R) Windows Server(R) 2003 -
目次 索引 前ページ次ページ

付録C レプリケーションの前後処理> C.2 レプリケーションの前後処理

C.2.3 レプリケーション実行時の後処理

後処理スクリプトには複写元ボリューム用(RepSrcPost.js)と複写先ボリューム用(RepDstPost.js)が存在し、以下のディレクトリ配下に格納されています。処理の必要性に応じてスクリプトをカスタマイズしてください。

RepSrcPost.js(複写元ボリューム後処理スクリプト)

  1: // AdvancedCopy Manager for Windows
  2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006
  3: //
  4: // RepSrcPost.js: Post-Processing Script for Replication(Source)
  5: //
  6: // [Parameters]
  7: // 1st argument: device name of source volume
  8: //
  9: // [Return Values]
 10: // 0: The script ended normally.
 11: // 2: The number of the arguments is incorrect.
 12: // (1,3): unused, but must not be used because older versions use this value.
 13: // 4: An error other than the above occurred.
 14: 
 15: try {
 16:     // create global objects
 17:     var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
 18:     var WshEnv   = WshShell.Environment("PROCESS");                    // create Environment object
 19:     var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
 20: 
 21:     // create SwstReplicationPostProc object
 22:     var proc = new SwstReplicationPostProc();
 23: 
 24:     // do nothing if postprocessing file exists
 25:     if (fsObj.FileExists(proc.postFileName) == false) {
 26:         SwstQuit(0);
 27:     }
 28: 
 29:     // get postprocessing type
 30:     var postProcType = proc.getPostProcData(proc.postFileName);
 31:     switch(postProcType) {
 32:     case "none":
 33:         proc.doNothing();
 34:         break;
 35:     }
 36: 
 37:     // clear temporary files
 38:     proc.deletePostFile(proc.postFileName);
 39:     SwstQuit(0);
 40: } catch (e) {
 41:     SwstQuit(9);
 42: }
 43: 
 44: function SwstReplicationPostProc()
 45: {
 46:     // member variables
 47:     this.svName    = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of source volume
 48:     this.postFileName = getDataPathName() + "\\" + getPutFileName(this.svName) + ".spre"; // name of postprocessing file
 49: 
 50:     // member functions
 51:     this.getPostProcData     = getPostProcData;     // self-explanatory
 52:     this.doNothing           = doNothing;           // self-explanatory
 53:     this.deletePostFile      = deletePostFile;      // self-explanatory
 54: }
 55: 
 56: function getPostProcData(postfile)
 57: {
 58:     var iomode = 1;     // means read-only mode
 59:     var create = false; // means not to create a file
 60:     var postFileStream = fsObj.OpenTextFile(postfile, iomode, create);
 61:     var postData = postFileStream.ReadLine();
 62:     postFileStream.Close();
 63:     return postData;
 64: }
 65: 
 66: function doNothing()
 67: {
 68:     // do nothing
 69: }
 70: 
 71: function deletePostFile(postfile)
 72: {
 73:     if (fsObj.FileExists(postfile) == true) {
 74:         fsObj.DeleteFile(postfile);
 75:     }
 76: }
 77: 
 78: function SwstQuit(exitStatus)
 79: {
 80:     switch(exitStatus) {
 81:     case 0:
 82:         WScript.Quit(0);
 83:     case 1:
 84:         WScript.Echo("[Replication Postprocessing] The number of the arguments is incorrect.");
 85:         WScript.Quit(2);
 86:     default:
 87:         WScript.Echo("[Replication Postprocessing] The script exited abnormally.");
 88:         WScript.Quit(4);
 89:     }
 90: }
 91: 
 92: function getDataPathName()
 93: {
 94:     return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\repl\\data\\DEFAULT";
 95: }
 96: 
 97: function getBinPathName()
 98: {
 99:     return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin";
100: }
101: 
102: function getSetupInfoKey()
103: {
104:     var nodeName = WshEnv.Item("SWSTGNODE");
105:     if( nodeName != "" ){
106:         return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
107:     }
108:     return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
109: }
110: 
111: function getPutFileName(deviceName){
112:     var fileName;
113:     if( isSafeDISKName(deviceName) ){
114:         var re = /(\S+)\/(\S+):(\S+)/;
115:         fileName = deviceName.replace(re, "$1_$2_$3");
116:     }else{
117:         fileName = deviceName;
118:     }
119:     return(fileName);
120: }
121: 
122: function getGXDXPX(deviceName){
123:     var gXdXpX;
124:     if( isSafeDISKName(deviceName) ){
125:         var re = /(\S+)\/(\S+):(\S+)/;
126:         gXdXpX = deviceName.replace(re, "$3");
127:     }else{
128:         gXdXpX = deviceName;
129:     }
130:     return(gXdXpX);
131: }
132: 
133: function isSafeDISKName(deviceName){
134:     var key = ":g";
135:     var s = deviceName.indexOf(key);
136:     if ( s < 0 ) {
137:         return (false);
138:     } else {
139:         return (true);
140:     }
141: }

RepDstPost.js(複写先ボリューム後処理スクリプト)

  1: // AdvancedCopy Manager for Windows
  2: // All Rights Reserved, Copyright FUJITSU LIMITED, 2002-2006
  3: //
  4: // RepDstPost.js: Post-Processing Script for Replication(Destination)
  5: //
  6: // [Parameters]
  7: // 1st argument: device name of destination volume
  8: //
  9: // [Return Values]
 10: // 0: The script ended normally.
 11: // 2: The number of the arguments is incorrect.
 12: // (1,3,5-7): unused, but must not be used because older versions use these values.
 13: // 4: An error other than the above occurred.
 14: 
 15: try {
 16:     // create global objects
 17:     var WshShell = WScript.CreateObject("WScript.Shell");              // create Shell object
 18:     var WshEnv = WshShell.Environment("PROCESS");                      // create Environment object
 19:     var fsObj    = WScript.CreateObject("Scripting.FileSystemObject"); // create FileSystemObject object
 20: 
 21:     // create SwstReplicationPostProc object
 22:     var proc = new SwstReplicationPostProc();
 23: 
 24:     // do nothing if postprocessing file exists
 25:     if (fsObj.FileExists(proc.postFileName) == false) {
 26:         SwstQuit(0);
 27:     }
 28: 
 29:     // get postprocessing type
 30:     var postProcType = proc.getPostProcData(proc.postFileName);
 31:     switch(postProcType) {
 32:     case "none":
 33:         proc.doNothing();
 34:         break;
 35:     }
 36: 
 37:     // clear temporary files
 38:     proc.deletePostFile(proc.postFileName);
 39:     SwstQuit(0);
 40: } catch (e) {
 41:     SwstQuit(9);
 42: }
 43: 
 44: function SwstReplicationPostProc()
 45: {
 46:     // member variables
 47:     this.dvName    = WScript.Arguments.length!=1?SwstQuit(1):WScript.Arguments.Item(0); // device name of destination volume
 48:     this.postFileName = getDataPathName() + "\\" + getPutFileName(this.dvName) + ".dpre";   // name of postprocessing file
 49: 
 50:     // member functions
 51:     this.getPostProcData     = getPostProcData;     // self-explanatory
 52:     this.doNothing           = doNothing;           // self-explanatory
 53:     this.deletePostFile      = deletePostFile;      // self-explanatory
 54: }
 55: 
 56: function getPostProcData(postfile)
 57: {
 58:     var iomode = 1;     // means read-only mode
 59:     var create = false; // means not to create a file
 60:     var postFileStream = fsObj.OpenTextFile(postfile, iomode, create);
 61:     var postData = postFileStream.ReadLine();
 62:     postFileStream.Close();
 63:     return postData;
 64: }
 65: 
 66: function doNothing()
 67: {
 68:     // do nothing
 69: }
 70: 
 71: function deletePostFile(postfile)
 72: {
 73:     if (fsObj.FileExists(postfile) == true) {
 74:         fsObj.DeleteFile(postfile);
 75:     }
 76: }
 77: 
 78: function SwstQuit(exitStatus)
 79: {
 80:     switch(exitStatus) {
 81:     case 0:
 82:         WScript.Quit(0);
 83:     case 1:
 84:         WScript.Echo("[Replication Postprocessing] The number of the arguments is incorrect.");
 85:         WScript.Quit(2);
 86:     default:
 87:         WScript.Echo("[Replication Postprocessing] The script exited abnormally.");
 88:         WScript.Quit(4);
 89:     }
 90: }
 91: 
 92: function getDataPathName()
 93: {
 94:     return WshShell.RegRead(getSetupInfoKey() + "\\etcPathName") + "\\etc\\repl\\data\\DEFAULT";
 95: }
 96: 
 97: function getBinPathName()
 98: {
 99:     return WshShell.RegRead(getSetupInfoKey() + "\\PathName") + "\\bin";
100: }
101: 
102: function getSetupInfoKey()
103: {
104:     var nodeName = WshEnv.Item("SWSTGNODE");
105:     if( nodeName != "" ){
106:         return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion\\" + nodeName;
107:     }
108:     return "HKEY_LOCAL_MACHINE\\SOFTWARE\\Fujitsu\\AdvancedCopy Manager\\CurrentVersion";
109: }
110: 
111: function getPutFileName(deviceName){
112:     var fileName;
113:     if( isSafeDISKName(deviceName) ){
114:         var re = /(\S+)\/(\S+):(\S+)/;
115:         fileName = deviceName.replace(re, "$1_$2_$3");
116:     }else{
117:         fileName = deviceName;
118:     }
119:     return(fileName);
120: }
121: 
122: function getGXDXPX(deviceName){
123:     var gXdXpX;
124:     if( isSafeDISKName(deviceName) ){
125:         var re = /(\S+)\/(\S+):(\S+)/;
126:         gXdXpX = deviceName.replace(re, "$3");
127:     }else{
128:         gXdXpX = deviceName;
129:     }
130:     return(gXdXpX);
131: }
132: 
133: function isSafeDISKName(deviceName){
134:     var key = ":g";
135:     var s = deviceName.indexOf(key);
136:     if ( s < 0 ) {
137:         return (false);
138:     } else {
139:         return (true);
140:     }
141: }

ボリュームのロック/ロック解除処理、バッファフラッシュ処理はスクリプトではなく、コマンド内で実施されています。したがって、複写元前後処理スクリプト、複写先前後処理スクリプトは、複写元/複写先ボリュームのロック/ロック解除処理、バッファフラッシュ処理の直前、直後にそれぞれ実行されます。複写元/複写先前後処理スクリプトでは実質的に何も処理を実施していません。

[図: スナップショット型レプリケーション(OPC)の場合]

[図: 同期型レプリケーション(EC)の場合1:複写先ボリュームがクラスタシステムの共用ボリュームでない場合]

[図: 同期型レプリケーション(EC)の場合2:複写先ボリュームがクラスタシステムの共用ボリュームの場合]

複写元ボリュームおよび複写先ボリュームのレプリケーション前処理では、他アプリケーションとの一時的なアクセス競合を回避するために、ロック処理に失敗した場合、ロック処理のリトライを実施します。既定のリトライ回数を超えた場合、コマンドは異常終了します。この場合、複写元ボリューム、複写先ボリュームを使用しているプロセスが存在していますので、アプリケーションやサービスの停止を行う等の対処を実施して、他のプロセスからボリュームが使用されていない状態にしてください。なお、ボリュームロック動作指定ファイルと呼ばれる設定ファイルを作成することにより、規定のリトライ回数の変更を行うことが可能ですが(詳細については、「複写元ボリュームロック動作指定ファイル」、「複写先ボリュームロック動作指定ファイル」を参照してください)、レプリケーション処理実行時に他のプロセスが処理対象ボリュームを使用しないための対策が適切に行われている場合は、通常これらのファイルを作成する必要はありません。

同期型レプリケーション(EC)かつコピー先ボリュームがクラスタシステムの共用ボリュームの場合、クラスタシステムの監視を回避するため、コピー先ボリュームのロック保持期間は複製開始コマンドおよび複製作成コマンドの動作中のみとなります(上図参照)。すなわち、複製開始コマンドの実行後から複製作成コマンドの実行前まではコピー先ボリュームはロックされません。これにより、「全般的な注意事項」の「イベントビューアに出力されるメッセージについて」に記載されているメッセージがイベントログに出力されることがありますが、問題はないため無視してください。

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2000-2008