搭建elk服務(wù)

一、搜索引擎

1、搜索引擎是由索引組件、搜索組件和用戶接口組成:

流程:
  • 索引組件:獲取數(shù)據(jù)-->建立文檔-->文檔分析-->文檔索引(倒排索引)
  • 搜索組件:用戶搜索接口-->建立查詢(將用戶鍵入的信息轉(zhuǎn)換為可處理的查詢對(duì)象)-->搜索查詢-->展現(xiàn)結(jié)果
  • 用戶接口:輸入和輸出
搜索引擎組件

2、搜索和索引組件的實(shí)現(xiàn)軟件

索引組件:Lucene
  • Apache LuceneTM是一個(gè)高性能、功能完全的文本搜索引擎庫(kù)完全用Java編寫。這是一個(gè)技術(shù)適合幾乎任何應(yīng)用程序需要全文搜索,尤其是跨平臺(tái)。
搜索組件:Solr
  • SolrTM高性能搜索服務(wù)器使用Lucene是一個(gè)核心,使用XML / HTTP和JSON / Python / Ruby api,顯示在平面的搜索、緩存、復(fù)制和web管理界面。
搜索組件:ElasticSearch
  • Elasticsearch是一種分布式的、基于rest的搜索和分析引擎可以解決越來(lái)越多的用例。彈性堆棧的核心,它集中存儲(chǔ)您的數(shù)據(jù),這樣你就可以發(fā)現(xiàn)預(yù)期和意想不到的發(fā)現(xiàn)。


    搜索和索引組件的實(shí)現(xiàn)軟件

3、抽取數(shù)據(jù)組件的實(shí)現(xiàn)軟件

什么是ETL工具
  • ETL,是英文 Extract-Transform-Load 的縮寫,用來(lái)描述將數(shù)據(jù)從來(lái)源端經(jīng)過(guò)抽取(extract)、轉(zhuǎn)換(transform)、加載(load)至目的端的過(guò)程。ETL 是構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)的重要一環(huán),用戶從數(shù)據(jù)源抽取出所需的數(shù)據(jù),經(jīng)過(guò)數(shù)據(jù)清洗,最終按照預(yù)先定義好的數(shù)據(jù)倉(cāng)庫(kù)模型,將數(shù)據(jù)加載到數(shù)據(jù)倉(cāng)庫(kù)中去。
ETL工具開(kāi)源實(shí)現(xiàn):Logstash
  • Logstash 是一個(gè)應(yīng)用程序日志、事件的傳輸、處理、管理和搜索的平臺(tái)。你可以用它來(lái)統(tǒng)一對(duì)應(yīng)用程序日志進(jìn)行收集管理,提供 Web 接口用于查詢和統(tǒng)計(jì)。Logstash 現(xiàn)在是 ElasticSearch 家族成員之一。
    Logstash是一個(gè)開(kāi)源的,服務(wù)器端數(shù)據(jù)處理管道,同時(shí)收集多個(gè)數(shù)據(jù)源的數(shù)據(jù),轉(zhuǎn)換,然后將其發(fā)送給你能夠“儲(chǔ)備?!?一般是Elasticsearch),Logstash性能比較差。
ETL工具開(kāi)源實(shí)現(xiàn):Beats
  • Filebeat:Log Files 處理日志文件
  • Metricbeat:Metrics 收集計(jì)量數(shù)據(jù)例如cpu信息
  • Packetbeat:Network Data 收集網(wǎng)絡(luò)報(bào)文數(shù)據(jù)
  • Winlogbeat:Windows Event Logs 視窗系統(tǒng)日志
  • Heartbeat:Uptime Monitoring 運(yùn)行監(jiān)控日志

4、用戶組件的實(shí)現(xiàn)軟件

Kibana:
  • Kibana允許您可視化Elasticsearch數(shù)據(jù)和導(dǎo)航彈性堆棧,非常精確的計(jì)算統(tǒng)計(jì)并展現(xiàn)出來(lái)。
    官方網(wǎng)站:https://www.elastic.co/cn/

二、ElasticSearch

1. ES是什么?

  • Elasticsearch 是一個(gè)開(kāi)源的搜索引擎,建立在全文搜索引擎庫(kù) Apache Lucene 基礎(chǔ)之上用 Java 編寫的,它的內(nèi)部使用 Lucene 做索引與搜索,但是它的目的是使全文檢索變得簡(jiǎn)單, 通過(guò)隱藏Lucene 的復(fù)雜性,取而代之的提供一套簡(jiǎn)單一致的 RESTful API。
  • Elasticsearch 是一個(gè)全文搜索引擎,也是一個(gè)分布式的實(shí)時(shí)文檔存儲(chǔ),每個(gè)字段可以被索引與搜索作數(shù)據(jù)庫(kù)用,也可做一個(gè)分布式實(shí)時(shí)分析搜索引擎 能勝任上百個(gè)服務(wù)節(jié)點(diǎn)的擴(kuò)展,并支持 PB 級(jí)別的結(jié)構(gòu)化或者非結(jié)構(gòu)化數(shù)據(jù)。
特性:

速度快、易擴(kuò)展、彈性、靈活、操作簡(jiǎn)單、多語(yǔ)言客戶端、X-Pack、hadoop/spark結(jié)合使用、開(kāi)啟即用。

