ElasticSearch简介
Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析也可以认为它是一个面向文档型数据库,它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写
特点:
实时(近实时)
分布式
面向文档
高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)。
接口友好(RESTful)
官方网站 : https://www.elastic.co/cn/
参考手册: https://www.elastic.co/guide/ [英文最新版本]
中文社区: https://elasticsearch.cn/
中文文档: https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html [ElasticSearch 2.0]
什么是Lucene?
-
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,是最先进、高性能、全功能的搜索引擎库,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎.
-
Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API
-
Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确的形容:
-
一个分布式的实时文档存储,每个字段 可以被索引与搜索
-
一个分布式实时分析搜索引擎
-
能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
-
ElasticSearch 基本概念
- 正排索引
对文档进行排序,然后搜索需要的内容 - 倒排索引
对正排索引的文档进行分词,分成不重复的索引列表,然后计算每个分词在正排索引的每个key(id)中出现次数- 关系型数据库通过增加一个 索引 比如一个 唯一索引 到指定的列上,以便提升数据检索速度。Elasticsearch 和 Lucene 使用了一个叫做 倒排索引 的结构来达到相同的目的,快速的全文搜索
- 倒排索引过程
- 节点
一个运行中的 Elasticsearch 实例称为一个节点 - 空集群
启动了一个单独的节点,里面不包含任何的数据和索引,包含空内容节点的集群 - 集群
集群是一个或多个运行elasticsearch实例的集合,它们共同保存整个数据,它们共同承担数据和负载的压力,并提供跨所有节点的联合索引和搜索功能。当一个节点被选举成为 主 节点时, 它将负责管理集群范围内的所有变更。主节点并不需要涉及到文档级别的变更和搜索等操作,所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。- 集群的三个状态
创建一个的索引之后,或者集群有问题时,集群会呈现三个健康状态 - 三种状态的含义
- green
所有的主分片和副本分片都正常运行 - yellow
所有的主分片都正常运行,但不是所有的副本分片都正常运行 - red
有部分主分片没能正常运行
- green
- 集群状态查看
url -s 192.168.0.1:9200/_cluster/health?pretty
- 作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的
- 集群的三个状态
- 分片
一个 分片 是一个底层的 工作单元 ,它仅保存了全部数据中的一部分,一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎。 我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量 - 副本
一个副本分片只是一个主分片的拷贝。副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务,提升吞吐量和性能 - 索引
保存相关数据的地方。 索引实际上是指向一个或者多个物理 分片 的 逻辑命名空间
ElasticSearch部署及配置
下载
-
版本下载:https://www.elastic.co/cn/start
-
在线文档:https://www.elastic.co/guide/index.html
-
本次版本:
- elasticsearch-6.8.0.tar.gz
安装
- 安装前环境设置
- 创建用于启动ElasticSearch的普通用户
- JAVA的家目录配置到环境变量或ES的启动脚本中
- 更改文件描述符限制
vim /etc/security/limits.conf
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536
- 非root用户的最大进程数
vim /etc/security/limits.d/20-nproc.conf
删除 非root 开始的一行,或者修改为:
user soft nproc unlimited
- 设置虚拟内存
vim /etc/sysctl.conf
vm.max_map_count=262144
- 禁用swap或少用swap
内存使用到多少开始使用swap?
vm.swappiness 由这个内核参数控制
/proc/sys/vm/swappiness 这个是可以直接修改立即生效
这个交换参数控制内核从物理内存移出数据移到交换空间。
该参数从0到100
当该参数为 0:表示只要有可能就尽力避免交换进程移出物理内存
当该参数为 100:这告诉内核疯狂的将数据移出物理内存移到swap缓存中
设置 vm.swappiness=0 并不代表禁用swap分区,只是告诉内核,能少用到swap分区就尽量少用到
设置 vm.swappiness=100 则表示尽量使用swap分区
默认的值是 vm.swappiness=60
调整内存参数,当内存使用率不足10%(开始是默认值60)时在使用swap,尽量避免使用swap,减少唤醒软中断进程,从而降低ksoftirqd进程对cpu的占用
- 安装方式
- rpm 包安装----忽略
- tar包安装【开箱即用】
-
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.0.tar.gz
-
tar -xzf elasticsearch-6.8.0.tar.gz
-
mkdir /data/es6 –p # 非必要,创建后需要修改配置文件 config/elasticsearch.yml
-
mkdir /data/logs/es6 –p # 非必要,创建后需要修改配置文件 config/elasticsearch.yml
-
chown -R elasticsearch:elasticsearch /data # 非必要, 创建后需要修改为ES启动用户的权限
-
chown -R elasticsearch:elasticsearch /opt/elasticsearch-6.8.0
-
su - elasticsearch -s /bin/bash -c ‘/opt/elasticsearch-6.8.0/bin/elasticsearch -d’
-
问题总结
问题1
JavaHotSpot(TM) 64-Bit Server VM warning: INFO: error='Cannotallocate memory' (errno=12)
解决:
在测试时常遇到,内存不足,更改config目录下的jvm.options,默认为2g
为题2
max virtual memory areas vm.max_map_count [65530]is too low, increase to at least [262144]
解决:
max_map_count 文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量,系统默认是65530,修改成262144。
解决方法是修改/etc/sysctl.conf配置文件,添加vm.max_map_count=262144
原因:最大虚拟内存太小
解决方案:
切换到root用户下,修改配置文件sysctl.conf
sudo vim /etc/sysctl.conf
添加下面配置:
vm.max_map_count=65536
并执行命令:
sysctl -p
问题3
max file descriptors [65535] for elasticsearchprocess is too low, increase to at least [65536]
解决:
最大文件描述符,设置其大于65536即可
解决方法:
切换到root用户下,修改/etc/security/limits.conf文件
将数字修改为65536
问题4
解决:
原因
无法创建本地线程问题,用户最大可创建线程数太小
解决方案
切换到root用户,进入limits.d目录下,修改90-nproc.conf 配置文件
sudo vim /etc/security/limits.d/90-nproc.conf
找到如下内容:
* soft nproc 1024
修改为
* soft nproc 65536
问题5
uncaught exception in thread [main]. org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
解决:
使用普通用户启动,不能以root用户启动
解决方案:
切换到普通用或es启动的用户
su - esuser
进入到elasticsearch的安装目录的bin下
./elasticsearch -d
问题6
ERROR: bootstrap checks failed. memory locking requested for elasticsearch process but memory is not locked
解决:
原因:锁定内存失败
解决办法
sudo vim /etc/security/limits.conf
添加如下内容:
* soft memlock unlimited
* hard memlock unlimited
临时取消限制
ulimit -l unlimited
简单配置
cluster.name:elasticsearch #集群的名称,同一个集群该值必须设置成相同的
node.name:"es-node1" #该节点的名字
node.master:true #该节点有机会成为master节点
node.data:true #该节点可以存储数据
index.number_of_shards:5 #shard的数目 默认为5个,可以不用设置
index.number_of_replicas:3 #数据副本的数目 默认为1个,根据需要进行配置,可以不配置
network.bind_host:0.0.0.0 #设置绑定的IP地址,可以是IPV4或者IPV6
network.publish_host:10.0.0.209 #设置其他节点与该节点交互的IP地址
network.host:10.0.0.209 #该参数用于同时设置bind_host和publish_host
transport.tcp.port:9300 #设置节点之间交互的端口号
transport.tcp.compress:true #设置是否压缩tcp上交互传输的数据
http.port:9200 #设置对外服务的http端口号
http.max_content_length:100mb
#设置http内容的最大大小[非必要]
http.enabled:true
#是否开启http服务对外提供服务
discovery.zen.minimum_master_nodes:2
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)【计算方法:node.master这个配置为true的节点个数/2 +1】
discovery.zen.ping.timeout:120s
#设置集群中自动发现其他节点时ping连接的超时时间
discovery.zen.ping.multicast.enabled:true
#设置是否打开多播发现节点
discovery.zen.ping.unicast.hosts:["10.0.0.209:9300","10.0.0.206:9300","10.0.0.208:9300"]
path.logs: /mnt/proxy/elasticsearch02/logs
#日志存放路径
path.data: /mnt/proxy/elasticsearch02/data
# 若为数据节点即node.data:true,则配置为数据存放路径。若node.data:false,则不必配置,多个数据路径可以使用逗号分隔开
http basic 配置
- 将以下配置添加到elasticsearch.yml中
http.basic.enabled: true
http.basic.user: "klpeng"
http.basic.password: "www.ligphp.com"
http.basic.ipwhitelist:["localhost", "127.0.0.1"]
http.basic.log: false
- 对应配置项和注释