ECPおよびプロセス管理API

比范的小容量の耇数のサヌバヌ間で負荷を分散する技術は、CachéDBMSの暙準機胜ずしお長い間䜿甚されおきたした。 分散キャッシュプロトコルECP゚ンタヌプラむズキャッシュプロトコルに基づいおいたす。 ここで意味するのは「キャッシュ」「キャッシュ」であり、「キャッシュ」「キャッシュE」ではありたせん。 ECPは、アプリケヌションシステムの氎平スケヌリングの豊富な機䌚を提䟛し、障害に察する高い抵抗力を維持しながら高いパフォヌマンスを提䟛し、プロゞェクト予算をかなり控えめなフレヌムワヌクのたたにしたす。 ECPネットワヌクの利点には、DBMS構成の䞭にアヌキテクチャの機胜を隠す可胜性が含たれるので、埓来の垂盎アヌキテクチャ甚に開発されたアプリケヌションは通垞、氎平ECP環境に容易に移行できたす。 この軜さはずおも魅力的で、垞にこのようにしたいです。 たずえば、珟圚のプロセスだけでなく「倖郚」のCachéプロセスを制埡する機胜には誰もが慣れおいたす。$ Jobシステム倉数および関連する関数ずクラスの熟緎者は、「驚異を働かせる」こずができたす。 停止したすが、プロセスは異なるCachéサヌバヌ䞊に配眮できたす...以䞋は、ECP環境でプロセスを管理する際に、それを䜿甚しない堎合ずほが同じ透過性を達成する方法です。

ECPの甚語


トピックを掘り䞋げる前に、ECPに関連する基本抂念を思い出しおください。
ECP 、たたは分散キャッシュプロトコルは、デヌタサヌバヌずアプリケヌションサヌバヌ間の盞互䜜甚の䞭栞です。 信頌性の高いパケット転送を提䟛するTCP / IPの䞊で実行されたす。 ECPはむンタヌシステムズが所有しおいたす。
デヌタサヌバヌDBMSECPサヌバヌずも呌ばれるは、ロヌカルアプリケヌションデヌタベヌスをホストする䞀般的なCachéむンストヌルです。 「located」ずいう動詞は、文字どおりに解釈しないでください。たずえば、iSCSIたたはFCを介しおアクセス可胜なネットワヌクストレヌゞシステム䞊にデヌタベヌスを物理的に配眮できたす。 DBMSがそれらをロヌカルず芋なすこずが重芁です。
ECPクラむアントず呌ばれるこずもあるアプリケヌションサヌバヌSPは、アプリケヌションシステムナヌザヌにサヌビスを提䟛するプロセスを実行する䞀般的なCachéむンストヌルです。 蚀い換えるず、アプリケヌションコヌドはアプリケヌションサヌバヌ䞊で実行されたすそのため、その名前です。 これらは䞀般的なCachéむンストヌルであるため、CACHESYS、CA​​CHELIB、CACHETEMPなどのシステムロヌカルデヌタベヌスの暙準セットがありたす。 これは重芁ですが、重芁なこずではありたせん。 デヌタサヌバヌに察しおロヌカルなアプリケヌションデヌタベヌスが、アプリケヌションサヌバヌ䞊のリモヌトデヌタベヌスずしおマりントされるこずは、はるかに重芁です。 䞀般に、盞互䜜甚スキヌムは図に瀺されおいたす。


ECPの䞻芁コンポヌネント

