ELK搭建實時日志分析平台之一ElasticSearch搭建


文:鐵樂與貓

系統:CentOS Linux release 7.3.1611 (Core)
注:我這里為測試和實驗方便,ELK整套都裝在同一台服務器環境中了,生產環境的話,可以分開搭建在不同的服務器上,只要能互相聯通。
相關部署環境
E:ElasticSearch-6.1.3
L:Logstash-6.1.3
K:Kibana-6.1.3
x-pack: X-Pack-6.1.3
JDK: openjdk1.8.0_141
node.js: v6.12.3
npm: 3.10.10
grunt-cli: 1.2.0
phantomjs: 2.1.1
整一套ELK可以當作一個MVC模型,
logstash是controller層,Elasticsearch是一個model層,kibana是view層。
將數據傳給logstash,它將數據進行過濾和格式化(轉成JSON格式);
然后傳給Elasticsearch進行存儲、建搜索的索引;
kibana提供前端的頁面再進行搜索和圖表可視化,它是調用Elasticsearch的接口返回的數據進行可視化。
logstash和Elasticsearch是用Java寫的,kibana使用node.js框架。

中文官網 https://www.elastic.co/cn/

一、安裝JAVA和設置JAVA變量環境

一般到官網將JDK包下載回來jdk-8u161-linux-x64.tar,放到服務端解壓到/usr/java(可以提前新建此文件夾)就完成安裝了,接下來是配置環境變量才為重要步驟。

vim /etc/profile
在底部添加以下內容 :

JAVA_HOME=/usr/java/jdk1.8.0_141
JRE_HOME=/usr/java/jdk1.8.0_141/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$JAVA_HOME/jre/lib/ext:
export JAVA_HOME JRE_HOME PATH CLASSPATH


我這次是嘗試直接使用yum 安裝的JDK,也就是直接 yum install java ,所以並沒有做前面那一步。
$ java -version
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-b16)
OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)

二、下載elasticsearch回來后解壓

ELK下載:https://www.elastic.co/downloads/
linux系統一般就選擇tar包下載可以了。
下載后在服務器/usr/ELK目錄上解壓:tar -zxvf elasticsearch-6.1.3.tar.gz

出於系統安全考慮設置,ElasticSearch不允許以root用戶模式運行。
由於Elasticsearch可以接收用戶輸入的腳本並且執行,
為了系統安全考慮,必須創建一個單獨的用戶用來運行Elasticsearch,
否則會導致運行失敗。

故為elsearch創建一個組和用戶如下:

sudo groupadd ELK #創建ELK組
sudo useradd elsearch -g ELK
sudo passwd elsearch

#創建新用戶elsearch加入ELK組並設置輸入密碼,注意如果直接-p指定明文密碼的話是不對的,-p后面接的是加密形式后的密文。

sudo chown -R elsearch:ELK /usr/ELK/elasticsearch-6.1.3 #變更elasticsearch目錄的權限所有者

su elsearch #切換elsearch用戶
/usr/ELK/elasticsearch-6.1.3/bin/elasticsearch -d #后台啟動elasticsearch
su - elsearch -c "/usr/ELK/elasticsearch-6.1.3/bin/elasticsearch -d" #臨時切換到elsearch用戶執行一條命令

**netstat -lnp | grep 9200 **#確認9200端口已監聽即elasticsearch啟動成功

tcp 0 0 127.0.0.1:9200 0.0.0.0:* LISTEN -

驗證
在服務器瀏覽器(安裝links或lynx)中輸入:http://localhost:9200/
或 127.0.0.1:9200(elasticsearch默認端口號為9200)
暫時不能在別的客戶機測試,因為偵聽的只是127.0.0.1本機,之后開放偵聽公網的時候記得systemctl stop iptabels關閉一下防火牆
或防火牆及安全組上配置開放端口。

links 127.0.0.1:9200 出現下載和顯示的選擇,選擇顯示后會顯示json內容:

修改監聽端口,允許外部系統遠程訪問(不然不方便吶):
編輯文件
sudo vim /usr/ELK/elasticsearch-6.1.3/config/elasticsearch.yml
在Network區域中修改默認參數
network.host的數值,另外http.port也可將默認的9200端口修改。

network.host: 0.0.0.0
(注意這里表示設置偵聽你所有網卡上的ip地址,也可以只針對單個網卡地址進行設置)

保存好設置,這個時候我想停止之前的elsearch換用已修改配置的這個該怎么辦?
elsearch是用java啟動的,我們可以先查找java進程再篩選,當然java也有可能運行了多個進程,所以還是直接查找elsearch為好。
ps -ef | grep elsearch

[operation@qiaocat-vpn config]$ ps -ef | grep elsearch
root 3045 2489 0 15:41 pts/11 00:00:00 su elsearch
elsearch 3046 3045 0 15:42 pts/11 00:00:00 bash
elsearch 3092 1 0 15:42 pts/11 00:00:23 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/usr/ELK/elasticsearch-6.1.3 -Des.path.conf=/usr/ELK/elasticsearch-6.1.3/config -cp /usr/ELK/elasticsearch-6.1.3/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
operati+ 5666 4141 0 17:24 pts/13 00:00:00 grep --color=auto elsearch

會看到主進程號,kill 主進程號就可以關掉了。
(當然,想平滑不關elsearch就實現配置重啟的話還可以用:
sudo kill -USR2 elsearch主PID號這樣,實際操作發現沒用,可能與我之前使用了臨時切換用戶啟動的命令有關。也有可能我誤輸入錯密碼了?)

重啟elseach:
su - elsearch -c "/usr/ELK/elasticsearch-6.1.3/bin/elasticsearch -d"
還是不行,那應該是要將前面3045和3046的進程也一並殺掉再試了。

[2018-02-01T18:02:39,534][INFO ][o.e.t.TransportService ] [l2qPmsb] publish_address {0.0.0.0:9300}, bound_addresses {0.0.0.0:9300}
[2018-02-01T18:02:39,548][INFO ][o.e.b.BootstrapChecks ] [l2qPmsb] bound or publishing to a non-loopback address, enforcing bootstrap checks
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2018-02-01T18:02:39,561][INFO ][o.e.n.Node ] [l2qPmsb] stopping ...
[2018-02-01T18:02:39,591][INFO ][o.e.n.Node ] [l2qPmsb] stopped
[2018-02-01T18:02:39,591][INFO ][o.e.n.Node ] [l2qPmsb] closing ...
[2018-02-01T18:02:39,608][INFO ][o.e.n.Node ] [l2qPmsb] closed

發現錯誤在於“綁定或發布到一個非回環地址”,執行bootstrap檢查后就直接停止進程了。
也就是一定要綁127.0.0.1這樣子的回環地址?
上網查證及思考后發現真正錯誤的提示是緊接着ERROR下面的兩行:
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

[1]無法創建本地文件問題,用戶最大可創建文件數太小,剛好差1……
解決方案:
vi /etc/sysctl.conf
設置fs.file-max=655350
保存之后sysctl -p使設置生效

vi /etc/security/limits.conf 修改或新增

  • soft nofile 65536
  • hard nofile 131072
  • soft nproc 2048
  • hard nproc 4096
    備注:* 代表Linux所有用戶名稱(比如 hadoop)
    后面設置的nproc實際上設置多線程,以防止再報用戶最大可創建線程數太小的故障。
    保存、退出、重新登錄才可生效
    重新使用SSH登錄,再次啟動elasticsearch即可。

[2]需要設置vm.max_map_count的參數從65530改到262144。是說系統最大虛擬內存的參數過低,這是與系統有關的了。
解決方案:
臨時設置:sudo sysctl -w vm.max_map_count=262144
永久修改:
修改/etc/sysctl.conf 文件,添加 " vm.max_map_count = 262144 "
並執行:sysctl -p