分布式:橫向擴(kuò)展非常靈活
全文檢索:基于lucene的強(qiáng)大的全文檢索能力;
近實(shí)時(shí)搜索和分析:數(shù)據(jù)進(jìn)入ES,可達(dá)到近實(shí)時(shí)搜索,還可進(jìn)行聚合分析
高可用:容錯(cuò)機(jī)制,自動(dòng)發(fā)現(xiàn)新的或失敗的節(jié)點(diǎn),重組和重新平衡數(shù)據(jù)
模式自由:ES的動(dòng)態(tài)mapping機(jī)制可以自動(dòng)檢測(cè)數(shù)據(jù)的結(jié)構(gòu)和類型,創(chuàng)建索引并使數(shù)據(jù)可搜索。
RESTful API:JSON + HTTP

2、ES的核心物理組件

Cluster 集群:
  • 一個(gè)集群由一個(gè)唯一的名字標(biāo)識(shí),默認(rèn)為“elasticsearch”。集群名稱非常重要,具有相同集群名的節(jié)點(diǎn)才會(huì)組成一個(gè)集群。集群名稱可以在配置文件中指定。集群 狀態(tài):有三個(gè)分別是green, yellow, red
Node 節(jié)點(diǎn):
  • 存儲(chǔ)集群的數(shù)據(jù),參與集群的索引和搜索功能。像集群有名字,節(jié)點(diǎn)也有自己的名稱,默認(rèn)在啟動(dòng)時(shí)會(huì)以一個(gè)隨機(jī)的UUID的前七個(gè)字符作為節(jié)點(diǎn)的名字,你可以為其指定任意的名字。通過(guò)集群名在網(wǎng)絡(luò)中發(fā)現(xiàn)同伴組成集群。一個(gè)節(jié)點(diǎn)也可是集群。
Shard 分片:
  • 在創(chuàng)建一個(gè)索引時(shí)可以指定分成多少個(gè)分片來(lái)存儲(chǔ)。每個(gè)分片本身也是一個(gè)功能完善且獨(dú)立的“索引”,可以被放置在集群的任意節(jié)點(diǎn)上。分片的好處:允許我們水平切分/擴(kuò)展容量可在多個(gè)分片上進(jìn)行分布式的、并行的操作,提高系統(tǒng)的性能和吞吐量。注意分片數(shù)創(chuàng)建索引時(shí)指定,創(chuàng)建后不可改了。備份數(shù)可以隨時(shí)改。
Primary Shard主分片
Replica Shard副本分片
  • 一個(gè)分片可以有多個(gè)備份(副本)。備份的好處:高可用。一個(gè)主分片掛了,副本分片就頂上去;備份可擴(kuò)展搜索的并發(fā)能力、吞吐量。搜索可以在所有的副本上并行運(yùn)行。在高并發(fā)下副本也可搜索。

分片狀態(tài):green代表所有分片都存在
yellow代表主副部分分片缺失
red代表主副分片都缺失

3、Lucene的核心組件:

Near Realtime(NRT) 近實(shí)時(shí):
  • 數(shù)據(jù)提交索引后,立馬就可以搜索到。
索引(index):數(shù)據(jù)庫(kù)
  • Index 索引: 一個(gè)索引是一個(gè)文檔的集合(等同于solr中的集合)。每個(gè)索引有唯一的名字,通過(guò)這個(gè)名字來(lái)操作它。一個(gè)集群中可以有任意多個(gè)索引。
類型(type):表
  • Type 類型:指在一個(gè)索引中,可以索引不同類型的文檔,如用戶數(shù)據(jù)、博客數(shù)據(jù)。從6.0.0 版本起已廢棄,一個(gè)索引中只存放一類數(shù)據(jù)。
文檔(Document):行
  • Document 文檔:被索引的一條數(shù)據(jù),索引的基本信息單元,以JSON格式來(lái)表示。
映射(Mapping):
  • 映射可以看作是建表的過(guò)程。但與數(shù)據(jù)庫(kù)不同的是,映射可以為一個(gè)字段建立不同的映射以滿足不同的場(chǎng)景,可以對(duì)數(shù)據(jù)進(jìn)行清洗,容錯(cuò),建立倒排索引。

4、域選項(xiàng)

域選項(xiàng)是用來(lái)來(lái)控制Lucene將文檔添加進(jìn)域

  • 索引后對(duì)該域執(zhí)行的操作有三個(gè)控制方法:

    Index.ANALYZED:切詞和分析;
    Index.NOT_ANALYZED:做索引,但不做分析;
    Index.NO:不做索引;

5、ElasticSearch 程序環(huán)境:

配置文件:

/etc/elasticsearch/elasticsearch.yml主配置文件
/etc/elasticsearch/jvm.options
/etc/elasticsearch/log4j2.properties日志配置文件
Unit File:elasticsearch.service

程序文件:

/usr/share/elasticsearch/bin/elasticsearch
/usr/share/elasticsearch/bin/elasticsearch-keystore:加密配置文件目錄
/usr/share/elasticsearch/bin/elasticsearch-plugin:管理插件程序

工作端口
  • 搜索服務(wù)工作在tcp的9200端口
  • 集群服務(wù)工作在tcp的9300端口

6、els集群的工作邏輯

  • 所有節(jié)點(diǎn)選舉一個(gè)主節(jié)點(diǎn),負(fù)責(zé)管理整個(gè)集群的狀態(tài)(green/yellow/red),以及各shards的分布方式;
    ES中默認(rèn)采用的節(jié)點(diǎn)發(fā)現(xiàn)方式是 zen(基于組播(多播)、單播)。在應(yīng)用于生產(chǎn)前有兩個(gè)重要參數(shù)需配置:
discovery.zen.ping.unicast.hosts: ["host1","host2:port","host3[portX-portY]"] 
  • 單播模式下,設(shè)置具有master資格的節(jié)點(diǎn)列表,新加入的節(jié)點(diǎn)向這個(gè)列表中的節(jié)點(diǎn)發(fā)送請(qǐng)求來(lái)加入集群
discovery.zen.minimum_master_nodes: 1 
  • 這個(gè)參數(shù)控制的是,一個(gè)節(jié)點(diǎn)需要看到具有master資格的節(jié)點(diǎn)的最小數(shù)量,然后才能在集群中做操作。官方的推薦值是(N/2)+1,其中N是具有master資格的節(jié)點(diǎn)的數(shù)量
  • 另外elastic還有很多插件,來(lái)完善各自功能。

7、集群配置方法流程:

elasticsearch.yml配置文件:

cluster.name: myels  #集群名稱
node.name: node1    #節(jié)點(diǎn)名稱
path.data: /data/els/data   #數(shù)據(jù)存儲(chǔ)目錄
path.logs: /data/els/logs    #日志目錄
network.host: 0.0.0.0        #監(jiān)聽(tīng)地址
http.port: 9200                  #監(jiān)聽(tīng)端口
discovery.zen.ping.unicast.hosts: ["node1", "node2", "node3"]    #集群成員
discovery.zen.minimum_master_nodes: 2      ##當(dāng)主節(jié)點(diǎn)丟失時(shí),定義法定票數(shù),投票選擇新master

8、el訪問(wèn)通過(guò)RESTful API:

格式:curl  -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

<BODY>:json格式的請(qǐng)求主體;
<VERB>動(dòng)作:GET獲取或搜索,POST,PUT上傳存儲(chǔ),DELETE刪除
<PATH>指明特定索引的特定類型
例如:/index_name/type/Document_ID/

  • 特殊端點(diǎn):/_cat, /_search請(qǐng)求查詢由search端點(diǎn)發(fā)出, /_cluster集群端點(diǎn)

向集群端點(diǎn)查詢成員健康狀態(tài)

curl -XGET 'http://10.1.0.67:9200/_cluster/health?pretty=true'

向集群端點(diǎn)查詢成員信息

curl -XGET 'http://10.1.0.67:9200/_cluster/stats?pretty=true'

向搜索端點(diǎn)查詢主機(jī)信息

curl -XGET 'http://10.1.0.67:9200/_cat/nodes?pretty'

向搜索端點(diǎn)查詢健康信息

curl -XGET 'http://10.1.0.67:9200/_cat/health?pretty'

創(chuàng)建文檔:

curl  -XPUT    {"key1": "value1", "key2": value, ...}

三、搭建elk服務(wù)

實(shí)驗(yàn)環(huán)境架構(gòu)

1、安裝elasticsearch集群

節(jié)點(diǎn)一 192.168.1.61
節(jié)點(diǎn)二 192.168.1.62
節(jié)點(diǎn)三 192.168.1.63

  • 注意:三個(gè)節(jié)點(diǎn)都要操作安裝配置
elasticsearch和kibana、filebeat、logstash的版本必須一致

下載地址:https://artifacts.elastic.co/

