InterSystemsデヌタベヌスミラヌリング。 ミラヌの䜜成ずテスト。 パヌト2

前のパヌトでは、ミラヌチュヌニングに぀いお怜蚎したした。これは、InterSystems Database Mirroring DBMSCachéの高可甚性テクノロゞです。
この蚘事では、䞭断倱敗のシナリオず、それらに察するミラヌの反応に぀いお怜蚎したす。

䌑憩は蚈画的でも蚈画倖でもかたいたせん。
スケゞュヌルされたものは、オペレヌティングシステム、DBMSバヌゞョン、アプリケヌションシステムバヌゞョンを曎新するためにサヌバヌを停止する必芁があり、プロセスを制埡する堎合です。

スケゞュヌルされた䌑憩の䟋


予定倖-サヌバヌが情報システムのクラむアントず、私たちの知識なしで動䜜するこずができなくなる䜕かが起こるずき。 この理由は次のずおりです。



フェむルオヌバヌ

Cachéミラヌの自動フェむルオヌバヌは、プラむマリサヌバヌで障害/䞭断が発生した堎合にのみ発生したす。この蚘事では、このような堎合のみを怜蚎したす。 もちろん、バックアップサヌバヌで問題が発生するシナリオもありたすが、この堎合、IPは匕き続き機胜し、管理者が手動でバックアップサヌバヌを埩元するたで物理的なミラヌリングはありたせん。 䞡方のサヌバヌがすぐに障害を起こした堎合、別のシナリオが可胜です。ただし、この堎合、IPの動䜜の䞭断は避けられず、その決枈は「手動」で実行されたす。

自動克服障害の基本的なシナリオ

  1. プラむマリサヌバヌは、ミラヌ化されたデヌタベヌスの1぀ず連携するISクラむアントに察応し、バックアップサヌバヌは「スタンバむ」状態になりたす。
  2. プラむマリサヌバヌで障害が発生したした。
  3. バックアップサヌバヌは、プラむマリサヌバヌが「ダりン」状態にあるこずを確認し、自動的にプラむマリサヌバヌになり、情報システムのクラむアントにサヌビスを提䟛し続けたす。
  4. 以前のプラむマリサヌバヌは管理者などによっお埩元され、新しいバックアップサヌバヌになり、新しいプラむマリサヌバヌの「スタンバむ」モヌドに入りたす。

䜕がおかしいのでしょうか
プラむマリサヌバヌでネットワヌクむンタヌフェむスに障害が発生したが、長くは続かない状況を想像しおください。ただし、バックアップサヌバヌがプラむマリサヌバヌになるこずを「決定」するだけで十分です。 結果は、スプリットブレむンの状況です。

スプリットブレむン

スプリットブレむン -䞡方のサヌバヌが動䜜しおいお、それぞれが珟圚プラむマリであるず考えおいる堎合、 脳 がんはクラスタヌサヌバヌの完党な非同期状態です。
このような状況は、たずえば、バックアップサヌバヌがプラむマリサヌバヌが「ダりン」しおいるず「誀っお」刀断した堎合に、クラスタヌ内に同時に2぀のプラむマリサヌバヌが衚瀺され、ナヌザヌリク゚ストを同時に凊理しようずする-クラスタヌの厩壊。
IPナヌザヌの堎合、この状況は䜜業の無期限の䞭断で衚され、管理者が手動で埩元したす。
この状況から回埩する最も速い方法は、バックアップたたは非同期の「ミラヌ」からデヌタを埩元するこずにより、クラスタヌを再䜜成するこずです。

AgentContactRequiredForFailover

障害/䞭断時のCachéミラヌの動䜜の決定的な芁因は、AgentContactRequiredForFailover = yes / noパラメヌタヌの倀です。

AgentContactRequiredForFailover = yes

AgentContactRequiredForFailoverACRF= yesデフォルトずフェヌルオヌバヌの堎合、䞡方のサヌバヌのISC゚ヌゞェントが䞭断時に接続しおいる必芁がありたす。 この状況は、キャッシュの予定倖の障害、キャッシュの予定された再起動、OSの予定された再起動の堎合に可胜です。 したがっお、このモヌドでは、他のすべおの堎合、自動フェむルオヌバヌは発生したせん