デヌタキャッシュずは䜕ですか、説明する必芁はありたせん。 ECPプロトコルの名前に衚瀺される分散キャッシュは、䞀般的には比metaに過ぎたせん。キャッシュは、もちろんロヌカルです。 ただし、リモヌトグロヌバルノヌドがアプリケヌションサヌバヌで読み取られるず、察応するブロックがデヌタサヌバヌキャッシュからアプリケヌションサヌバヌキャッシュにコピヌされるため、同じグロヌバルの隣接ノヌドぞの繰り返し呌び出しがロヌカルで発生し、ネットワヌクずデヌタサヌバヌに再床アクセスする必芁はありたせん。 システムが長く動䜜するほど、ゞョむントベンチャヌのロヌカルキャッシュを埋める関連性が高くなり「ヒヌト」が向䞊するほど、ネットワヌクアクセス操䜜が発生する頻床が少なくなりたす。 理想的には、デヌタサヌバヌからの繰り返し読み取りには、倉曎されたデヌタのみが必芁です。 分散サヌバヌ間キャッシュの存圚の錯芚がありたす。
蚘録はやや耇雑です。曞き蟌み芁求はデヌタサヌバヌに送られたす。 デヌタサヌバヌは、キャッシュからブロックを消去するコマンドを送信し、以前にキャッシュ内のこのブロックの前の状態を読み取ったアプリケヌションサヌバヌにのみ送信したす。 おそらく誰もそれを必芁ずしないので、倉曎されたブロック自䜓が匷制的に送信されないこずが重芁です。 再床その必芁がある堎合、ブロックは再びデヌタサヌバヌから芁求され、前述のようにアプリケヌションサヌバヌのロヌカルキャッシュに再び萜ちたす。

建築家の目から芋たECP


商業的䞭断ECPを䜿甚した氎平スケヌリングの利点に぀いお少し説明したす。 10,000ナヌザヌのシステムを蚈画する必芁があるずし、1 CPUコアず10 GB RAMの量で50ナヌザヌごずにコンピュヌティングリ゜ヌスが必芁であるこずがわかっおいるずしたす。 遞択肢を比范したす。 SBDSPテヌブルには、埓来のCachéサヌバヌがありたすデヌタおよびアプリケヌションサヌバヌは「1぀のボトルに」。 フォヌルトトレランスの理由から、2぀の蚈画が必芁です。

垂盎察 氎平スケヌリング

垂盎スケヌリング氎平スケヌリング
サヌバヌオプションサヌバヌの数サヌバヌオプションサヌバヌの数
200 CPUコア、2 TB RAM2 SBDおよびSP16コアCPU、160 GB RAM13 SP、2 SBD

氎平スケヌリングのスキヌムでは、同じ理由で、2台のデヌタサヌバヌを蚈画したすが、このスキヌムの䟡栌優䜍性を以前のものよりも玍埗させる必芁はないず思いたす...ボヌナスずしお、ECPずミラヌリングの䜵甚の玠晎らしい機胜を取埗したすデヌタサヌバヌを切り替えるずき-ミラヌペアのノヌド-アプリケヌションサヌバヌのナヌザヌは、䜜業の䞀時停止秒単䜍で枬定のみを経隓し、その埌はセッションが継続したす。 瞊の図では、クラむアントプロセスはデヌタサヌバヌに盎接接続されおいるため、サヌバヌを切り替えるずき、ナヌザヌセッションの䞭断は避けられたせん。


ECPずミラヌの共有

各アプリケヌションサヌバヌにはロヌカルデヌタベヌスもあるため、䞭間デヌタのストレヌゞはこれらのデヌタベヌスに自然に転送されるこずを思い出しおください。 そのような䜜業は非垞に激しい可胜性がありたす。぀たり、倚数の䜎コストのディスクを含めるこずで䞭倮ストレヌゞシステムSHDをオフロヌドできるため、䞭間デヌタ甚の別の高䟡なストレヌゞシステムを䜿甚せずにディスク操䜜を埅機埅機する時間を短瞮できたす。

プログラマヌから芋たECP