#同步時(shí)間
#三個(gè)節(jié)點(diǎn)設(shè)置主機(jī)名
[root@node-61 ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.61    node1 node1.localdomain    
192.168.1.62    node2 node2.localdomain
192.168.1.63    node3 node3.localdomain

#三個(gè)節(jié)點(diǎn)安裝jdk
yum install java-1.8.0-openjdk-devel -y

#三個(gè)節(jié)點(diǎn)下載安裝elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.3.rpm

 rpm -ivh elasticsearch-6.5.3.rpm 

#節(jié)點(diǎn)一下載安裝kibanna
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.5.3-x86_64.rpm


#配置三個(gè)節(jié)點(diǎn)elasticsearch配置文件
vim /etc/elasticsearch/elasticsearch.yml 
------ Cluster ------
cluster.name: myels  #定義集群名稱
---- Node -----
node.name: node1    #當(dāng)前節(jié)點(diǎn)名稱
----- Paths ----
path.data: /els/data  #索引數(shù)據(jù)存儲(chǔ)位置
path.data: /els/data  #索引數(shù)據(jù)存儲(chǔ)位置
----- Memory -----
#bootstrap.memory_lock: true    #開(kāi)機(jī)后是否鎖定內(nèi)存使用,jvm.options 文件中的最大最小保持一致此選項(xiàng)設(shè)置為true,不一致設(shè)置為fail
------ Network ------
network.host: 192.168.1.61  #監(jiān)控在本機(jī)的那個(gè)地址,不設(shè)置默認(rèn)所有地址
#http.port: 9200  #默認(rèn)端口
----- Discovery -----
discovery.zen.ping.unicast.hosts: ["node1", "node2","node3"] #判定集群成員名稱
discovery.zen.minimum_master_nodes:2  #當(dāng)主節(jié)點(diǎn)丟失時(shí),定義法定票數(shù),投票選擇新master


##配置三個(gè)節(jié)點(diǎn)vm.options 文件
[root@node-61 ~]# vim /etc/elasticsearch/jvm.options 
.............
-Xms1g   #最小初始化內(nèi)存
-Xmx1g   #最大使用內(nèi)存

##三個(gè)節(jié)點(diǎn)創(chuàng)建索引數(shù)據(jù)和日志目錄
[root@node-61 ~]# mkdir -pv /els/{data,logs}
mkdir: created directory ‘/els’
mkdir: created directory ‘/els/data’
mkdir: created directory ‘/els/logs’
[root@node-61 ~]# chown -R elasticsearch.elasticsearch /els/

##配置三個(gè)節(jié)點(diǎn)啟動(dòng)elasticsearch
[root@node-61 ~]# systemctl status elasticsearch
[root@node-61 ~]# ss -tnl
.....
  ::ffff:192.168.1.61:9200

#查詢節(jié)點(diǎn)集群信息
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes
192.168.1.63 11 96 3 0.00 0.06 0.10 mdi - node3
192.168.1.61 10 95 3 0.00 0.03 0.08 mdi * node1                #有*號(hào)的是主節(jié)點(diǎn)
192.168.1.62 10 96 2 0.07 0.11 0.12 mdi - node2


#查詢集群健康狀態(tài)
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/health

1544710687 14:18:07 myels green 3 3 0 0 0 0 0 0 - 100.0%

#查看每個(gè)節(jié)點(diǎn)負(fù)載情況
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes?v
ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.63           12          96   0    0.02    0.04     0.09 mdi       -      node3
192.168.1.61           11          95   1    0.03    0.04     0.07 mdi       *      node1
192.168.1.62           10          96   0    0.06    0.07     0.11 mdi       -      node2

#查詢有幾個(gè)插件
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/plugin?v

#查詢有幾個(gè)索引
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/indices?v


#自定義信息使用幫助
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes?
help

#顯示集群自定義信息,名稱,ip,啟動(dòng)時(shí)間,jdk版本
[root@node-61 ~]# curl -XGET http://192.168.1.61:9200/_cat/nodes?
h=name,ip,port,uptime,jdk
node3 192.168.1.63 9300 23.6m 1.8.0_191
node1 192.168.1.61 9300 25.3m 1.8.0_191
node2 192.168.1.62 9300   24m 1.8.0_191

#顯示當(dāng)前節(jié)點(diǎn)摘要信息
                                              [root@node-61 ~]# curl http://node1:9200
{
  "name" : "node1",
  "cluster_name" : "myels",
  "cluster_uuid" : "XGFCSZW9QPKfLv7N0q1qtA",
  "version" : {
    "number" : "6.5.3",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "159a78a",
    "build_date" : "2018-12-06T20:11:28.826501Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"    #看到此句表名服務(wù)啟動(dòng)正常
}

2、安裝elasticsearch-head插件

  • 為了便于觀察集群狀況和管理,安裝elasticsearch-head插件,使用網(wǎng)頁(yè)管理集群,到GitHub克隆head插件
[root@node-61 ~]# yum install epel-release -y
[root@node-61 ~]# yum install npm -y

#克隆head插件
[root@node-61 ~]# git clone https://github.com/mobz/elasticsearch-head.git

#在elasticsearch配置文件最后添加
[root@node-61 ~]# vim /etc/elasticsearch/elasticsearch.yml 
......
#文件的最后添加
http.cors.enabled: true    #啟動(dòng)http插件
http.cors.allow-origin: "*"   #允許那些地址訪問(wèn),實(shí)際使用不能使用*


#安裝插件
[root@node-61 ~]# cd elasticsearch-head/
[root@node-61 elasticsearch-head]# npm install --ignore-scripts

#啟動(dòng)head插件,并在后臺(tái)運(yùn)行
[root@node-61 elasticsearch-head]# nohup npm run start &

[root@node-61 elasticsearch-head]# ss -tnl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128     *:9100          

連接elasticsearch

3、測(cè)試集群

  • 上傳信息,el自動(dòng)生成索引
[root@node-61 ~]# curl -H "Content-Type: application/json"   -XPUT 'node1:9200/students/major/1?pretty' -d '{"name":"Jerry","age":17,"course":"jisuanji"}'

{
  "_index" : "students",
  "_type" : "major",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}


#查詢索引
[root@node-61 ~]# curl -XGET 'node1:9200/students/_search?q="jisuanji"&pretty'
{
  "took" : 637,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "students",
        "_type" : "major",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "Jerry",
          "age" : 17,
          "course" : "jisuanji"
        }
      }
    ]
  }
}

分片存儲(chǔ)情況
自動(dòng)形成索引

四、查詢

ELS有很多API 例如:_cluster, _cat, _search

格式:curl -X GET '<SCHEME://<HOST>:<PORT>/[INDEX/TYPE/]_search?q=KEYWORD&sort=DOMAIN:[asc|desc]&from=#&size=#&_source=DOMAIN_LIST'

  • /_search:搜索所有的索引和類型;
  • /INDEX_NAME/_search:搜索指定的單個(gè)索引;
  • /INDEX1,INDEX2/_search:搜索指定的多個(gè)索引;
  • /s*/_search:搜索所有以s開(kāi)頭的索引;
  • /INDEX_NAME/TYPE_NAME/_search:搜索指定的單個(gè)索引的指定類型;

示例:

[root@node-61 ~]# curl  -XGET 'node1:9200/students/major/2?pretty'
{
  "_index" : "students", #索引
  "_type" : "major", #類型
  "_id" : "2",          #id
  "_version" : 1,   #版本
  "found" : true,   #是否找到
  "_source" : {      #內(nèi)容
    "name" : "Tom",
    "age" : 19,
    "course" : "dianzixinxi"
  }
}

1、查詢類型:

第一種:Query DSL帶有查詢語(yǔ)句的查詢
第二種:簡(jiǎn)單字符串

文本匹配的查詢條件:
  • (1) q=KEYWORD, 相當(dāng)于q=_all:KEYWORD
  • (2) q=DOMAIN:KEYWORD
#單個(gè)詞條搜索
[root@node-61 ~]# curl  -XGET 'node1:9200/_search/?q=name:Tom&pretty'
{
  "took" : 45,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "students",
        "_type" : "major",
        "_id" : "2",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "Tom",
          "age" : 19,
          "course" : "dianzixinxi"
        }
      }
    ]
  }
}
以字段范圍查找
[root@node-61 ~]# curl  -XGET 'node1:9200/_search/?pretty' -d '
 {
"query": {
            "query_string": {
              "fields": ["age"],
               "query": "[17 TO 20]"
                                     }
                  }
 }

查詢修飾符說(shuō)明連接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html

自定義分析器:

analyzer=

默認(rèn)操作符:OR/AND
default_operator, 默認(rèn)值為OR

返回字段:

fields=

[root@node-61 ~]# curl  -XGET 'node1:9200/_search/?q=“Tom"&stored_fields=name&pretty'

注:5.X不支持;

結(jié)果排序:

sort=DOMAIN:[asc|desc]

#升序排序
[root@node-61 ~]# curl  -XGET 'node1:9200/_search/?sort=age&pretty'
#降序排序
[root@node-61 ~]# curl  -XGET 'node1:9200/_search/?sort=age:desc&pretty'
搜索超時(shí):
timeout=搜索超時(shí)間
查詢結(jié)果窗口:

from=,默認(rèn)為0,偏移量,從多少開(kāi)始
size=, 默認(rèn)為10,顯示幾個(gè)結(jié)果

[root@node-61 ~]# curl  -XGET 'node1:9200/_search/?q=name:"Tom"&from=0&size=2&pretty'

elasticsearch-head查詢

五、Kibana安裝使用

Kibana要和elasticsearch版本一致,安裝在節(jié)點(diǎn)一上

1、安裝kibana

節(jié)點(diǎn)一:

#安裝kibana
[root@node-61 ~]# ls
 kibana-6.5.3-x86_64.rpm  
elasticsearch-6.5.3.rpm 
[root@node-61 ~]# yum install kibana-6.5.3-x86_64.rpm  -y

#修改配置文件
[root@node-61 ~]# vim /etc/kibana/kibana.yml 
server.port: 5601   #監(jiān)聽(tīng)端口
server.host: "192.168.1.61"   #主機(jī)地址
server.name: "node1"            #主機(jī)名稱
elasticsearch.url: "http://192.168.1.61:9200"      #el地址端口
#elasticsearch.username: "user"  #認(rèn)證用戶
#elasticsearch.password: "pass"  #認(rèn)證密碼

#啟動(dòng)kibana
[root@node-61 ~]# systemctl start kibana.service

[root@node-61 ~]# ss -tnl
LISTEN      0      128    192.168.1.61:5601  

2、在kibana添加索引

查詢el中可用索引

在kibana中創(chuàng)建索引

查詢使用

多條件查詢

模糊查詢

模糊查詢2

六、fiebeat和logstash

1、beat的種類:

  • PacketBeat:網(wǎng)絡(luò)報(bào)文分析工具,統(tǒng)計(jì)收集報(bào)文信息;
  • Filebeat:是logstash forwarder的替換者,因此是一個(gè)日志收集工具;
  • Topbeat:用來(lái)收集系統(tǒng)基礎(chǔ)數(shù)據(jù),如cpu、內(nèi)存、io等相關(guān)的統(tǒng)計(jì)信息;
  • Winlogbeat:用于搜集windows事件日志
  • Metricbeat:可以定期收集操作系統(tǒng)和服務(wù)器的運(yùn)行指標(biāo)(CPU,內(nèi)存,硬盤,IO,讀寫速度,進(jìn)程等等)

2、filebeat介紹

簡(jiǎn)介:
  • Filebeat 是一款輕量級(jí)的日志傳輸工具,它有輸入和輸出兩端,通常是從日志文件中讀取數(shù)據(jù),輸出到 Logstash 或 Elasticsearch 。其作用是收集業(yè)務(wù)服務(wù)器的日志,輸出到一個(gè)日志系統(tǒng)便于集中管理。

filebeat參考配置示例

? 主配置文件 /etc/filebeat/filebeat.yml

示例(與本次試驗(yàn)無(wú)關(guān)):

###################### Filebeat Configuration Example #########################

#=========================== Filebeat inputs =============================

filebeat.inputs:

# 這里每一個(gè) type 表示定義了一個(gè)日志讀取源,這個(gè)源是收集 Nginx 的訪問(wèn)日志
- type: log

  enabled: true

  paths:
    - /usr/log/nginx/access/access.log
  fields_under_root: true
  fields: 
    alilogtype: nginxacclog

# 收集某一個(gè)服務(wù)的錯(cuò)誤日志
- type: log

  enabled: true

  paths:
    - /var/www/service/storage/logs/error.log
  fields_under_root: true
  fields: 
    alilogtype: service_error
    serverip: ${serverip}

