ElasticSearch Logstash Kibana

集群搭建

集群搭建需要注意的几个配置点。

1 修改每个进程最大同时打开文件数太小和用户最大线程。修改/etc/security/limits.conf文件,增加配置,用户退出后重新登录生效。

* soft nofile 65536

* hard nofile 65536

* soft nproc 4096

* hard nproc 4096

2 修改虚拟内存最大值 /etc/sysctl.conf 增加 

vm.max_map_count=262144

3 修改ES中JVM占用内存,默认的太大。ES配置文件config/jvm.options

-Xms512m
-Xmx512m

4 修改ES配置文件

cluster.name : es
#配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。

node.name : n1
#节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中

node.master : true
#指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。

node.data : true
#指定该节点是否存储索引数据,默认为true。

network.host : 0.0.0.0
#本机地址

transport.tcp.port : 9001
#设置节点间交互的tcp端口,默认是9300。

http.port : 8001
#设置对外服务的http端口,默认为9200。

transport.tcp.compress : true
#设置是否压缩tcp传输时的数据,默认为false,不压缩。

http.max_content_length : 100mb
#设置内容的最大容量,默认100mb

discovery.zen.ping.unicast.hosts : ["0.0.0.0:9001","0.0.0.0:9002","0.0.0.0:9003"]
#设置新节点被启动时能够发现的主节点列表(主要用于不同网段机器连接)

discovery.zen.minimum_master_nodes: 2
#master候选节点数量/2+1

#master候选节点
cluster.initial_master_nodes: ["n1","n2","n3"]


#如果使用head插件,需要增加这个。
http.cors.enabled: true 
http.cors.allow-origin: "*"
View Code

5 安装IK分词器

https://github.com/medcl/elasticsearch-analysis-ik

将解压好的目录命名位IK放到ES的plugins下。

6 安装head插件

 

下载head需要先安装node环境。这里给出一篇博客。

https://www.cnblogs.com/xiaojianfeng/p/9435507.html

7 启动Es不能使用root用户,需要创建一个Linux用户。启动脚本再 bin 下。

bin/elasticsearch -d 其中 -d 为后台启动。

故障转移

在一个ES集群中创建一个索引指定了主分片和副本分片后。如果集群节点挂掉后,ES会动态的做故障转移。

将挂掉的节点上的分片,分配给其他节点上。直到该节点恢复,才会将分片重新分配。

下图store索引,主分片数量三个,每个有一个副本分片,总共六个。

当node3节点挂掉后。经过短暂的ES检查到节点丢失。

短暂的调整后,ES会将node3的节点分配到其他两个节点上。

极限扩容

索引库一旦创建,主分片数量不可更改。例如上图的store索引库,三个主分片,每个主分片一个副本。

但随着业务的增加,一台服务上放置多个分片势必导致读写慢,ES写操作只能在主分片上操作,而读

操作可以在主分片或者副本分片操作。所以我们需要对索引库进行扩容。就是增加服务器。这次的目标是

在扩展3台服务器,总共6台做到每台服务器上只放置一个分片。这个操作只需要对ES集群增加节点即可。

 

增加副本

上边说过,当索引建立后,主分片不可增加。那么业务量庞大时,做到极限扩容,显然已经

到达了阈值。像上边那样,已经是一台服务器放一个分片了。接下来我们要做的操作是增加

副本分片。下图为使用springBoot JPA的方式创建了主分片和副本分片都是一的索引。

可以看到 n2这个节点完全没有用到。接下来我们通过 rest 的方式,对索引的副本分片进行更改。 

FieldType.Text和FieldType.Keyword

定义文档时会选择字段类型。如果是字符串类型,我们则要考虑是否对改字段进行分词。

如果分词就会创建索引。Text则会对字符串进行分词并索引。Keyword则不会对字符串

分词,但是会创建索引。以下索引Item只有title字段是text类型。其他是keyword类型。

index

表示字段是否索引,上边我们说过对于字符串类型,无论是Keywork还是Text都会对字段进行

索引。index属性为false则表示该属性不创建索引。即使此字符串是Text类型。

 

 

 

 

LogStash

从这个地址下载LogStash  https://artifacts.elastic.co/downloads/logstash 注意LogStash版本要和Elasticsearch一致。