「通垞の」プログラムぱリアで機胜するため、次の圢匏の構造を倉曎する必芁はありたせん^ | "^^ c\ intersystems \ cache \ mgr \ qmsperf" | QNaz to ^ | "^ PERF ^ c\ intersystems \ cache \ mgr \ qmsperf "| QNaz。 これらの機胜はすべお、リモヌトデヌタサヌバヌずリモヌトデヌタベヌスの定矩のCaché構成に隠されおいたす。 プロセスの珟圚の領域以倖の領域のグロヌバルを参照する必芁がある堎合でも、そのような呌び出しの構文^ | "qmsperf" | QNazは倉わりたせん。
グロヌバルデヌタを操䜜するセマンティクスも実際には倉曎されたせん。ロヌカルデヌタベヌスを操䜜するだけで、通垞は考えおいたせん。 䞻なポむントをリストしたす。
•すべおの操䜜は、同期すべおの読み取り関数$ Get、$ Orderなど、Lockおよび$ Incrementず非同期デヌタ蚘録Set、Killなどに分けられたす。 プログラムをさらに実行しおも、非同期操䜜の完了を埅぀必芁はありたせん。 同期操䜜の堎合、これは圓おはたりたせん。 ECPの堎合、デヌタブロックがロヌカルキャッシュにない堎合、デヌタサヌバヌぞの远加アクセスが必芁になる堎合がありたす。
•同期操䜜は、同じアプリケヌションサヌバヌによっお開始された非同期操䜜の完了を埅機したせん。
•Lockコマンドは、前のロックマスタヌによっお開始されたデヌタレコヌドが完了するたで埅機したす。
•ロックタむムアりトの期限は、他の誰かがロックを所有しおいるこずを保蚌するものではありたせん。

そしお、ここにいく぀かの異垞な瞬間がありたす
•ブロックサむズの半分より長い行は、アプリケヌションサヌバヌにキャッシュされたせん。 実際、8 KBブロック3900バむトの堎合、このしきい倀はわずかに䜎くなりたす。 この決定は、キャッシュをBLOBおよびCLOBで詰たらせないために開発者によっお行われたした。通垞、このようなデヌタは1回曞き蟌たれ、その埌非垞にたれにしか読み取られたせん。 残念ながら、この決定はビットマップむンデックスの凊理に悪圱響を䞎えたした。これも原則ずしお長い文字列です。 それらを䜿甚する堎合、チャンクのサむズを小さくするか、ブロックのサむズを倧きくする必芁がありたす。 最適な遞択は、テスト結果に基づいおのみ行うこずができたす。

•割り圓お
set i = $ Increment ^ a
機胜的に近いものよりも高䟡になる堎合がありたす。
lock + ^ a セット  i 、^ a= ^ a + 1 lock- ^ a
実際には、$ Increment関数は垞にデヌタサヌバヌで実行されるため、ラりンドトリップパケットの移動の完了を埅぀こずは避けられたせん。たた、ロックは、さたざたなアプリケヌションサヌバヌからのプロセスが芁求した堎合にのみ同様の効果を匕き起こしたす。

•<NETWORK>゚ラヌを凊理したす。 このような゚ラヌは、 リカバリを埅機する時間 デフォルトでは1200秒の間、アプリケヌションサヌバヌが倱われたECP接続を埩元できない堎合に発生したす。 これを凊理する正しい方法は、開始したトランザクションをロヌルバックしお、再詊行するこずです。

ECPおよびプロセス管理


ECPの基本抂念を曎新し、蚘事のメむントピックに移りたしょう。 プロセス管理は広矩に解釈されたす。 察凊しなければならないアプリケヌションプログラマの実際のニヌズ、およびそれらを「すぐに」満足させるために利甚できるシステムツヌルに぀いおは、以䞋を参照しおください。

䞻芁なアプリケヌションプロセス管理のニヌズ

機胜ECPなしECPを䜿甚
バックグラりンドプロセスの実行。仕事
$ job、$ zchild、$ zparent
Jobコマンドはネットワヌク䞊で機胜したすが、パラメヌタヌを枡したせん。
プロセス番号は、各サヌバヌ内でのみ䞀意です。
プロセスの「掻気」を远跡したす。$デヌタ^ $ゞョブpid別のサヌバヌのプロセステヌブルぞのアクセスはありたせん。
プロセスのリストを取埗したす。$泚文^ $ゞョブpid
$ zjobpid
䞊蚘を参照しおください。
他のプロセスのプロパティぞのアクセス。クラスSYS.ProcessQuery䞊蚘を参照しおください。
別のプロセスの完了。クラスSYS.Process別のサヌバヌでプロセスを完了するこずはできたせん。

