分散データベース1Cの交換を監視することは、Zabbixを意味します

habrosocietyへのご挨拶! 黄色のプログラムの使用は、ロシアで非常に人気があります。 残念ながら、作業の安定性には多くの課題が残されています。 多くのシステム管理者(1C管理者/プログラマーでもある)は、毎日の処理の監視と1Cアンロードの継続的な作業の問題を​​非常に簡単に解決します-彼らは電子メールアラートを設定します。 何か悪いことが起こった場合-メールが送信されると、管理者はサーバーに行き、エラー、修正、利益を確認します。 しかし、これは怠け者の管理者にとっては選択肢ではありません!

1Cを監視するためのインターネットには、1Cサービスを監視するためのテンプレートのみがあります。 監視ゾーンを拡大してみましょう。

この記事では、次の問題を解決する方法を説明します。







大規模な組織では、1C監視の問題は1Cプログラマー/管理者によって対処されます。 システム管理者(このような別のポジションがあるが、私たちが持っている場合)は、彼のハードウェア/プログラムのみを監視し、1Cはそれを本当に好きではありません。 私たちはこの障壁を克服しました。私たちもあなたのためにそれを克服することを提案します:)



組織について



大規模な小売ネットワークでは、STU 1Cを品質として使用しています。 多くのオブジェクト、どこでも中央ベースとの交換が必要です。 1C(レジと重量との交換)を常に実行しているオブジェクトのサーバー上で回転しています。

追加条件:





ソリューションのアーキテクチャ



一般的な作業スキームを示した後、各部分を分析します。



ザビックス


模様
<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>2.0</version> <date>2015-06-05T11:21:26Z</date> <groups> <group> <name>My Templates</name> </group> </groups> <templates> <template> <template>1C Habr template</template> <name>1C Habr template</name> <groups> <group> <name>My Templates</name> </group> </groups> <applications> <application> <name>1 </name> </application> </applications> <items> <item> <name>1  </name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>exchange.status</key> <delay>0</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>1 </name> </application> </applications> <valuemap> <name>1Ok / 0Fail</name> </valuemap> </item> <item> <name> 1   </name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>exchange.restart</key> <delay>0</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>1 </name> </application> </applications> <valuemap> <name>1C Restart</name> </valuemap> </item> </items> <discovery_rules/> <macros/> <templates/> <screens/> </template> </templates> <triggers> <trigger> <expression>{1C Habr template:exchange.status.nodata(30m)}=1&{1C Habr template:exchange.status.time()}>084500&{1C Habr template:exchange.status.time()}<200000</expression> <name>{HOST.NAME} 1C     30 </name> <url/> <status>0</status> <priority>1</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{1C Habr template:exchange.restart.count(1h,100)}>2</expression> <name>{HOST.NAME} 1C      3   1 </name> <url/> <status>0</status> <priority>1</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{1C Habr template:exchange.restart.last(0)}=2</expression> <name>{HOST.NAME} 1C     !</name> <url/> <status>0</status> <priority>2</priority> <description/> <type>0</type> <dependencies/> </trigger> </triggers> </zabbix_export>
      
      







テンプレートには2つの項目があります。

  1. 1C Exchangeステータス(exchange.status) -ここで、1Cは何が機能するかに関するデータを送信します。 トリガー:

    • {HOST.NAME} 1C 30分以上交換がありませんでした-1Cの再起動アクションをトリガーするトリガーです。 時間の制限があるため、トリガー式のこの部分を自分用にカスタマイズします
      &{1C Habrテンプレート:exchange.status.time()}> 084500&{1C Habrテンプレート:exchange.status.time()} <200000


  2. センターで1C Exchangeを再起動します(exchange.restart) -スクリプトのみがここに値を送信します

    • {HOST.NAME} 1CはセンターエラーでExchangeを再起動します! -トリガーは動作しますが、スクリプトは正しく動作しませんでした(1Cの終わりに必要なタスクやその他のエラーはありません)
    • {HOST.NAME} 1Cは、1時間で3回以上、センターでExchangeを再起動します-再起動の回数を決定する必要があります。再起動の頻度が高すぎると、システムの動作が正しくないことを示します。




アクション


アクションを作成します(zabbixがすべての設定をエクスポートするとき...):







ご覧のとおり、トリガーが消えない場合、トリガーは3回(トリガーの直後、30分後と40分後)発生します。 確かに。

コマンド実行を有効にする


各サーバーで、 zabbix_agentd.confに行を追加します
EnableRemoteCommands = 1


1C


1CはHTTP経由でzabbix_senderを使用してデータをZabbixに送信します 。 zabbix_sender.exeを使用して実行できます。 8.1では、いくつかのGETパラメータを使用したhttpリクエストに問題があるため、ここに作業コードを示します。 8.2では、すべてが良いと言われています。標準的な方法を使用できます。

1Cを常時実行する場合、要求は定期的な起動でN分ごとに1回送信する必要があります-完了時に(長続きしない場合)。 1Cは、Zabbixに動作することと触れないことを伝えます。 レポートが停止するとすぐに、すべてのプロセスを強制終了し、新しいプロセスを開始します。

コード1C 8.1
  (, )   = (());  = "http://zabbix.example.com/zabbix_sender/index.php?server=" +  + "&key=" +  + "&value=" + ;  WinHttp =  COM("WinHttp.WinHttpRequest.5.1"); WinHttp.Option(2,"Windows-1251"); WinHttp.Open("GET", , 0); WinHttp.SetRequestHeader("Accept-Language", "ru"); WinHttp.SetRequestHeader("Accept-Charset","Windows-1251"); WinHttp.setRequestHeader("Content-Language", "ru"); WinHttp.setRequestHeader("Content-Charset", "Windows-1251"); WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=Windows-1251"); WinHttp.Send();  = WinHttp.ResponseText();   ; ;   = "OK"   ;   ; ; 
      
      









次の内容のファイルC:\ ZBX \ restart-1c.ps1を作成します。

restart-1c.ps1
 param([string]$programm_name="nul") Try{ $servername=$env:computername $zabbixhost="zabbix.example.com" $zabbix_key=$programm_name+".restart" switch ($programm_name) { "exchange" { $window_name="1: - :  " $schedule_name="" } default { throw "No param" } } ###################  ,   ################### Get-Process | Where-Object {$_.MainWindowTitle -eq $window_name} | Stop-Process -Force Sleep 10; schtasks /end /TN $schedule_name Sleep 10; schtasks /run /TN $schedule_name if ($LastExitCode -ne 0){ throw "LastExitCode -ne 0" } #Send to Zabbix $get_str1="https://$zabbixhost/zabbix_sender/index.php?server=$servername&key=$zabbix_key$vm_name&value=100" $wc = New-Object system.Net.WebClient; $Result = $wc.downloadString("$get_str1") } Catch { #Send to Zabbix Error $get_str2="https://$zabbixhost/zabbix_sender/index.php?server=$servername&key=$zabbix_key$vm_name&value=2" $wc = New-Object system.Net.WebClient; $Result = $wc.downloadString("$get_str2") }
      
      







そして、タスクをサーバーにインポートします。 PowerShellスクリプトを起動します(残念ながら、長さが255文字のコマンドはzabbix_actionで制限されているため、すぐにスクリプトを渡すことはできません)。

プランナー
 <?xml version="1.0" encoding="UTF-16"?> <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Author>example/username</Author> </RegistrationInfo> <Triggers /> <Principals> <Principal id="Author"> <UserId>Server\username</UserId> <LogonType>InteractiveToken</LogonType> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> <AllowHardTerminate>true</AllowHardTerminate> <StartWhenAvailable>false</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <Duration>PT10M</Duration> <WaitTimeout>PT1H</WaitTimeout> <StopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <AllowStartOnDemand>true</AllowStartOnDemand> <Enabled>true</Enabled> <Hidden>false</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <WakeToRun>false</WakeToRun> <ExecutionTimeLimit>P3D</ExecutionTimeLimit> <Priority>7</Priority> </Settings> <Actions Context="Author"> <Exec> <Command>powershell.exe</Command> <Arguments>-windowstyle hidden -nologo -NonInteractive -File "C:\ZBX\restart-1c.ps1" exchange</Arguments> </Exec> </Actions> </Task>
      
      







前提条件 -スケジューラーのタスクは、1Cが実行されるユーザーの下で作成する必要があります。 システムにログインしている専用ユーザーがいます。

言い訳


そのようなメカニズムに頼らなければなりませんでした( Stop-Process 1cv8.exeだけを行うことは不可能でした )。 サーバーは多くの実行中の1Cを実行しますが、これは機能するため、必要なしにそのように再起動するだけではいけません。

すべてを正しく行った(そして、私が正しく説明した)場合、突然(すべてのタスクと.exeの完了とともに)作業を停止すると、プログラムが再起動します。



おそらく何か質問があります(技術的な解決策を説明してください-私の趣味ではありません)-私は答えて、個人的に書きます。 また、各レジと各残高で交換を制御するメカニズムを実装しました(1つのボタンで低レベル検出と1C構成の非動的更新を使用すると、誰かに役立つかもしれません。これに関する記事を書きます)。

建設的な批判、アドバイスは大歓迎です:)

私の自尊心:解決策がいつ誰かを助けるかを知りたいので、それが難しくなく、あなたが一部または完全な解決策を使用する場合、調査のボタンをクリックしてください、ありがとう!



All Articles