logStash主要作用从一个输入源读数据,然后将数据存到Elasticsearch 输入源可以是数据库,文件,APP应用等。

注意事项

1 修改config/jvm.config文件

-Xms256m
-Xmx256m

2 启动脚本再 bin 目录下  bin/logstash -e  'input{ stdin{} } output{ stdout{} }' 这种方式直接将配置放到启动脚本后,但是如果过长就不好看了,可以放到配置文件步骤3.

3 修改启动配置文件

config/ 下创建一个 xx.config 即可。

LogStash配置文件主要配置输入源,和输出目的地。格式如下

input{
    tcp{
        port => 1111
        codec => "json"
    }
}

output{

    elasticsearch{
        hosts => ["10.0.98.76:9200"]
        index => "testapp"
    }

}
View Code

input表示输入,output表示输出。可以有多个输入源,也可以有多个输出源。以上则是监听服务端口,然后输出到Elasticsearch

步骤2的 stdin{} stdout{} 为控制台输入输出。如果有多个输入源,这个语法也支持 if 判断,根据输入源的 type 判断输入到哪里。

 以下是一个常用配置。需要注意的是,如果输入源是 file 则该文件必须是 .log 结尾。同时要设置 start_position 属性,该属性规定了Logstash从文件的什么

位置开始读取,如果是 beginning 则表示从文件第一行开始读。注意Logstash会一行一行的读,遇到换行符则代表一行。 end 表示会从文件尾部读取,也就是

如果你指定的文件里已经有内容,Logstash只会读取新增的日志。但是,如果这个文件曾经被Logstash读取过,则Logstash会对文件有标记,标记曾经读到哪一行

也就是说,start_position只对第一次读的文件生效。

4 启动时指定配置文件 logstash -f config/logstash-sample.conf

nohup bin/logstash -f config/logstash-sample.conf &  后台启动

输入源如果是 tcp 则需要指定 codec 为json

input{

#stdin{}

file{
path => "/home/elk/logStash/logstash-7.8.0/config/test1.log"
type => "test1"
start_position => "beginning"
}

file{
path => "/home/elk/logStash/logstash-7.8.0/config/test2.log"
type => "test2"
start_position => "beginning"
}

tcp{
host => "192.168.31.77"
port => 1111
codec => json
type => "app"
}
}

output{

if [type] == "test1"{
elasticsearch{
hosts => ["192.168.31.77:8003"]
index => "log1"
}
}

if [type] == "test2"{
elasticsearch{
hosts => ["192.168.31.77:8003"]
index => "log2"
}
}

if [type] == "app"{
elasticsearch{
hosts => ["192.168.31.77:8003"]
index => "applog"
}
}

#stdout{
#codec => json 
#}
}

 
View Code

下面代码片段为 springboot中将日志输入到 tcp

1 根据使用的日志框架导入相应的包,我这里用的logback

  <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>4.11</version>
        </dependency>
View Code

2 配置logback,关于logback的配置规则可以参考我上一篇博客。

  <appender name="logstashshow" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:1111</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"></encoder>
    </appender>


 <logger name="com.dfsn.cloud.consumer" level="INFO" additivity="false">
        <appender-ref ref="logstashshow"></appender-ref>
    </logger>
View Code

当应用启动后,会额外的启动一个端口,将日志输入到该端口,Logstash监听该端口,接收日志。最后给出一个Logback官方地址,所有的配置都可以找到。

https://www.elastic.co/guide/en/logstash/current/index.html

Kibana

Kibana是一个视图app,对Elasticsearch中的日志,做分析查看。

Kibana只需要修改config配置文件下的kibana.yml文件即可。

 

server.port: 5601
server.host: "192.168.31.77"
elasticsearch.hosts: ["http://192.168.31.77:8001"]
kibana.index: ".kibana"
View Code

 

默认的 Kibana 也不支持 root 用户启动,可以设置 --allow-root 忽略检查。

kibana --allow-root 

 

nohup bin/kibana  --allow-root  & 

截至目前我对Kibana运用的也十分生疏,给出一个博客吧。

https://blog.csdn.net/qq_18769269/article/details/80843810

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 





 

posted @ 2020-07-13 17:08  顶风少年  阅读(283)  评论(0编辑  收藏  举报
返回顶部