前回からしばらく開いてしまったけど、今回は前回の Fluentd の仕込みと 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
インストール時の設定そのままでも起動はできるけど、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 になっているのが確認できる。
Elasticsearch のデフォルトは「どのサーバ(IP)からもアクセスを許可」になっているので、このままだと、世界中のどこからでもアクセスができてしまう。
当初の構成案に従い、iptables を使って第三tDiary.Netのサーバと、自サーバからのみアクセスを受け付けるようにする。
設定内容はこのようにしてみた。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 そうだ。
次は第三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
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個までとした結果がこれ。
集計ができそうな気配が出てきた。