AgentContactRequiredForFailover = no

ミラヌリングのこの動䜜モヌドにより、サヌバヌ゚ヌゞェント間のオンラむン接続がなくおもフェヌルオヌバヌを実行できたす。 このモヌドは、プラむマリサヌバヌずの接続がない堎合に、プラむマリサヌバヌの電源オフ、ネットワヌクアダプタヌたたはサヌバヌ間のネットワヌク自䜓の障害などの状況をカバヌするために必芁になる堎合がありたす。 このモヌドでは、バックアップサヌバヌをプラむマリサヌバヌの状態に自動的に切り替える決定は、領域SYSにあるZMIRRORプログラムのナヌザヌ機胜によっお決定されたす。

詊隓結果

もちろん、フェむルオヌバヌ゜リュヌションを構築する堎合、ほずんどの状況で障害を自動的に克服するこずが期埅されたす。 珟圚、Cachéミラヌは、考えられるほがすべおのシナリオを自動的に凊理できたす。
ACRF倀が異なるいく぀かの兞型的なシナリオで、ミラヌがどのように動䜜するかをテストしたした。
珟圚、Caché2012.2 RCの最新バヌゞョンをテストしたした。 はい-このシナリオの自動フェむルオヌバヌを意味したす。
NシナリオACRF =はいACRF =いいえ
1プラむマリでのCachéDBMSの蚈画的たたは緊急の再起動、シャットダりンはいはい
2OSのスケゞュヌルされた再起動はいはい
3OSの緊急停止、リセット、電源オフいやはい
4プラむマリのネットワヌクむンタヌフェむスを無効にするいやはい
5プラむマリずバックアップを同時にオフにし、最初にプラむマリを起動したすはいはい
6プラむマリずバックアップを同時にオフにしおから、最初のバックアップを起動したすいやいや

テスト結果によるず、刀明したした-䞍快なシナリオは、ネットワヌクむンタヌフェむスを無効にするこずです4。 したがっお、ミラヌサヌバヌ間に冗長ネットワヌクリンクを確立するこずをお勧めしたす。
サヌバヌ構成の䟋
画像
䞡方のサヌバヌで同時に障害が発生した堎合シナリオ5〜6電源​​の長時間の䞭断など、コミッショニングシヌケンスを遵守するこずが重芁です。プラむマリサヌバヌを最初にアクティブ化する必芁がありたす。 それ以倖の堎合、バックアップサヌバヌはプラむマリになり、前のプラむマリサヌバヌの起動埌、スプリットブレむンの結果ずしお、2぀のサヌバヌが存圚したす。

衚からわかるように、ACRF = yes既定倀のCaché同期ミラヌは、クラスタヌサヌバヌ間のネットワヌクが「アクティブ」である堎合にのみ、緊急事態を提䟛したす。
他の状況では、ACRF = noモヌドがありたす。管理者は、自己の責任においお、ナヌザヌプログラムZMIRRORを䜜成しお、プラむマリサヌバヌに障害が発生したかどうかを刀断したす。

Zmirror

ミラヌの最終むンストヌル甚にこのようなハヌドりェアず゜フトりェアのシステムを構築するこずは理論的に可胜です。どのシナリオでも、プラむマリサヌバヌの状態を゜フトりェア状態で䞀意に刀断できる堎合です。
サヌバヌでこの状況が発生した堎合は、モヌドをACRF = noに蚭定するこずをお勧めしたす。 その埌、ブレヌクが発生し、ISC゚ヌゞェントプラむマリサヌバヌずの通信がない堎合、システムは関数$$ IsOtherNodeDown ^ ZMIRRORを呌び出したす。 関数は1たたは0を返したす。関数がない堎合、たたは関数が0を返す堎合、自動フェヌルオヌバヌプロセスは終了したす。
$$ IsOtherNodeDown ^ ZMIRROR関数のカスタム実装を蚘述するずき、プログラマヌのタスクは、プラむマリサヌバヌが実際に倱敗し、この堎合1を返すこずを確実に確認するこずです。

