# tar zxf jdk-8u101-linux-x64.tar.gz -C /opt/ # vim /etc/profile.d/java.sh export JAVA_HOME=/opt/jdk1.8.0_101 export JAVA_BIN=/opt/jdk1.8.0_101/binls export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH # source /etc/profile.d/java.sh # java -version
# useradd heboan # passwd heboan
# tar zxf elasticsearch-5.2.0.tar.gz -C /opt/ # cd /opt/ # ln -s elasticsearch-5.2.0/ elasticsearch # chown -R heboan elasticsearch-5.2.0 elasticsearch # su heboan $ tree -L 1 . ├── bin //運行Elasticsearch實例和管理插件的一些腳本 ├── config //配置文件路徑,包含Elastichsearch.yml基本配置文件 ├── lib //Elasticsearch使用的庫 ├── LICENSE.txt ├── modules ├── logs //日誌目錄 ├── NOTICE.txt ├── plugins //插件安裝目錄 └── README.textile
四、改下配置文件/opt/elasticsearch/config/elasticsearch.ymljava
cluster.name: my-application //集羣名字 node.name: node-88.1 //節點名字 path.data: /data/es-data //數據存放路徑,確保建立此目錄 # mkdir -p /data/es-data # chown -R heboan /data/es-data network.host: 192.168.88.1 http.port: 9200 ----官方建議進行的配置說明------------ 雖然Elasticsearch僅須要不多的配置,但有一些設置須要手動配置,而且在進入生產以前進行配置 ☻ path.data 和 path.logs #若是使用.zip或.tar.gz安裝文件,則data和logs目錄是在目錄$ES_HOME中。若是這些重要的文件夾保留在默認位置,則在將Elasticsearch升級到新版本時存在將其刪除的高風險 ☻ cluster.name #節點只能cluster.name在與集羣中全部其餘節點共享集羣時才加入集羣。咱們應該將其更改成描述集羣用途的適當名稱 ☻ node.name #默認狀況下,Elasticsearch將使用隨機生成的UUID的第一個字符做爲節點ID,節點ID是持久的,重啓不會更改,咱們應該配置一個更有意義的名稱 ☻ bootstrap.memory_lock #對節點的健康相當重要,沒有一個JVM被交換到磁盤,一種實現方法是將bootstrap.memory_lock設置設置爲true ☻ network.host #默認狀況下,Elasticsearch僅綁定到環回地址,爲了與其餘服務器帶上的節點進行通訊和造成集羣,咱們須要將節點綁定到非環回地址 ☻ discovery.zen.ping.unicast.hosts #當與其餘服務器的節點造成集羣時,咱們必須提供集羣中多是活動和可聯繫的其餘節點列表 ☻ discovery.zen.minimum_master_nodes #爲了防止數據丟失,此配置相當重要,爲了不腦裂,此設置應該設置爲主合格節點的法定 數量(master_eligible_nodes / 2)+1, 換句話說,若是有三個主合格節點,則最小主節點應設置爲(3 / 2 ) + 1或2: discovery.zen.minimum_master_nodes:2
$ /opt/elasticsearch/bin/elasticsearch -d //-d 表示在後臺運行 >>啓動報錯,日誌以下 bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks ERROR: bootstrap checks failed max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] >>解決辦法 切換到root用戶修改配置sysctl.conf # vi /etc/sysctl.conf vm.max_map_count=655360 # sysctl -p # echo "* soft nofile 65536" >>/etc/security/limits.conf # echo "* hard nofile 65536" >>/etc/security/limits.conf 修改後從新登陸heboan用戶,使用以下命令查看是否修改爲功 $ ulimit -Hn 65536
$ netstat -lntp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN - tcp6 0 0 192.168.88.1:9200 :::* LISTEN 2428/java tcp6 0 0 192.168.88.1:9300 :::* LISTEN 2428/java tcp6 0 0 :::22 :::* LISTEN - tcp6 0 0 ::1:25 :::* LISTEN -
$ curl 192.168.88.1:9200 { "name" : "node-88.1", "cluster_name" : "my-application", "cluster_uuid" : "5j87qZ4dS9uBIoZc0CEseg", "version" : { "number" : "5.2.0", "build_hash" : "24e05b9", "build_date" : "2017-01-24T19:52:35.800Z", "build_snapshot" : false, "lucene_version" : "6.4.0" }, "tagline" : "You Know, for Search" }
/opt/elasticsearch/config/elasticsearch.yml更改以下: cluster.name: my-application //集羣名字 node.name: node-88.2 //節點名字 path.data: /data/es-data //數據存放路徑,確保建立此目錄 # mkdir -p /data/es-data # chown -R heboan /data/es-data network.host: 192.168.88.2 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.88.1", "192.168.88.2"] 在192.168.88.1也修改此配置,內容同樣 部署過程當中遇到問題請參考192.168.88.1解決方案
九、查看集羣狀態node
$ curl -XGET 'http://192.168.88.1:9200/_cluster/health?pretty' { "cluster_name" : "my-application", "status" : "green", "timed_out" : false, "number_of_nodes" : 2, "number_of_data_nodes" : 2, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }
# tar zxf jdk-8u101-linux-x64.tar.gz -C /opt/ # vim /etc/profile.d/java.sh export JAVA_HOME=/opt/jdk1.8.0_101 export JAVA_BIN=/opt/jdk1.8.0_101/binls export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH # source /etc/profile.d/java.sh # java -version
YUM安裝下載並安裝公共簽名密鑰 # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 例如/etc/yum.repos.d/,在具備.repo後綴的文件中的目錄中添加如下內容logstash.repo [logstash-5.x] name=Elastic repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md 能夠安裝 $sudo yum install logstash 由於使用YUN安裝網絡慢的緣由,這裏我使用二進制包安裝 ☻下載並解壓logstash # tar zxf logstash-5.2.0.tar.gz -C /opt/ # cd /opt/ # ln -s logstash-5.2.0 logstash # chown -R heboan logstash* # su heboan ☻準備logstash.conf配置文件 ☻運行 bin/logstash -f logstash.conf
$ /opt/logstash/bin/logstash -e 'input {stdin {}} output {stdout {}}'
hello heboan 2017-02-15T10:21:08.599Z host-2.heboan.com hello heboan my name is heboan 2017-02-15T10:21:22.909Z host-2.heboan.com my name is heboan
$ /opt/logstash/bin/logstash -e 'input {stdin {}} output {stdout {codec => rubydebug}}' hello heboan { "@timestamp" => 2017-02-15T10:31:46.127Z, "@version" => "1", "host" => "0.0.0.0", "message" => "hello heboan" }
$ /opt/logstash/bin/logstash -e 'input {stdin {}} output {elasticsearch {hosts => ["192.168.88.1:9200"]}}' hello heboan 如今咱們來查看192.168.88.1上面Elasticsearch的索引全部列表 $ curl '192.168.88.1:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open logstash-2017.02.15 wLuFEV4rRsS87DruuoX6fQ 5 1 1 0 4.6kb 4.6kb 咱們發現有一個索引logstash-2017.02.15 刪除索引 $ curl -XDELETE '192.168.88.1:9200/logstash-2017.02.15'
# tar zxf kibana-5.2.0-linux-x86_64.tar.gz -C /opt/ # cd /opt/ # ln -s kibana-5.2.0-linux-x86_64 kibana # chown -R heboan kibana*
# cd kibana # tree -L 1 . ├── bin //二進制腳本包括kibana啓動Kibana 服務器和kibana-plugin安裝插件 ├── config //配置文件 ├── data //Kibana及其插件寫入磁盤的數據文件的位置 ├── LICENSE.txt ├── node ├── node_modules ├── optimize //Transpiled源代碼。某些管理操做(例如插件安裝)致使源代碼被即時從新轉換 ├── package.json ├── plugins //插件文件位置。每一個插件都將包含在一個子目錄中 ├── README.txt ├── src ├── ui_framework └── webpackShims
server.port: | 默認值:5601 Kibana由後端服務器提供服務。此設置指定要使用的端口 |
server.host: | 默認值:「localhost」此設置指定後端服務器的主機 //這裏我把kibana安裝在88.1上面,因此我指定了IP:192.168.88.1 |
server.basePath: | 使您可以指定一個路徑來掛載Kibana在若是你在代理後面運行。這隻影響Kibana生成的URL, 您的代理應該在將請求轉發到Kibana以前刪除basePath值。此設置不能以斜槓(/)結尾 |
server.maxPayloadBytes: | 默認值:1048576傳入服務器請求的最大有效負載大小(以字節爲單位) |
server.name: | 默認值:「your-hostname」用於標識此Kibana實例的可讀的顯示名稱 |
server.defaultRoute: | 默認值:「/ app / kibana」此設置指定打開Kibana時的默認路由, 您可使用此設置在打開Kibana時修改着陸頁 |
elasticsearch.url: | 默認值:「http:// localhost:9200」要用於全部查詢的Elasticsearch實例的URL //這裏我改成http://192.168.88.1:9200 |
elasticsearch.preserveHost: | 默認值:true當此設置的值爲true時Kibana使用server.host設置中指定的主機名, 當此設置的值爲時false,Kibana使用鏈接到此Kibana實例的主機的主機名 |
kibana.index: | 默認值:「.kibana」Kibana使用 Elasticsearch中的索引來存儲保存的搜索, 可視化和儀表板。若是索引不存在,Kibana將建立一個新索引 |
kibana.defaultAppId: | 默認值:「discover」要加載的默認應用程序 |
tilemap.url: | Kibana用於在tilemap可視化中顯示地圖圖塊的圖塊服務的URL。 默認狀況下,Kibana從外部元數據服務讀取此URL,但用戶仍能夠覆蓋此參數以使用本身的Tile Map Service。 例如:"https://tiles.elastic.co/v2/default/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana" |
tilemap.options.minZoom: | 默認值:1最小縮放級別 |
tilemap.options.maxZoom: | 默認值:10最大縮放級別 |
tilemap.options.attribution: | 默認:"© [Elastic Tile Service](https://www.elastic.co/elastic-tile-service)"地圖屬性字符串 |
tilemap.options.subdomains: | tile服務使用的子域的數組。指定帶有令牌的URL的子域的位置{s} |
elasticsearch.username: 和 elasticsearch.password: |
若是您的Elasticsearch受基本認證保護,這些設置提供Kibana服務器用於在啓動時對Kibana索引執行維護的用戶名和密碼, 您的Kibana用戶仍須要使用經過Kibana服務器代理的Elasticsearch進行身份驗證 |
server.ssl.cert: 和 server.ssl.key: |
分別指向PEM格式SSL證書和SSL密鑰文件的路徑。這些文件爲從Kibana服務器到瀏覽器的傳出請求啓用SSL |
elasticsearch.ssl.cert: 和 elasticsearch.ssl.key: |
提供PEM格式SSL證書和密鑰文件路徑的可選設置。這些文件驗證您的Elasticsearch後端使用相同的密鑰文件 |
elasticsearch.ssl.ca: | 可選設置,使您可以爲Elasticsearch實例指定證書頒發機構的PEM文件的路徑 |
elasticsearch.pingTimeout: | 默認值:值elasticsearch.requestTimeout設置以毫秒爲單位的時間等待Elasticsearch對PING做出響應 |
elasticsearch.requestTimeout: | 默認值:30000等待來自後端或Elasticsearch的響應的時間(以毫秒爲單位)。此值必須爲正整數 |
elasticsearch.requestHeadersWhitelist: | 默認值:[ 'authorization' ]要發送到Elasticsearch的Kibana客戶端頭標列表。要發送任何客戶端頭,請將此值設置爲[](一個空列表) |
elasticsearch.customHeaders: | 默認值:{}要發送到Elasticsearch的標題名稱和值。不管配置如何, 任何自定義標頭都不能被客戶端頭elasticsearch.requestHeadersWhitelist覆蓋 |
elasticsearch.shardTimeout: | 默認值:0 Elasticsearch等待來自分片的響應的時間(毫秒)。設置爲0可禁用 |
elasticsearch.startupTimeout: | 默認值:5000重試前等待Kibana啓動時Elasticsearch的時間(以毫秒爲單位 |
pid.file: | 指定Kibana建立進程標識文件的路徑 |
logging.dest: | 默認值:stdout容許您指定Kibana存儲日誌輸出的文件 |
logging.silent: | 默認值:false將此設置的值設置true爲禁止全部日誌記錄輸出 |
logging.quiet: | 默認值:false將此設置的值設置true爲禁止除錯誤消息以外的全部日誌記錄輸出 |
logging.verbose | 默認值:false將此設置的值設置爲true記錄全部事件,包括系統使用信息和全部請求 |
ops.interval | 默認值:5000設置示例系統和過程性能指標的間隔(以毫秒爲單位)。最小值爲100 |
status.allowAnonymous | 默認值:false若是啓用了驗證,則將此設置爲true容許未經身份驗證的用戶訪問Kibana服務器狀態API和狀態頁 |
console.enabled | 默認值:true設置爲false可禁用控制檯。切換這將致使服務器在下次啓動時從新生成資產,這可能會致使在開始投放網頁以前出現延遲 |
console.proxyFilter | 默認值:.*用於驗證來自控制檯的任何傳出請求的正則表達式列表。若是沒有匹配,請求將被拒絕 |
console.proxyConfig | 基於代理目標的配置選項列表。使用此選項能夠爲特定主機設置自定義超時或SSL設置。 這是經過match使用通配符/ globs 定義一組標準來完成的,這將根據每一個請求進行檢查。而後將全部匹配規則中的配置合併在一塊兒,以配置用於該請求的代理 |
有效匹配關鍵字match.protocol, match.host,match.port, 和match.path |
全部這些鍵默認爲*,這意味着它們將匹配任何值。有關示例,請參閱配置控制檯 |
elasticsearch.tribe.url: | 用於全部查詢的Elasticsearch部落實例的可選URL |
elasticsearch.tribe.username: 和 elasticsearch.tribe.password: |
若是您的Elasticsearch受基本認證保護,這些設置提供Kibana服務器用於在啓動時對Kibana索引執行維護的用戶名和密碼。 您的Kibana用戶仍須要使用經過Kibana服務器代理的Elasticsearch進行身份驗證 |
elasticsearch.tribe.ssl.cert: 和 elasticsearch.tribe.ssl.key: |
提供PEM格式SSL證書和密鑰文件路徑的可選設置。這些文件驗證您的Elasticsearch後端使用相同的密鑰文件 |
elasticsearch.tribe.ssl.ca: | 可選設置,使您可以爲Elasticsearch實例指定證書頒發機構的PEM文件的路徑 |
elasticsearch.tribe.ssl.verify: | 默認值:true要忽略SSL證書的有效性,請將此設置的值更改成false |
elasticsearch.tribe.pingTimeout: | 默認值:值elasticsearch.tribe.requestTimeout設置以毫秒爲單位的時間等待Elasticsearch對PING做出響應 |
elasticsearch.requestTimeout: | 默認值:30000等待來自後端或Elasticsearch的響應的時間(以毫秒爲單位)。此值必須爲正整數 |
elasticsearch.tribe.requestHeadersWhitelist: |
默認值:[ 'authorization' ]要發送到Elasticsearch的Kibana客戶端頭標列表。要發送任何客戶端頭,請將此值設置爲[](一個空列表) |
elasticsearch.tribe.customHeaders: | 默認值:{}要發送到Elasticsearch的標題名稱和值。不管配置如何, 任何自定義標頭都不能被客戶端頭elasticsearch.tribe.requestHeadersWhitelist覆蓋 |
# su heboan $ cd /opt/kibana/bin/ $ ./bin/kibana 默認狀況下,Kibana在前臺運行,將其日誌打印到標準輸出(stdout),並能夠經過按中止Ctrl-C
$ tree /home/heboan/logs /home/heboan/logs ├── log-error.2017-02-10.log ├── log-error.2017-02-15.log └── log-info.2017-02-10.log
2017-02-10 14:23:24.636 [http-nio-8082-exec-7] ERROR com.bagtree.api.app.AppDeviceController 145 - [userFollow:device = 1788223859148804 no bind to children] 2017-02-10 14:23:24.637 [http-nio-8082-exec-7] ERROR com.bagtree.common.extend.CommExceptionHandler 28 - 設備未關聯到寶貝 com.bagtree.common.extend.CommException: 設備未關聯到寶貝 at com.bagtree.api.app.AppDeviceController.userFollow(AppDeviceController.java:146) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101] 2017-02-10 14:23:27.319 [http-nio-8082-exec-9] ERROR com.bagtree.api.app.AppDeviceController 145 - [userFollow:device = 1788223859148804 no bind to children] 2017-02-10 14:23:27.320 [http-nio-8082-exec-9] ERROR com.bagtree.common.extend.CommExceptionHandler 28 - 設備未關聯到寶貝 com.bagtree.common.extend.CommException: 設備未關聯到寶貝 at com.bagtree.api.app.AppDeviceController.userFollow(AppDeviceController.java:146) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_101] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_101] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_101] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_101] 分析: 從上面的日誌咱們能夠看出,多行事件,就是一個日誌事件由多行組成,java的異常日誌基本上是這樣的
input { stdin { codec => multiline { charset =>... # 字符編碼 ,可選 max_bytes => # bytes類型,設置最大的字節數,可選 max_lines => #number類型,設置最大的行數,默認是500行,可選 multiline_tag => #string類型,設置一個事件標籤,默認是"multiline" ,可選 pattern =>... # string 類型,設置匹配的正則表達式 ,必選 patterns_dir =>... #array類型,能夠設置多個正則表達式,可選 negate =>... # boolean類型,設置正向匹配仍是反向匹配,默認是false,可選 what =>... # 設置未匹配的內容是向前合併仍是向後合併,previous, next 兩個值選擇,必選 } } }
2017-02-10 23:59:41.156 [Thread-4] INFO com.bagtree.push.OemPushClient 113 - package read length:23 2017-02-10 23:59:41.156 [Thread-4] INFO com.bagtree.push.impl.response.LTHBCmdResponseHandlerImpl 33 - hb response:11722 2017-02-10 23:59:51.128 [Timer-0] INFO com.bagtree.push.impl.response.LTLoginCmdResponseHandlerImpl 70 - hb send:117204298 2017-02-10 23:59:51.158 [Thread-4] INFO com.bagtree.push.OemPushClient 113 - package read length:23 2017-02-10 23:59:51.158 [Thread-4] INFO com.bagtree.push.impl.response.LTHBCmdResponseHandlerImpl 33 - hb response:11723 分析:這個info日誌是一行一個事件
$ vim /opt/logstash/conf/logstash.conf input { file { path => "/home/heboan/logs/log-error.*.log" type => "log_error" start_position => "beginning" codec => multiline { pattern => "^\d" negate => true what => "previous" } } file { path => "/home/heboan/logs/log-info.*.log" type => "log_info" start_position => "beginning" } } output { if [type] == "log_error" { elasticsearch { hosts => ["192.168.88.1:9200"] index => "log_error_%{+YYYY-MM-dd}" } } if [type] == "log_info" { elasticsearch { hosts => ["192.168.88.1:9200]" index => "log_info_%{+YYYY-MM-dd}" } } }
$ /opt/logstash/bin/logstash -f /opt/logstash/conf/logstash.conf 運行成功以後,咱們能夠看下索引: $ curl '192.168.88.1:9200/_cat/indices?v' health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open log_info_2017-02-16 iq0HUZKMQtqLgPCQpamXTw 5 1 11633 0 4.7mb 4.7mb yellow open .kibana HesedL8WSiuprZzNObB-3w 1 1 1 0 3.1kb 3.1kb yellow open log_error_2017-02-16 lwG1iEsYSNmC5tgFIlUFMA 5 1 9 0 57.5kb 57.5kb