分布式全文检索引擎Elasticsearch与实践踩坑系列

Posted 互联网技术萌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式全文检索引擎Elasticsearch与实践踩坑系列相关的知识,希望对你有一定的参考价值。


念在天涯,心在咫尺

全文检索、分词中文语义对媒体单位来说有着特殊重要意义。

年前对大约1T(3亿条)日志做全文检索压力测试,Elasticsearch看起来很火爆,又有很多产品使用Facebook、github、stackoverflow),值得一试。把以往实践过程中整理了不少资料以及踩过的坑,整理做个系列。

Elasticsearch是一个基于Lucene构建的开源、分布式、RESTful的搜索引擎,能够实现近实时(NRT)搜索,稳定、可靠、安装方便。性能不错、水平扩展、文档齐全、社区火爆,这几点很重要。

如果之前已经了解过分布式存储系统、query切词、检索相关性策略,Elasticsearch的使用学习起来会很快。

1 基础概念

Elasticsearch是一个近实时的系统,从你写入数据到数据可以被检索到,一般会有1秒钟的延时。Elasticsearch是基于Lucene的,Lucene的读写是两个分开的句柄,往写句柄写入的数据刷新之后,读句柄重新打开,这才能读到新写入的数据。

名词解释:

Cluster:集群。

Index:索引,Index相当于关系型数据库的DataBase。

Type:类型,这是索引下的逻辑划分,一般把有共性的文档放到一个类型里面,相当于关系型数据库的table。

Document:文档,Json结构,这点跟MongoDB差不多。

Shard、Replica:分片,副本。

分片有两个好处,一个是可以水平扩展,另一个是可以并发提高性能。在网络环境下,可能会有各种导致分片无法正常工作的问题,所以需要有失败预案。ES支持把分片拷贝出一份或者多份,称为副本分片,简称副本。副本有两个好处,一个是实现高可用(HA,High Availability),另一个是利用副本提高并发检索性能。

分片和副本的数量可以在创建index的时候指定,index创建之后,只能修改副本数量,不能修改分片


2 搭建ElasticSearch

1.安装JDK

Elasticsearch是基于Java开发是一个Java程序,运行在Jvm中,所以第一步要安装JDK

yum install -y java-1.8.0-openjdk-devel

2.下载elasticsearch

https://artifacts.elastic.co/downloads/elasticsearch/ 是ELasticsearch的官方站点,如果需要下载最新的版本,进入官网下载即可。可以下载到本地电脑然后再导入CentOS中,也可以直接在CentOS中下载。

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.0.1.rpm

3.配置目录

安装完毕后会生成很多文件,包括配置文件日志文件等等,下面几个是最主要的配置文件路径

/etc/elasticsearch/elasticsearch.yml                            # els的配置文件/etc/elasticsearch/jvm.options                       # JVM相关的配置,内存大小等等/etc/elasticsearch/log4j2.properties     # 日志系统定义/var/lib/elasticsearch                               # 数据的默认存放位置

4.创建用于存放数据与日志的目录

数据文件会随着系统的运行飞速增长,所以默认的日志文件与数据文件的路径未来可能不能满足我们的需求,那么手动创建日志与数据文件路径,可以使用NFS、可以使用Raid等等方便以后的管理与扩展

mkdir /els/{log,date}chown -R elasticsearch.elasticsearch /els/*

5.集群配置

vim /etc/elasticsearch cluster.name: aubin-cluster                                      # 集群名称node.name: els1                                         # 节点名称,仅仅是描述名称,用于在日志中区分path.data: /var/lib/elasticsearch                           
# 数据的默认存放路径path.logs: /var/log/elasticsearch               # 日志的默认存放路径network.host: 192.168.0.1                       # 当前节点的IP地址http.port: 9200                                   # 对外提供服务的端口,9300为集群服务的端口discovery.zen.ping.unicast.hosts: ["172.18.68.11", "172.18.68.12","172.18.68.13"]       # 集群个节点IP地址,也可以使用els、els.shuaiguoxia.com等名称,需要各节点能够解析discovery.zen.minimum_master_nodes: 2                     # 为了避免脑裂,集群节点数最少为 半数+1

6.JVM配置

由于Elasticsearch是Java开发的,所以可以通过/etc/elasticsearch/jvm.options配置文件来设定JVM的相关设定。如果没有特殊需求按默认即可。
不过其中还是有两项最重要的
-Xmx1g-Xms1gJVM的最大最小内存。如果太小会导致Elasticsearch刚刚启动就立刻停止。太大会拖慢系统本身

vim /etc/elasticsearch/jvm.options-Xms1g                         # JVM最大、最小使用内存-Xmx1g

7.启动Elasticsearch

由于启动Elasticsearch会自动启动daemon-reload所以最后一项可以省略。

systemctl enable elasticsearch.service systemctl start elasticsearch systemctl daemon-reload                                 # 可以省略


一波坑30秒后到达战场
分布式全文检索引擎Elasticsearch与实践踩坑系列(一)
 

1

java.io.FileNotFoundException: /usr/elasticsearch/logs/elasticsearch.log (Permission denied) 方案:将ElasticSearch的安装目录及其子目录改为另外一个非root账户,如:sudo chown -R guest elasticsearch5.0.1

2

ERROR: bootstrap checks failed

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536] 
max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]

解决:切换到root用户,编辑limits.conf 添加类似如下内容

vi /etc/security/limits.conf


3


问题三:max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

解决:切换到root用户,进入limits.d目录下修改配置文件。

vi /etc/security/limits.d/90-nproc.conf

修改如下内容:soft nproc 1024

修改为:soft nproc 2048








以上是关于分布式全文检索引擎Elasticsearch与实践踩坑系列的主要内容,如果未能解决你的问题,请参考以下文章

滴滴Elasticsearch多集群架构实践

分布式全文检索引擎之ElasticSearch

搜索引擎:Elasticsearch与Solr

分布式全文检索引擎之ElasticSearch

搜索引擎选择: Elasticsearch与Solr

搜索引擎选择: Elasticsearch与Solr