サーチはどのように動くか how search works -...

40
Copyright © 2016 Splunk Inc. Takashi Komatsubara Splunk Ninja 顕微鏡の向こう側: サーチはどのように動くか

Upload: takashi-komatsubara

Post on 24-Jan-2018

1.514 views

Category:

Software


1 download

TRANSCRIPT

Copyright © 2016 Splunk Inc.

Takashi Komatsubara

Splunk Ninja

顕微鏡の向こう側:サーチはどのように動くか

免責条項

2

このプレゼンテーション中に、弊社は弊社の将来の事象または予想される業績に関する前向きな意見を述べること

があります。弊社は、かかる意見が、現在弊社が知っている要因に基づく弊社の現在の予測および推定を反映する

ものであることと、実際の事象または結果が著しく異なることがあることを皆さんにご注意いたします。実際の結果が

弊社の前向きな意見に含まれるものとは異なるようにさせる重要な要因については、SECを含む弊社の文書をお調

べください。このプレゼンテーションに含まれる前向きな意見は、生のプレゼンテーションの日時において述べられたもの

です。生のプレゼンテーションの後に見直しが行われた場合、このプレゼンテーションに現在のまたは正確な情報が含

まれないことがあります。弊社は、弊社が述べることがある前向きな意見を更新する義務を負いません。また、弊社

のロードマップに関する情報で、弊社の一般的な製品方針の概要が示されていますが、この情報は予告なしにいつ

でも変更されることがあります。これはあくまで参照用であって、契約またはその他の約定に組み込まれないものとしま

す。Splunkは、記述されている特徴または機能を開発する義務も、かかる特徴または機能を将来のリリースに含める

義務も負いません。

私は・・・

3

名前:小松原貴司

勤務先:Splunk

仕事内容: パートナー様への技術支援

趣味:大人ミュージカル、少しゴルフ

技術バックグラウンド:メールとかJavaとか

本セッションの対象の方々

4

以下の内容に多少の知見がある方・・・

Splunk のコンポーネント– サーチヘッド、インデクサ、フォワーダ

Splunk サーチインターフェース

Search Processing Language (SPL)

本セッションで学んでいただくこと

1. サーチをクリックしたら、なにが起きているのか

2. サーチをどうやって改善すると、より早くなるのか

– Splunk アーキテクチャオーバービュー– Splunk はどのようにイベントを保存しているか– サーチ処理をおこなうコンポーネント– サーチのTipsとSPLコマンドのバリエーション– サーチコマンドのサンプル

5

Splunk Enterprise のアーキテクチャ

6

様々な種類やバージョンのSplunk Forwarderをつかって、何千ものサーバからデータを収集する

Splunkインデクサに、データが自動ロードバランスされながら投入される

サーチヘッドによって、サーチリクエストが分散される

インデックス Vs. インデックス

7

データを論理的にグループ化– あなたもしくはSplunk管理者が作成– あなたがサーチ文のなかでつかうもの

暗黙、あるいは明示的に

紛らわしい言葉

TSIDX ファイル– 時間フィールドに注目したインデックス– Splunkの “秘密のソース”– 論理的なインデックスは、複数のインデックスとTSIDXファイルから構成されている

– ここがサーチの味噌 詳しくは後で・・・

イベントはどう保存されている?

8

バケット、インデックス、インデクサー

インデクサーインデックスバケットイベント(論理的なグルーピング)

イベントはどう保存されている?

9

バケットのエージングプロセス

ホット/ウォームストレージ コールドストレージ

アーカイブストレージ● 早いストレージ

● 最近のデータ

● 遅い “バルク” のストレージ

● 古いデータ

● 過去/コンプライアンスデータ

● オンライン(検索可能)/オフライン

削除

-あるいは-

バケットの中には何がある?

10

.tsidx

journal.gz

ブルームフィルタ

バケットの中には何がある?

11

イベントはここに来る

Journal.gzは、圧縮され、小さく、

多量のスライスされたデータから構成される

収集された生のデータは、スライス単位で保存される– 1つのスライスは、最大128KB程度の未圧縮のデータから成る

Journal.gz

journal.gz

バケットの中には何がある?

12

TSIDX

生のイベント

Jim likes Mickey

Suzie likes Donald

