暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

elk部署·优化手册

小胡的博客 2018-11-10
275


第一 JDK环境变量配置

安装JDK 1.8

第一步:tar -xvf  jdk安装包

  第二步:配置环境变量 vi /etc/profile

JAVA_HOME=/opt/jdk1.8.0_65

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

export PATH JAVA_HOME CLASSPATH

第三步: source /etc/profile 刷新配置文件(立即生效)

第二 ES安装(root用户操作)

ElasticSearch 主节点

一、下载es

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.3.tar.gz

 

二、解压es

tar -xvf elasticsearch-5.5.3.tar.gz

 

三、将elasticsearch-5.5.3 复制一份 制作两个节点

 cp  -rf /root/Desktop/elasticsearch-5.5.3   /root/Desktop/elasticsearch-5.5.3-2

 

四、进入elasticsearch-5.5.3目录 修改es配置文件

 1、vi config/elasticsearch.yml

 

 2、编写配置信息

①cluster.name: datav-cluster 定义集群名称

②node.name: node-1 定义节点名称

node.data:true

node.master:true

node.max_local_storage_nodes:1 只启动一个节点

③path.data: /home/anda1/node1/data 数据存放路径

④path.logs: /home/anda1/node1/logs 日志存放路径

⑤network.host: 172.17.100.184 主机地址

⑥transport.tcp.port: 9300设置节点间交互的端口号,默认9300

⑦http.port: 9200 设置对外服务的http端口 ,默认9200

discovery.zen.minimum_master_nodes: 1

设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4

⑨discovery.zen.ping.unicast.hosts:[“主节点IP:端口”]

设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。

⑩bootstrap.memory_lock: false 是否锁住内存

 bootstrap.system_call_filter:false:系统调用过滤器(需linux3.5以上的内核)

 

 

ElasticSearch 从节点

一、进入/root/Desktop/elasticsearch-5.5.3-2/config

 1、vi elasticsearch.yml 修改配置文件

 2、编辑配置信息:

  A.cluster.name: datav-cluster

  B.node.name: node1_1

  C.path.data: /home/anda1/node2/data

  D.path.logs: /home/anda1/node2/logs

  E.bootstrap.memory_lock: false

  F.bootstrap.system_call_filter: false

  G.network.host: 0.0.0.0

  H.http.port: 9202

  I.transport.tcp.port: 9302

  J.node.data: true

  K.node.master: false

  L.node.max_local_storage_nodes: 2

  M.discovery.zen.ping.unicast.hosts: ["主节点IP:端口"]

  

 

 

启动节点bin/elasticsearch

常见问题(解决方案参考)

1. max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]

 解决:切换到root用户,编辑limits.conf 添加类似如下内容

vi /etc/security/limits.conf 

添加如下内容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

 

 

 

2.max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

解决:切换到root用户,进入limits.d目录下修改配置文件。

vi /etc/security/limits.d/90-nproc.conf 

修改如下内容:

* soft nproc 1024

#修改为

* soft nproc 2048

 

3.max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

解决:切换到root用户修改配置sysctl.conf

vi /etc/sysctl.conf 

添加下面配置:

vm.max_map_count=655360

并执行命令:

sysctl -p

 

 

启动成功验证:

浏览器输入:http://节点IP:节点端口/(注意关闭防火墙)

 

 

即成功

 

第三 Logstash安装

 

一、下载logstash-5.5.3.tar.gz安装包

wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.3.tar.gz

 

二、解压安装包

tar -xvf  logstash-5.5.3.tar.gz

 

三、运行logstash

1、进入logstash-5.5.3目录

2、运行 bin/logstash -e 'input{stdin{}} output{stdout{codec=>rubydebug}}'

3、输入123

4、如图所示即成功

 

 

第四 Kibana 安装

一、下载Kibana

wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.3-linux-x86_64.tar.gz

 

二、解压安装包

tar -xvf kibana-5.5.3-linux-x86_64.tar.gz

 

三、编辑配置文件Kibana.yml

A. server.port: 5601

