一 . Elasticsearch是什么
Elasticsearch是一个高度可扩展的开源全文本搜索和分析引擎。它可以快速,近实时地存储,搜索和分析大量数据。它通常用作支持具有复杂搜索功能和要求的应用程序的基础引擎。
- ES分布式的索引库,nosql
- 对外提供检索服务:http或者transport(7.0后不再支持)协议对外提供搜索,Restful的json
- 对内就是一个数据库nosql
二 . Elasticsearch的场景
-
电商网站。允许客户搜索产品。可以使用ES存储整个产品目录和库存,并为其提供搜索和自动完成功能。
-
日志或交易数据收集。并且要对数据进行分析和挖掘以查找趋势,统计信息,摘要或异常等。
-
价格警报平台。平台允许客户指定如“如果某商品的价格在下个月内降到X以下,就通知我” 。
-
业务智能分析。想要快速调查,分析,可视化并针对大量数据提出特别问题。
三 .Elasticsearch特点
Elasticsearch封装了Lucene,开箱即用,使用起来更加简单。Elasticsearch支持集群,也支持集群节点动态扩展,在高可用上做了很多工作,是一个搜索引擎,而不是一个索引类库。
-
Elasticsearch基于Lucene构建,Elasticsearch利用Lucene做实际的工作
-
ELasticsearch中的每个分片都是一个分离的Lucene实例.
-
Elasticsearch在Lucene基础上(即利用Lucene的功能)提供了一个分布式的、基于JSON的REST API 来更方便地使用 Lucene的功能。
-
Elasticsearch提供其他支持功能,如:线程池,队列,节点/集群监控API,数据监控API,集群管理等
四. Elasticsearch基本概念
1.集群(Cluster)
集群是一个或多个节点(服务器)的集合,这些节点一起保存全部数据,并在所有节点之间提供索引和搜索功能。集群由唯一名称标识,默认情况下为“ elasticsearch”。此名称很重要,因为如果节点被设置为通过名称加入群集,则该节点只能是群集的一部分。
2. 节点(Node)
节点是单个服务器是群集的一部分,用于存储数据并参与群集的索引和搜索。像群集一样,节点由名称标识,该名称默认为在启动时分配给该节点的随机唯一标识符(UUID)。如果不想使用默认的节点名称,可以自定义节点名称。该名称对于管理集群非常重要,命名时尽可能可以通过名称来判别在集群中对应哪个节点
3. 索引(Index)
索引是具有相似特征的文档的集合。如:可以以客户数据创建索引,以产品目录创建一个索引,以订单数据创建一个索引
4. 类型(Type)
在索引中,您可以定义一个或多个类型。类型是索引的逻辑类别或分区。通常,为具有一组公共字段的文档定义一种类型
5.文档(Document)
文件是可以索引的基本信息单位
Elastic Search | 关系型数据库 |
---|---|
索引(Indices) | 数据库(Databases) |
类型 (Types6.x只有一个,之前可以多个,7.x没有了) | 表(Table) |
文档(Document) | 行(Row) |
字段(Field) | 列(Column) |
Mapping | Schema |
结构化查询语言(query DSL) | SQL |
GET http:9200/index... | SELECT * FROM table... where ... |
es致命的缺点:非关系型的没有办法链接查询,也就是跨索引查询
6. 分片(Shard)
实际项目中,索引数据可能会非常庞大,而这些数据可能超过了单个节点的硬件条件。如:十亿个文档的单个索引占用了1TB的磁盘空间,这时无法使用单个节点的磁盘存储,或者因为检索过程太慢而无法满足搜索请求。
为了解决此问题,Elasticsearch提供了将索引细分为多个碎片(分片)的功能。创建索引时,只需定义所需的分片数量即可。每个分片本身就是一个功能齐全且独立的“索引”,它们可以托管在群集中的任何节点上。
7. 副本(Replicas)
为了以防分片/节点因为某些原因脱机或消失(提供高可用机制),强烈建议使用故障转移机制。为此,Elasticsearch允许将索引分片的一个或多个副本制作为所谓的副本分片(简称副本)。
8. 近实时搜索
随着按段(per-segment)搜索的发展,一个新的文档从索引到可被搜索的延迟显著降低了。新文档在几分钟之内即可被检索,但这样还是不够快。
磁盘在这里成为了瓶颈。提交(Commiting)一个新的段到磁盘需要一个 fsyn 操作来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据。 但是 fsyn 操作代价很大;如果每次索引一个文档都去执行一次的话会造成很大的性能问题。
我们需要的是一个更轻量的方式来使一个文档可被搜索,这意味着 fsyn 要从整个过程中被移除。
在Elasticsearch和磁盘之间是文件系统缓存。像之前描述的一样, 在内存索引缓冲区中的文档会被写入到一个新的段中。但是这里新段会被先写入到文件系统缓存——这一步代价会比较低,稍后再被刷新到磁盘——这一步代价比较高。不过只要文件已经在缓存中, 就可以像其它文件一样被打开和读取了。
Lucene 允许新段被写入和打开—使其包含的文档在未进行一次完整提交时便对搜索可见。 这种方式比进行一次提交代价要小得多,并且在不影响性能的前提下可以被频繁地执行。
五. Elasticsearch安装配置
版本选择
Elasticsearch 主线版本有 5 / 6 / 7 考虑到机器的性能问题以及版本5在好多生成环境还在使用
ES是基于java开发的,所以安装之前需要确保本机上已经安装有jdk,ES对java依赖如下:
- ES5.x以上需要Java8 以上的版本
- ES6.5以上开始支持Java 11
- 从ES7.0开始,ES内置了Java环境
版本:Elasticsearch-6.6.0.tar
JDK: 版本最少 JDK 1.8.0_133 不要使用系统默认的opendJDK总是有些不可预料的问题
下载地址:下载中心 - Elastic 中文社区
备用下载地址:链接: 百度网盘 请输入提取码 提取码: fdx7
# 下载elasticsearch-6.6.0
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.tar.gz
# 解压文件
$ tar xvzf elasticsearch-6.6.0.tar.gz
# 移动到指定目录
$ mv ./elasticsearch-6.6.0 /usr/path/to
配置 (配置文件详解 )
配置项 | 配置项说明 |
---|---|
cluster.name | Elasticsearch集群名称。默认名称为elasticsearch |
node.name | 节点名称。默认情况下,Elasticsearch使用随机生成UUID的前七个字符作为节点ID。节点ID是持久的在重新启动时也不会更改,因此默认节点名称也不会更改。 |
node.attr.rack | 节点服务器所在的机架信息 |
path.data | 设置索引数据的存储路径,默认是Elasticsearch根目录下data文件夹。可以设置多个存储路径,用逗号隔开 |
path.log | 设置日志文件的存储路径,默认是Elasticsearch根目录下logs文件夹 |
bootstrap.memory_lock | 设置为true代表任何JVM内存都不会交换到磁盘上,防止Elasticsearch内存被交换出去影响性能。 |
network.host | 指定Elasticsearch节点的IP地址 |
http.port | 设置Elasticsearch对外服务的http端口号。默认9200 |
discovery.zen.ping.unicast.hosts | 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点 |
discovery.zen.minimum_master_nodes | 该参数是为了防止”脑裂”的产生,定义了为形成群集而必须可见的符合主机要求的最小数量。默认为1。 |
gateway.recover_after_nodes | 只要预期的节点数已加入集群,就会启动本地分片的恢复。默认为0 |
action.destructive_requires_name | 只能删除指定了名称的数据,而不允许通过 _all 或通配符来删除匹配的索引库。可以Rest API 动态的更新这个设置。 |
系统配置文件
memory_lock配置
如果memory_lock设置为true,出现报错,则需要修改下面2个Linux系统文件:
修改 /etc/security/limits.conf
soft nofile 65536
hard nofile 65536
soft nproc 32000
hard nproc 32000
hard memlock unlimited
soft memlock unlimited
修改/etc/systemd/system.conf
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
max_map_count警告
启动时,如果出现警告:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
立即生效:执行/sbin/sysctl -p 立即生效
临时设置
临时设置,当Linux重新启动会恢复到设置之前的值。
$ sysctl -w vm.max_map_count=262144
# 查看结果:
$ sysctl -a|grep vm.max_map_count
# 显示:
$ vm.max_map_count = 262144
永久设置
在 /etc/sysctl.conf文件最后添加一行
vm.max_map_count=262144
启动
$ cd $ES_HOME/bin
# 启动elasticsearch
$ ./elasticsearch
# 后台启动elasticsearch
$ ./elasticsearch -d
# 带参数覆盖配置启动(通过自定义名称覆盖集群默认的名称或节点名称)
$ ./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name
#如果启动时使用root用户启动报错,使用其他用户执行启动命令【注意把文件权限赋予对应用户】
$ chown -R userName:userName /usr/path/to/elasticsearch-6.6.0
测试ES是否成功启动:
curl http://127.0.0.1:9200/_cat/health?v
6 安装IK分词器
6.1 下载Elasticsearch 对应版本的IK分词器
下载地址:Releases · medcl/elasticsearch-analysis-ik · GitHub
6.2切换到ES的启动用户,并在es的安装目录下/plugins中创建ik
mkdir ‐p /usr/local/elasticsearch‐6.8.0/plugins/ik
6.3 将下载的ik分词器上传并解压到该目录
cd /usr/local/es/elasticsearch‐6.8.0/plugins/ik
unzip elasticsearch‐analysis‐ik‐6.8.0.zip
6.4 重启Elasticsearch
./elasticsearch -d
7. 配置es登录用户名密码
./elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
给这五个分别设置密码后,既可
8. 修改kibana配置文件
vim kibana-6.7.0-linux-x86_64/config/kibana.yml
elasticsearch.username: "elastic"
elasticsearch.password: "123456"
重启kibana服务
ps -ef|grep node
nohup ./kinbana &