ナヌザヌ関数ZMIRRORの䟋
Zmirror
; 自己責任で䜿甚しおください。
q

IsOtherNodeDown  public
{
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "------------> IsOtherNodeDown" 

{
s ip = "192.168.169.186"; 別のフェむルオヌバヌノヌドのアドレス

■ PingSuccessful = $ system .INetInfo 。 CheckAddressExist ip
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "IPアドレス" _ip_ "is" _
$ s PingSuccessful "available" 、1 "unavailable" _ "。" 
if 'PingSuccessful s returnValue = 1 q ; pingなし

s url = " " _ip_ "57772 / csp / sys / UtilHome.csp"
s stat = $$ GetStatus url
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、url_ "is" _stat_ "。" 
if stat [ "゚ラヌ" s returnValue = 1 q ;
s returnValue = 0

} catch e {
d ##クラス  Library.Device 。 ブロヌドキャスト  "" 、 e。DisplayString 
s returnValue = 0
}
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "Returning" _returnValue_ "..." 
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "<------------ IsOtherNodeDown" 
q returnValue
}

CheckBecomePrimaryOK  public
{
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "------------> CheckBecomePrimaryOK" 
{
s stat = $$ MemberDescription 
s returnValue = 1
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "This instance is" _stat
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "Returning" _returnValue_ "..." 
} catch e {
d ##クラス  Library.Device 。 ブロヌドキャスト  "" 、 e。DisplayString 
s returnValue = 0
}
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "<------------ CheckBecomePrimaryOK" 
q returnValue
}

NotifyBecomePrimary  public
{
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "------------> NotifyBecomePrimary" 
{
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "このむンスタンスは" _ $$ MemberDescription 
} catch e {
d ##クラス  Library.Device 。 ブロヌドキャスト  "" 、 e。DisplayString 
}
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "<------------ NotifyBecomePrimary" 
}

NotifyBecomePrimaryFailed  public
{
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "------------> NotifyBecomePrimaryFailed" 
{
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "このむンスタンスは" _ $$ MemberDescription 
} catch e {
d ##クラス  Library.Device 。 ブロヌドキャスト  "" 、 e。DisplayString 
}
d ##クラス  デバむス 。 ブロヌドキャスト  "" 、 "<------------ NotifyBecomePrimaryFailed" 
}

MemberDescription  ; ミラヌメンバヌのステヌタスを取埗する
q $ s  $ system .Mirror。IsMember  $ s  $ system .Mirror。IsBackup  "a backup" 、
$ system .Mirror 。 IsPrimary  「プラむマリ」 、
$ system .Mirror 。 IsAsyncMember  「非同期」 、
1 "䞍明" _ "member of" _ $ system .Mirror 。 MirrorName 、
1 「メンバヌではない」 

GetStatus URL
; url-address http// localhost57772 / csp / sys / UtilHome.csp
S $ ZT = "HttpError"
N A、ステヌタス、゚ラヌ、httprequest、ポヌト、コンテンツ、objlasterror
httprequest = ##クラス  Net.HttpRequest を蚭定したす。 新芏 
S A = $ P  $ p url、 "//" 、2、 "/" 、1 I A = "" Q "゚ラヌURL"
I A [ "" S ポヌト= $ P A、 "" 、2、A = $ P A、 "" 、1 httprequestを 蚭定し たす。 ポヌト =ポヌト
httprequestを 蚭定し たす。 サヌバヌ = a
S A = "/" _ $ P  $ p url、 "//" 、2、 "/" 、2,991
httprequestを 蚭定し たす。 タむムアりト = 3
httprequestを実行したす。 取埗 A
S ステヌタス= httprequest。 HttpResponse StatusLine
httprequestを実行したす。 閉じる 
i status = "" 、 $ g objlasterror '= "" g HttpError
q ステヌタス
HttpError I $ ZE [ "<無効なOREF>" Q "゚ラヌサヌバヌにアクセスできたせんか" _ $ ZE
DecomposeStatus ^apiOBJobjlasterror、.err
Q "゚ラヌ" _ $ G errerr


免責事項 このコヌドを䜿甚しおも、ACRF =いいえの実皌働構成での自動フェむルオヌバヌは保蚌されたせん。 このモヌドを実際に䜿甚するには、構成ごずに培底的なフェヌルオヌバヌテストが個別に必芁です。

ミラヌのヒント

InterSystemsデヌタベヌスミラヌリング゚クスペリ゚ンスからのいく぀かの掚奚事項

「手動で「バックアップサヌバヌがオフになっおいる堎合、プラむマリサヌバヌのログをクリアするこずはできたせん」」
確かに、そうしおもバックアップサヌバヌが必芁なログを取埗できなかった堎合は、バックアップサヌバヌを再床䜜成できたす。

「プラむマリサヌバヌの実行䞭は、バックアップサヌバヌを長時間オフにするこずはできたせん」
この堎合、同期されおいないログのオヌバヌフロヌにより、プラむマリサヌバヌのディスク領域が䞍足する可胜性がありたす。

「サヌバヌの時刻を同期する必芁がありたす」
これは単玔な条件ですが、満たす必芁がありたす。 それ以倖の堎合、たずえば数時間の同期解陀䞭に、バックアップサヌバヌはログの関連性ず「混乱」したす。 その結果、バックアップサヌバヌを再床䜜成したす。

「サヌバヌ間のネットワヌクをアンロヌドする必芁がありたす」
ネットワヌクを介しお、ログは垞にプラむマリサヌバヌからバックアップに転送されたす。 サヌバヌ間のネットワヌクがただビゞヌ状態であるか、チャネルがデヌタ転送に十分でない堎合、プラむマリサヌバヌは「スロヌダりン」を開始し、ISナヌザヌが入力したデヌタを転送する時間がありたせん。

「システム構成蚭定、マッピング、ロヌルおよびナヌザヌ蚭定は手動で同期する必芁がありたす」
グロヌバル、クラス、パッケヌゞのマッピングの蚭定、およびプラむマリサヌバヌずバックアップサヌバヌの圹割、ナヌザヌ、システム構成のすべおの蚭定も同期する必芁がありたす。 ミラヌは、ミラヌリング甚に遞択されたデヌタベヌスのみを同期したす。 したがっお、ミラヌ管理者は同じ構成、マッピング、およびナヌザヌセキュリティポリシヌを持ち、プラむマリサヌバヌずバックアップサヌバヌのこの状態を維持する必芁がありたす。

運甚特性

フェヌルオヌバヌに必芁な゚ヌゞェントコンタクトの自動フェヌルオヌバヌの平均実行時間= yesは10〜20秒です。 10〜20秒の䞀時停止は、アプリケヌションが新しいサヌバヌで匕き続き動䜜する時間です。 この堎合、接続が再接続するサヌバヌぞの盎接接続があった堎合か、䜜業がECP接続を介しお行われた堎合、単に動䜜を継続したす。
ACRF = noの堎合、䞀時停止は平均35〜40秒です。 この堎合、ECPクラむアントは接続を倱いたす。 ECPのデフォルトのタむムアりト= 30秒。 SYSTEM ^ZSTARTのECPクラむアントサヌバヌでECPずACRF = noのミラヌを䜿甚するシステムの堎合、ECPタむムアりトを増加させるコヌドを䜜成するこずをお勧めしたす。

$ system .ECPを実行し たす。 SetProperty  "ECPRecoveryTimout" 、90

䞀番䞋の行たたは「それが必芁」

この質問に答えお、「はい」ず蚀いたす。 「すぐに䜿甚できる」もの、぀たりACRF = yesモヌドを䜿甚しおも、OS、Caché、ハヌドりェアなどの曎新に関するスケゞュヌルされた䜜業を実行できたす。 情報システムのノンストップ操䜜、およびCachéDBMSの障害の自動克服。 残りのシナリオは、必芁な数の「小数点以䞋9」のハヌドりェアフェヌルオヌバヌクラスタヌず無停電電源システムの助けを借りお、既知の手段でカバヌできたす。

Source: https://habr.com/ru/post/J149248/


All Articles