# 收集某一個(gè)服務(wù)的錯(cuò)誤日志,并且使用了多行合并
- type: log

  enabled: true

  paths:
    - /var/www/user_center/storage/logs/SERVER*.log
  fields_under_root: true
  fields: 
    alilogtype: usercenter_serverlog
    serverip: ${serverip}

  multiline.pattern: '^\['
  multiline.negate: true
  multiline.match: after

#============================= Filebeat modules ===============================

filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml

  # Set to true to enable config reloading
  reload.enabled: false

  # Period on which files under path should be checked for changes
  #reload.period: 10s

#================================ Outputs =====================================

#-------------------------- Elasticsearch output ------------------------------

# 這部分是用于配置日志輸出到 Elasticsearch 的部分

#----------------------------- Logstash output --------------------------------

# 將日志發(fā)送到 logstash 主機(jī)的 5044 端口,對(duì)應(yīng)的這臺(tái) logstash 主機(jī)需要配置一個(gè) input 監(jiān)聽(tīng)于 5044 (配置過(guò)程,參考 Logstash 文檔)
output.logstash:
  hosts: ["10.26.10.15:5044"]

參數(shù)解釋:

## 默認(rèn)值 log ,表示一個(gè)日志讀取源
type : log

## 該配置是否生效,如果設(shè)置為 false 將不會(huì)收集該配置的日志
enabled: true

## 要抓取的日志路徑,寫絕對(duì)路徑
paths: /to/file.log

## fields 表示自定義字段,在下面縮進(jìn)兩格處寫要自己添加的字段。如: alilogtype: usercenter_serverlog  表示在輸出的每條日志中加入該字段,key:alilogtype , value:usercenter_serverlog 用于標(biāo)識(shí)該日志源的類別,在傳輸?shù)较乱粚?logstash 時(shí)可以根據(jù)該字段分類處理。
  fields: 
    alilogtype: usercenter_serverlog
##    意思相同,增加一個(gè)自定義字段,key:serverip ,value: ${serverip} 這個(gè)值是讀取的系統(tǒng)環(huán)境變量,如果系統(tǒng)中沒(méi)有定義這個(gè)環(huán)境變量,那么啟動(dòng) filebeat 的時(shí)候會(huì)報(bào)錯(cuò),找到這個(gè)值.
        serverip: ${serverip}

## 設(shè)置系統(tǒng)環(huán)境變量,創(chuàng)建文件  /etc/profile.d/serverip.sh  加入內(nèi)容:
export serverip=`ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | cut -d':' -f2`
## 這里拿的是本機(jī) IP

## 多行合并參數(shù),正則表達(dá)式
multiline.pattern: '^\['
## true 或 false;默認(rèn)是false,匹配pattern的行合并到上一行;true,不匹配pattern的行合并到上一行
multiline.negate: true
## after 或 before,合并到上一行的末尾或開(kāi)頭
multiline.match: after

##  ['ERROR','WARN'] 該屬性可以配置只收集error級(jí)別和warn級(jí)別的日志,如果有配置多行收集,一定要將這個(gè)配置放在多行的后面
include_lines:
## ['DEBUG'] 該屬性配置不收集DEBUG級(jí)別的日志,如果配置多行 這個(gè)配置也要放在多行的后面
exclude_lines:

## Logstash所在的主機(jī)
hosts:

## 如果設(shè)置為TRUE和配置了多臺(tái)logstash主機(jī),輸出插件將負(fù)載均衡的發(fā)布事件到所有l(wèi)ogstash主機(jī)。如果設(shè)置為false,輸出插件發(fā)送所有事件到隨機(jī)的一臺(tái)主機(jī)上,如果選擇的不可達(dá)將切換到另一臺(tái)主機(jī)。默認(rèn)是false。
loadbalance

## 每個(gè)配置的主機(jī)發(fā)布事件到Logstash的工作者數(shù)量。這最適用于啟用負(fù)載平衡模式。示例:如果您有2個(gè)主機(jī)和3個(gè)工作人員,則共有6個(gè)工作人員啟動(dòng)(每個(gè)主機(jī)3個(gè))。
worker

3、安裝nginx做web服務(wù)器

  • web服務(wù)器上
安裝nginx做web服務(wù)器
[root@node-60 ~]# yum install epel-release -y
[root@node-60 ~]# yum install nginx -y
[root@node-60 ~]# systemctl start nginx.service

4、安裝fiebeat,收集日志

  • 注意:版本和elasticsearch一致
#下載
[root@node-60 ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.3-x86_64.rpm

#安裝
[root@node-60 ~]# rpm -ivh filebeat-6.5.3-x86_64.rpm 

#配置文件
[root@node-60 ~]# vim /etc/filebeat/filebeat.yml 

......
- type: log     #文件類型
  enabled: true   #是否使用改變
 paths:
    - /var/log/nginx/access.log          #設(shè)置日志路徑
output.elasticsearch: 
  hosts: ["node1:9200","node3:9200"]     #el節(jié)點(diǎn)名稱
.....
#啟動(dòng)filebeat
[root@node-60 ~]# systemctl start filebeat.service

5、安裝logtash,對(duì)取到的日志處理

因?yàn)槿罩緝?nèi)容復(fù)雜,filebeat無(wú)法對(duì)日志標(biāo)準(zhǔn)化處理(切詞),所以要安裝logtash
  • 注意:版本和elasticsearch一致,建議安裝單個(gè)主機(jī)上面