這下就正常改變偵聽網卡后也可以正常啟動elasticsearch了。
用客戶端瀏覽器訪問也正常了。

調整jvm內存參數
另外根據需要,可修改文件ElasticSearch目錄下
config/jvm.options文件,調整jvm內存參數。

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms1g
-Xmx1g

默認1g,可根據情況修改成-Xms2g之類。

后台運行elasticsearch還可以切換到elsearch用戶之后,在elasticsearch/bin目錄下執行:
nohup ./elasticsearch >> /usr/ELK/elasticsearch-6.1.3/output.log 2>&1 &

輸出日志倒是可有可無,因為elasticsearch本就有log記錄。也可以直接:
nohup ./elasticsearch &

創建軟鏈接:
ln -s elasticsearch-6.1.3 elasticsearch
一個良好習慣,
生成一個elasticsearch來作為elasticsearch-6.1.3的映射,平常在別的地方要用到指向elaticsearch時直接指的是不帶版本號的軟鏈接。
這樣在以后升級elasticsearch到別的版本的時候不致於是影響太多,只需要重新作軟鏈接即可。

三、安裝Head插件:

elasticsearch自5.x版本后便不支持直接安裝head插件。

不但如此,同時5.1之后也不支持直接放在elasticsearch的 plugins、modules 目錄下,不能使用 elasticsearch-plugin install。
直接啟動elasticsearch即可,之后再啟動head插件。

我第一次安裝時是放在elasticsearch的 plugins下了,結果關閉elasticsearch服務后第二天重啟發現報錯

org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentException: property [elasticsearch.version] is missing for plugin [head]
報head插件丟失

或另一種報錯是你沒有那些支持的目錄與文件。

elasticsearch配置允許跨域訪問
修改elasticsearch配置文件elasticsearch.yml
vim config/elasticsearch.yml,注意有空格

http.cors.enabled: true
http.cors.allow-origin: "*"

可以參考官網上說的安裝方法。如下:

1、下載head插件

https://github.com/mobz/elasticsearch-head

cd /usr/ELK/elasticsearch-6.1.3
mkdir head #創建一個head目錄用來存放,因為5.1版本后的不支持直接放plugins下了。
cd /usr/ELK/elasticsearch-6.1.3/head
開始用git下載head:
(參考https://github.com/mobz/elasticsearch-head上的官網做法,
當然前提是你要先安裝git,如果沒有也可以直接在它官網下打包下載回來再傳到服務器上。)

sudo git clone git://github.com/mobz/elasticsearch-head.git
下載回來的目錄大致如下:
[operation@qiaocat-vpn plugins]$ cd elasticsearch-head/
[operation@qiaocat-vpn elasticsearch-head]$ ll
total 60
-rw-r--r-- 1 root root 248 Feb 2 15:24 Dockerfile
-rw-r--r-- 1 root root 221 Feb 2 15:24 Dockerfile-alpine
-rw-r--r-- 1 root root 104 Feb 2 15:24 elasticsearch-head.sublime-project
-rw-r--r-- 1 root root 2171 Feb 2 15:24 Gruntfile.js
-rw-r--r-- 1 root root 3482 Feb 2 15:24 grunt_fileSets.js
-rw-r--r-- 1 root root 1088 Feb 2 15:24 index.html
-rw-r--r-- 1 root root 559 Feb 2 15:24 LICENCE
-rw-r--r-- 1 root root 886 Feb 2 15:24 package.json
-rw-r--r-- 1 root root 100 Feb 2 15:24 plugin-descriptor.properties
drwxr-xr-x 4 root root 4096 Feb 2 15:24 proxy
-rw-r--r-- 1 root root 6944 Feb 2 15:24 README.textile
drwxr-xr-x 5 root root 4096 Feb 2 15:24 _site
drwxr-xr-x 4 root root 4096 Feb 2 15:24 src
drwxr-xr-x 4 root root 4096 Feb 2 15:24 test

