ELK-es篇

系统参数修改:

vim /etc/sysctl.conf
#添加如下语句
vm.max_map_count = 262144
#2
vim /etc/security/limits.conf
#添加如下语句
* soft nofile 65536
* hard nofile 65536
* soft nproc 2048
* hard nproc 4096
#3
vim /etc/security/limits.d/90-nproc.conf
#修改如下属性,该值原为1024,需要修改为2048
* soft nproc 2048
防火墙:
vim /etc/sysconfig/iptables
#在指定区域加入端口:
iptables -I INPUT -p tcp --dport 9200 -j ACCEPT
iptables -I INPUT -p tcp --dport 9300 -j ACCEPT
#重启
service iptables restart

jdk安装
es安装
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
tar -xvf elasticsearch-2.3.4.tar.gz
目录结构
bin :脚本文件,包括 ES 启动 & 安装插件等等
config : elasticsearch.yml(ES 配置文件)、jvm.options(JVM 配置文件)、日志配置文件等等
JDK : 内置的 JDK,JAVA_VERSION="12.0.1"
lib : 类库
logs : 日志文件
modules : ES 所有模块,包括 X-pack 等
plugins : ES 已经安装的插件。默认没有插件
data : ES 启动的时候,会有该目录,用来存储文档数据。该目录可以设置

关键的 jvm.options JVM 配置文件,默认为-Xms1g -Xmx1g
推荐:如果足够的内存,也尽量不要 超过 32 GB。即每个节点内存分配不超过 32 GB。
因为它浪费了内存,降低了 CPU 的性能,还要让 GC 应对大内存。如果你想保证其安全
可靠,设置堆内存为 31 GB 是一个安全的选择
标准的建议是把 50% 的可用内存作为 Elasticsearch 的堆内存,保留剩下的 50%。当然它也不会被浪费,Lucene 会很乐意利用起余下的内存。
swapping是性能的坟墓:内存交换 到磁盘对服务器性能来说是 致命 的
swapoff -a和永久修改/etc/fstab
或者降低swappiness,在紧急情况还能使用交换内存:
vm.swappiness = 1(设置为1比0好,因为一些版本内核可能会触发oom)
也可以锁住内存:配置elasticsearch.yml 文件中,设置如下:bootstrap.mlockall: true

配置:
cluster.name: yf_es_elk #配置elasticsearch的集群名称
# ---------------------------------- Node -----------------------------------
node.name: node-1 #节点名,es会默认随机指定一个名字
# ----------------------------------- Paths ---------------------------------
path.data: /data/elasticsearch/es-data,/data1/elasticsearch/es-data #设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开
path.logs: /data/elasticsearch/es-logs #设置日志文件的存储路径,默认是es根目录下的logs文件夹
# ---------------------------------- Network --------------------------------
network.host: 10.111.8.172 #设置bind_host和publish_host,设置为0.0.0.0允许外网访问
http.port: 9200 #设置对外服务的http端口,默认为9200
# --------------------------------- Discovery -------------------------------
discovery.seed_hosts: ["10.111.8.172"] ##Elasticsearch7新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点,由discovery.zen.ping.unicast.hosts:参数改变而来
cluster.initial_master_nodes: ["node-3"] ##Elasticsearch7新增参数,写入候选主节点的设备地址,来开启服务时就可以被选为主节点
# --------------------------------- Cross domain ---------------------------
http.cors.enabled: true ##是否开启跨域访问
http.cors.allow-origin: "*" ##开启跨域访问后的地址限制,*表示无限制
# ---------------------------------- Various --------------------------------
node.master: true ##允许节点是否可以成为一个master节点,ES是默认集群中的第一台机器成为master,如果这台机器停止就会重新选举
node.data: true ##允许该节点存储索引数据(默认开启
#-----------------------------------Disk------------------------------------
cluster.routing.allocation.disk.threshold_enabled: true ## ture时,给节点分配分片时将参考磁盘大小,会检查watermark.low和watermark.high参数
cluster.routing.allocation.disk.watermark.low: 200gb ## 磁盘使用率 或 磁盘剩余大小,达到后ES不再分配新分片,1g表示磁盘剩余空间小于1g时, ES将停止分配新分片。也可以设置为:.97,表示磁盘利用率大于97%时不再分配新分片
cluster.routing.allocation.disk.watermark.high: 100gb ## 磁盘使用率 或 磁盘剩余大小,达到后ES将开始移动分片,1g表示磁盘剩余空间小于1g时,ES将开始移动分片。也可以设置为:.99,表示磁盘利用率大于99%时将开始移动分片
cluster.routing.allocation.disk.watermark.flood_stage: 50gb #洪水警戒水位线——默认为磁盘容量的95%,防止节点耗尽磁盘空间的最后手段
cluster.info.update.interval: 10m
bootstrap.memory_lock: true #锁定内存
discovery.zen.ping.multicast.enabled: false # 关闭多播
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] # 设置此节点定时ping的ip,只应该配置主节点的ip,若配了非主节点ip、
cat jvm.option
#堆内存配置
-Xms16g #Xms表示ES堆内存初始大小
-Xmx16g #Xmx表示ES堆内存的最大可用空间
#GC配置
-XX:+UseConcMarkSweepGC
#使用CMS内存收集
-XX:CMSInitiatingOccupancyFraction=75
#使用CMS作为垃圾回收使用,75%后开始CMS收集
-XX:+UseCMSInitiatingOccupancyOnly
#使用手动定义初始化开始CMS收集
#在ES运行起来后锁定ES所能使用的堆内存大小,锁定内存大小一般为可用内存的一半左右;锁定内存后就不会使用交换分区
#如果不打开此项,当系统物理内存空间不足,ES将使用交换分区,ES如果使用交换分区,那么ES的性能将会变得很差
启动:
bin/elasticsearch
关于ES的重启或者停止,只有使用 ps -ef | grep elastic,杀死对应进程ID。或者 curl -XPOST 'http://localhost:9200/_shutdown'
默认 9300 是 Java 客户端的端口。9200 是支持 HTTP 的接口

插件安装:
bin/plugin install mobz/elasticsearch-head
访问http://localhost:9200/_plugin/head/ 验证
#查看节点信息:
http://localhost:9200/_cat/nodes?v
查看集群状态
http://localhost:9200/_cluster/health?pretty
elasticsearch 集群健康状况返回颜色取值
green 所有分片和复制分片均可用
yellow 所有主分片可用,部分或全部复制分片不可用
red 主分片部分或全部不可用
常见操作:
Kibana里有控制台```Dev Tools,控制台里直接操作即可

增删改查
ES Restful API GET、POST、PUT、DELETE、HEAD含义:
1)GET:获取请求对象的当前状态。
2)POST:传教添加改变对象的当前状态。
3)PUT:创建,添加一个对象。
4)DELETE:销毁对象。
5)HEAD:请求获取对象的基础信息。
对应关系
索引:Index 相当于数据库中的database
类型:type 相当于数据库中的table
主键:id 相当于数据库中的主键

如curl -XPUT 'http://hadoop100:9200/store/books/2' -d '{
"title": "Elasticsearch Blueprints",
.......
#store为database;books为table;2为主键
索引操作:索引相当于SQL中的一个数据库
创建索引
PUT /test #传教索引test
查询索引
GET /test
删除索引
DELETE /test

mapping操作:映射是定义文档及其包含的字段如何存储和索引的过程
查询test索引的mapping
GET /test/_mapping
向test索引中添加mytest字段,之前mapping中的name不会被删除
POST /person/_mapping
{
"properties" : {
"mytest" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
文档操作:
文档添加
使用_doc API向 test 中添加文档:
PUT /test/_doc/1
{
"name":"ytao",
"blog":"公众号 ytao",
"remark":"https://ytao.top"
}
上面命令执行过程,如果索引或 mapping 不存在,都会自动创建。这里的 id 我们也可以自动生成,但是请求不能使用 PUT 方式,要改为 POST 方式
POST /person/_doc/
{
"name":"ytao",
"blog":"公众号 ytao",
"remark":"https://ytao.top"
}
如果上面我们插入 id 为 1 的文档重复执行,那么会先删除掉旧的文档,再引用新的文档,并且所对应的_version版本号值会较之前的 +1
create 方式添加文档
使用_create API向 test 添加文档,这里 id 必须指明:
PUT /test/_create/2
{
"name":"yangtao",
"blog":"ytao's blog",
"remark":"coder"
}
查询文档
GET /test/_doc/1
根据字段进行查询(使用_search API进行查询,查询 name 为 ytao 的文档,通过from=0&size=2分页查询)
GET /test/_search?q=name:ytao&from=0&size=2
返回,查询时间took,分片信息_shards,返回总数total,以及返回的原数据
更新文档
POST /test/_update/1
{
"doc":{
"blog":"ytao's blog"
}
}
删除文档
文档删除使用 DELETE 请求,然后指定 id:
DELETE /person/_doc/1

批量操作文档,使用_bulk API进行
#索引添加方式添加一个文档到索引中(前两步),然后更新文档中 blog 字段(后两步)
POST _bulk
{"index":{"_index":"test", "_id":1}}
{"name":"ytao","blog":"公众号 ytao","remark":"https://ytao.top"}
{"update":{"_index":"person", "_id":1}}
{"doc":{"blog":"ytao's blog"}}
批量获取文档,使用_mget API进行
在 person 索引中获取 id 为 1,2 的文档
POST _mget
{
"docs":[
{
"_index": "person",
"_id": 1
},
{
"_index": "person",
"_id": 2
}
]
}
批量查询文档
使用_msearch API进行
GET /person/_msearch
{"index":"person"}
{"query":{"match":{"blog":"ytao's blog"}}}
{"index":"person"}
{"query":{"match":{"remark":"coder"}}}

过滤查询:
curl -XGET 'http://hadoop100:9200/store/books/_search' -d '{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"price": 35.99
}
}
}
}
}'
布尔过滤:
# must: 条件必须满足,相当于 and
# should: 条件可以满足也可以不满足,相当于 or
# must_not: 条件不需要满足,相当于 not
curl -XGET 'http://hadoop100:9200/store/books/_search' -d '{
"query" : {
"bool" : {
"should" : [
{ "term" : {"price" : 35.99}},
{ "term" : {"price" : 99.99}}
],
"must_not" : {
"term" : {"publish_date" : "2016-02-06"}
}
}
}
}'
嵌套查询:
curl -XGET 'http://hadoop100:9200/store/books/_search' -d '{
"query": {
"bool": {
"should": [
{
"term": {
"price": 35.99
}
},
{
"bool": {
"must": [
{
"term": {
"publish_date": "2016-02-06"
}
},
{
"term": {
"price": 99.99
}
}
]
}
}
]
}
}
}'
range范围过滤
# gt : > 大于
# lt : < 小于
# gte : >= 大于等于
# lte : <= 小于等于
curl -XGET 'http://hadoop100:9200/store/books/_search' -d '{
"query": {
"range" : {
"price" : {
"gte" : 10,
"lt" : 99
}
}
}
}
#name和author都必须包含Guide,并且价钱等于33.99或者188.99
curl -XGET 'http://hadoop100:9200/store/books/_search' -d '{
"query": {
"bool": {
"must": {
"multi_match": {
"operator": "and",
"fields": [
"name",
"author"
],
"query": "Guide"
}
},
"filter": {
"terms": {
"price": [
35.99,
188.99
]
}
}
}
}
}'

跨域问题:
elasticsearch.yml文件中添加
http.cors.enabled: true
http.cors.allow-origin: "*"
磁盘问题:
es 集群的默认配置是当集群中的某个节点磁盘达到使用率为 85% 的时候,就不会在该节点进行创建副本,
当磁盘使用率达到 90% 的时候,尝试将该节点的副本重分配到其他节点。当磁盘使用率达到95% 的时候,当前节点的所有索引将被设置为只读索引
日志清理问题:
curl -XGET 'http://127.0.0.1:9200/_cat/indices/?v'
curl -XDELETE 'http://127.0.0.1:9200/logstash-2016-07-*'
或者利用脚本+crontab
#!/bin/bash
######################################################
# $Name: clean_es_index.sh
# $Version: v1.0
# $Function: clean es log index
# $Author: sjt
# $Create Date: 2018-05-14
# $Description: shell
######################################################
#本文未加文件锁,需要的可以加
#脚本的日志文件路径
CLEAN_LOG="/app/elk/es/clean_es_index.log"
#索引前缀
INDEX_PRFIX="backstage_logs"
#elasticsearch 的主机ip及端口
SERVER_PORT=192.168.31.163:9200
#取出已有的索引信息
INDEXS=$(curl -s "${SERVER_PORT}/_cat/indices?v" |grep "${INDEX_PRFIX}"|awk '{print $3}')
#删除多少天以前的日志,假设输入10,意味着10天前的日志都将会被删除
DELTIME=30
# seconds since 1970-01-01 00:00:00 seconds
SECONDS=$(date -d "$(date +%F) -${DELTIME} days" +%s)
#判断日志文件是否存在,不存在需要创建。
if [ ! -f "${CLEAN_LOG}" ]
then
touch "${CLEAN_LOG}"
fi
#删除指定日期索引
echo "----------------------------clean time is $(date +%Y-%m-%d_%H:%M:%S) ------------------------------" >>${CLEAN_LOG}
for del_index in ${INDEXS}
do
indexDate=$( echo ${del_index} |cut -d "-" -f 2 )
format_date=$(echo ${indexDate}| sed 's/\.//g')
format_date=$(echo ${indexDate}| sed 's/-//g')
#根据索引的名称的长度进行切割,不同长度的索引在这里需要进行对应的修改
indexSecond=$( date -d ${format_date} +%s )
if [ $(( $SECONDS- $indexSecond )) -gt 0 ]
then
echo "${del_index}" >> ${CLEAN_LOG}
#取出删除索引的返回结果
delResult=`curl -s -XDELETE "${SERVER_PORT}/"${del_index}"?pretty" |sed -n '2p'`
#写入日志
echo "clean time is $(date)" >>${CLEAN_LOG}
echo "delResult is ${delResult}" >>${CLEAN_LOG}
fi
done

posted @ 2020-09-16 03:35  舍&得  阅读(235)  评论(0)    收藏  举报