雑文発散

«前の日記(2014-11-03) 最新 次の日記(2014-11-05)» 編集
過去の日記

2014-11-04 [長年日記]

[Fluentd][Elasticsearch] Fluentd + Elasticsearch + Kibana での解析用に Elasticsearch を仕込む

前回からしばらく開いてしまったけど、今回は前回の Fluentd の仕込みと Elasticsearch 本体との連携部分。

Elasticsearch のインストール

Elasticsearch 本体は、本家のリポジトリを登録し、apt-get で install やら update やらをできるようにした。手順は、ドキュメントの repositories にあるとおり。

まずは、GPG KEY のインストール。

% wget -qO - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | sudo apt-key add -

source list に URL を追記。ドキュメントでは /etc/apt/sources.list に直接追記するように書かれているけど、/etc/apt/sources.list.d/elasticsearch.list というファイルを新規に作成し、そこへ記述するようにした。

% sudo vim /etc/apt/sources.list.d/elasticsearch.list
deb http://packages.elasticsearch.org/elasticsearch/1.3/debian stable main

あとは、apt-get でインストール。

% sudo apt-get update
% sudo apt-get install elasticsearch

それから、このサーバには Java の環境も入っていなかったので OpenJDK もインストールした。

% sudo apt-get install openjdk-7-jdk

Elasticsearch の設定

インストール時の設定そのままでも起動はできるけど、Elasticseach のクラスタ名・ノード名あたりは変更するクセを付けておいた方が後々のトラブルが少なそうなので、個別に設定する。

設定ファイルは /etc/elasticsearch/elasticsearch.yml にある。

% sudo vim /etc/elasticsearch/elasticsearch.yml

今回は、クラスタ名を「starfighter」にしてノード名を「X-wing」にする。分かる人にはすぐ分かると思うけど、分からない人は List of Star Wars starfighters あたりを見ると良いかもしれない。

cluster.name: starfighter
node.name: "X-wing"

これで起動して、クラスタ名・ノード名が変更になったかを確認しておく。

% sudo /etc/init.d/elasticsearch stop
% sudo /etc/init.d/elasticsearch start

cluster API のうち、ノード情報を表示する _node を利用する。

% curl -XGET "http://localhost:9200/_nodes?pretty=true"
{
  "cluster_name" : "starfighters",
  "nodes" : {
    "6rs2ICjMQrWdTdoG0pnpVA" : {
      "name" : "X-wing",
[snip]

cluster.name が starfighter で、node.name が X-wing になっているのが確認できる。

iptables の設定

Elasticsearch のデフォルトは「どのサーバ(IP)からもアクセスを許可」になっているので、このままだと、世界中のどこからでもアクセスができてしまう。

当初の構成案に従い、iptables を使って第三tDiary.Netのサーバと、自サーバからのみアクセスを受け付けるようにする。

fluentd + elasticsearch 構成図

設定内容はこのようにしてみた。IPv6 は使っていないので v4 の設定のみ。

% sudo vim /etc/iptables/rules.v4
# Allow Elasticsearch from 3rd tDiary.Net
-A INPUT -p tcp --dport 9200 -s 127.0.0.1      -j ACCEPT
-A INPUT -p tcp --dport 9200 -s [第三tDiary.NetのIPアドレス] -j ACCEPT
-A INPUT -p tcp --dport 9200 -j REJECT

設定を reload して適用する(iptables-persistent が入っていなければ別途インストールする)。

% sudo /etc/init.d/iptables-persistent reload

設定が意図通りに動くかを確認する。まずは自サーバからアクセス。

% curl -XGET "http://localhost:9200/_nodes?pretty=true"
{
  "cluster_name" : "starfighters",
  "nodes" : {
    "6rs2ICjMQrWdTdoG0pnpVA" : {
      "name" : "X-wing",
[snip]

_nodes API から返答が来るので意図通り。次は第三tDiary.Netのサーバからアクセスしてみる。

% curl -XGET "http://[解析サーバのIP]:9200/_nodes?pretty=true"
{
  "cluster_name" : "starfighters",
  "nodes" : {
    "6rs2ICjMQrWdTdoG0pnpVA" : {
      "name" : "X-wing",
[snip]

こちらも期待の返答が来た。最後は、手元の MacBook Air から。

% curl -XGET "http://vps.zatsubun.com:9200/_nodes?pretty=true"
curl: (7) Failed to connect to vps.zatsubun.com port 9200: Connection refused

いまは SoftBank のモバイルルータからアクセスしているのだけど、許可していない IP なので期待通りに REJECT された。これでアクセス元の制御は OK そうだ。

Fluentd から Elasticsearch への流し込み

次は第三tDiary.Netから解析サーバへのログの流し込み。

前回の td-agent.conf から少し拡張して、このようにした。

これで td-agent を再起動すれば、第三tDiary.Netの Fluentd から解析サーバの Elasticsearch サーバへログが流し込まれるようになる。

% sudo /etc/init.d/td-agent stop
% sudo /etc/init.d/td-agent start

Elasticsearch でデータの確認

Fluentd を起動してしばらくすると Elasticsearch にデータが入ってくるはず。マッピングの設定はしていないけど、自動でこんな感じで定義してくれた。

% curl -XGET "http://localhost:9200/logstash-2014.11.03/_mapping?pretty=true"
{
  "logstash-2014.11.03" : {
    "mappings" : {
      "access_log" : {
        "properties" : {
          "@log_name" : {
            "type" : "string"
          },
          "@timestamp" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "bytes" : {
            "type" : "string"
          },
          "http" : {
            "type" : "string"
          },
          "ip" : {
            "type" : "string"
          },
          "method" : {
            "type" : "string"
          },
          "request_uri" : {
            "type" : "string"
          },
          "server" : {
            "type" : "string"
          },
          "status" : {
            "type" : "string"
          },
          "user_agent" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

さらにしばらく放置しておき、Elasticsearch への登録数が増えるのを待って、インデックスの登録件数を見てみた。

% curl -XGET "http://localhost:9200/_cat/count/logstash-2014.11.03"
1415007863 18:44:23 4946

suzuki.tdiary.net へのアクセスを検索してみる。表示するフィールドを server と path に限定。結果は最大3個までとした結果がこれ。

集計ができそうな気配が出てきた。

つづきの日記へ