Elasticsearch安装部署研究
1 ElasticSearch简介
ElasticSearch(简称ES)是一个基于Lucene构建的开源、分布式、可扩展、RESTful搜索引擎。它能从项目一开始就赋予你的数据以搜索、分析和探索的能力,能够达到实时搜索,稳定,可靠,快速,安装使用方便。它能让你以一个之前从未有过的速度和规模,去探索你的数据。支持通过HTTP使用JSON进行数据索引。Elasticsearc是一种设计用于分布式全文索引解决方案。
Elasticsearch建立在一个全文搜索引擎库 Apache Lucene基础之上。Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库--无论是开源还是私有,但是 Lucene 仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。
Elasticsearch也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API。然而,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
1、一个分布式的实时文档存储,每个字段 可以被索引与搜索;
2、一个分布式实时分析搜索引擎;
3、能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据;
Elasticsearch 将所有的功能打包成一个单独的服务,这样你可以通过程序与它提供的简单的 RESTful API 进行通信, 可以使用自己喜欢的编程语言充当 web 客户端,甚至可以使用命令行(去充当这个客户端)。2 Elasticsearch处理逻辑图
3 Elasticsearch Basic Concepts
3.1 Near Realtime (NRT)
Elasticsearch是近实时搜索平台。这意味着从索引一个文档到找到它的时间,它会有一个小的延迟(通常是1秒)。获取一个新的IndexReader开销很大,所以不能每次一有索引操作就真的去获取一个新的IndexReader,可以隔一段时间去刷新一下,比如每隔一秒钟等等,这就是称之为接近实时( near real-time )的原因。3.2 Cluster(集群)
集群是一个或多个节点的集合,它们共同保存整个数据,并在所有节点上提供联合索引和搜索功能。一个集群由一个唯一的名称,默认为“elasticsearch”。这个名称很重要,因为一个节点通过名称加入集群,来加入这个集群。确保不要在不同的环境中重用相同的集群名称,否则最终会导致节点加入错误的集群。当数据量或查询压力超过单机负载时,需要多个节点来协同处理,所有这些节点组成的系统称为集群(cluster)。集群同时也是无间断提供服务的一种解决方案,即便在某些节点因为宕机或执行管理任务(如升级)不可用时。ElasticSearch 几乎无缝集成了集群功能。
3.3 Node(节点)
单个的ElasticSearch 服务实例称为节点(node),一个服务器通过分端口可以配置多个实例。作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的。默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。如果不想要默认值,可以定义所需的任意节点名,推荐根据不要采用默认值,自定义节点名。这个名字对于管理工作来说很重要,因为在管理过程中,会去确定网络中的哪些实例对应于Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果在网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。在一个集群里,可以拥有任意多个节点。而且,如果网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。
特别的,推荐一个服务器只配置一个实例,即一个服务器只作为集群的一个节点使用。
3.4 Index(索引)
索引是具有相似特性的文档集合。比如说,你可以有一个客户数据的索引,一个产品目录的索引,一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,如果你想,可以定义任意多的索引。ElasticSearch 将它的数据存储在一个或多个索引(index)中。用SQL领域的术语来类比,索引就像数据库,可以向索引写入文档或者从索引中读取文档,并通过在ElasticSearch内部使用Lucene 将数据写入索引或从索引中检索数据。需要注意的是,ElasticSearch 中的索引可能由一个或多个Lucene 索引构成,具体细节由ElasticSearch 的索引分片(shard)、复制(replica)机制及其配置决定。
3.5 Type(类型)
在一个索引中,可以定义一种或多种类型。一个类型是索引的一个逻辑上的分类/分区,其语义完全由自定义。通常,会为具有一组共同字段的文档定义一个类型。比如说,假设运营一个博客平台并且将所有的数据存储到一个索引中。在这个索引中,可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。ElasticSearch 中每个文档都有与之对应的类型(type)定义。这允许用户在一个索引中存储多种文档类型,并为不同文档类型提供不同的映射。
3.6 Document(文档)
文档是可以被索引的基本单元。比如,可以拥有某一个客户的文档,某一个产品的一个文档,当然也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。在一个index/type里面,可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。文档是ElasticSearch 世界中的主要实体(对Lucene 来说也是如此)。对所有使用ElasticSearch 的案例来说,它们最终都可以归结为对文档的搜索。文档由字段构成,每个字段有它的字段名以及一个或多个字段值(在这种情况下,该字段被称为是多值的,即文档中有多个同名字段)。文档之间可能有各自不同的字段集合,且文档并没有固定的模式或强制的结构。另外,这些规则也适用于Lucene 文档。事实上,ElasticSearch 的文档最后都存储为Lucene 文档了。
3.7 Shards(分片)
一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间,或者单个节点处理搜索请求响应太慢。为了满足这个需求,ElasticSearch 将索引散布到多个物理Lucene 索引上。这些Lucene 索引称为分片(shard),而散布这些分片的过程叫作分片处理(sharding)。ElasticSearch 会自动完成分片处理,并且让这些分片呈现出一个大索引的样子。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的索引(Lucene 索引),这个索引可以被放置到集群中的任何节点上。默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制。
特别的,除了ElasticSearch 本身自动进行分片处理外,用户为具体的应用进行参数调优也是至关重要的,分片和副本的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
分片之所以重要,主要有两方面的原因:
1、允许你水平分割/扩展你的内容容量;
2、允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。
3.8 Replicas(副本)
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做副本分片,或者直接叫副本。Replicas代表索引副本,Elasticsearch可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高Elasticsearch的查询效率,Elasticsearch会自动对搜索请求进行负载均衡。副本之所以重要,有两个主要原因:
1、在分片/节点失败的情况下,提供了高可用性。因为这个原因,需要注意,分片和它的副本分片不能置于同一节点上。
2、扩展搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。
每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。开启复制后,索引就有主从关系:主分片和复制分片。分片和副本的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制。这意味着,如果集群中至少有两个节点,索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
node1:P0、R1、P2、R3、P4
node2:R0、P1、R2、P3、R4
3.9 Mapping(映射)
所有文档在写入索引前都需要先进行分析。用户可以设置一些参数,来决定如何将输入文本分割为词条,哪些词条应该被过滤掉,或哪些附加处理是有必要被调用的(如移除HTML 标签)。此外,ElasticSearch 也提供了各种特性,如排序时所需的字段内容信息。这就是映射(mapping)扮演的角色,存储所有这种元信息。虽然ElasticSearch 能根据字段值自动检测字段的类型,但有时候(事实上,几乎是所有时候)用户还是想自行配置映射,以避免出现一些令人不愉快的意外。
3.10 Recovery(恢复)
Recovery代表数据恢复或叫数据重新分布,Elasticsearch在有节点加入或退出时会根据机器的负载对索引分片自动进行重新分配,挂掉的节点重新启动时也会自动进行数据恢复。3.11 River(数据源)
River代表Elasticsearch的一个数据源,也是其它存储方式(如:数据库)同步数据到Elasticsearch的一个方法。它是以插件方式存在的一个Elasticsearch服务,通过读取river中的数据并把它索引到Elasticsearch中。3.12 Gateway
Gateway代表Elasticsearch索引的持久化存储方式,Elasticsearch默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个Elasticsearch集群关闭再重新启动时就会从gateway中读取索引数据。Elasticsearch支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。3.13 discovery.zen
discovery.zen代表Elasticsearch的自动发现节点机制,Elasticsearch是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播(单播)协议来进行节点之间的通信,同时也支持点对点的交互。3.14 Transport
Transport代表Elasticsearch内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。4 ElasticSearch 工作流程
4.1 Elasticsearch启动过程
当ElasticSearch 节点启动时,它使用广播技术(也可配置为单播)来发现同一个集群中的其他节点(这里的关键是配置文件中的集群名称)并与它们连接。可以通过下图的描述来了解相关的处理过程:集群中会有一个节点被选为管理节点(master node)。该节点负责集群的状态管理以及在集群拓扑变化时做出反应,分发索引分片至集群的相应节点上。
从用户的角度来看,ElasticSearch中的管理节点并不比其他节点重要,这与其他分布式系统不同(如数据库)。实际上,不需要知道哪个节点是管理节点,所有操作可以发送至任意节点,ElasticSearch内部会自行处理这些不可思议的事情。如果有需要,任意节点可以并行发送子查询给其他节点,并合并搜索结果,然后返回给用户。所有这些操作并不需要经过管理节点处理(ES是基于对等架构的)。
管理节点读取集群的状态信息,并在必要时进行恢复处理。在该阶段,管理节点会检查所有索引分片并决定哪些分片将用于主分片。然后,整个集群进入黄色状态。这意味着集群可以执行查询,但是系统的吞吐量以及各种可能的状况是未知的(这种状况可以简单理解为所有的主分片已经分配出去了,而副本没有),因而接下来就是要寻找到冗余的分片并用作副本。如果某个主分片的副本数过少,管理节点将决定基于某个主分片创建分片和副本。如果一切顺利,集群将进入绿色状态(这意味着所有主分片和副本均已分配好)。
4.2 故障检测
集群正常工作时,管理节点会监控所有可用节点,检查它们是否正在工作。如果任何节点在预定义的超时时间内没有响应,则认为该节点已经断开,然后开始启动错误处理过程。这意味着要在集群-分片之间重新做平衡,因为之前已断开节点上的那些分片不可用了,剩下的节点要肩负起相应的责任。换句话说,对每个丢失的主分片,一个新的主分片将会从原来的主分片的副本中脱颖而出。新分片和副本的放置策略是可配置的,用户可以根据具体需求进行配置。为了描述故障检测(failure detection)是如何工作的,我们用一个只有三个节点的集群为例,即包含一个管理节点,两个数据节点。管理节点会发送ping 请求至其他节点,然后等待响应。如果没有响应,则该节点会从集群中移除。如下图所示:
4.3 与ElasticSearch 通信
如何向ElasticSearch 推送数据并构建查询?ElasticSearch 对外公开了一个设计精巧的API。这个API 是基于REST,并在实践中能轻松整合到任何支持HTTP 协议的系统中去。ElasticSearch 假设数据由URL 携带或者以JSON文档的形式由HTTP 消息体携带。使用Java 或基于JVM 语言的用户,应该了解一下Java API,它除了REST API 提供的所有功能以外还有内置的集群发现功能。值得一提的是,ElasticSearch 在内部也使用Java API 进行节点间通信。
4.4 索引数据
ElasticSearch 提供了四种方式来创建索引。(1)索引API;
(2)bulk API;---使用HTTP 协议
(3)UDP bulk API;---使用UDP 协议
(4)插件;
最简单的方式是使用索引API,它允许用户发送一个文档至特定的索引。
例如,使用curl 工具,并用如下命令创建一个文档:
$ curl -XPUT http://localhost:9200/blog/article/1 -d '
{
"title": "New version of Elastic Search released!",
"content": "...",
"tags": ["announce", "elasticsearch", "release"]
}
'
第二种或第三种方式允许用户通过bulk API 或UDP bulk API 来一次性发送多个文档至集群。两者的区别在于网络连接方式,前者使用HTTP 协议,后者使用UDP 协议,且后者速度快,但是不可靠。第四种方式使用插件发送数据,称为河流(river),河流运行在ElasticSearch 节点上,能够从外部系统获取数据。
有一件事情需要记住,建索引操作只会发生在主分片上,而不是副本上。当把一个索引请求发送至某节点时,如果该节点没有对应的主分片或者只有副本,那么这个请求会被转发到拥有正确的主分片的节点(如下图所示)
4.5 查询数据
查询API 占据了ElasticSearch API 的大部分内容。使用查询DSL(基于JSON 的可用于构建复杂查询的语言),我们可以做下面这些事情:(1)使用各种查询类型,包括:简单的词项查询、短语查询、范围查询、布尔查询、模糊查询、区间查询、通配符查询、空间查询等。
(2)组合简单查询构建复杂查询。
(3)文档过滤,在不影响评分的前提下抛弃那些不满足特定查询条件的文档。
(4)查找与特定文档相似的文档。
(5)查找特定短语的查询建议和拼写检查。
(6)使用切面构建动态导航和计算各种统计量。
(7)使用预搜索(prospective search)并查找与指定文档匹配的 query 集合。
于查询操作,应该要重点了解:查询并不是一个简单的、单步骤的操作。一般来说,查询分为两个阶段:
>分散阶段(scatter phase):将query 分发到包含相关文档的多个分片中去执行查询;
>合并阶段(gather phase):则从众多分片中收集返回结果,然后对它们进行合并、排序、后续处理,然后返回给客户端。
该机制可以由下图描述。
5 系统部署规划
5.1 硬件规划
PS:基于生产环境使用Elasticsearch集群经验:
1、推荐配置64GB内存,不推荐主机内存大于64G;
2、推荐配置CPU cores在8以上;
3、推荐采用15k RPM磁盘,成本允许的话,配置SSD;
4、避免使用网络附加存储(NAS);
5、推荐采用10GbE网络;
6、避免集群跨越多个数据中心,避免集群跨越大的地理距离;
7、如果需要备份ES数据,需要采用并行文件系统或分布式文件系统,保证所有节点均能访问。
5.2 软件版本
PS:
1、当前使用Elasticsearch2.4.x版本,需要到官网下载Elasticsearch2.4最新版本安装部署;
2、Elasticsearch2.4.x需要jdk1.7及以上,推荐最新版本的oracle jdk 1.8,同时需要保证ES的jdk版本和传输客户端&节点客户端的jdk相同。
5.3 网络规划
5.3.1 Vlan规划
5.3.2 IP地址规划
PS:本示例为测试环境,集群中节点不在一个网段。在生产环境,推荐各节点规划在同一个网段内。
5.4 磁盘分区规划
PS:
1、2*600GB磁盘,配置raid1;
2、1.2T磁盘配置为raid5,挂载到/data,用作Elasticsearch数据文件系统。
3、非数据节点的管理节点主机1.2T盘配置为raid5,挂载到/es_backup,用于Elasticsearch备份;
5.5 Cluster规划
PS:示例为3节点集群参数规划。
6 Elasticsearch 部署
6.1 对Java的要求
在安装Elasticsearch之前,需要确定相应版本的Elasticsearch需要的java版本。例如:Elasticsearch2.4的安装至少需要安装java 7,Elasticsearch2.4推荐采用oracle JDK 1.8.0_73以上。
Elasticsearch推荐应该始终运行最新版本的 Java 虚拟机( JVM )。Elasticsearch, 特别是 Lucene,是一个高要求的软件。Lucene 的单元测试和集成测试经常暴露出 JVM 本身的 bug。这些 bug 的范围从轻微的麻烦到严重段错误,所以,最好尽可能的使用最新版本的 JVM。
Java8 强烈优先选择于 Java 7。不再支持 Java 6。Oracle 或者 OpenJDK 是可以接受的,它们在性能和稳定性也差不多。如果应用程序是用 Java 编写并正在使用传输客户端(Transport Client)或节点客户端(Node Client),需要确保运行应用程序的 JVM 和Elasticsearch服务器的 JVM 是完全一样的。在 Elasticsearch 的几个地方,使用 Java 的本地序列化( IP 地址、异常等等)。不幸的是,Oracle 的 JVM 在几个小版本之间有修改序列化格式,从而导致奇怪的错误。这种情况很少见,但最佳实践是客户端和服务器使用相同版本 JVM。
特别的,当前oracle jdk开始收费,如果商用使用oracle jdk部署Elasticsearch,需要购买oracle jdk license。oracle jdk下载地址:
http://www.oracle.com/technetwork/java/javase/archive-139210.html
6.2 Elasticsearch下载
在安装Elasticsearch之前,需要下载Elasticsearch 2.4.x最新版本来安装部署。官网下载连接如下:
https://www.elastic.co/downloads/past-releases
产品列:选择Elasticsearch
Version列:选择Elasticsearch2.4.x最新版本
点击Download
Elasticsearch的安装包提供了四种模式:zip、tar、DEB、rpm。zip包安装部署方便,可以根据需求直接把文件解压到自定义目录中,类似tomcat的安装部署。推荐下载Elasticsearchzip包安装部署。
下载Elasticsearch zip安装包:elasticsearch-2.4.5.tar.gz
6.3 创建Elasticsearch文件系统
根据Elasticsearch磁盘分区规划,我们需要创建相应的文件系统。本示例需要在es1、es2、es3节点创建如下文件系统。各节点主机根据下列步骤创建相应文件系统:
es1(master&data):
VG Name/sd* | Size | Lv Name | Type | Mount Point | Remark |
vg00 | 558G | lvelasticsearch | xfs | /elasticsearch | 100GB |
vgdata | 3400G | lvdata | xfs | /data | 3400G |
es2(master&data):
VG Name/sd* | Size | Lv Name | Type | Mount Point | Remark |
vg00 | 558G | lvelasticsearch | xfs | /elasticsearch | 100GB |
vgdata | 3400G | lvdata | xfs | /data | 3400G |
es3(master):
VG Name/sd* | Size | Lv Name | Type | Mount Point | Remark |
vg00 | 558G | lvelasticsearch | xfs | /elasticsearch | 100GB |
vgesbak | 3400G | lves_backup | xfs | /es_backup | 3400G |
6.3.1 创建/elasticsearch
# lvcreate -L 100G -n lvelasticsearch vg00 # mkfs.xfs /dev/vg00/lvelasticsearch # mkdir /elasticsearch # echo "/dev/mapper/vg00-lvelasticsearch /elasticsearch xfs defaults 0 0" >>/etc/fstab # mount /elasticsearch |
6.3.2 创建/data
1、查看磁盘
在root用户下执行fdisk –l,检查相关的lun是否映射到了主机上
[email protected][/]# fdisk -l |grep sd ……………………………………………………………………………………….. Disk /dev/sdb: 3400GB, 214748364800 bytes Disk /dev/sdc: 214.7 GB, 214748364800 bytes ……………………………………………………………………………………….. |
2、磁盘分区
PS:大于2T磁盘采用parted工具划分分区。
[email protected][/]## parted /dev/sdb GNU Parted 2.1 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel New disk label type? gpt (parted) mkpart Partition name? []? 1 File system type? [ext2]? xfs Start? 1M End? 3400G (parted) quit Information: You may need to update /etc/fstab.
|
验证
[email protected][/]# fdisk -l |grep sd ……………………………………………………………………………………….. Disk /dev/sdb: 3400GB, 214748364800 bytes /dev/sdb1 1 26108 209712478+ 83 Linux ……………………………………………………………………………………….. |
3 创建文件系统
# mkfs.xfs /dev/sdb1 # mkdir /data # echo "/dev/sdb1 /data xfs defaults 0 0" >>/etc/fstab # mount /data |
6.3.3 创建/es_backup
PS:存储备份的节点创建,在示例的三节点集群中,备份存储在非数据节点的管理节点;
1、查看磁盘
在root用户下执行fdisk –l,检查相关的lun是否映射到了主机上
[email protected][/]# fdisk -l |grep sd ……………………………………………………………………………………….. Disk /dev/sdb: 3400GB, 214748364800 bytes Disk /dev/sdc: 214.7 GB, 214748364800 bytes ……………………………………………………………………………………….. |
2、 磁盘分区
PS:大于2T磁盘采用parted工具划分分区。
[email protected][/]## parted /dev/sdb GNU Parted 2.1 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel New disk label type? gpt (parted) mkpart Partition name? []? 1 File system type? [ext2]? xfs Start? 1M End? 3400G (parted) quit Information: You may need to update /etc/fstab.
|
验证
[email protected][/]# fdisk -l |grep sd ……………………………………………………………………………………….. Disk /dev/sdb: 3400GB, 214748364800 bytes /dev/sdb1 1 26108 209712478+ 83 Linux ……………………………………………………………………………………….. |
3、创建文件系统
# mkfs.xfs /dev/sdb1 # mkdir /es_backup # echo "/dev/sdb1 /es_backup xfs defaults 0 0" >>/etc/fstab # mount /es_backup |
6.4 创建Elasticsearch用户及组
# groupadd -g 525 elasticsearch # useradd -u 525 -g elasticsearch -d /elasticsearch elasticsearch useradd: warning: the home directory already exists. Not copying any file from skel directory into it. # chown -R elasticsearch:elasticsearch /elasticsearch # passwd elasticsearch Changing password for user elasticsearch. New password: BAD PASSWORD: it is based on a dictionary word BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully. # # chown -R elasticsearch:elasticsearch /data # chown -R elasticsearch:elasticsearch /es_backup |
PS:用户口令推荐至少8个字符,包括大写字母,小写字母、数字、特殊字符。
6.5 配置用户环境变量
使用elasticsearch用户,编辑/elasticsearch/.bash_profile,添加如下内容
$ vi /elasticsearch/.bash_profile
export ES_HOME=$HOME/elasticsearch-2.4.5 export JAVA_HOME=/usr/local/jdk1.8.0_112 export JRE_HOME=/usr/local/jdk1.8.0_112/jre export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$ES_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$ES_HOME/bin:$PATH export ES_HEAP_SIZE=31g export [email protected]`hostname`['$PWD']$ |
PS:红色部分为一行。
6.6 刷新用户环境变量
$ . ~/.bash_profile |
6.7 上传Elasticsearch介质
使用elasticsearch用户,将elasticsearch相关介质以bin模式上传到对应目录
/elasticsearch/elasticsearch-2.4.5.tar.gz |
6.8 解压安装介质
使用elasticsearch用户解压安装介质
$ cd /elasticsearch $ tar -xvf elasticsearch-2.4.5.tar.gz |
6.9 Elasticsearch目录结构说明
Elasticsearch | Remark |
bin | 运行ElasticSearch实例和管理插件的一些脚本 |
config | 放置两个配置文件:elasticsearch.yml和logging.yml |
lib | ElasticSearch使用的依赖包 |
modules | 模块 |
当启动elasticsearch,lasticsearch还会创建以下文件夹:
Elasticsearch | Remark |
data | ElasticSearch存放数据的地方,如果配置了数据多路径,则会创建多个目录 |
logs | 日志的文件夹 |
plugins | 已经安装的插件的存放位置 |
work | 一些临时文件 |
6.10 配置参数说明
Elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml:
- elasticsearch.yml:Elasticsearch的基本配置文件;
- logging.yml:Elasticsearch的日志配置文件。Elasticsearch也是使用log4j来记录日志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了。
Elasticsearch的配置主要涉及elasticsearch.yml文件配置,logging.yml采用默认配置即可,下面将对elasticsearch.yml配置项进行说明。
6.10.1 Cluster(集群)
- cluster.name
集群名称,默认是elasticsearch。es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。特别的,需要为业务配置唯一的集群名,避免elasticsearch启动后,误添加到别的集群的情况。根据生产和测试等环境的不同,添加production和test字段。例如集群名:dms-production。
6.10.2 Node(节点)
- node.name
节点名,默认随机指定一个name列表中名字,该列表在Elasticsearch的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。你可能会觉得这很有趣,但是当凌晨3 点钟的时候,你还在尝试回忆哪台物理机是 Tagak the Leopard Lord 的时候,你就不觉得有趣了。更重要的是,这些名字是在启动的时候产生的,每次启动节点,它都会得到一个新的名字。这会使日志变得很混乱,因为所有节点的名称都是不断变化的。建议给每个节点设置一个有意义的、清楚的、描述性的名字。例如节点名:dms-data-005。
- node.master
指定该节点是否有资格被选举成为master node,默认为true,Elasticsearch是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
- node.data
指定该节点是否存储索引数据,默认为true。
配置示例:
1、将节点设置为主节点并保存索引数据:
node.master: true
node.data: true
2、将节点配置为主节点,不保存任何数据。(用作集群的“协调者”)。
node.master:true
node.data: false
3、将节点永不配置成主节点,并不保存索引数据。(用做“搜索平衡器”)
node.master: false
node.data: false
6.10.3 Index(索引)
- index.number_of_shards
设置默认索引分片个数,默认为5片。
- index.number_of_replicas
设置默认索引副本个数,默认为1个副本。
这两个属性的设置直接影响集群中索引和搜索操作执行。假你有足够机器来持有分片和副本,那么可以按如下规则设置这两个值:
1、拥有更多的分片可以提升索引执行能力,并允许通过机器分发一个大型的索引;
2、拥有更多的副本能够提升搜索执行能力以及集群能力。
对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。
6.10.4 Paths(路径)
- path.conf
设置配置文件的存储路径,默认是Elasticsearch根目录下的config文件夹。
path.conf: /path/to/conf
示例:
示例:/etc/elasticsearch
- path.data
设置索引数据的存储路径,默认是Elasticsearch根目录下的data文件夹,可以设置多个存储路径,用逗号隔开。对于配置多个数据路径的情况,Elasticsearch将把一个分片数据都放到一个数据路径下来保证最小程度的数据丢失。
path.data: /path/to/data1, /path/to/data2
示例:
path.data: /mnt/first,/mnt/second
or
path.data: ["/mnt/first","/mnt/second"]
- path.work
设置临时文件的存储路径,默认是Elasticsearch根目录下的work文件夹。
path.work: /path/to/work
- path.logs
设置日志文件的存储路径,默认是Elasticsearch根目录下的logs文件夹。
path.logs: /path/to/logs
- path.repo
设置Elasticsearch备份所用的仓库路径,默认配置为空,需要根据实际情况配置。
path.repo: /es_backup
6.10.5 Plugin(插件)
- path.plugins
设置插件的存放路径,默认是Elasticsearch根目录下的plugins文件夹。
6.10.6 Memory(内存)
- bootstrap.mlockall
设置为true来锁住内存。因为当jvm开始swapping时Elasticsearch的效率会降低,所以要保证它不swap,可以把ES_MIN_MEM和 ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给Elasticsearch。同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。推荐配置:
bootstrap.mlockall: true
Elasticsearch最小堆大小和最大堆大小的默认值分别为-Xms 256mb和-Xmx 1gb。Elasticsearch可以通过在启动进程的时候设置堆内存大小,例如:
./bin/elasticsearch -Xmx10g -Xms10g
也可以通过在用户环境变量中设置ES_HEAP_SIZE参数来配置堆内存大小,例如:
exportES_HEAP_SIZE=31g
确保堆内存最小值( Xms )与最大值( Xmx )的大小是相同的,防止程序在运行时改变堆内存大小, 这是一个很耗系统资源的过程。通常来说,设置 ES_HEAP_SIZE 环境变量,比直接写 -Xmx -Xms 更好一点。
一般Elasticsearch节点配置64G物理内存,推荐把 50% 的可用内存作为 Elasticsearch 的堆内存。同时需要注意,不要分配超过32G的内存给堆内存,因为 JVM 在内存小于 32 GB 的时候会采用一个内存对象指针压缩技术,可以提升性能,设置大于32G则使用不上该性能,反而导致性能下降。意思就是说:即便你有足够的内存,也尽量不要分配超过 32 GB给JVM,因为它浪费了内存,降低了CPU性能,降低Elasticsearch性能。
因为centos7系统默认能让进程锁住的内存为64k,需要通过修改limit才实现进程能锁住大于64k的内存,配置方法参见limit配置章节。
6.10.7 Network And HTTP(网络和HTTP)
- network.bind_host
设置绑定的ip地址,可以是ipv4或ipv6的,默认情况下,ElasticSearch使用0.0.0.0地址,并为http传输开启9200端口,为节点到节点的通信开启9300端口,可以自行设置IP地址
- network.publish_host
设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
- network.host
这个参数是用来同时设置bind_host和publish_host上面两个参数。
- transport.tcp.port
设置节点间交互的tcp端口,默认是9300。为了安全,推荐设置为自定义端口。
- transport.tcp.compress
设置是否压缩tcp传输时的数据,默认为false,不压缩。推荐设置为true,节省带宽。
- http.port
设置对外服务的http端口,默认为9200
- http.max_content_length
设置内容的最大容量,默认100mb。
- http.enabled
是否使用http协议对外提供服务,默认为true,开启。
6.10.8 Gateway(网关)
- gateway.type
gateway的类型,默认为local,即为本地文件系统(推荐),可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器。
- gateway.recover_after_nodes
设置集群中N个节点启动时进行数据恢复,默认为1。
这将阻止Elasticsearch 在存在至少N个节点(数据节点或者 master 节点)之前进行数据恢复。 这个值的设定取决于个人喜好:整个集群提供服务之前你希望有多少个节点在线。如果设置为 8,这意味着至少要有8个节点,该集群才可用。
- gateway.recover_after_time
设置初始化数据恢复进程的超时时间,默认是5分钟。
- gateway.expected_nodes
设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。
例如:
gateway.recover_after_nodes: 8
gateway.expected_nodes: 10
gateway.recover_after_time: 5m
这意味着Elasticsearch 会采取如下操作:
(1)等待集群至少存在 8 个节点;
(2)等待 5 分钟,或者10 个节点上线后,才进行数据恢复,这取决于哪个条件先达到。
这三个设置可以在集群重启的时候避免过多的分片交换。这可能会让数据恢复从数个小时缩短为几秒钟。
注意:这些配置只能设置在config/elasticsearch.yml 文件中或者是在命令行里(它们不能动态更新)它们只在整个集群重启的时候有实质性作用。
6.10.9 Recovery Throttling(恢复限制)
- cluster.routing.allocation.node_initial_primaries_recoveries
初始化数据恢复时,并发恢复线程的个数,默认为4。
- cluster.routing.allocation.node_concurrent_recoveries
添加删除节点或负载均衡时并发恢复线程的个数,默认为4。
- indices.recovery.max_size_per_sec
设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。
- indices.recovery.concurrent_streams
设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。
6.10.10 Discovery(发现集群)
- discovery.zen.minimum_master_nodes
设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)。minimum_master_nodes 设定对集群的稳定极其重要,有助于防止脑裂。
如果集群发生了脑裂,那么集群就会处在丢失数据的危险中,因为主节点被认为是这个集群的最高统治者,它决定了什么时候新的索引可以创建,分片是如何移动的等等。
如果你有两个masters 节点,你的数据的完整性将得不到保证,因为你有两个节点认为他们有集群的控制权。这个配置就是告诉 Elasticsearch 当没有足够 master 候选节点的时候,就不要进行 master 节点选举,等 master 候选节点足够了才进行选举。此设置应该始终被配置为 master 候选节点的法定个数(大多数个)。法定个数就是:
(master 候选节点个数 / 2) +1 。
- discovery.zen.ping.timeout
设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。
- discovery.zen.ping.multicast.enabled
设置是否打开多播发现节点,默认是true。
虽然组播仍然作为插件提供,但它应该永远不被使用在生产环境,否则得到的结果就是一个节点意外的加入到了你的生产环境,仅仅是因为他们收到了一个错误的组播信号。
- discovery.zen.ping.unicast.hosts
设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
使用单播,可以为Elasticsearch 提供一些它应该去尝试连接的节点列表。当一个节点联系到单播列表中的成员时,它就会得到整个集群所有节点的状态,然后它会联系 master 节点,并加入集群。这意味着单播列表不需要包含你的集群中的所有节点,它只是需要足够的节点,当一个新节点联系上其中一个并且说上话就可以了。如果你使用 master 候选节点作为单播列表,只要列出三个就可以了。
6.10.11 Slow Log(慢日志)
下面是一些查询时的慢日志参数设置
index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn:10s
index.search.slowlog.threshold.query.info:5s
index.search.slowlog.threshold.query.debug:2s
index.search.slowlog.threshold.query.trace:500ms
index.search.slowlog.threshold.fetch.warn:1s
index.search.slowlog.threshold.fetch.info:800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace:200ms
6.10.12 Supplemental index settings(补充索引设置)
- index.compound_format
索引的文件格式是否使用混合模式,如果没有设置,由实际使用的存储来控制,因为当使用文件系统来存储的时候,使用混合模式的索引格式,可以用来减少打开文件的句柄数,默认设置为false。保证更好的性能(当使用文件系统的索引存储确实非常合适,不过需要调整最大打开文件数。)
- index.term_index_interval
用更多内存,访问词的速度就会提高,默认值为128。
- index.term_index_divisor
那些词会被二次抽样加载到内存,使用效果和 index.term_index_interval 一样,只不过后者的设置必须在索引之前进行设置,而这个可以是按读或搜索来分别进行设置,当设置为N,那么索引里面的N*termIndexInterval个词则会加载到内存,当设置的值>1,可以减少内存的使用,默认是1,设置为-1将直接跳过索引中词的加载。
- index.refresh_interval
用来控制多长时间进行一次刷新操作,默认为1s,可以设置为 -1 来禁用刷新。
如果搜索结果不需要近实时的准确度,考虑把每个索引的 index.refresh_interval 改到 30s。
如果在做大批量导入,导入期间你可以通过设置这个值为 -1 关掉刷新。别忘记在完工的时候重新开启它。
6.10.13 Other(其他)
- action.destructive_requires_name
这个设置使删除只限于特定名称指向的数据, 而不允许通过指定 _all 或通配符来删除指定索引库。推荐设置为true。
6.10.14 注意事项
Elasticsearch参数配置的时候需要注意,冒号和逗号后面必须接一个空格,否则参数设置失败,Elasticsearch启动的时候也会报参数设置有误。
例如:
6.11 Elasticsearch参数配置
6.11.1 es1主机参数配置
采用elasticsearch用户编辑elasticsearch.yml文件,添加如下配置:
cluster.name: cl-dms-production node.name: es1 node.master: true node.data: true index.number_of_shards: 2 index.number_of_replicas: 1 path.data: /data path.repo: /es_backup #需要挂载仓库文件系统后再配置path.repo参数 bootstrap.memory_lock: true network.bind_host: 10.45.66.204 network.publish_host: 10.45.66.204 network.host: 10.45.66.204 transport.tcp.port: 19300 http.port: 19200 discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.timeout: 40s discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["10.45.66.204", "10.45.66.205", "10.45.81.58"] action.destructive_requires_name: true |
6.11.2 es2主机参数配置
cluster.name: cl-dms-production node.name: es2 node.master: true node.data: true index.number_of_shards: 2 index.number_of_replicas: 1 path.data: /data path.repo: /es_backup #需要挂载仓库文件系统后再配置path.repo参数 bootstrap.memory_lock: true network.bind_host: 10.45.66.205 network.publish_host: 10.45.66.205 network.host: 10.45.66.205 transport.tcp.port: 19300 http.port: 19200 discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.timeout: 40s discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["10.45.66.204", "10.45.66.205", "10.45.81.58"] action.destructive_requires_name: true |
6.11.3 es3主机参数配置
cluster.name: cl-dms-production node.name: es3 node.master: true node.data: false index.number_of_shards: 2 index.number_of_replicas: 1 path.repo: /es_backup #需要挂载仓库文件系统后再配置path.repo参数 bootstrap.memory_lock: true network.bind_host: 10.45.81.58 network.publish_host: 10.45.81.58 network.host: 10.45.81.58 transport.tcp.port: 19300 http.port: 19200 discovery.zen.minimum_master_nodes: 2 discovery.zen.ping.timeout: 40s discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["10.45.66.204", "10.45.66.205", "10.45.81.58"] action.destructive_requires_name: true |
6.12 Elasticsearch的启停
PS:Elasticsearch的启停等操作不能使用root用户操作,否则会存在异常问题,推荐采用elasticsearch用户维护Elasticsearch。
6.12.1 Elasticsearch的启动
PS:集群的启动即节点的启动,根据参数的设置,节点的启动个数到达参数值,集群即可对外提供服务。默认第一个具有master权限的节点启动后,被集群设置为当前的master节点。
1、es1主机Elasticsearch的启动
$ cd /elasticsearch/elasticsearch-2.4.5/bin $ ./elasticsearch -p /elsearch/elasticsearch-2.4.5/logs/elasticsearch-pid -d |
PS:
(1)启动参数-p/elasticsearch/elasticsearch-2.4.5/logs/elasticsearch-pid,把Elasticsearch进程号记录到/elsearch/elasticsearch-2.4.5/logs/elasticsearch-pid中,方便进程的维护;
(2)参数-d标识挂到后台执行。
2、es2主机Elasticsearch的启动
$ cd /elasticsearch/elasticsearch-2.4.5/bin $ ./elasticsearch -p /elsearch/elasticsearch-2.4.5/logs/elasticsearch-pid -d |
3、es3主机Elasticsearch的启动
$ cd /elasticsearch/elasticsearch-2.4.5/bin $ ./elasticsearch -p /elsearch/elasticsearch-2.4.5/logs/elasticsearch-pid -d |
6.12.2 查看集群状态
1、查看集群监控情况
[email protected][/]$ curl -XGET 'http://10.45.66.204:19200/_cluster/health?pretty' { "cluster_name" : "cl-dms-production", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 2, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 } |
PS:链接到集群任何一个节点均能查看到集群的监控情况。
2、查看集群节点情况
[email protected][/]$ curl 'http://10.45.66.204:19200/_cat/nodes?v' host ip heap.percent ram.percent load node.role master name 10.45.66.204 10.45.66.204 9 52 0.00 d * es1 10.45.66.205 10.45.66.205 8 48 0.00 d m es2 10.45.81.58 10.45.81.58 4 45 0.03 - m es3 |
6.12.3 Elasticsearch的停止
Elasticsearch的停止即节点的停止,通过停止全部节点即停止集群。下面给出es1节点进程的停止方法。
1、查看当前集群节点进程号
[email protected][/]$ jps |grep Elasticsearch 92936 Elasticsearch |
92936即为当前节点Elasticsearch进程的进程号。同样的可以通过ps命令查看Elasticsearch进程的进程号
[email protected][/]$ ps -ef |grep elasticsearch root 92337 90780 0 18:22 pts/0 00:00:00 su - elasticsearch elastic+ 92936 1 0 18:36 pts/1 00:00:31 /usr/local/jdk1.8.0_112/bin/java -Xms2g -Xmx2g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true -Des.path.home=/elasticsearch/elasticsearch-2.4.5 -cp /elasticsearch/elasticsearch-2.4.5/lib/elasticsearch-2.4.5.jar:/elasticsearch/elasticsearch-2.4.5/lib/* org.elasticsearch.bootstrap.Elasticsearch start -d elastic+ 94557 92338 0 19:32 pts/0 00:00:00 grep --color=auto elasticsearch |
2、停止es1节点Elasticsearch进程
[email protected][/]$ kill -SIGTERM 92936 [email protected][/]$ ps -ef |grep elasticsearch root 92337 90780 0 18:22 pts/0 00:00:00 su - elasticsearch root 92856 92746 0 18:35 pts/1 00:00:00 su - elasticsearch elastic+ 94581 92338 0 19:33 pts/0 00:00:00 grep --color=auto elasticsearch |
PS:如果kill -SIGTERM无法停止,可以采用kill -9 pid模式停止Elasticsearch进程。
3、同理停止es2和es3节点Elasticsearch进程
[email protected][/elasticsearch]$ jps |grep Elasticsearch 96589 Elasticsearch [email protected][/elasticsearch]$ kill -SIGTERM 96589 [email protected][/elasticsearch]$ [email protected][/elasticsearch]$ jps |grep Elasticsearch [email protected][/elasticsearch]$
[email protected][/elasticsearch]$ jps |grep Elasticsearch 30532 Elasticsearch [email protected][/elasticsearch]$ kill -SIGTERM 30532 [email protected][/elasticsearch]$ [email protected][/elasticsearch]$ jps |grep Elasticsearch [email protected][/elasticsearch]$ |