#安裝jdk
[root@node-60 ~]# yum install java-1.8.0-openjdk-devel -y

#下載
[root@node-60 ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.5.3.rpm

#安裝
[root@node-60 ~]# rpm -ivh logstash-6.5.3.rpm 

#以logstash用戶運(yùn)行
[root@node-60 ~]# id logstash
uid=996(logstash) gid=994(logstash) groups=994(logstash)
[root@node-60 ~]# usermod -s /bin/bash logstash

#使用幫助信息
[root@node-60 ~]# /usr/share/logstash/bin/logstash --help

#設(shè)置輸入輸出配置
[root@node-60 ~]# vim /etc/logstash/conf.d/test.conf

input {
         stdin{   #標(biāo)準(zhǔn)輸入
               type => "stdandardinput"  #自定義判斷類型條件
          } 
}

output {
         stdout { codec => rubydebug }
}


#切換用戶
[root@node-60 ~]# su - logstash

#查詢配置文件語(yǔ)法
-bash-4.2$ /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -t -f /etc/logstash/conf.d/test.conf 
.........
The stdin plugin is now waiting for input:
[INFO ] 2018-12-16 20:41:36.268 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
等待輸入:hello world
hello world
{
           "type" => "stdandardinput",
          "host" => "node-60",
      "@version" => "1",       #系統(tǒng)自動(dòng)添加版本
    "@timestamp" => 2018-12-16T12:44:24.507Z,
       "message" => "hello world"
}

配置logstash端口,使用beats插件傳入logstash
#修改filebeast配置文件
[root@node-60 ~]# vim /etc/filebeat/filebeat.yml
- type: log     #文件類型
  enabled: true   #是否使用改變
 paths:
    - /var/log/nginx/access.log          #設(shè)置日志路徑
#---------- Logstash output --------
output.logstash:
  hosts: ["192.168.1.60:5044"]
#重啟filebeat
[root@node-60 ~]# systemctl restart filebeat


#設(shè)置logstash輸入輸出配置
[root@node-60 ~]# vim /etc/logstash/conf.d/test.conf

input {
      beats {
           host => '0.0.0.0'
           port => 5044
          } 
}

output {
         stdout { codec => rubydebug }  #標(biāo)準(zhǔn)輸出
}

#切換用戶
[root@node-60 ~]# su - logstash
#啟動(dòng)logstash
-bash-4.2$ /usr/share/logstash/bin/logstash  -f /etc/logstash/conf.d/test.conf 

  • web服務(wù)器測(cè)試curl命令,logstash是否在前臺(tái)輸出

6、安裝redis

  • redis對(duì)大量日志緩存隊(duì)列處理
#安裝redis
[root@node-60 ~]# yum install redis -y

#配置redis文件
bind 0.0.0.0    #監(jiān)聽(tīng)地址
requirepass 123   #認(rèn)證密碼

#啟動(dòng)redis
[root@node-60 ~]# systemctl start redis
修改filebeat配置文件,使filebeat輸出到redis
[root@node-60 ~]# vim /etc/filebeat/filebeat.yml
- type: log     #文件類型
  enabled: true   #是否使用改變
 paths:
    - /var/log/nginx/access.log          #設(shè)置日志路徑
#---------- Logstash output --------
.........
output.redis:          #添加
    hosts: ["localhost"]
    password: "123"
    key: "filebeat"
    db:  0                   #默認(rèn)是0號(hào)庫(kù),最多16個(gè)庫(kù),表示為0-15
    timeout: 5

#重啟filebeat
[root@node-60 ~]# systemctl restart filebeat

#redis以獲取filebeat數(shù)據(jù)
[root@node-60 ~]# redis-cli -a 123
127.0.0.1:6379> keys *
1) "filebeat"

127.0.0.1:6379>LPOP  filebeat  #從左邊查詢內(nèi)容

127.0.0.1:6379>RPOP  filebeat  #從右邊查詢內(nèi)容

127.0.0.1:6379>LLEN  filebeat   #查看里面條目

七、logstash的GrokBasics 插件使用

  • grok可以提取結(jié)構(gòu)化字段的一個(gè)文本字段在一個(gè)文檔中。你選擇哪個(gè)字段可以做字段匹配,模糊匹配,正則表達(dá)式匹配,別名表達(dá)式匹配,這些匹配可以重用。
  • 這個(gè)工具非常適合syslog日志,apache和其他網(wǎng)絡(luò)服務(wù)器日志,mysql日志,可以一起打包的許多可重用的模式。

格式:

%{SYNTAX:SEMANTIC}
SYNTAX:預(yù)定義的模式名稱;
SEMANTIC:給模式匹配到的文本所定義的鍵名;

例如:

1.2.3.4 GET /logo.jpg  203 0.12
%{IP:clientip} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

自動(dòng)匹配語(yǔ)法,并截取詞后,加個(gè)鍵值(詞1:值,詞2:值,詞3:值.......)
{ clientip: 1.2.3.4, method: GET, request: /logo.jpg, bytes: 203, duration: 0.12}

1、修改logstash配置文件,用來(lái)獲取redis數(shù)據(jù)

[root@node-60 ~]# vim /etc/logstash/conf.d/test.conf

