人們常常說資料如金,可是,能被利用起的資料,才是“金”。而網際網路的資料,常常以日誌的媒介的形式存在,並需要從中提取其中的”資料”。
從這些資料中,我們可以做使用者畫像(每個使用者都點了什麼廣告,對哪些開源技術感興趣),安全審計,安全防護(如果1小時內登入請求數到達一定值就報警),業務資料統計(如開源中國每天的部落格數是多少,視覺化編輯格式和markdown格式各佔比例是多少)等等。
之所以能做這些,是因為使用者的所有的行為,都將被記錄在nginx日誌中或其它web伺服器的日誌中。日誌分析要做的就是將這些日誌進行結構化,方便我們的業務人員快速查詢。日誌分析平臺要做的就是這些。
說完這些,你是不是覺得日誌分析平臺很難做,需要十人的團隊加班幾個月才能完成?
自從有了Elasticsearch、Logstash、Kibana,俗稱ELK,小公司也可以很輕鬆地做日誌分析了。說白了,1天幾G的日誌,ELK完全可以吃得消。就像標題說的,只需要1個人半小時就可以搭建好了。前提是你已經熟悉了Ansible。下文也假設你已經熟悉Anbile,如果不熟悉可以看看我的另一篇文章:Puppet,Chef,Ansible的共性
本文目的就是教你如何在搭建一個日誌分析平臺的雛形。有了這個雛形,你可以慢慢迭代出更強大,更適合你業務的日誌分析平臺。同時,提供可執行的原始碼:OSC-AdCenter
簡單日誌分析架構圖
我做了簡化,架構圖中的每個元件都可以分別放到不同的機器。這裡簡單介紹下這些你元件:
- your app:你的應用,我們的原始碼中,把這個給省略了
- Openresty:基於Nginx的Web開發平臺,你可以想像它基於Nginx做了很多擴充套件,類似淘寶的Tengine。為什麼我們不直接使用Nginx呢?因為在Openresty上,我們可以做更多事情。
- Logstash:日誌收集,結構化資料後,push到Elasticsearch中,基於JRuby。可使用其它日誌收集工具替代,比如Beats
- Elasticsearch:分散式搜尋引擎,基於Lucene
- Kibana:用於視覺化資料,基於NodeJs
日誌分析平臺開發所需要工具
- Ansible 2.0+:簡單的自動化配置工具,運維工具。關於自動化配置還有什麼好說的呢?
- Vagrant:作業系統虛擬化工具,開發時使用。如果沒有聽過,Docker總聽過吧。這傢伙就和Docker完全類似的功能,也早於Docker出現。
- 一個簡單的支援yml格式高亮的文字編輯器,比如Atom
- 自行下載JDK8:jdk-8u66-linux-x64.tar.gz放到專案路徑:
provision/roles/jdk8/files/jdk-8u66-linux-x64.tar.gz
P.S. 抱歉這個的確需要你自己下。 - 什麼?不用寫程式碼嗎?的確不用需要寫。如果你要擴充套件這個雛形就會需要寫一些指令碼。
啟動一臺伺服器
因為我們需要在本地開發好以後,再部署到生產環境,所以,我們需要一臺伺服器用來做實驗。用Vagrant可以在你的開發機上虛擬化一臺。clone 下 OSC-AdCenter後,進入專案目錄執行:Vagrant up
檔案Vagrantfile有描述這臺機器的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Vagrant.configure(2) do |config| ANSIBLE_RAW_SSH_ARGS = [] machine_box = "trusty-server-cloudimg-amd64-vagrant-disk1" machine_box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box" config.vm.define "oscadcenter" do |machine| machine.vm.box = machine_box machine.vm.box_url = machine_box_url machine.vm.hostname = "oscadcenter" machine.vm.network "private_network", ip: "192.168.4.10" ##指定這臺機器的IP,只能宿主機能訪問 machine.vm.provider "virtualbox" do |node| node.name = "oscadcenter" node.memory = 4048 node.cpus = 2 end end end |
更多關於Vagrantfile:https://www.vagrantup.com/docs/vagrantfile/
Vagrant機器的預設賬號密碼都是: vagrant,所以你可以使用ssh vagrant@192.168.4.10
登入這臺機器。也可以使用vagrant命令登入,在Vagrantfile所在目錄下執行:vagrant ssh oscadcenter
。
部署日誌分析平臺
在你的開發機上,安裝好ansible:
伺服器準備好了,我們只需要一條命令就可以部署OSC-AdCenter了:
1 |
ansible-playbook ./provision/playbook.yml -i ./provision/inventory -u vagrant -k |
然後輸入ssh登入密碼:vagrant。
簡單說明:
- ansible-playbook是ansible的一個命令
- ./provision/playbook.yml是描述你的伺服器配置的文字,你可以想像成所有的部署指令碼都寫在這個檔案中
- ./provision/inventory是伺服器在playbook在的host與ip的對映表,比如playbook中這麼寫:
12---- hosts: adcenter
那麼,inventory檔案就是這樣的:
1 2 |
[adcenter] 192.168.4.10 |
具體請看文件:http://docs.ansible.com/ansible/intro_inventory.html
-u vagrant -k
表示使用vagrant賬號ssh登入目標機器
部署的這個過程,要看你的網速和elastic源的提供速度,可能會很漫長。 參考時長為半小時。建議執行部署後,做些別的事情,比如午休。
測試部署是否成功
- 開啟Elasticsearch http://192.168.4.10:9200/_plugin/head/ 可看到介面:
- 開啟Kibana http://192.168.4.10:5601 可看到介面:
-
- 開啟各種瀏覽器,輸入url:http://192.168.4.10/1.gif?account=oschina&e=pv&p=p233444&url=www.oschina.net&title=學習&sh=1200&sw=800&cd=400&lang=en,然後可在Elasticsearch中和kibana中看到相應的資料
我使用Chrome訪問了兩次url,再使用Safari訪問了一次。就這樣,Elasticsearch中出現了3條資料,而Kibana中我們可統計出,過去4小時中,Chrome佔了2/3,而Safari佔 1/3。
部署過程都執行了什麼?
從部署指令碼的入口./provision/playbook.yml
看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
- hosts: analysis sudo: yes vars_files: - ./vars/base-env.yml - ./vars/analysis-logstash.yml roles: - common # 執行一些基礎工作 - openresty # 安裝openresty - {role: "analysis-openresty-conf", nginx_server_conf: "analysis.conf"} # 配置openresty - jdk8 # 安裝jdk8,並設定JAVA_HOME到 /etc/profile中 - ansible-role-elasticsearch #安裝 es - ansible-role-kibana-4 # 安裝kibana4 - ansible-logstash # 安裝logstash |
這裡的ELK的role都是從Ansible 的 Galaxy上download下來的。
然後呢?
- 學習Kibana的查詢語法,根據業務需求來統計分析日誌。
- 對當前的日誌分析平臺實施監控,哪天系統掛了,你都不知道。
- 與現在有的系統結合。
- 解決當單個Elasticsearch,特別龐大時的擴容問題
最後
好吧,如果你不會Ansible,你半小時可能搞不定。所以,我說的半小時,其實並不科學。但是這也恰恰說明了使用的自動化配置的好處。我一個運維外行,利用Ansible兩三天就搭建好了一個簡單日誌分析平臺。
而且如果你要在生產環境使用這套系統,你只需要線上上準備一臺乾淨的ubuntu伺服器,修改inventory檔案的IP就可以了。
現實中的日誌分析平臺一定不會這麼簡單的,本次教程,只是拋磚引玉。