介绍
Elasticsearch是用于分布式搜索和实时数据进行分析的平台。 它的流行性是由于它的易用性,强大的功能和可扩展性。
Elasticsearch支持RESTful操作。 这意味着您可以使用HTTP方法(GET,POST,PUT,DELETE等)结合HTTP URI(/ collection / entry)来操作您的数据。 直观的RESTful方法是开发人员和用户友好的,这是Elasticsearch的流行的原因之一。
Elasticsearch是一个免费的开源软件,它背后有一个坚实的公司 - Elastic。 这种组合使其适用于从个人测试到企业集成的任何地方。
本文将向您介绍Elasticsearch,并向您展示如何安装,配置和开始使用它。
先决条件
在遵循本教程之前,请确保您满足以下先决条件:
- 一个CentOS 7Droplet
- 非根Sudo用户(看看在CentOS 7初始服务器设置的详细信息。)
除非另有说明,本教程中需要root权限的所有命令都应以具有sudo权限的非root用户身份运行。
假设
本教程假定您的服务器使用的是像这里所描述的一个VPN: 如何使用Ansible和TINC VPN保护您的服务器基础架构 。 这将提供专用网络功能,而不管您的服务器正在使用的物理网络。
如果您使用共享专用网络(如DigitalOcean专用网络),则必须使用VPN才能保护Elasticsearch免受未经授权的访问。 每个服务器必须在同一个专用网络上,因为Elasticsearch没有在其HTTP接口中内置安全性。 不得与不信任的计算机共享专用网络。
第1步 - 安装Java
首先,您将需要在Droplet上使用Java运行时环境(JRE),因为Elasticsearch是用Java编程语言编写的。 您可以使用本机CentOS OpenJDK包为JRE。 这个JRE是免费的,良好的支持,并通过CentOS Yum安装管理器自动管理。
您可以使用以下命令安装最新的OpenJDK:
sudo yum install java-1.8.0-openjdk.x86_64
要验证您的JRE是否已安装并可以使用,请运行以下命令:
java -version
结果应如下所示:
Output of java -versionopenjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
当您使用Elasticsearch进行开发时,您开始寻找更好的Java性能和兼容性,您可以选择安装Oracle专有Java(Oracle JDK 8)。 有关如何操作的更多信息,请查看文章如何在CentOS和Fedora安装Java 。
第2步 - 下载并安装Elasticsearch
Elasticsearch可以直接从下载elastic.co拉链,tar.gz的,DEB或RPM软件包。 对于CentOS,最好使用本机rpm包,它将安装运行Elasticsearch所需的一切。
在写这篇文章的时候,最新的Elasticsearch版本是1.7.3。 使用命令在您选择的目录中下载它:
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.3.noarch.rpm
然后在平时的CentOS的方式与安装rpm
这样的命令:
sudo rpm -ivh elasticsearch-1.7.3.noarch.rpm
这导致Elasticsearch正在安装/usr/share/elasticsearch/
与它的配置文件放在/etc/elasticsearch
和增加它的init脚本/etc/init.d/elasticsearch
。
要确保Elasticsearch使用Droplet自动启动和停止,请使用以下命令将其init脚本添加到默认运行级别:
sudo systemctl enable elasticsearch.service
第3步 - 配置Elastic
现在,Elasticsearch及其Java依赖项已安装,现在是时候配置Elasticsearch。
该Elasticsearch配置文件在/etc/elasticsearch
目录。 有两个文件:
elasticsearch.yml
-配置Elasticsearch服务器设置。 这是所有选项,除了日志记录,存储,这就是为什么我们主要对这个文件感兴趣的地方。logging.yml
-提供日志配置。 开始时,您不必编辑此文件。 您可以保留所有默认日志记录选项。 您可以在所生成的日志/var/log/elasticsearch
默认。
第一个变量,自定义任何Elasticsearch服务器上是node.name
和cluster.name
在elasticsearch.yml
。 如它们的名字暗示, node.name
指定服务器(节点)的名称和要后者相关联的簇。
如果不自定义这些变量, node.name
会自动在对于Droplet主机分配。 该cluster.name
将被自动设置为默认集群的名称。
该cluster.name
值由Elasticsearch的自动发现功能来自动发现和准Elasticsearch节点到群集。 因此,如果不更改默认值,则可能会在集群中的同一网络上找到不需要的节点。
开始编辑的主要elasticsearch.yml
配置文件:
sudo nano /etc/elasticsearch/elasticsearch.yml
删除#
在该行的开头字符node.name
和cluster.name
取消注释它们,然后改变它们的值。 在你的第一个配置更改/etc/elasticsearch/elasticsearch.yml
文件应该是这样的:
...
node.name: "My First Node"
cluster.name: mycluster1
...
另一个重要的设置是服务器的角色,可以是“主”或“从”。 “大师”负责集群的健康和稳定。 在具有大量集群节点的大型部署中,建议拥有多个专用的“主节点”。 通常,专用的“主”不会存储数据或创建索引。 因此,不应该有过载的机会,由此可能危及群集健康。
“Slaves”用作“workhorses”,可以加载数据任务。 即使“从”节点过载,集群健康不应受到严重影响,前提是有其他节点承担额外负载。
这就决定了服务器的角色设置被称为node.master
。 如果你只有一个Elasticsearch节点,应该让它保持它的默认值保留此选项注释掉true
-也就是唯一的节点应该也是高手。 另外,如果您希望将节点配置为Minion,删除#
在开始时性格node.master
行,值更改为false
:
...
node.master: false
...
另外一个重要的配置选项是node.data
,它决定一个节点是否将存储数据或没有。 在大多数情况下,这个选项应该留给它的默认值( true
),但有两种情况下,您可能希望不要将数据存储在节点上。 一个是当节点是专用的“主机”时,正如我们已经提到的。 另一种是当节点仅用于从节点获取数据并聚合结果时。 在后一种情况下,节点将作为“搜索负载平衡器”起作用。
同样,如果你只有一个Elasticsearch节点,应该使其保持默认保留此设置注释掉true
价值。 否则,禁止在本地存储数据,取消注释以下行和值更改为false
:
...
node.data: false
...
另外两个重要的选项是index.number_of_shards
和index.number_of_replicas
。 第一个确定索引将被分割成多少块(分片)。 第二个定义将在群集中分布的副本的数量。 拥有更多分片可提高索引编制性能,同时拥有更多副本可使搜索更快。
假设您仍然在单个节点上探索和测试Elasticsearch,最好只从一个分片开始,而不是从副本开始。 因此,它们的值应设置如下(请务必删除#
在行的开头):
...
index.number_of_shards: 1
index.number_of_replicas: 0
...
你可能有兴趣在不断变化的最后一个设置是path.data
,它决定了存储数据的路径。 默认路径是/var/lib/elasticsearch
。 在生产环境中,建议您使用专用分区和装载点来存储Elasticsearch数据。 在最好的情况下,这个专用分区将是一个单独的存储介质,将提供更好的性能和数据隔离。 您可以指定不同的path.data
通过取消注释路径path.data
线和改变其值:
...
path.data: /media/different_media
...
完成所有更改后,请保存并退出文件。 现在您可以使用命令第一次启动Elasticsearch:
sudo service elasticsearch start
请至少等待10秒钟才能使Elasticsearch完全启动,然后才能使用它。 否则,您可能会收到无法连接的错误。
第4步 - 保护弹性
Elasticsearch没有内置安全性,可以由任何可以访问HTTP API的人控制。 本节不是确保Elasticsearch安全的全面指南。 采取任何必要的措施,以防止未经授权的访问它和运行它的服务器/虚拟机。 考虑使用iptables的 ,以进一步保护您的系统。
第一个安全措施是防止公共访问。 要删除公共访问编辑的文件elasticsearch.yml
:
sudo nano /etc/elasticsearch/elasticsearch.yml
查找包含行network.bind_host
,取消它通过删除#
在该行的开头字符,然后将值更改为localhost
,所以它看起来是这样的:
...
network.bind_host: localhost
...
警告:由于Elasticsearch没有任何内置的安全性,这是非常重要的,你不要将此设置为是,你不控制或信任的任何服务器访问的IP地址。 不绑定Elasticsearch到公共或共享的专用网络 IP地址!
此外,为了额外的安全性,您可以禁用用于评估自定义表达式的动态脚本。 通过制作自定义恶意表达式,攻击者可能会危及您的环境。
要禁用自定义表达式,添加下面一行是在年底/etc/elasticsearch/elasticsearch.yml
文件:
...
script.disable_dynamic: true
...
要使上述更改生效,必须使用以下命令重新启动Elasticsearch:
sudo service elasticsearch restart
第5步 - 测试
到目前为止,Elasticsearch应该在端口9200上运行。您可以使用curl,命令行客户端URL传输工具和一个简单的GET请求来测试它,如下所示:
curl -X GET 'http://localhost:9200'
您应该会看到以下响应:
Output of curl{
"status" : 200,
"name" : "CentOS Node",
"cluster_name" : "mysqluster",
"version" : {
"number" : "1.7.3",
"build_hash" : "05d4530971ef0ea46d0f4fa6ee64dbc8df659682",
"build_timestamp" : "2015-10-15T09:14:17Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}
如果您看到类似于上面的响应,Elasticsearch正常工作。 如果没有,请确保您已正确遵循安装说明,并允许Elasticsearch完全启动一段时间。
第6步 - 使用Elasticsearch
要开始使用Elasticsearch,让我们先添加一些数据。 如前所述,Elasticsearch使用RESTful API,它响应通常的CRUD命令:创建,读取,更新和删除。 为了使用它,我们将再次使用curl。
您可以使用命令添加第一个条目:
curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
您应该会看到以下响应:
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"created":true}
使用curl,我们向Elasticseach服务器发送了一个HTTP POST请求。 请求的URI是/tutorial/helloworld/1
。 在此了解参数很重要:
-
tutorial
是在Elasticsearch的数据的索引。 -
helloworld
是类型。 -
1
是我们对上述指标和类型在条目的ID。
您可以使用HTTP GET请求检索此第一个条目,如下所示:
curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
结果应如下所示:
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}
要修改现有条目,您可以使用类似于以下内容的HTTP PUT请求:
curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
{
"message": "Hello People!"
}'
Elasticsearch应该确认成功的修改,如下所示:
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"created" : false
}
在上面的例子中,我们已修改message
的第一个条目到的“你好人们!”。 同的是,版本号已被自动增加到2
。
您可能已经注意到了额外的参数pretty
的上述请求。 它启用人类可读的格式,以便您可以在新行上写入每个数据字段。 当检索数据并获得更好的输出时,您还可以“prettify”您的结果,如下所示:
curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'
现在的响应将是一个更好的格式:
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"found" : true,
"_source":{ "message": "Hello World!" }
}
到目前为止,我们已经在Elasticsearch中添加和查询了数据。 要了解其他操作请查看API文档 。
结论
这是安装,配置和开始使用Elasticsearch很容易。 一旦您使用手动查询播放足够,您的下一个任务将是开始从您的应用程序使用它。