權限給elsearch用戶。
sudo chown -R elsearch:ELK /usr/ELK/elasticsearch-6.1.3/head/elasticsearch-head

2、npm安裝

cd elasticsearch-head
按照官網的說明到這步是進入到elasticsearch-head目錄后直接就開始npm install。
不過我的服務器上顯然還沒有安裝nodejs和grunt-cli,直接執行會報n多錯,
所以在進行這一步之前,還需要進行nodejs和grunt-cli/grunt及phantomjs的安裝:

sudo yum install nodejs
當然你也可以跑nodejs官網上去下載解壓來安裝,配置對應的環境變量就是了。
nodejs官網下載地址https://nodejs.org/dist/

驗證
node -v
v6.12.3
npm -v
3.10.10

cd /usr/ELK/elasticsearch-6.1.3/head/elasticsearch-head
**sudo npm install -g grunt-cli **
#注意這個命令要在elasticsearch-head目錄下運行,而且一旦目錄被遷移或中間的絕對路徑有變化,就得重新運行安裝。
另外,elsearch的用戶權限不足以運行命令安裝,需要切換到root用戶下執行。

[root@qiaocat-vpn elasticsearch-head]# npm install -g grunt-cli
/usr/bin/grunt -> /usr/lib/node_modules/grunt-cli/bin/grunt
/usr/lib
└── grunt-cli@1.2.0

上述命令執行完后,grunt 命令就被加入到你的系統路徑中了,以后就可以在任何目錄下執行此命令了。
注意,安裝grunt-cli並不等於安裝了 Grunt!
Grunt CLI的任務很簡單:調用與Gruntfile在同一目錄中 Grunt。
這樣帶來的好處是,允許你在同一個系統上同時安裝多個版本的 Grunt。
這樣就能讓多個版本的 Grunt 同時安裝在同一台機器上。

安裝grunt
Grunt是基於Node.js的項目構建工具。它可以自動運行你所設定的任務。
cd elasticsearch-head
因為我們是在git克隆下來的elasticsearch-head目錄下進行安裝grunt的,
而這個目錄下已經有package.json和Gruntfile.js,所以接下來可以用
sudo npm install grunt --save-dev

sudo npm install -g grunt --registry=https://registry.npm.taobao.org
來進行安裝Grunt最新版本到項目目錄中,並將其添加到devDependencies內

驗證:

[root@qiaocat-vpn elasticsearch-head]# grunt
>> Local Npm module "grunt-contrib-clean" not found. Is it installed?
>> Local Npm module "grunt-contrib-concat" not found. Is it installed?
>> Local Npm module "grunt-contrib-watch" not found. Is it installed?
>> Local Npm module "grunt-contrib-connect" not found. Is it installed?
>> Local Npm module "grunt-contrib-copy" not found. Is it installed?
>> Local Npm module "grunt-contrib-jasmine" not found. Is it installed?
Warning: Task "clean" not found. Use --force to continue.
Aborted due to warnings.

這些是Gruntfile.js中引用的,但缺少這些模板,分別去下載安裝,還要注意版本號問題。
當然這只是警報,忽略去運行也是能正常啟動的。只是不爽。

npm install grunt-contrib-clean
npm install grunt-contrib-concat
npm install grunt-contrib-watch
npm install grunt-contrib-connect
npm install grunt-contrib-copy
npm install grunt-contrib-jasmine

附Grunt常用插件說明:
1)grunt-contrib-uglify:壓縮js代碼
2)grunt-contrib-concat:合並js文件
3)grunt-contrib-qunit:單元測試
4)grunt-contrib-jshint:js代碼檢查
5)grunt-contrib-watch:文件監控
6)grunt-contrib-sass:Scss編譯
7)grunt-contrib-connect:建立本地服務器

運行以上安裝,還有一個npm install grunt-contrib-clean很可能因為版本問題裝不上,
因為哪怕直接指定版本號:npm install grunt-contrib-clean@1.0.1也出錯,沒有這個版本。

