ELK 安裝筆記 | Daily Oops!
Daily Oops

Daily Oops!

April 7, 2016

ELK 安裝筆記

這份其實是學校作業(逃)。雖然說是作業,但也還算有分享的價值,就在此整理出來。因為主力機 MBA 的儲存空間快炸了,所以我在 AWS 上開了一台 t2.medium 的機器來跑 Spark 以及 ELK Stack。在課堂中, ELK 是以下載 binary zip 包的方式設定,因為小弟習慣用 APT 套件管理程式,所以裝 ELK 相關設定方式也和 binary zip 不太一樣。

安裝過程主要參考數位海的這篇,還有上課簡報。數位海這篇超詳細的,可以交互對照一下。

安裝 Java 8

sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
sudo apt-get -y install oracle-java8-installer

安裝 ElasticSearch

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list
sudo apt-get update
sudo apt-get -y install elasticsearch

到這邊裝完,然後編輯 ElasticSearch 設定檔:

sudo vi /etc/elasticsearch/elasticsearch.yml

把 network.host 改成 0.0.0.0,讓外網也可以存取。

註:之後還會搭上 nginx 的 reverse proxy,並裝上前端 kibana,這裡為了安全性也可以不要改。

重啟 elasticsearch 的服務:

sudo service elasticsearch restart

讓它開機時自動啟動(Optional)

sudo update-rc.d elasticsearch defaults 95 10

ElasticSearch binary 檔的位置在 /usr/share/elasticserach/bin

安裝 head plugin:

sudo /usr/share/elasticserach/bin/plugin install mobz/elasticsearch-head

把 iptable 打開

sudo iptables -A INPUT -m tcp -p tcp --dport 9200 -j ACCEPT
sudo iptables -A INPUT -m udp -p udp --dport 9200 -j ACCEPT

記得在 EC2 打開 9200 port,這時候開啟瀏覽器,進到

http://YOUR_IP_ADDRESS:9200/_plugin/head

就有一個簡單的圖形界面啦。

安裝 Kibana

echo "deb http://packages.elastic.co/kibana/4.4/debian stable main" | sudo tee -a /etc/apt/sources.list.d/kibana-4.4.x.list
sudo apt-get update
sudo apt-get -y install kibana

到這裡裝完,然後編輯 kibana 的設定檔:

sudo vi /opt/kibana/config/kibana.yml

把 server.host 從 0.0.0.0 改成 localhost,因為稍後會裝 nginx 來做我們的反向代理:

server.host: "localhost"

加入開機啟動,然後啟動服務:

sudo update-rc.d kibana defaults 96 9
sudo service kibana start

安裝 nginx 啥的

sudo apt-get install nginx apache2-utils

建立一個 kibanaadmin 的認證使用者(名稱可換)

sudo htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

編輯 nginx 設定檔

sudo vi /etc/nginx/sites-available/default

換成下面這個

server {
listen 80;
server_name example.com;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

example.com 的地方,看你要換成 Instance 的 IP 或是 domain name 都可以。EC2 可以換成 public dns name。

重啟 nginx

sudo service nginx restart

安裝 Logstash

echo 'deb http://packages.elastic.co/logstash/2.2/debian stable main' | sudo tee /etc/apt/sources.list.d/logstash-2.2.x.list
sudo apt-get update
sudo apt-get install logstash

中間數位海插了一段設定 SSL 的,因為我沒有要用就跳過這部分。

Logstash 安裝完的 binary 會在 /opt/logstash/bin

設定 Logstash

sudo vim /etc/logstash/conf.d/02-twitter.conf

填入以下內容

input {
twitter {
consumer_key => ""
consumer_secret => ""
oauth_token => ""
oauth_token_secret => ""
keywords => ["beauty"]
languages => ["en"]
full_tweet => true
}
}
output {
elasticsearch {
index => "twitter"
}
}

oauth 的 key 就填自己申請的,keywords 填自己要的,然後存檔離開。

接下來跑

sudo service logstash configtest

看一下設定檔有沒有寫錯, 然後重啟 logstash 服務,並加入開機自啟動(Optional)

sudo service logstash restart
sudo update-rc.d logstash defaults 96 9

原則上這時候登入 kibana 或是在 head 儀表板就可以看到記錄數一直增多了 :p

匯出資料

我用了 elasticsearch-dump 套件,記得先裝好 node v1.0 以上版本。

npm install elasticdump -g # 安裝
elasticdump --input=http://localhost:9200/twitter --output=twitter.json # 一鍵匯出

上傳

之前 Github 推了 LFS(Large File Storage),json 雖然純文字檔很好壓縮,但無論怎麽壓還是有點難推進到 100 MB ,也就是 Github 支援的最大容量,以內。勢必就要來用下 git-lfs 了。

匯出的資料格式

搜尋的關鍵字是 beauty,你知道 twitter 上最多這種圖帳了,多訂閱幾個總是使人心情愉悅 #)

{
"_index": "twitter", // 灌入到 elasticsaerch 裡的資料表
"_type": "logs",
"_id": "AVPCY9McFvHLlvNymVV9", // elasticearch 產生的 id
"_score": 1,
"_source": {
"created_at": "Tue Mar 29 12:40:34 +0000 2016", // 建立於
"id": 714794377491587100, // twitter 的 tweets id
"id_str": "714794377491587072",
"text": "Regina King On The 'Fascinating' Beauty Of Black Women's Hair https://t.co/0838uXkQ1e @HannahOliver152",
"source": "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.it</a>",
"truncated": false,
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": { // twitter user 的資料
"id": 2558258431, // user id
"id_str": "2558258431",
"name": "Hannah Oliver", //名字
"screen_name": "HannahOliver152", //帳號名
"location": null,
"url": "http://www.wordpress.com",
"description": "Our life always expresses the result of our dominant thoughts.",
"protected": false,
"verified": false,
"followers_count": 31,
"friends_count": 11,
"listed_count": 6,
"favourites_count": 0,
"statuses_count": 17481,
"created_at": "Tue Jun 10 05:18:02 +0000 2014",
"utc_offset": null,
"time_zone": null,
"geo_enabled": false,
"lang": "en",
"contributors_enabled": false,
"is_translator": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_link_color": "0084B4",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"profile_image_url": "http://pbs.twimg.com/profile_images/476232749041201152/yWKGqAkC_normal.jpeg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/476232749041201152/yWKGqAkC_normal.jpeg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/2558258431/1402377722",
"default_profile": true,
"default_profile_image": false,
"following": null,
"follow_request_sent": null,
"notifications": null
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"is_quote_status": false,
"retweet_count": 0,
"favorite_count": 0,
"entities": {
"hashtags": [],
"urls": [
{
"url": "https://t.co/0838uXkQ1e",
"expanded_url": "http://dlvr.it/Kw7QcG",
"display_url": "dlvr.it/Kw7QcG",
"indices": [
62,
85
]
}
],
"user_mentions": [
{
"screen_name": "HannahOliver152",
"name": "Hannah Oliver",
"id": 2558258431,
"id_str": "2558258431",
"indices": [
86,
102
]
}
],
"symbols": []
},
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"filter_level": "low",
"lang": "en",
"timestamp_ms": "1459255234488",
"@version": "1",
"@timestamp": "2016-03-29T12:40:34.000Z"
},
"fields": {
"@timestamp": [
1459255234000
]
}
}

(完)