input {
        redis{
                key => "filebeat"
                data_type => "list"
               password => "123"
       }
}
filter {       #過(guò)濾器
grok {
match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx
][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\
" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"
%{DATA:[nginx][access][agent]}\""] }
remove_field => "message"
}
date {
match => [ "[nginx][access][time]", "dd/MMM/YYYY:H:m:s Z" ]
remove_field => "[nginx][access][time]"  #日期格式轉(zhuǎn)換
}
useragent {   #替換易識(shí)別的格式
source => "[nginx][access][agent]"
target => "[nginx][access][user_agent]"
remove_field => "[nginx][access][agent]"
}
geoip {
source => "[nginx][access][remote_ip]"
target => "geoip"
database => "/etc/logstash/GeoLite2-City.mmdb"   #城市地址庫(kù)
}

}

output {        #輸出
elasticsearch {
hosts => ["node1:9200","node2:9200","node3:9200"]         #定義elasticsearch節(jié)點(diǎn)
index => "logstash-ngxaccesslog-%{+YYYY.MM.dd}"  #定義取到當(dāng)天的時(shí)間加日志在后面
}
}

2、使用城市地址庫(kù)展示用戶ip來(lái)源

下載地址庫(kù):https://dev.maxmind.com/geoip/geoip2/geolite2/

[root@node-60 ~]# cd /etc/logstash/
#下載
[root@node-60 logstash]#wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
[root@node-60 logstash]# tar xf GeoLite2-City.tar.gz  #解壓縮
[root@node-60 logstash]# ll            
..........
GeoLite2-City.mmdb            #提取此文件到當(dāng)前目錄,與test.conf對(duì)應(yīng)

測(cè)試:

#修改nginx日志模擬外網(wǎng)地址
[root@node-60 ~]# echo '10.228.1.60 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log
[root@node-60 ~]# echo '10.228.1.78 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log
[root@node-60 ~]# echo '10.228.1.18 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log
[root@node-60 ~]# echo '221.221.42.212 - - [23/Dec/2018:14:25:40 +0800] "GET /javascripts/index.html HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"' >> /var/log/nginx/access.log

添加新索引獲取數(shù)據(jù)

kibana的圖表功能

生成圖表

生成IP城市地圖

添加監(jiān)控視圖
選擇已保存的圖表

生成監(jiān)控視圖

注意:
1、輸出的日志文件名必須以“l(fā)ogstash-”開(kāi)頭,方可將geoip.location的type自動(dòng)設(shè)定為"geo_point";
2、target => "geoip"

八、json格式使用

  • 除了使用grok filter plugin實(shí)現(xiàn)日志輸出json化之外,還可以直接配置服務(wù)輸出為json格式,因此可以不用logstash,直接送到elasticsearch集群;

1、為什么不用logstash在web端收集?

  • 依賴java環(huán)境,一旦java出問(wèn)題,可能影響到web服務(wù)
  • 系統(tǒng)資源占用率高,且存在bug風(fēng)險(xiǎn)
  • 配置比較復(fù)雜,支持匹配過(guò)濾
  • Filebeat的優(yōu)點(diǎn),專注日志收集,語(yǔ)法簡(jiǎn)單,安裝快捷,配置方便

2、nginx配置文件json格式示例

編輯nginx配置文件nginx.conf:

......
 log_format main '{"@timestamp":"$time_iso8601",'
 '"host":"$server_addr",'
 '"clientip":"$remote_addr",'
 '"size":$body_bytes_sent,'
 '"responsetime":$request_time,'
 '"upstreamtime":"$upstream_response_time",'
 '"upstreamhost":"$upstream_addr",'
 '"http_host":"$host",'
 '"url":"$uri",'
 '"domain":"$host",'
 '"xff":"$http_x_forwarded_for",'
 '"referer":"$http_referer",'
 '"status":"$status"}';

3、編輯tomcat配置文件json格式示例

#vim /apps/tomcat/conf/server.xml
 pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%
l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&q
uot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%
s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&qu
ot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion
&quot;:&quot;%{User-Agent}i&quot;}"/>

4、filebeat配置

filebeat.inputs:
#nginx日志提取
- type: log
  enabled: true                 # 該配置是否生效,如果設(shè)置為 false 將不會(huì)收集該配置的日志
  paths:
    - /var/log/nginx/access.log  #日志路徑
  fields_under_root: true
  fields:                          # 自定義字段,在下面縮進(jìn)兩格處寫要自己添加的字段
    alilogtype: nginxacclog   

#Tomcat日志提取
- type: log
  enabled: true                 # 該配置是否生效,如果設(shè)置為 false 將不會(huì)收集該配置的日志
  paths:
   - /var/log/tomcat/catalina.*.log   #日志路徑
  fields_under_root: true
  fields:                                 # 自定義字段,在下面縮進(jìn)兩格處寫要自己添加的字段
    alilogtype: tomcatlog
..............
output.elasticsearch:           #直接輸出到elasticsearch集群
    hosts: ["192.168.1.61:9200","192.168.1.62:9200"]

九、遇到的錯(cuò)誤

  curl -XPUT      'XXXXX:XXXX'
{
  "error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
  "status" : 406
}
#解決方法
  curl -XPUT   -H "Content-Type: application/json"   'XXXXX:XXXX'

參考鏈接:https://www.cnblogs.com/leeSmall/p/9189078.html
https://www.linuxidc.com/Linux/2018-10/154669.htm

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,263評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,946評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,409評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,641評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,872評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,650評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容