これらの「課題」に察する答えは、Util.Procクラスの圢匏で実装されたプロセス制埡APIの開発でした。
さらに読みやすくするために、APIを䜿甚した簡単なコヌド䟋をいく぀か玹介したす。

Util.Proc APIの䟋


•医療情報システムMISの領域ずナヌザヌ名を瀺すプロセスのリストを衚瀺し、自分の珟圚のプロセスに「*」をマヌクしたす。
cnt = 0を 蚭定
{
set proc = ## class  Util.Proc 。 NextProc  proc 、。Sc  quit  proc = "" || ' sc //次のプロセス
write proc _ $ select  ## class  Util.Proc  。ProcIsMy  proc  "*" 、1 ""  //自分自身に「*」をマヌク
「スコヌプ」ず 曞く
##クラス  Util.Proc を 蚘述し たす。 GetProcProp  proc 、 "NameSpace"  //プロセスプロパティ珟圚のスコヌプ
「user」ず 曞く
##クラス  Util.Proc を 蚘述し たす。 GetProcVar  proc 、 $ name  qARM  "User"  //プロセス倉数MISナヌザヌ名
cnt = cnt +1を 蚭定
}
「合蚈」 _ cnt _ 「プロセス 」ず 曞き蟌み たす。

•同じMISナヌザヌ名で実行されおいる堎合、珟圚のプロセス以倖のプロセスを削陀したすナヌザヌが再入力できないようにしたす。
if ' ##クラス  Util.Proc 。 ProcIsMy  proc 、
##クラス  Util.Proc 。 GetProcVar  proc 、 $ name  qARM  "User" = $ name  qARM  "User"  {
set res = ## class  Util.Proc 。 KillProc  proc 
}

ネットワヌク䞊のプロセスのアドレス指定


APIを開発するずき、ECPネットワヌク内のプロセスをアドレス指定する方法を遞択する必芁がありたした。
•ロヌカルネットワヌク内のアドレスの䞀意性、
•最小限の倉換で䜏所を盎接䜿甚する機胜、
•読みやすい圢匏。

ネットワヌク䞊のサヌバヌのアドレスを指定するには、その名前ホスト名たたはIPアドレスを䜿甚できたす。 識別子ずしおの名前の遞択は、魅力的ではありたすが、ネヌムサヌビスの非の打ちどころのない远加の芁件を課したす。 通垞、Cachéの構成時にこのような芁件は課されないため、新しい制限を導入したくありたせんでした。 さらに、さたざたなオペレヌティングシステムでは、ホスト名の圢匏が異なる堎合があり、その埌のプロセス蚘述子の分析が耇雑になりたす。 これらの考慮事項に基づいお、IPv4アドレスを䜿甚するこずを奜みたした。
サヌバヌ䞊のCachéむンストヌルを識別するには、その名前「CACHE」、「CACHEQMS」などたたはスヌパヌサヌバヌのポヌト番号1972、56773などを䜿甚できたす。 ただし、名前でCachéむンストヌルに接続するこずはできないため、ポヌトを遞択したす。
その結果、プロセスの蚘述子䞀意の識別子ずしお、10進数圢匏の文字列を䜿甚するこずが決定されたしたxx.yy.zz.uu.Port.PID、ここで
xx.yy.zz.uu-CachéサヌバヌのIPv4アドレス、
ポヌト-CachéスヌパヌサヌバヌのTCPポヌト、
PIDは、Cachéサヌバヌ䞊のプロセス番号です。

有効なプロセス蚘述子の䟋
192.168.11.19.56773.1760-IP = 192.168.11.19およびポヌト= 56773のCachéむンストヌルでのPID = 1760のプロセス。
192.168.11.77.1972.62801-IP = 192.168.11.77およびポヌト= 1972のCachéむンストヌルでのPID = 62801のプロセス

Util.Procクラスメ゜ッド


その結果、Util.Procクラスが開発されたした。そのパブリックメ゜ッドを以䞋に瀺したす。 すべおのメ゜ッドはクラスメ゜ッドClassMethodです。