Pat likes Pluto

言葉 ポスティングリスト

Donald 1

Jim 0

likes 0,1,2

Mickey 0

Pat 2

Pluto 2

Suzie 1

ポスティング値

シークアドレス

0 34

1 87

2 132

レキシコン 値の配列

生のイベントからの、ユニークな言葉が、レキシコンとして書き込みされる

ポスティングリストを見れば、特定語句がどの配列値に存在しているのか

がわかる

シークアドレスは、対象イベントが

journal.gz内の位置

アドレスを示している

*本資料は、わかりやすいようにかなり簡素化して表記しています。

Lexicon(レキシコン) と dictionary はどう違うのですか?>lexicon=語彙(ごい)、ギリシャ語・ヘブライ語・アラビア語などの辞書>dictionary=辞書・辞典

語句

Donald

Jim

likes

Mickey

Pat

Pluto

Suzie

バケットの中には何がある?

13

ある語句をTSIDXにぶつけてみることで、そのTSIDXに対応する実際のバケットにデータがあるかどうかを判断する– 誤判定はありうるが、見落とすことはない(そのバケットに、その語句は絶対に無いということは保証される

ブルームフィルタ

レキシコン

レキシコンの中のそれぞれの語句に対して、ハッシュアルゴリズム計

算を行う

• 語句の数に関係なく、ビットの配列のサイズは変わらない

• バイナリフォーマット

• TSIDXよりも高速。ユニークな

語句が増えるとサイズが増える

それぞれのハッシュの結果で、ビットを立てる

サーチはどのように動くか…例

サーチはどのように動くか

15

サーチ文字例を構成するパーツ

index=world name=waldo glasses=yes | eval miles=km*0.62 | stats count by countries

ベースサーチ

イベントを取得し、フィルタする

SPL コマンド

イベントデータを評価したり、変換したり、フォーマットを変える

イベントが取得された SPLコマンドを通って、結果がリニアに移動する

サーチはどのように動くか

16

“Waldo“はどこ?

index=world name=waldo

サーチはどのように動くか

17

“Waldo“はどこ?

journal.gzBloom filter .tsidx

I have been trying to find Waldo lookingall over these books. I’m not sure I’ll ever find him because my vision is terrible.

The individual you are looking for does notexist in this dataset. We banished him. He isn’t welcome.

Oh yeah, Waldo comes in this joint all thetime. The last time I saw him was probably6 months ago. He was wearing a fur coatfrom a bear that killed his brother.

find 0,1,3Waldo 1looking 0,1,2,4

The, 0,1,2,3,5,6individual 0,2,4you 0,1,2,3,4,5are 1,2,5,6

Yeah 0,2,4Waldo 0,3comes 0,2,3,4,5in

作成したフィルタを、各々のバケット内のフィルタと比較する

TSIDX上にwaldo

が存在することを確認する

01010101001001

11001001000110

01010101001001

シークアドレスを使って、対象のイベントを取得する

01010101001001

2 waldoのhash値からbloomfilterが作成される

3

4時間前からのデータで

“world”インデクサへの

検索を開始する

4 5 6

*The internal structure of Bloom filters, TSIDX, and Journal files has been simplified for illustrative purposes

1

01010101001001

index=world name=waldo

サーチはどのように動くか…分散サーチ

サーチはどのように動くか

19

分散サーチ

1 サーチヘッドは、サーチ文を分散実行する部分と、

中央で実行する部分とに分ける

2 分散実行部分を、各インデクサに投げる

3 各インデクサはディスクからイベントを取得する

4 Key/Valueのスキーマがイベントに適用される

(スキーマオンザフライ)

5 Key/Valueの観点で結果をフィルタする

6 分散コマンドを適用する

7結果がサーチヘッドに返される

8サーチヘッドで、中央コマンドを実行し、

変換処理コマンドを実行し、結果を表示する

サーチはどのように動くか

20

サーチコマンドの種類

● ストリームコマンド

– 分散可能 (リモートストリーミング)

‣ イベント個々を操作する

‣ インデクサ上で実行される(分散)

‣ 例: eval, rex, where, rename, fields…

– 中央 (ステートフルストリーミング)

‣ 全体の結果の少なくとも一部を操作する

‣ サーチヘッドで実行される(中央)

‣ 例: head, streamstats

● トランスフォームコマンド

– レポート目的のデータ構造を作成する

– 全体のイベント上で実行される

‣ ストリームされない(分散されない)

‣ 大抵サーチヘッドで実行される

– 例: transaction, stats, top, timechart…

サーチはどのように動くか

21

コマンドの順番

index=world name=waldo glasses=yes | eval miles=km*0.62 | stats count by countries

分散される

イベントが取得された

中央で実行される

• コマンドは、書いたとおりの順番で実行される

• 中央/トランスフォームコマンドを分散コマンドの前に置くと、不必要にデータをサーチヘッドに一旦集めてきてしまうことになりかねない

SPLコマンドを通って、結果がリニアに移動する

もっと知りたい?

22

ぜひ次回?のユーザ会で!

サーチ Tips

サーチ Tips

24

Splunkにサーチさせたいデータを極力減らす– インデックスを指定して制限すべき– 時間範囲でしっかり絞る– なるべくユニークな値を検索するようにする

スキーマオンザフライ後にフィルタされる(捨てられる)イベントを減らせられる

分散サーチ– しっかりと分散されることを確認– 分散コマンドを中央コマンドの前に

サーチ Tips

25

避けるべき なぜ 代替案

全期間 • イベントは時間でグループ化される

• 時間を指定することでサーチ対象のバケット数を減らせられる

• 時間範囲を指定する• 時間範囲をなるべく狭くする

index=* • イベントはインデクサ単位でグループ化される

• インデックスを指定することでサーチ対象のバケット数を減らせられる

• 常にインデクサを指定するようにする

ワイルドカード • ワイルドカードは、ブルームフィルタが効かない

• 単語のワイルドカードマッチングがとても時間がかかる

• 使い方によってレベルが異なる> myterm* 百歩譲ってやる> *mytermだめ> *myterm* 終わってる

• ORを使ってがんばってi.e.: MyTerm1 OR MyTerm2

サーチ Tips

26

避けるべき なぜ 代替案

NOT!=

• ブルームフィルタとインデックスという概念は、語句の位置をすばやく特定できるように、という目的で設計されている

• 存在していない語句を探すという処理は重い

• OR/ANDを使ってがんばる(host=c OR host=d)(host=f AND host=h)vs.(host!=a host!=b)NOT host=a host=b

Verbose 検索モード

• すべてのイベントデータがサーチヘッドに返されるので、重い

• スマートモードか、Fastモードを使ってね

リアルタイムサーチ

• リアルタイムサーチは、サーチヘッドとインデクサへの負荷をかけてしまう

• 1分や5分のスケジュールサーチでも同じぐらいの効果は実現可能ですよ

• スケジュールサーチをより頻繁につかってください

• Indexed-Realtimeサーチを使ってね(Set by Splunk admin)

サーチ Tips

27

避けるべき なぜ 代替案

Transaction • インデクサ間で分散されない• maxSpanやstartsWithといった概念が必要な時のみ使うようにする

• statsコマンドをなるべく使ってください

Joins/Sub-searches

• Joins コマンドは、共通のフィールドで

イベントをリンクさせるが、とても重い検索コマンド

• なるべくstatsあるいはtransactionコマンドでリンクをさせてください

最初の”|”の後のseachコマンド

• 検索した結果を二つ目の”|search”で検索するのは効率がとても悪い

• なるべく最初の”|”の手前でフィルタ処理をおこなってくださいi.e.: >index=main foo bar

vs. >index=main foo | search bar

TERM コマンドなにそれ

• Splunkは、単語をMajorとMinorというセグメントに分けます– TSIDに書き込まれ、またサーチされる際に– 以下の文字がMinorセグメントとして判断される:

/ : = @ . - $ # % \\ _

• TERM コマンドは、サーチする際にこのMinorセグメントの分割処理を省いてくれる

28

Raw Events

10.0.0.6

9/28/2016

[email protected]

Term Postings List

0 0

6 0

9 1

10 0

28 1

2016 1

10.0.0.6 0

9/28/2016 1

com 2

jeff 2

splunk 2

[email protected] 2

Lexicon

[ AND 0 10 6 index::myindex ]

TERM コマンド

29

TERMコマンドはlexiconをどう検索するか、どのイベントをディスクから取ってくるかをコントロールしています

引用「”」は、イベントがディスクから取得された”後”にフィルタリングする際に便利です

値にMajorブレーカがある場合は、引用「”」を使ってください

引用「”」はどう?

index=myIndex name=“Willy Wonka”

[ AND wonka willy index::myindex ]

TERM コマンドどうやって使う?

30

• 単語は、かならずMajorセグメントで囲まれている必要がある‒ 例えば: スペース、タブ、リターンコード

‣ Segmenters.conf ファイルの中身をよく見ること‒ 単語にMajorセグメントを含めることはできない

ip 10.0.0.6 - 807256800 GET /images/launchlogo.gif

ip=10.0.0.6 - 807256804 GET /shuttle/missions.html

ip10.0.0.6 - 807256944 GET /history/history.html

ip=TERM(10.0.0.6)

TERM(ip=10.0.0.6)

TERM(ip10.0.0.6)

10.0.0.6:80 - 807256966 GET /skylab/skylab-4.htmlTERM(10.0.0.6*)

9/28/16 1:30 PM - name=Willy Wonka sex=m age=46TERM(“Willy Wonka”) X

サーチ Tips

31

Key/Valueは、TSIDXファイルに保存される

デフォルトの展開– source, host, sourcetype– これらを常に使う

TSTATS– 超高速コマンド– 生データを一切検索しないし、返さない– レポート高速化/データモデル高速化利用時に使えるのと、インデックス時の展開、の場合に使える

インデックスの際の展開

もっと知りたい?

32

ぜひ次回?のユーザ会で!

実際にコマンドを使ってみる

Command 対決Fields vs. Table

Goal: 結果から特定のフィールドを取り除きたい

• Table フォーマットのコマンドであり、フィルタリングしていない– 不適切に使うと、必要以上のデータをインデクサからサーチヘッドに渡してしまうことになる

• Fields は、Splunkに明示的にフィールドを破棄させたり、保持させたり指示ができる

34

index=myIndex field1=value1 | fields field1, field2, field4 | head 10000

| fields field2, field4

index=myIndex field1=value1 | table field1, field2, field4 | head 10000

| table field2, field4

Command 対決Fields vs. Table Example

35

サーチ文 ステータス 取得サイズ イベント数 実行時間

| table Running (1%)

624.93MB 2,037,500 00:02:44

| fields Done 9.95MB 10,000 00:00:13

Command 対決Stats vs. Transaction

Goal: G共通の値で複数イベントをグルーピングしたい

• もし素でtransactionコマンドを使っていたら、statsコマンドで代用できます– startswith, endswith, maxspan, maxpause, etc…

36

index=mail [email protected] | stats latest(_time) AS mTime values(to)

AS to values(from) AS from values(subject) AS subject BY message_id

index=mail [email protected]| transaction message_id | table _time, to,

from, subject, message_id

Command 対決Joins & サブサーチ

Goal: 二つのソースタイプをまたいで、最新のJSESSIONIDを返したい

37

sourcetype=access_combined OR sourcetype=applogs | stats latest(*) AS *

BY JSESSIONID

sourcetype=access_combined | join type=inner JSESSIONID [search

sourcetype=applogs | dedup JSESSIONID | table JSESSIONID,

clienip, othervalue]

Resources• Splunk Docs

– Write Better Searcheshttp://docs.splunk.com/Documentation/Splunk/latest/Search/Writebettersearches

– Wiki: How Distributed Search Workshttp://wiki.splunk.com/Community:HowDistSearchWorks

– Splunk Search Typeshttp://docs.splunk.com/Documentation/Splunk/6.2.3/Capacity/HowsearchtypesaffectSplunkEnterpriseperformance

– Blog: When to use Transaction and when to use Statshttp://blogs.splunk.com/2012/11/29/book-excerpt-when-to-use-transaction-and-when-to-use-stats/

– Segmenters.conf Spechttp://docs.splunk.com/Documentation/Splunk/latest/Admin/Segmentersconf

– Splunk Book: Exploring Splunkhttp://www.splunk.com/goto/book

• How Bloom Filters Work: An Interactive Demohttps://www.jasondavies.com/bloomfilter/

38

Questions?

THANK YOU