Elasticsearch的使用

随着公司业务的增长,我们渐渐积累了很多的业务数据,其中包括应用程序的日志和业务相关的日志,在此之前,我们通常都是将日志定时打包然后同步到一台磁盘够大的机器,也或者直接推给数据平台使用Hadoop集群算一些统计数据。然后有时候我们的业务需要实时地去查找一些日志,或者实时地统计一些数据。所以在已有的hadoop集群下,我们搭建了一个Elasticsearch集群,来存储关键日志并提供搜索查询。

Elasticsearch(以下简称ES)底层是基于Lucene,在搜索领域已经很长时间了,包括常用的Solr搜索引擎,也是建立的lucene上的。

对于应用程序来讲只需要考虑ES怎么使用就可以了,ES服务对外提供HTTP接口和Java接口,所以不管应用是什么开发的,一般都可以通过ES提供的HTTP接口来完成所有操作,而且ES的接口非常简单(当然有些用法比较绕),使用起来很方便,这篇文章主要讲ES的集群的搭建和分片、副本的分配以及在实际项目中的一些实用技巧。

ES中最主要的是索引(Index),相当于我们的一个DB,一个索引可以分配到不同的分片上,每个分片又可以有多个副本,通过把索引这样分配到不同的分片,就可以将一个很大的索引分割成一个个小的索引,而且分片是可以分配到集群中不同的机器上的,所以这样分配,一个大的索引可以使用多个服务器资源,达到性能提升,降低索引在单机上的压力。

而分片和副本是如何分配呢?可以通过我在实际操作中的一些经验简单的记录下。(以下部分数据是参考值/预估值,跟最终跑在线上的有部分出入,而且公司的一些数据不宜公开,所以做了一定处理)

我们的ES集群重要提供三种服务:
1、业务搜索服务。
2、日志存储和查询。
3、机器的监控数据。

因为两个业务存在一定的差别,所以需要做一下隔离,而ES正好提供node(节点)的分配,可以通过配置node的一些属性,达到资源的一部分隔离。所以我将ES集群分了两个区域, zone-search, zone-log。
提供搜索服务的索引分配在 zone-search
提供日志存储和查询的分配在 zone-log
机器的监控数据分配在 zone-search和zone-log

初期我先分析了下数据量:
1、对于搜索服务,写操作不是很大,需要读取效率高,数据量不是很大,单个索引目前一年总的数据量应该在100G以下,文档数1000万左右,所以磁盘空间不需要太大,但是需要高可用,所以每个索引需要多个副本,而且需要搜索响应快,所以尽量将索引分配在多个机器,尽量使数据对象能够都在内存中。

区域zone-search 每个节点的磁盘我分配了100G(后期可以扩展),内存32G,4核心。

2、对于日志存储和查询服务,大部分是写入操作,而且目前每天的数据量大概是5千万文档,20G数据,所以需要较大的磁盘。但是日志数据按天建索引,所以单个索引的大小并不是很大。

区域zone-log 每个节点的磁盘我分配了3T(后期可以扩展),内存16G,2核心。

3、机器的监控数据都是写本机的ES, 数据量比较小,一天可能就20M左右。每天一个索引。

最终:
zone-search区域包含3个数据节点
objects索引存放在 zone-search,索引分配为3分片,2副本。
zone:log区域包含2个数据节点
logs索引存放在 zone-log,索引分配为2分片,1副本。
monitors索引存放在 zone-search和zone-log,monitors索引分配为1分片,1副本。

而索引分配的节点可以通过在创建索引的时候更改下面参数实现:

index.routing.allocation.include.zone: zone-search
index.routing.allocation.include.zone: zone-log

index.routing.allocation.include.zone: zone-search, zone-log

另外需要在每个ES的data node中设置:
cluster.routing.allocation.awareness.attributes: zone
node.zone: zone-search

cluster.routing.allocation.awareness.attributes: zone
node.zone: zone-log

ES集群

“Elasticsearch的使用”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注