ELK(Elasticsearch、Logstash、Kibana)
ElasticSearch
Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。
特点
- 分布式的实时文件存储,每个字段都能被索引
- 分布式的实时分析搜索引擎,不规则查询
- 高拓展性PB级数量级,可处理结构和非结构化数据
应用场景
- 全文检索(全字段查询)
- 模糊查询(搜索)
- 数据分析(提供分析语法)
es安装
- 首先装好java环境以及静态网络配置
- 下载好安装包到指定目录下,解压安装
linux添加一个用户es
adduser es
passwd es - 授权es用户给指定的安装目录
chown -R es:es /usr/elastic_search/es - 用es账户启动elasticSearch
./elasticsearch - 本机检验是否启动成功
curl 127.0.0.1:9200 - 其他主机校验成功
需要修改配置文件elasticsearch.yml
network.host参数为你的静态ip或者主机名
安装中问题解决
再次启动报错
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决
vim /etc/security/limits.conf
在end之前添加下面信息
- hard nofile 65536
- soft nofile 131072
- hard nproc 4096
- soft nproc 2048
参数说明
nofile 打开文件的最大数目
nproc 进程的最大数目
hard 当前系统生效的设置值
soft 系统中所能设置的最大值
vim /etc/sysctl.conf
插入下面信息
vm.max_map_count=655360
fs.file-max=655360
参数说明
vm.max_map_count 单个jvm能开启的最大线程数
fs.file-max 系统所有进程一共可以打开的文件数量
让修改生效
sysctl -p
在浏览器访问http://hadoop1:9200/,看到下面消息就成功了
{
“name” : “hR4B3zp”,
“cluster_name” : “elasticsearch”,
“cluster_uuid” : “b-d3OuvoRimcc951UCxdvw”,
“version” : {
“number” : “6.3.1”,
“build_flavor” : “default”,
“build_type” : “tar”,
“build_hash” : “eb782d0”,
“build_date” : “2018-06-29T21:59:26.107521Z”,
“build_snapshot” : false,
“lucene_version” : “7.3.1”,
“minimum_wire_compatibility_version” : “5.6.0”,
“minimum_index_compatibility_version” : “5.0.0”
},
“tagline” : “You Know, for Search”
}
es的集群安装
修改配置文件elasticsearch.yml
vim /elasticsearch.yml
配置参数
cluster.name: arnold-application #集群名字,可自定义
node.master: true #设置为主节点
node.data: true #设置为数据节点
node.name: hadoop-1 #节点名字可自定义
path.data: /usr/elk/es_data #es数据路径
path.logs: /usr/elk/es_logs #es日志路径
network.host: hadoop1 #主机名
http.port: 9200 #端口
discovery.zen.ping.unicast.hosts: ["hadoop2", "hadoop3"] #集群通信主机名配置
transport.tcp.port: 9300 #集群通信端口
discovery.zen.minimum_master_nodes: 3 #集群节点最少数目,避免脑裂最好设置半数+1
安装head插件(管控es集群的插件)
- 安装nodejs
- 下载地址
https://github.com/mobz/elasticsearch-head - 配置
https://blog.csdn.net/Mr_Mocha/article/details/89175469 - 配置文件添加
elasticsearch默认不支持第三方插件,head插件在elasticsearch5+版本后被移除elasticsearch,需要配置config/elasticsearch.yml
文件末尾插入代码:
#allow origin
http.cors.enabled: true
http.cors.allow-origin: “*”
head集群中的status显示状态
green 所有主要分片和复制分片都可用
yellow 所有主要分片可用,但不是所有复制分片都可用
red 不是所有的主要分片可用
集群术语定义
索引:一个用来指向一个或多个分片(shards)的逻辑命名空间
分片(shard):一个最小级别的工作单元,只是保存索引中所有数据的一部分,是一个lucene实例,本身就是一个完成的搜索引擎,我们的文档存储在索引中,可以把分片想象成数据的容器,文档存储在分片中,然后分片分配到集群的节点上
主分片:索引中的每个文档属于一个单独的主分片,所以主分片的数量决定了索引最多能存储多少数据
副分片:复制分片只是主分片的一个副本,可以提供读请求
故障转移:文档索引主要被存储在主分片中,然后复制到对应的副分片上,主副节点可做到相互转换,并且放着数据挂掉之后的数据完整性问题
es存储方式
- 面向文档
- json
数据结构
一个索引库index下,老版本还有多个type,后期版本中就存在一个type,多个document,一个document就是一条数据,有多个field
一些常用命令(可在kibana下的Dev Tools进行相关命令操作)
创建一个文档数据
PUT {
Index}/{
type}/{
id}
{
}
eg:POST arnold/doc/1
{
"name":"arnold",
"age":18
}
arnold可理解成一个索引数据库
doc为type类型
1 _id 主键
批量插入文档(对象之间不能有\n)
POST {
Index}/{
type}/_bulk
{
"index":{
"_id":1
}
{
数据实体对象
}
"index":{
"_id":2
}
{
数据实体对象
}
}
查询文档
GET arnold/doc/1 获取一个文档信息
检索文档的一部分