B. server.host: "192.168.154.130"

C. elasticsearch.url: "http://客户端节点IP:9200"

D. kibana.index: ".kibana"

 

四、运行kibana

bin/kibana

 

 

 

 

 

第五 常用的插件

一、ES-sqlrestful接口调用时可省去写DSL语法,以常用的sql替代)

1、下载ESsql 文件  

https://github.com/NLPchina/elasticsearch-sql

2、安装

/bin/elasticsearch-plugin install file:/文件路径

3、测试

Urlhttp://ip:端口/_sql?sql=select * from myindex limit 10

4、web

A.cd site-server

B.npm install express --save

C.node node-server.js

D.site_configuration.json修改端口

F:浏览器访问地址http://ip:修改的端口号

 

二、ES-head(用来监控集群状态,可查看索引个数、分片数等一些简易操作)

1、安装

  简单的安装方式就是通过谷歌的扩展插件安装。

2、运行

可通过运行谷歌插件运行

三、Bigdesk(优于ES-head

1、安装

A.yum install git

B.git clone https://github.com/hlstudio/bigdesk

2、运行

A. cd bigdesk/_site/

B. python -m SimpleHTTPServer

3、查看

默认启动8000端口,http://ip(文件所在机器):8000

Tip:elasticsearch.yaml需修改配置

http.cors.enabled:true 启用跨源资源共享

http.cors.allo-origin:/.*/ 哪个源允许使用正则表达式*,运行任何地方的源的请求(相当于拦截器)

第六 Elasticsearch的使用

一、集群状态的查看

 

1、GET /_cat/allocation?v

分配给每个数据节点的碎片数量以及它们使用的磁盘空间大小

 

2、GET /_cat/count?v   GET /_cat/count/myindex?v

快速查询当前整个集群或者指定索引的document数量(不包括已标记删除的document

 

3、_cat/fielddata fielddata?v&fields=XXX 制定fields

查询集群中每个节点中fielddata所用的堆内存

 

4、_cat/health(参数ts=false 不显示时间戳)

查询当前集群的健康信息

 

5、GET  /_cat/indices/index1?v

查询指定索引index1的相关信息(组成一个索引(index)的shard数量,document的数量,删除的doc数量,主存大小和所有索引的总存储大小(包括replicas

 

6、GET /_cat/master?v

显示master的节点ID,绑定IP地址,节点名称

 

7、GET /_cat/nodes?v

显示使用堆的百分比,总内存使用百分比,CPU使用率,平均负载,是否主节点资格,节点名称

 

8、GET /_cat/plugins

显示安装的插件信息

 

9、GET /_cat/recovery?v

查看分片的恢复状态

 

10、GET /_cat/template?v

查看模板信息

 

11、GET /_cat/shards?v

查看分片的状态,大小,所属节点以及HOST

 

二、索引

1、索引的创建

 

2、删除索引

 

 

3、打开/关闭索引

 

 

4、更新索引设置

 

5、索引模板设置

PUT /_template/template_1?pretty

{

  "template": "te*",(通配符* 匹配所有以te开头的索引)

  "settings": {

    "number_of_shards": 1(主分片为1

  },

  "mappings": {

    "type1": {typetype1

      "_source": {

        "enabled": false

      },

      "properties": {

        "host_name": {(字段名)

          "type": "keyword"(字段类型)

        },

        "created_at": {

          "type": "date",

          "format": "EEE MMM dd HH:mm:ss Z YYYY"

        }

      }

    }

  }

}

 

6、清楚索引缓存

curl -XPOST 'localhost:9200/kimchy,elasticsearch/_cache/clear?pretty'(清除指定索引的缓存)

curl -XPOST 'localhost:9200/_cache/clear?pretty'(清楚所有缓存)

 

 

第七 ES的优化

(自定义调优)

 

1、如果对数据的完整性要求不高,可将副本设置为0

原因:副本也要完成分析,索引和段合并的操作,影响导入性能

 

2、磁盘的优化,使用多个磁盘给Elasticsearch访问,通过在path.data中添加

原因:类似于多线程,同时打开数据目录,逐层查询

 

3、默认自建ID

原因:自定义ID,每次写入,都会检查ID是否存在(耗时);若存在,则作更新操作

 

4、禁止swapping交换内存

原因:内存交换到磁盘,再从磁盘交换的内存,影响磁盘的IO性能

 

5、使用性能更好的硬件,比如固态

 

6ES _refresh flush

_refresh 文件->内存->文件系统缓存->磁盘 默认刷新1s。 数据写入磁盘会创建一个segment file/秒,为获取更大吞吐量可增大刷新时间。

_flush  ES为了数据安全性,在写入内存buffer时,会产生一份translog日志,从而在出现程序故障/磁盘异常时, 保证数据的完整和安全。flush会触发lucene commit,并清空translog日志文件,释放内存。默认5分钟自动同步刷新,一次commit

 

7、增大内存。

原因: ES java应用,和它相关的两个名词JVMGC 离不开内存

Lucene的倒排索引是在内存里生成,然后是以段的形式刷到磁盘。每个段实际就是一个完整的倒排索引,并且一旦写道磁盘上就不会做修改。

API层面的文档更新和删除是增量写入的一种特殊文档,会保存在新的段里。不变的段文件易于被操作系统cache,热数据几乎等效于内存访问。

8、节约内存

①合理设计数据结构(mapping)减少结构占用内存空间

a.明确需要分词字段(默认情况下索引建立的字段类型都是text+keyword,这样搜索时会对所有text类型字段会做分词处理)

b.减少不需要的字段

 

ES分配的内存小于32G

原因:jvm在内存小于32G时会采用内存对象指针压缩技术,java中的对象都是通过指针指引对象所在堆的位置,这些指针大小通常是32bit64bit(取决于处理器)

对于64位系统可以使用更大的内存,64位的指针会造成浪费,所以指针不直接表示对象的位置,而是表示偏移量。(32位的指针可以引用40亿个对象,而不是40亿个字节)

③禁用swapping

原因:物理内存不够用时,释放一部分物理内存提供给当前运行的程序,内存存放到磁盘,影响磁盘IO性能。

9、索引每个分片的大小在10G左右

原因:过多或者过少的分片都会导致检索慢

 

10、合并段

原因:每个索引文件都是有多个segments组成的,索引的更新和删除操作不会将数据从segments文件中删除,只是标记为删除文档,segments 越多查询性能越差。

在合并段时,会生成新的段,标有删除标记的文档不会存在。

 

 

11、查询时多用filter

①查询上下文中,查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;在过滤器上下文中,查询操作仅判断是否满足查询条件

②过滤器上下文中,查询的结果可以被缓存。

 

12index buffer

indices.memory.index_buffer_size 这个值默认为10%,即堆内存的10%会被用作index时的缓存,这个值可以设置百分比也可以是固定的大小。缓冲自然是越大越好。但记得千万不能超过可用的对内存,并且要跟filter cachefiled cache保证在一个合理的比例。

 

 

(官方调优)

调优索引速度 即写入速度

1、使用批量请求

2、使用多个线程将数据发送到ES

3、增加刷新间隔时间

4、禁用初始加载刷新和副本

5、禁用交换

6、给文件缓冲区内存

7、使用自动生成的ID

8、使用更快的硬件

9、增大索引缓冲区大小

10、调整磁盘使用

(1) 禁用不需要的字段

(2) 不要使用默认的动态字符串映射

(3) 禁用_all

(4) 使用足够的最小数字类型

 

调整搜索速度

1、给文件缓冲区内存

2、使用更快的硬件

3、文档建模

4、预索引数据

5、搜索舍入日期

6、强制合并只读索引

7、预热文件系统缓存

(1) Index.store.type: niofs

 

设置参考

 

#基础设置

 cluster.name: ee

 node.name: datanode1

 node.data: true

 node.master: false

 path.data: /home/anda2/datanode1_data1,/home/anda2/datanode1_data2,/home/anda2/datanode1_data3,/home/anda2/datanode1_data4

 path.logs: /home/anda2/datanode1_logs

 network.host: 172.17.100.185

 transport.tcp.port: 9302

 http.port: 9202

 discovery.zen.minimum_master_nodes: 1

 discovery.zen.ping.unicast.hosts: ["172.17.100.184:9301"]

 bootstrap.memory_lock: false

 bootstrap.system_call_filter: false

 

#碎片分配设置

 

#启用或禁用分配特定种类的分片

cluster.routing.allocation.enable: all

 

#允许在一个节点上发生多少个并发传入碎片恢复。即将进行的恢复是在节点上分配目标分片(最有可能是副本,除非分片重新分配)的恢复。默认为2

cluster.routing.allocation.node_concurrent_incoming_recoveries: 2

 

#虽然复制副本的恢复发生在网络上,但重新启动节点后恢复未分配的主节点将使用本地磁盘中的数据。这些应该很快,以便在同一个节点上可以同时发生更多的初始主恢复。默认为4

cluster.routing.allocation.node_initial_primaries_recoveries: 4

 

 

#碎片重新平衡设置

#启用或禁用特定种类的分片重新平衡

cluster.routing.rebalance.enable: all

 

#指定何时允许分片重新平衡

cluster.routing.allocation.allow_rebalance: indices_all_active

 

#允许控制集群范围允许多少个并发碎片重新平衡。默认为2。请注意,此设置仅控制由于群集中的不平衡而导致的并发碎片重定位的数量。此设置不会限制由于分配过滤 或强制感知而导致的碎片重定位

cluster.routing.allocation.cluster_concurrent_rebalance: 2

 

#碎片平衡启发式

 

#定义节点上分配的碎片总数(浮点数)的权重因子。默认为0.45f。提高这种趋势会使集群中所有节点上的碎片数量相等

cluster.routing.allocation.balance.shard: 0.45f

 

#定义在特定节点上分配的每个索引的分片数(浮点数)的权重因子。默认为0.55f。提高这种趋势会使集群中所有节点上的每个索引的碎片数量相等。

cluster.routing.allocation.balance.index: 0.55f

 

#应该执行的操作的最小优化值(非负浮点数)。默认为1.0f。提高这将导致集群在优化分片余额方面不太积极。

cluster.routing.allocation.balance.threshold: 1.0f

 

 

#基于磁盘的碎片分配

 

#Elasticsearch应该检查集群中每个节点的磁盘使用情况。默认为30s

cluster.info.update.interval: 1m

 

#本地网关

#预计在群集中的(数据或主节点)数量。一旦预期的节点数量加入到群集中,本地碎片的恢复就会开始。默认为0

gateway.expected_nodes: 0

 

#预计将在群集中的主节点的数量。当主节点加入集群时,本地碎片的恢复将立即开始。默认为0

gateway.expected_master_nodes: 0

 

#如果未达到预期的节点数量,则无论恢复尝试恢复,恢复过程都会等待配置的时间量。默认为5m如果expected_nodes配置其中一个设置。

gateway.recover_after_time: 2m

 

#聚合排序数据缓存

indices.fielddata.cache.size: 40%

 

#节点查询缓存

 

indices.queries.cache.size: 20%

 

index.queries.cache.enabled: true

 

#索引缓冲区

indices.memory.index_buffer_size: 35%

 

#索引恢复

indices.recovery.max_bytes_per_sec: 50mb

 

 

#线程池

thread_pool.index.size: 9

thread_pool.index.queue_size: 200

 

thread_pool.search.size: 12

thread_pool.search.queue_size: 1000

 

thread_pool.get.size: 8

thread_pool.get.queue_size: 1000

 

thread_pool.bulk.size: 8

thread_pool.bulk.queue_size: 200

 

 

 

JVM 配置

 

-XX:ParallelCMSThreads=8

-XX:CMSInitiatingOccupancyFraction=75

-XX:MaxGCPauseMillis=200

第八  ES迁移

1. 下载http://nodejs.org/

wget http://nodejs.org/dist/latest/node-v9.3.0-linux-x64.tar.gz

 

2. 解压

3. 配置全局

4. 验证

node -v

5. 安装迁移工具

npm install elasticdump -g

6. 迁移

elasticdump --input=http://192.168.1.201:9201/map --output=http://192.168.1.201:9202/map --type=mapping/data/analyzer

 

官方地址链接(https://github.com/taskrabbit/elasticsearch-dump

#使用分析器和映射将生产索引复制到分段:

elasticdump \

  --input = http//production.es.com9200 / my_index \

  --output = http//staging.es.com9200 / my_index \

  --type =分析器

elasticdump \

  --input = http//production.es.com9200 / my_index \

  --output = http//staging.es.com9200 / my_index \

  --type =映射

elasticdump \

  --input = http//production.es.com9200 / my_index \

  --output = http//staging.es.com9200 / my_index \

  --type =数据

 

#将索引数据备份到文件中:

elasticdump \

  --input = http//production.es.com9200 / my_index \

  --output = / data / my_index_mapping.json \

  --type =映射

elasticdump \

  --input = http//production.es.com9200 / my_index \

  --output = / data / my_index.json \

  --type =数据

 

#使用标准输出备份和索引到gzip

elasticdump \

  --input = http//production.es.com9200 / my_index \

  --output = $ \

  | gzip > /data/my_index.json.gz

 

#将查询结果备份到文件中

elasticdump \

  --input = http//production.es.com9200 / my_index \

  --output = query.json \

  --searchBody ' {query”:{term”:{username”:“admin}}} '

 

#复制单个分片数据:

elasticdump \

  --input = http//es.com9200 / api \

  --output = http//es.com9200 / api2 \

  --params = ' {preference”:“_shards0} '

 

第九 磁盘挂载

一、

1、echo "- - -" > /sys/class/scsi_host/host0/scan

2、fdisk -l | grep /dev/sd

3、pvcreate /dev/sdb

4、vgextend centos /dev/sdb

5、Vgs

6、lvextend -r -L +3000g /dev/centos/home

7、df -h

 

二、

1、fdisk /dev/sda

2、n->p->3->enter->enter->w

3、Partprobe

4、Pvcreate /dev/sda3

第十 GC

并发标记清除(CMS)收集器(-XX:+UseConcMarkSweepGC):CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器通过多线程并发进行垃圾回收,尽量减少垃圾收集造成的停顿。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器一样。这个垃圾收集器适用于不能忍受长时间停顿要求快速响应的应用。可使用 -XX:ParallelCMSThreads=n JVM选项来限制CMS收集器的线程数量。默认使用

G1垃圾收集器(-XX:+UseG1GC) G1(Garbage First):垃圾收集器是在Java 7后才可以使用的特性,它的长远目标时代替CMS收集器。G1收集器是一个并行的、并发的和增量式压缩短暂停顿的垃圾收集器。G1收集器和其他的收集器运行方式不一样,不区分年轻代和年老代空间。它把堆空间划分为多个大小相等的区域。当进行垃圾收集时,它会优先收集存活对象较少的区域,因此叫“Garbage First”。建议使用

Serial GC(-XX:+UseSerialGC):Serial GC使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收,即Minor GC和Major GC。Serial GC在client模式(客户端模式)很有用,比如在简单的独立应用和CPU配置较低的机器。这个模式对占有内存较少的应用很管用。

Parallel GC(-XX:+UseParallelGC):除了会产生N个线程来进行年轻代的垃圾收集外,Parallel GC和Serial GC几乎一样。这里的N是系统CPU的核数。我们可以使用 -XX:ParallelGCThreads=n 这个JVM选项来控制线程数量。并行垃圾收集器也叫throughput收集器。因为它使用了多CPU加快垃圾回收性能。Parallel GC在进行年老代垃圾收集时使用单线程。

Parallel Old GC(-XX:+UseParallelOldGC):Parallel GC一样。不同之处,Parallel Old GC在年轻代垃圾收集和年老代垃圾回收时都使用多线程收集



文章转载自小胡的博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论