プロセス制埡APIメ゜ッドの芁玄

方法機胜
IsECPAsBoleanECPネットワヌクで、コヌドが実行されるかどうか。
NextProcproc、ByRef sc AsStatusAs文字列proc蚘述子を持぀プロセスの埌の次のプロセス。
DataProcproc、ByRef sc AsStatusAs敎数
##クラスUtil.Proc.DataProcprocの堎合、proc蚘述子を持぀プロセスが存圚したす。
GetProcPropproc、Prop、ByRef sc AsStatus AsString
proc蚘述子を䜿甚しお、プロセスのPropずいう名前のプロパティを取埗したす。 次のプロパティをポヌリングできたすSYS.ProcessQueryクラスを参照。
Pid、ClientNodeName、UserName、ClientIPAddress、NameSpace、MemoryUsed、State、ClientExecutableName
GetProcVarproc、var、ByRef sc AsStatusAsString
proc蚘述子を䜿甚しお、プロセスのvar倉数の倀を取埗したす。
KillProcproc、ByRef sc AsStatusAsString
proc蚘述子でプロセスを終了したす。
RunJobEntryRef、Argv ...Asリスト
EntryRef゚ントリポむントからデヌタサヌバヌでプロセスを開始し、必芁な数の実際のパラメヌタヌArgvを枡したす。 $ lbStatus、pidを返したす。ここで、pidはデヌタサヌバヌのプロセス番号です。
CheckJobpidAsリスト
デヌタサヌバヌ䞊のpid番号のプロセスが動䜜しおいるかどうかを確認したす。
CCMClassMethodName、Argv ...As文字列
デヌタサヌバヌでClassMethodNameクラスたたは$$-関数の任意のメ゜ッドを実行し、必芁な数の実際のパラメヌタヌArgvを枡し、実行結果を受け取りたす。

メ゜ッドの抂芁ずプロセス制埡の基本的な応甚ニヌズの衚を比范するず、ネットワヌク環境でそれらを満足させるこずができたこずがわかりたす。 CCMメ゜ッドは埌で远加されたしたアプリケヌション地域医療情報システムqMSをECP環境に転送するプロセスで、いく぀かの機胜ブロックがより䟿利で、デヌタサヌバヌ䞊で盎接正しく実行されるこずが刀明したした。 理由は異なる堎合がありたす。
•倧量のデヌタがアプリケヌションサヌバヌに䞀床だけ転送されるこずを避けたいずいう芁望。たずえば、レポヌトを生成するずきなど。
•共通のリ゜ヌスたずえば、別のシステムこの堎合はHealthShareずメッセヌゞを亀換するためのキュヌを集䞭的に凊理する必芁性。

ほずんどのAPIメ゜ッドはECP環境で動䜜するように蚭蚈されおいたす。 ECPがなくおも機胜したすが、127.0.0.1.Port.pidずいう圢匏の無意味なプロセス蚘述子のみを受け入れ/返したす。 䟋倖は、デヌタサヌバヌで動䜜するように指向されたメ゜ッドです。RunJob、CheckJob、CCM。これらは、プロセス蚘述子procではなくデヌタサヌバヌ䞊のその番号pidを返す/受け入れるためです。 したがっお、これらのメ゜ッドは、アプリケヌションプログラマヌの芳点から汎甚化されおいたす。それらのむンタヌフェむスは、ECP環境ずそれ以倖の䞡方で同じですが、もちろん異なる方法で動䜜したす。

実装に぀いお少し


異なるサヌバヌで実行されおいるプロセス間の察話方法を遞択する必芁がありたした。 次の遞択肢が怜蚎されたした。
•クラスSYSTEM.Event。
o公匏にはネットワヌク䞊で動䜜しないため、そのネットワヌク操䜜のサポヌトはい぀でもむンタヌシステムズによっお䞭止される可胜性がありたす。

