ElasticSearch功能特点
Elasticsearch不仅仅是Lucene和全文搜索, 还包括:
ElasticSearch使用场景
ElastciSearch广泛应用于各行业领域, 比如维基百科, GitHub的代码搜索,电商网站的大数据日志统计分析, BI系统报表统计分析等。
提供分布式的搜索引擎和数据分析引擎
比如百度,网站的站内搜索,IT系统的检索, 数据分析比如热点词统计, 电商网站商品TOP排名等。
全文检索,结构化检索,数据分析
支持全文检索, 比如查找包含指定名称的商品信息; 支持结构检索, 比如查找某个分类下的所有商品信息;
还可以支持高级数据分析, 比如统计某个商品的点击次数, 某个商品有多少用户购买等等。
支持海量数据准实时的处理
采用分布式节点, 将数据分散到多台服务器上去存储和检索, 实现海量数据的处理, 比如统计用户的行为日志, 能够在秒级别对数据进行检索和分析。
ElasticSearch基本概念介绍
索引(Index)
相比传统的关系型数据库,索引相当于SQL中的一个【数据库】,或者一个数据存储方案(schema)。
类型(Type)
一个索引内部可以定义一个或多个类型, 在传统关系数据库来说, 类型相当于【表】的概念。
文档(Document)
文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,采用JSON格式表示。相当于传统数据库【行】概念
集群(Cluster)
集群是由一台及以上主机节点组成并提供存储及搜索服务, 多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。
节点(Node)
Node为集群中的单台节点,其可以为master节点亦可为slave节点(节点属性由集群内部选举得出)并提供存储相关数据的功能
切片(shards)
切片是把一个大文件分割成多个小文件然后分散存储在集群中的多个节点上, 可以将其看作mysql的分库分表概念。 Shard有两种类型:primary主片和replica副本,primary用于文档存储,每个新的索引会自动创建5个Primary shard;Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。
主节点(或候选主节点)
主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作, 主节点负荷相对较轻, 客户端请求可以直接发往任何节点, 由对应节点负责分发和返回处理结果。
一个节点启动之后, 采用 Zen Discovery机制去寻找集群中的其他节点, 并与之建立连接, 集群会从候选主节点中选举出一个主节点, 并且一个集群只能选举一个主节点, 在某些情况下, 由于网络通信丢包等问题, 一个集群可能会出现多个主节点, 称为“脑裂现象”, 脑裂会存在丢失数据的可能, 因为主节点拥有最高权限, 它决定了什么时候可以创建索引, 分片如何移动等, 如果存在多个主节点, 就会产生冲突, 容易产生数据丢失。要尽量避免这个问题, 可以通过 discovery.zen.minimum_master_nodes 来设置最少可工作的候选主节点个数。 建议设置为(候选主节点/2) + 1 比如三个候选主节点,该配置项为 (3/2)+1 ,来保证集群中有半数以上的候选主节点, 没有足够的master候选节点, 就不会进行master节点选举,减少脑裂的可能。
主节点的参数设置:
node.master = true
node.data = false
数据节点
数据节点负责数据的存储和CRUD等具体操作,数据节点对机器配置要求比较高、,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统CPU、Memory和IO的性能消耗都很大。通常随着集群的扩大,需要增加更多的数据节点来提高可用性。
数据节点的参数设置:
node.master = false
node.data = true
客户端节点
客户端节点不做候选主节点, 也不做数据节点的节点,只负责请求的分发、汇总等等,增加客户端节点类型更多是为了负载均衡的处理。
node.master = false
node.data = false
提取节点(预处理节点)
能执行预处理管道,有自己独立的任务要执行, 在索引数据之前可以先对数据做预处理操作, 不负责数据存储也不负责集群相关的事务。
参数设置:
node.ingest = true
协调节点
协调节点,是一种角色,而不是真实的Elasticsearch的节点,不能通过配置项来指定哪个节点为协调节点。集群中的任何节点,都可以充当协调节点的角色。当一个节点A收到用户的查询请求后,会把查询子句分发到其它的节点,然后合并各个节点返回的查询结果,最后返回一个完整的数据集给用户。在这个过程中,节点A扮演的就是协调节点的角色。
ES的一次请求非常类似于Map-Reduce操作。在ES中对应的也是两个阶段,称之为scatter-gather。客户端发出一个请求到集群的任意一个节点,这个节点就是所谓的协调节点,它会把请求转发给含有相关数据的节点(scatter阶段),这些数据节点会在本地执行请求然后把结果返回给协调节点。协调节点将这些结果汇总(reduce)成一个单一的全局结果集(gather阶段) 。
部落节点
在多个集群之间充当联合客户端, 它是一个特殊的客户端 , 可以连接多个集群,在所有连接的集群上执行搜索和其他操作。 部落节点从所有连接的集群中检索集群状态并将其合并成全局集群状态。 掌握这一信息,就可以对所有集群中的节点执行读写操作,就好像它们是本地的。 请注意,部落节点需要能够连接到每个配置的集群中的每个单个节点。
分片处理机制
设置分片大小的时候, 需预先做好容量规划, 如果节点数过多, 分片数过小, 那么新的节点将无法分片, 不能做到水平扩展, 并且单个分片数据量太大, 导致数据重新分配耗时过大。
假设一个集群中有两个数据节点。movie索引的分片分布情况如下所示:
PUT /orders
{
"settings":{
"number_of_shards":2, //主节点
"number_of_replicas":2 //副本节点
}
}
整个集群中存在P0和P1两个主分片, P0对应的两个R0副本分片, P1对应的是两个R1副本分片。
准备三台虚拟机:
10.10.20.28: Node-1 (Elastic主节点), Kibana(可视化操作平台), elasticsearch-head(可视化管理工具)
10.10.20.29: Node-2 (Elastic数据节点)
10.10.20.30: Node-3 (Elastic数据节点)
在三台节点上, 分别安装ElasticSearch服务。
到官网下载地址下载6.8.1版本的gz压缩包, 不要下载最新版本, Spring Boot等项目可能未及时更新支持。
解压安装包
tar -xvf elasticsearch-6.8.1-linux-x86_64.tar.gz
ElasticSearch不能以Root身份运行, 需要单独创建一个用户
1. groupadd elsearch
2. useradd elsearch -g elsearch -p elasticsearch
3. chown -R elsearch:elsearch /usr/local/elasticsearch-6.8.1
执行以上命令,创建一个名为elsearch用户, 并赋予目录权限。
修改配置文件
vi config/elasticsearch.yml, 只需修改以下设置:
#集群名称
cluster.name: my-application
#节点名称
node.name: node-1
#数据存储路径
path.data: /usr/local/elasticsearch-6.8.1/data
#日志存储路径
path.logs: /usr/local/elasticsearch-6.8.1/logs
# 绑定IP地址
network.host: 10.10.20.28
# 指定服务访问端口
http.port: 9200
# 指定API端户端调用端口
transport.tcp.port: 9300
指定JDK版本
最新版的ElasticSearch需要JDK11版本, 下载JDK11压缩包, 并进行解压。
修改环境配置文件
vi bin/elasticsearch-env
参照以下位置, 追加一行, 设置JAVA_HOME, 指定JDK11路径。
JAVA_HOME=/usr/local/jdk_11
# now set the path to java
if [ ! -z "$JAVA_HOME" ]; then
JAVA="$JAVA_HOME/bin/java"
else
if [ "$(uname -s)" = "Darwin" ]; then
# OSX has a different structure
JAVA="$ES_HOME/jdk/Contents/Home/bin/java"
else
JAVA="$ES_HOME/jdk/bin/java"
fi
fi
关闭ConcMarkSweepGC
JDK9版本以后不建议使用ConcMarkSweepGC, 如果不想出现提示, 可以将其关闭
vi config/jvm.options
将UseConcMarkSweepGC注释:
## GC configuration
#-XX:+UseConcMarkSweepGC
...
## G1GC Configuration
# NOTE: G1GC is only supported on JDK version 10 or later.
# To use G1GC uncomment the lines below.
#-XX:-UseConcMarkSweepGC
...
启动ElasticSearch
切换用户
su elsearch
以后台常驻方式启动
bin/elasticsearch -d
问题记录
出现max virtual memory areas vm.max_map_count [65530] is too low, increase to at least 错误信息
修改系统配置:
vi /etc/sysctl.conf
添加
vm.max_map_count=655360
执行生效
sysctl -p
vi /etc/security/limits.conf
在文件末尾添加
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
elsearch soft nproc 125535
elsearch hard nproc 125535
重新切换用户即可:
su - elsearch
在安装好的三台节点中, 修改集群配置文件:
vi /usr/local/elasticsearch-6.8.1/config/elasticsearch.yml
10.10.20.28主节点配置内容:
# 集群名称
cluster.name: my-application
#节点名称
node.name: node-1
#数据存储路径
path.data: /usr/local/elasticsearch-6.8.1/data
#日志存储路径
path.logs: /usr/local/elasticsearch-6.8.1/logs
# 绑定IP地址
network.host: 10.10.20.28
# 指定服务访问端口
http.port: 9200
# 指定API端户端调用端口
transport.tcp.port: 9300
#是否作为主机
node.master: true
#是否作为数据节点
node.data: false
#集群通讯地址
discovery.zen.ping.unicast.hosts: ["10.10.20.28:9300", "10.10.20.29:9300","10.10.20.30:9300"]
#是否开启跨域访问,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 这里允许所有域名
http.cors.allow-origin: /.*/
10.10.20.29数据节点配置内容:
# 集群名称
cluster.name: my-application
#节点名称
node.name: node-2
#数据存储路径
path.data: /usr/local/elasticsearch-6.8.1/data
#日志存储路径
path.logs: /usr/local/elasticsearch-6.8.1/logs
# 绑定IP地址
network.host: 10.10.20.29
# 指定服务访问端口
http.port: 9200
# 指定API端户端调用端口
transport.tcp.port: 9300
#是否作为主机
node.master: false
#是否作为数据节点
node.data: true
#集群通讯地址
discovery.zen.ping.unicast.hosts: ["10.10.20.28:9300", "10.10.20.29:9300","10.10.20.30:9300"]
#是否开启跨域访问,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 这里允许所有域名
http.cors.allow-origin: /.*/
10.10.20.30数据节点配置内容:
# 集群名称
cluster.name: my-application
#节点名称
node.name: node-2
#数据存储路径
path.data: /usr/local/elasticsearch-6.8.1/data
#日志存储路径
path.logs: /usr/local/elasticsearch-6.8.1/logs
# 绑定IP地址
network.host: 10.10.20.29
# 指定服务访问端口
http.port: 9200
# 指定API端户端调用端口
transport.tcp.port: 9300
#是否作为主机
node.master: false
#是否作为数据节点
node.data: true
#集群通讯地址
discovery.zen.ping.unicast.hosts: ["10.10.20.28:9300", "10.10.20.29:9300","10.10.20.30:9300"]
#是否开启跨域访问,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 这里允许所有域名
http.cors.allow-origin: /.*/
启动集群节点
启动之前, 先把三台节点的防火墙关闭, 防止集群节点之间不能正常通讯。
# 临时关闭
systemctl stop firewalld
# 永久关闭
systemctl disable firewalld
在10.10.28.28,10.10.28.29和10.10.28.30 三台节点依次启动服务:
su elsearch
/usr/local/elasticsearch-6.8.1/bin/elasticsearch -d
注意: 启动如果出现"elasticsearch with the same id but is a different node instance"错误,
ElasticSearch是从虚拟机复制过来的话, 需要将各节点的data目录清空, 再重启服务。
集群状态查看
集群安装与启动成功之后, 执行请求: http://10.10.20.28:9200/_cat/nodes?pretty
ElastciSearch Head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。 ElastciSearch 如果是5.X以上版本, 可以直接安装最新版本使用。
下载ElastciSearch Head 源码
如果没有安装git, 执行安装:
yum -y install git
下载git仓库代码
git clone git://github.com/mobz/elasticsearch-head.git
安装组件
cd elasticsearch-head
npm install
启动服务
npm run start
如果没有npm命令, 需要安装NodeJs服务
下载Node10以上版本:
wget https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.xz
解压:
tar -xvf node-v10.13.0-linux-x64.tar.xz
创建软链接:
ln -s /usr/local/node-v10.13.0-linux-x64/bin/node /usr/bin/node
ln -s /usr/local/node-v10.13.0-linux-x64/bin/npm /usr/bin/npm
查看版本, 安装成功会正常显示:
[root@localhost local]# node -v
v10.13.0
[root@localhost local]# npm version
{ npm: '6.4.1',
ares: '1.14.0',
cldr: '33.1',
http_parser: '2.8.0',
icu: '62.1',
modules: '64',
napi: '3',
nghttp2: '1.34.0',
node: '10.13.0',
openssl: '1.1.0i',
tz: '2018e',
unicode: '11.0',
uv: '1.23.2',
v8: '6.8.275.32-node.36',
zlib: '1.2.11' }
通过ElasticSearch Head查看集群信息:
访问地址: http://10.10.20.28:9100/
输入集群主节点地址: http://10.10.20.28:9200/, 点击"连接", 可以看到三个节点的信息。
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。
到官网下载, Kibana安装包, 与之对应6.8.1版本, 选择Linux 64位版本下载,并进行解压。
Kibana启动不能使用root用户, 使用上面创建的elsearch用户, 进行赋权:
chown -R elsearch:elsearch kibana-6.8.1-linux-x86_64
修改配置文件
vi config/kibana.yml , 修改以下配置:
# 服务端口
server.port: 5601
# 服务地址
server.host: "0.0.0.0"
# elasticsearch服务地址, 填写集群所有节点地址, 之间用逗号分割
elasticsearch.hosts: ["http://10.10.20.28:9200", "http://10.10.20.29:9200", "http://10.10.20.30:9200"]
启动kibana
./kibana -q
看到以下日志, 代表启动正常
log [01:40:00.143] [info][listening] Server running at http://0.0.0.0:5601
如果出现启动失败的情况, 要检查集群各节点的日志, 确保服务正常运行状态。
进入Kibana管理后台
地址: http://10.10.20.28:5601
在Console中输入命令进行操作。
增加名为orders的索引
指定分片数为2, 副本数位2。
PUT /orders
{
"settings":{
"index":{
"number_of_shards": 2,
"number_of_replicas": 2
}
}
}
返回:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "orders"
}
查看索引设置信息
查看创建的orders索引设置信息:
GET /orders/_settings
返回:
{
"orders" : {
"settings" : {
"index" : {
"creation_date" : "1571055294856",
"number_of_shards" : "2",
"number_of_replicas" : "2",
"uuid" : "R-P8VeEMQl2X9WSVXLejpQ",
"version" : {
"created" : "6080199"
},
"provided_name" : "orders"
}
}
}
}
添加文档
指定文档ID, 添加一个用户信息:
put /orders/person/1
{
"name":"Mirson",
"mobile": "13800138000",
"address":"China"
}
返回:
{
"_index" : "orders",
"_type" : "person",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 3,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
根据ID查看文档
get /orders/person/1/_source
返回:
{
"name" : "Mirson",
"mobile" : "13800138000",
"address" : "China"
}
更新文档
全覆盖更新
put /orders/person/1
{
"name" : "Mirson_updated",
"mobile" : "13800138001"
}
返回:
{
"_index" : "orders",
"_type" : "person",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 3,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 3
}
更新指定字段
post /orders/person/1/_update
{
"doc": {
"mobile": "13800138002"
}
}
返回:
{
"_index" : "orders",
"_type" : "person",
"_id" : "1",
"_version" : 3,
"result" : "updated",
"_shards" : {
"total" : 3,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 3
}
删除文档
根据ID删除
DELETE /orders/person/1
返回:
{
"_index" : "orders",
"_type" : "person",
"_id" : "2",
"_version" : 2,
"result" : "deleted",
"_shards" : {
"total" : 3,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 4,
"_primary_term" : 3
}
根据指定条件删除文档
POST orders/_delete_by_query
{
"query": {
"match": {
"name": "Mirson2"
}
}
}
返回:
{
"took" : 258,
"timed_out" : false,
"total" : 1,
"deleted" : 1,
"batches" : 1,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until_millis" : 0,
"failures" : [ ]
}
未经本人同意, 请勿随意转载! 相逢是缘, 希望对大家有所帮助, 谢谢!
如需获取最新技术资讯或交流, 请关注: