Zabbix、ラストマイルのポートを監視し、パーティショニングを使用してデータベースとの作業を最適化する

ロシア連邦の最大のプロバイダーと協力して、私は加入者が最近の問題、すなわち 昨日はすべてが悪かったが、今ではうまくいった。 この場合の対処方法 すべての加入者回線の主要なパラメータを収集してしばらく保存する監視システムを使用するオプションがあり、TPオペレータはこのような状況に簡単にアクセスしてこのデータにアクセスできます。 また、これらのデータを使用して、各加入者回線で自動的に専門家の評価を行うことができ、必要に応じて、xDSLで最適なプロファイルを自動的に選択します。 同じデータを使用して、不良回線またはパラメータが不十分な回線を識別し、加入者がTPに連絡する前に発生する可能性のある問題を排除することができます。

一見、タスクは難しくありませんが、機器の数が数千のアクセスノードを簡単に超え、加入者ポートの数が数万に達すると、そのようなシステムをセットアップして実行するいくつかの機能が表示され、すべてが最大限に自動化されます。

興味があれば、キャットへようこそ





ボード上に2つのプロセッサと4つのコアを備えたHPサーバーが1つしかなく、メモリは10G、Raid5 132G 15000 SASでした。

加入者ポートの主な数は、さまざまなDSLAMのADSLポートであり、大容量(「バスケット」あたり最大576ポートおよび低ポート)で、構成に応じて16〜64ポートです。



トリガーを監視および構築する方法を定義する



dslam'aで何が得られますか? ほとんどすべて、唯一の質問はそれを行う方法です。 私にとって、最も確実な方法は、SNMPによるポーリングです。 全体的な問題は、多くのハードウェアのMIBファイルが単なる定命の人間にアクセスできないことでした。これは、メーカーがさまざまな契約や私には明らかではない他の障害を締結したというトリックがあるためです(ただし、異なる契約なしで送信されたhuawei mibの功績による)取得できません)。 あなたの状況が私のものに似ている場合は、snmpwalkを使用して、鉄片が提供するすべてを分析し、大量のメガバイトのテキストを提供します。 得られたOIDの分析は非常に時間のかかるプロセスです。 zabbix用の既製のテンプレートがある場合、またはmibがある場合は便利です(このトピック「ハードウェアの一部をMIBに接続する」 habrahabr.ru/blogs/sysadm/85156を読むと、テンプレートをすばやく簡単に作成できます)

テンプレートを受け取ったら、何を収集するか、どの頻度でどれだけの時間を保存するかを決定する必要があります。 これらのパラメーターはすべて、最終的に作業用テンプレートに設定され、腺にバインドされます。



たとえば、dslam'aの最初のポートから収集された大容量パラメーターの場合、私のセットはそれほど大きくありませんでした





1.01ifAtucFfrADSL 1.01ifAtucFrADSL

1.01ifAtucLossADSL

1.01ifDownSnrADSL 1.01ifUpSnrADSL

1.01ifDownSpeedADSL 1.01ifUpSpeedADSL

,

1.01ifOperPhysicalStatADSL

1.01ifOperStatADSL








含めることができる要素を持つ追加のテンプレート。



1.01ifDownAttenuationADSL 1.01ifUpAttenuationADSL

1.01ifDownOutputPowerADSL 1.01ifUpOutputPowerADSL

1.01ifDownSpeedMaxADSL 1.01ifUpSpeedMaxADSL

1.01ifProfSpeedADSL








上記のデータを使用する場合、現在のプロファイル、最大速度および現在の速度を取得し、これらのデータに基づいて、プロファイルで指定された速度が実際の最大達成可能速度よりも低い場合、より低速のプロファイルを提供または独立して変更するトリガーを書くことができます最大速度が実際の速度よりも高く、プロファイルに設定されている速度よりも高い場合は、より高速のプロファイルを変更または変更することを提案します。



ポート上のプロファイルを変更するためのすべての推奨事項が目詰まりしているため、このようなトリガーは私を捕まえませんでしたが、自動化に与えることを恐れていました。



非常に便利なトリガーの別のオプションがあります。これらは、ノイズの量、減衰、エラー数と再接続の時間の変化(デルタ関数)、およびサブスクライバーを非常に多くのサブスクライバーに届けるためのその他の喜びのトリガーです。 繰り返しますが、これらのトリガーは同じ理由で定着しませんでした。 数百のポートが不十分であるとみなされる場合、それはあなたの魂にとって困難です。 ;)



FTTxテクノロジーを使用するノードの場合、収集されたパラメーターは多少異なります。現在、サブスクライバーポートのエラー数のデルタ関数のみが収集されています。一定期間、特定の値を超えている場合は、注意のリストにポートをリストします。

1つのポートから収集されたデータの例を次に示します



データは時間のグラフとして表すことができます





また、Huaweiを支持する興味深い中国のEdgeコアスイッチがあったため、OTDRを使用して加入者ケーブルを測定し、結果を分析した結果をポーリングするテンプレートを作成しました。UTPに障害のあるポートのリストがありました。 これらの測定は、zabixのスクリプトまたはクラウンのいずれかを使用して、腺にsnmpコマンドを送信することで実行できます。 すべてのハリネズミをフヤウェイに置き換えたため、このテンプレートを完成しませんでした。



全体像と監視のアプローチは明確だと思います。より具体的な質問があれば、あまりよく照らされていないポイントについては、尋ねて、答えようとします。



Zabbix用のデータベースをセットアップしましょう



現時点では、最新の安定版ブランチ1.8.5は公式ウェブサイトwww.zabbix.com/download.phpからダウンロードできます。

www.zabbix.com/documentation/startから入手できるため、インストール方法と初期セットアップの方法については説明しません。



Ubuntuサーバー10.04 64ビットにすべてがあります。 Postgresql 8.4は元々データベースとして使用されていましたが、その後9.0はMySQL 5.5に移行しました。MySQL5.5は、公式マニュアルと小さなファイルディッピングに従ってサーバーにインストールされました。 パーティションテーブルを移動する理由は、 dev.mysql.com / doc / refman / 5.5 / en / partitioning.htmlをサポートしています(( 筋肉が倒れない限りpostgresを高速で動作させることができませんでした。調理することはできません、partition表は会議後ですが、実装は筋肉とは多少異なります)。



MySQLの構成は複雑ではなく、フォーラムで詳しく説明されていますが、MySQLを構成したトピックの例はwww.zabbix.com/forum/showthread.php?t=12407です。



重要な必須オプションに注意します

innodb_file_per_table







デフォルトのエンジンは、innodb、utf-8エンコーディングに設定する必要があります。

それが非常に好奇心will盛な場合は、構成をレイアウトします。



Zabbixは多くの値をデータベースに保存します;メインの大きなテーブルは履歴*と傾向*

当初、履歴テーブルには最大5億件のレコードがあり、このテーブルはインデックスファイルを使用して約40ギガバイトあり、パフォーマンスの問題を引き起こしていました。

加入者ポートから収集されたデータは、平均して約3日間保存されます。 古いデータはハウスキーパーによって削除され、その後断片化されたテーブルが残ります。 これがどれほど悪いか、説明する必要はないと思います。

この場合の対処方法 答えは、時分割でパーティションテーブルを使用することです。 このために、私はブラジルの同志zabbixzone.com/zabbix/partitioning-tablesのブログの経験を活用しました

彼は、テーブルを2つのタイプに分割することをお勧めします。大-日で分割、非常に大ではなく-月で分割。

日ごとの分割表は次のとおりです。



そして、月で割った:





既に構成済みの監視システムがあり、友人が提供しているものを追加するために、次のアクションを実行する必要がありました(これらは上記のブログとほぼ同じです)。



まず、変更する各テーブルのダンプを作成します

mysqldump --no-create-info --lock-tables zabbix history_str > 09.06.2011_history_str.sql







上記の表をデータから消去します。

テーブル構造をわずかに変更する



ALTER TABLE `acknowledges` DROP PRIMARY KEY , ADD KEY `acknowledgedid` (`acknowledgeid`);

ALTER TABLE `alerts` DROP PRIMARY KEY , ADD KEY `alertid` (`alertid`);

ALTER TABLE `auditlog` DROP PRIMARY KEY , ADD KEY `auditid` (`auditid`);

ALTER TABLE `events` DROP PRIMARY KEY , ADD KEY `eventid` (`eventid`);

ALTER TABLE `service_alarms` DROP PRIMARY KEY , ADD KEY `servicealarmid` (`servicealarmid`);

ALTER TABLE `history_log` DROP PRIMARY KEY , ADD PRIMARY KEY (`itemid`,`id`,`clock`);

ALTER TABLE `history_log` DROP KEY `history_log_2`;

ALTER TABLE `history_text` DROP PRIMARY KEY , ADD PRIMARY KEY (`itemid`,`id`,`clock`);

ALTER TABLE `history_text` DROP KEY `history_text_2`;




* This source code was highlighted with Source Code Highlighter .








2013年まで月単位でパーティションテーブルを作成する



ALTER TABLE `acknowledges` PARTITION BY RANGE( clock ) (

PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),

PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),

PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),

PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),

PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),

PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),

PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),

PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),

PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),

PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),

PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),

PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),

PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),

PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),

PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),

PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),

PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),

PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),

PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),

PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))

);



ALTER TABLE `alerts` PARTITION BY RANGE( clock ) (

PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),

PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),

PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),

PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),

PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),

PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),

PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),

PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),

PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),

PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),

PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),

PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),

PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),

PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),

PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),

PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),

PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),

PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),

PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),

PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))

);



ALTER TABLE `auditlog` PARTITION BY RANGE( clock ) (

PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),

PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),

PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),

PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),

PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),

PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),

PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),

PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),

PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),

PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),

PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),

PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),

PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),

PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),

PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),

PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),

PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),

PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),

PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),

PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))

);



ALTER TABLE `events` PARTITION BY RANGE( clock ) (

PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),

PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),

PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),

PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),

PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),

PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),

PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),

PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),

PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),

PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),

PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),

PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),

PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),

PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),

PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),

PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),

PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),

PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),

PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),

PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))

);



ALTER TABLE `service_alarms` PARTITION BY RANGE( clock ) (

PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),

PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),

PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),

PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),

PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),

PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),

PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),

PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),

PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),

PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),

PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),

PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),

PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),

PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),

PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),

PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),

PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),

PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),

PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),

PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))

);




* This source code was highlighted with Source Code Highlighter .








日次パーティションテーブルを作成する



ALTER TABLE `history_uint` PARTITION BY RANGE( clock ) (

PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),

PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),

PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),

PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),

PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),

PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),

PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),

PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),

PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))

);



ALTER TABLE `history_log` PARTITION BY RANGE( clock ) (

PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),

PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),

PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),

PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),

PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),

PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),

PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),

PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),

PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))

);



ALTER TABLE `history_text` PARTITION BY RANGE( clock ) (

PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),

PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),

PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),

PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),

PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),

PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),

PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),

PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),

PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))

);



ALTER TABLE `history` PARTITION BY RANGE( clock ) (

PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),

PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),

PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),

PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),

PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),

PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),

PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),

PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),

PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))

);



ALTER TABLE `history_str` PARTITION BY RANGE( clock ) (

PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),

PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),

PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),

PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),

PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),

PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),

PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),

PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),

PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))

);




* This source code was highlighted with Source Code Highlighter .








各テーブルのデータを次のように復元します(各テーブルを独自のダンプファイル名に置き換えます)

mysql zabbix < 09.06.2011_history_str.sql







最終結果では、データは非常に便利に保存されます-毎日/月は別のファイルに、テーブルの別の部分に



ls -l /var/lib/mysql/zabbix/ |grep history_u

-rw-rw---- 1 mysql mysql 8628 2011-06-08 14:00 history_uint.frm

-rw-rw---- 1 mysql mysql 140 2011-06-08 14:00 history_uint.par

-rw-rw---- 1 mysql mysql 457179136 2011-06-07 11:34 history_uint#P#p20110605.ibd

-rw-rw---- 1 mysql mysql 557842432 2011-06-07 11:34 history_uint#P#p20110606.ibd

-rw-rw---- 1 mysql mysql 620756992 2011-06-07 11:34 history_uint#P#p20110607.ibd

-rw-rw---- 1 mysql mysql 629145600 2011-06-08 00:03 history_uint#P#p20110608.ibd

-rw-rw---- 1 mysql mysql 666894336 2011-06-09 00:08 history_uint#P#p20110609.ibd

-rw-rw---- 1 mysql mysql 423624704 2011-06-09 14:55 history_uint#P#p20110610.ibd

-rw-rw---- 1 mysql mysql 114688 2011-06-07 11:09 history_uint#P#p20110611.ibd

-rw-rw---- 1 mysql mysql 114688 2011-06-07 11:44 history_uint#P#p20110612.ibd

-rw-rw---- 1 mysql mysql 114688 2011-06-07 11:44 history_uint#P#p20110613.ibd

-rw-rw---- 1 mysql mysql 114688 2011-06-07 11:44 history_uint#P#p20110614.ibd

-rw-rw---- 1 mysql mysql 114688 2011-06-08 14:00 history_uint#P#p20110615.ibd

-rw-rw---- 1 mysql mysql 8688 2011-05-27 21:30 history_uint_sync.frm

-rw-rw---- 1 mysql mysql 131072 2011-05-27 21:30 history_uint_sync.ibd









古いデータのクリーンアップは簡単なコマンドで実行されます( `history_uint`の代わりに必要なテーブルを置き換えます)

ALTER TABLE `history_uint` DROP PARTITION p20110604;





テーブルの新しい部分を追加する

ALTER TABLE `history_uint` ADD PARTITION (PARTITION p20110628 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-29 00:00:00")));







手を使ってテーブルをきれいにし、新しいテーブルを追加することは、何となく面白くありません。ブログでも、数日ごとに壊れたテーブルの手順を紹介しています。コードは、 ペーストビン.com / ijyKkxLhに保存されています。



/**************************************************************

MySQL Auto Partitioning Procedure for Zabbix 1.8

zabbixzone.com/zabbix/partitioning-tables



Author: Ricardo Santos (rsantos at gmail.com)

Version: 20110518

**************************************************************/

DELIMITER //

DROP PROCEDURE IF EXISTS `zabbix`.`create_zabbix_partitions` //

CREATE PROCEDURE `zabbix`.`create_zabbix_partitions` ()

BEGIN

CALL zabbix.create_next_partitions("zabbix","history");

CALL zabbix.create_next_partitions("zabbix","history_log");

CALL zabbix.create_next_partitions("zabbix","history_str");

CALL zabbix.create_next_partitions("zabbix","history_text");

CALL zabbix.create_next_partitions("zabbix","history_uint");

CALL zabbix.drop_old_partitions("zabbix","history");

CALL zabbix.drop_old_partitions("zabbix","history_log");

CALL zabbix.drop_old_partitions("zabbix","history_str");

CALL zabbix.drop_old_partitions("zabbix","history_text");

CALL zabbix.drop_old_partitions("zabbix","history_uint");

END //

DROP PROCEDURE IF EXISTS `zabbix`.`create_next_partitions` //

CREATE PROCEDURE `zabbix`.`create_next_partitions` (SCHEMANAME varchar (64), TABLENAME varchar (64))

BEGIN

DECLARE NEXTCLOCK timestamp ;

DECLARE PARTITIONNAME varchar (16);

DECLARE CLOCK int ;

SET @totaldays = 7;

SET @i = 1;

createloop: LOOP

SET NEXTCLOCK = DATE_ADD(NOW(), INTERVAL @i DAY );

SET PARTITIONNAME = DATE_FORMAT( NEXTCLOCK, 'p%Y%m%d' );

SET CLOCK = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD( NEXTCLOCK , INTERVAL 1 DAY ), '%Y-%m-%d 00:00:00' ));

CALL zabbix.create_partition( SCHEMANAME, TABLENAME, PARTITIONNAME, CLOCK );

SET @i=@i+1;

IF @i > @totaldays THEN

LEAVE createloop;

END IF ;

END LOOP;

END //

DROP PROCEDURE IF EXISTS `zabbix`.`drop_old_partitions` //

CREATE PROCEDURE `zabbix`.`drop_old_partitions` (SCHEMANAME varchar (64), TABLENAME varchar (64))

BEGIN

DECLARE OLDCLOCK timestamp ;

DECLARE PARTITIONNAME varchar (16);

DECLARE CLOCK int ;

SET @mindays = 3;

SET @maxdays = @mindays+4;

SET @i = @maxdays;

droploop: LOOP

SET OLDCLOCK = DATE_SUB(NOW(), INTERVAL @i DAY );

SET PARTITIONNAME = DATE_FORMAT( OLDCLOCK, 'p%Y%m%d' );

CALL zabbix.drop_partition( SCHEMANAME, TABLENAME, PARTITIONNAME );

SET @i=@i-1;

IF @i <= @mindays THEN

LEAVE droploop;

END IF ;

END LOOP;

END //

DROP PROCEDURE IF EXISTS `zabbix`.`create_partition` //

CREATE PROCEDURE `zabbix`.`create_partition` (SCHEMANAME varchar (64), TABLENAME varchar (64), PARTITIONNAME varchar (64), CLOCK int )

BEGIN

DECLARE RETROWS int ;

SELECT COUNT (1) INTO RETROWS

FROM `information_schema`.`partitions`

WHERE `table_schema` = SCHEMANAME AND `table_name` = TABLENAME AND `partition_name` = PARTITIONNAME;



IF RETROWS = 0 THEN

SELECT CONCAT( "create_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg;

SET @ sql = CONCAT( 'ALTER TABLE `' , SCHEMANAME, '`.`' , TABLENAME, '`' ,

' ADD PARTITION (PARTITION ' , PARTITIONNAME, ' VALUES LESS THAN (' , CLOCK, '));' );

PREPARE STMT FROM @ sql ;

EXECUTE STMT;

DEALLOCATE PREPARE STMT;

END IF ;

END //

DROP PROCEDURE IF EXISTS `zabbix`.`drop_partition` //

CREATE PROCEDURE `zabbix`.`drop_partition` (SCHEMANAME varchar (64), TABLENAME varchar (64), PARTITIONNAME varchar (64))

BEGIN

DECLARE RETROWS int ;

SELECT COUNT (1) INTO RETROWS

FROM `information_schema`.`partitions`

WHERE `table_schema` = SCHEMANAME AND `table_name` = TABLENAME AND `partition_name` = PARTITIONNAME;



IF RETROWS = 1 THEN

SELECT CONCAT( "drop_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ")" ) AS msg;

SET @ sql = CONCAT( 'ALTER TABLE `' , SCHEMANAME, '`.`' , TABLENAME, '`' ,

' DROP PARTITION ' , PARTITIONNAME, ';' );

PREPARE STMT FROM @ sql ;

EXECUTE STMT;

DEALLOCATE PREPARE STMT;

END IF ;

END //

DELIMITER ;




* This source code was highlighted with Source Code Highlighter .








これで、3日ごとにクラウンにこのコードの実行を追加することになります。

設定クラウンの行は次のようになります

0 6 */3 * * ___ mysql -B -h localhost -u zabbix -p zabbix -e "CALL create_zabbix_partitions();"







データベースのセットアップが完了しました。



機器のボード数にテンプレートの自動バインドを設定します



私の鉄片は非常に大きく、加入者ポート付きのボードを追加することで拡大します。 鉄片に存在しないポートに再度問い合わせないように、すべてのテンプレートをボードに分割しました。 1日に1回特定のOidをノックするという検出ルールを追加しました。 このoidからの回答により、ボードがスロットにインストールされているかどうかを確認できます。 スキャンは、腺の種類の全範囲にわたって行われます。



このカードのテンプレートをノードにバインドするか、テンプレートを解くかの2つのアクションを追加し、検出時に取得した値に応じてこれを実行します。







このような単純なアクションにより、アクセスノードにインストールされているカードの数を制御するという退屈なタスクを取り除きます。



何を得たの?



以下にprocaおよびその他の異なるグラフィックをロードします。

データベースサイズのグラフでは、最初のドロップ-プロシージャの最初の開始、1日の2番目のドロップ-プロシージャの手動検証の2つのドロップを確認できます。







簡単な品質特性





ご覧のとおり、リソースを使用すると、パフォーマンスに大きな損害を与えることなく負荷を持ち上げることができます。 かつてはアイテムの数を300,000にし、1秒あたりの受信値の数を200にしました。これで、不要で監視に不要なものはすべて削除されました。



マイナーボーナス



FTTBネットワークカードの一部の例





1つの企業クライアントのリンク制御





トピックが興味深い場合に継続するために))



PS素材のやや面倒なプレゼンテーションをおaび申し上げます。

UPD:スペルおよび文法エラーの一部を修正しました。

UPD2:さらに多くのスペルおよび文法エラーを修正し、失われたリンクを修正しました。



All Articles