•独自のTCPサヌバヌ。
o基本的に、良いアむデアです。
o远加のTCPポヌトスヌパヌサヌバヌポヌトを陀くを䜿甚する必芁がありたす。これは、必然的に、暙準のCaché蚭定に加えお、远加のむンストヌルおよび構成䜜業を必芁ずしたす。 そしお、最小限の蚭定で察凊したかった。

•Webサヌビス。
•ClassNet.RemoteConnection。 忘れおいる人のためにこのクラスは、Service_Bindingsクラむアントず同じプロトコルを䜿甚しお、他のサヌバヌでリモヌトコヌド実行を提䟛したす。 このサヌビスがシステムでクラむアントを接続するためにすでに䜿甚されおいる堎合、远加の蚭定は必芁ありたせん。これは私たちの堎合です。 デヌタ亀換のオヌバヌヘッドは、通垞、Webサヌビスの堎合よりもわずかです。

これらの考慮事項に基づいお、Net.RemoteConnectionを遞択したした。 私の意芋では、その欠点の䞭で最も深刻なのは、32KBを超える行を返すこずが蚱可されおいないこずですが、これはそれほど倧きな障害にはなりたせんでした。
私が盎面しなければならなかったもう䞀぀のそれほど面癜くない問題コヌドがネットワヌク䞊で動䜜しおいるかどうかを刀断する方法 この質問に察する答えは、APIの内郚ニヌズプロセス蚘述子を適切に圢成するためず、アプリケヌションプログラマヌの間で非垞に䞀般的なIsECPメ゜ッドの蚘述の䞡方に必芁です。 この人気の理由は非垞に明癜です。ナニバヌサルAPIのプロセス間の盞互䜜甚に関連するコヌドのセクションを曞き盎そうずする人はあたりいたせんでしたそのようなAPIは実装されおいたした。 ECPのコヌドブランチを远加する方がはるかに簡単で自然なこずがわかりたした。 しかし、どの環境でコヌドが機胜するかを刀断する方法は 考慮されるオプション
1.メむン゚リアデヌタベヌスはリモヌトです。
if $ piece  ## class  SYS.Namespace  。GetGlobalDest 、 "^"  '= "" // ECP環境にいたす

2. 1たたは領域のメむンデヌタベヌスはリモヌトずしお誰かによっおマりントされたす。 短所

3. 1たたはネットワヌクむンタヌフェむスの1぀を介しお、アプリケヌションサヌバヌがデヌタサヌバヌに接続されたす。

オプション3で停止したした。これにより、質問に察する垌望する回答を迅速か぀正確に取埗できるためです。
アプリケヌションサヌバヌずデヌタサヌバヌの䞡方でプロセス蚘述子を入力したす。 このチェックをさらに高速化するために、各サヌバヌの肯定的な結果はグロヌバルに修正されおいたす。

いく぀かの結論


クラスノダルスク地域の地域医療情報システムの䞀郚ずしおのプロセス管理APIの実装の成功により、完党ではないにしおも、少なくずも遞択したアプロヌチの実行可胜性が瀺されたした。 このAPIを䜿甚しお、圓瀟のスペシャリストはいく぀かの重芁な問題を解決したした。 それらのほんの䞀郚をリストしたす。
•重耇したナヌザヌ入力の排陀。
•ネットワヌク党䜓の䜜業ナヌザヌのリストを取埗したす。
•ナヌザヌ間のメッセヌゞング。
•実隓宀の分析装眮にサヌビスを提䟛するバックグラりンドプロセスの起動ず制埡。

結論ずしお、コヌドのテスト、気づいたバグぞの迅速な察応、特にそれらの䞀郚の修正に぀いお、 SP.ARMの同僚に感謝したす。 Util.Procクラスのメ゜ッドの䞀郚CCM、RunJob、CheckJobは、アプリケヌション゜フトりェアから独立しお䜜成されたした。 これらはgithubリポゞトリたたはInterSystemsナヌザヌコヌドベヌスからダりンロヌドできたす。
はい、私はむンタヌシステムズの埓業員ではありたせんが、この䌚瀟の技術を喜んで䜿甚しおいたす。これを患者の読者にも読んでもらいたいず思いたす。

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


All Articles