[root@qiaocat-vpn elasticsearch-head]# npm install grunt-contrib-clean --save-dev
elasticsearch-head@0.0.0 /usr/ELK/elasticsearch-6.1.3/head/elasticsearch-head
└── grunt-contrib-clean@1.0.0

npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression

上面的報警信息說的spdx,開源軟件或其他合作類軟件的一個使用聲明影響了。

The SPDX License List is a list of commonly found licenses and exceptions used in free and open source and other collaborative software or documentation.
The purpose of the SPDX License List is to enable easy and efficient identification of such licenses a standardized short identifier, full name, vetted license text including matching guidelines markup as appropriate, and a canonical permanent URL for each license and exception.
SPDX許可證列表是一個常見的許可和例外的列表,在自由和開放源代碼和其他協作軟件或文檔中使用。SPDX許可證列表的目的是為了方便和有效地標識此類許可證。
使其具有標准化的短標識符、全名、經過審查的許可文本,包括適當的匹配准則標記,以及每個許可證和異常的標准永久URL。

據網上所說是要打開elasticsearch-head目錄下的package.json文件,找到license位置,修改為上面這個網站上存在Identifier,就可以了。
至於為什么elasticsearch-head使用的是Apache License2.0,我也不太清楚。
而且默認已經是license : Apache2,但仍然要改成和spdx網站上顯示的Apache-2.0才可以……好坑。

如此修改保存后,再進行npm install grunt-contrib-clean --save-dev就正常安裝上了。

再運行grunt報的No "clean" targets found.就真的只是一個無關重要的警報了,畢竟沒有需要clean的目標。
[root@qiaocat-vpn elasticsearch-head]# grunt
>> No "clean" targets found.
Warning: Task "clean" failed. Use --force to continue.

Aborted due to warnings.

安裝phantomjs
可以從http://phantomjs.org/download.html官網找到安裝包下載。不過我前面執行過npm install grunt-contrib-jasmine已經是安裝上了。

比如我找到的最新版本地址就是https://github.com/ariya/phantomjs/archive/2.1.3.tar.gz
sudo wget https://github.com/ariya/phantomjs/archive/2.1.3.tar.gz
sudo tar -zxvf 2.1.3.tar.gz
解壓后得phantomjs-2.1.3目錄。

現在可以進行執行
**sudo npm install **

雖然執行后還是重新自行去安裝PhantomJS了,看提示應該是我前面解壓后還要做一步復制phantomjs-prebuilt目錄到node_modules目錄下才對。

[operation@qiaocat-vpn elasticsearch-head]$ sudo npm run start #或在elasticsearch-head目錄下敲grunt server

> elasticsearch-head@0.0.0 start /usr/ELK/elasticsearch-6.1.3/head/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

上面可以看得啟動了head插件服務,且偵聽的是localhost9100端口。
ctrl+c停止進程,我們需要修改一下grunt的偵聽網卡地址,這樣在外網也能訪問。
修改head目錄下的Gruntfile.js配置,head默認監聽127.0.0.1
#sudo vim Gruntfile.js
找到

connect: {
                        server: {
                                options: {
                                        port: 9100,
                                        base: '.',
                                        keepalive: true
                                }
                        }
                }

在這區域的options括號中增添一行
hostname: '0.0.0.0',
注意":"后是接一個空格的,另外末尾的","不能漏。
最終如圖:

阿里雲ECS安全組和服務器防火牆開放(默認)9100/9200/9300端口
使用客戶端瀏覽ES服務器的9100端口,如圖:

證明安裝head插件成功。

注意的是,停止elasticsearch主進程並不會影響到head 9100的訪問。

如果要將head進程放入后台運行,可以使用nohup 加&后台運行,並且建議輸出一個日志記錄:
nohup npm run start >> /usr/ELK/elasticsearch-6.1.3/head/elasticsearch-head/output.log 2>&1 &

(未完,下接ELK搭建實時日志分析平台之二Logstash和Kibana搭建)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM