简介

大家好,我是jackxu,es大家都听过,现在也是越来越火了,用到的公司越来越多。中文官网:https://www.elastic.co/cn/ 。

es的特点:

  • 可拓展性:大型分布式集群(数百台服务器)技术,处理PB级数据,es自动可以将海量数据分散到多台服务器上去存储和检索,进行并行查询,提高搜索效率。相对的,Lucene是单机应用。
  • 技术整合:将全文检索、数据分析、分布式相关技术整合在一起:lucene(全文检索),商用的数据分析软件(BI软件),分布式数据库(mycat)
  • 部署简单:开箱即用,很多默认配置不需关心,解压完成直接运行即可。拓展时,只需多部署几个实例即可,负载均衡、分片迁移集群内部自己实施。
  • 接口简单:使用restful api进行交互,跨语言。功能强大:Elasticsearch作为传统数据库的一个补充,提供了数据库所不不能提供的很多功能,如全文检索,同义词处理,相关度排名。
  • 近实时:数据库上亿条数据查询,搜索一次耗时几个小时,是批处理(batch-processing)。而es只需秒级即可查询海量数据,所以叫近实时。秒级。

es是基于lucene开发的,封装了许多lucene底层功能,提供简单易用的restful api接口和许多语言的客户端,如java的高级客户端(Java High Level REST Client)和底层客户端(Java Low Level REST Client)。

基本概念

近实时

  • 写入数据时,过1秒才会被搜索到,因为内部在分词、录入索引。
  • es搜索时:搜索和分析数据需要秒级出结果。

Cluster:集群

包含一个或多个启动着es实例的机器群。通常一台机器起一个es实例。同一网络下,集名一样的多个es
实例自动组成集群,自动均衡分片等行为。默认集群名为“elasticsearch”。

Node:节点

每个es实例称为一个节点。节点名自动分配,也可以手动配置。

Index:索引

包含一堆有相似结构的文档数据。索引创建规则:

  1. 仅限小写字母
  2. 不能包含\、/、 *、?、"、<、>、|、#以及空格符等特殊符号
  3. 从7.0版本开始不再包含冒号
  4. 不能以-、_或+开头
  5. 不能超过255个字节(注意它是字节,因此多字节字符将计入255个限制)

Document:文档

es中的最小数据单元。一个document就像数据库中的一条记录。通常以json格式显示。多个
document存储于一个索引(Index)中。例如:

book document
{
"book_id": "1",
"book_name": "jackxu的搭建es7.0集群教程",
"book_desc": "jackxu花费很多心思时间写的,大家一定要好好学习",
"category_id": "2",
"category_name": "java"

Field:字段

就像数据库中的列(Columns),定义每个document应该有的字段。

Type:类型

每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的
document,都有相同的fifield。7.x版本正式被去除。

ES的版本演变:

  • 在 5.X 版本中,一个 index 下可以创建多个 type;
  • 在 6.X 版本中,一个 index下只能存在一个 type;
  • 在7.X 版本中,直接去除了 type 的概念,就是说index 不再会有 type。
    那么为什么要去除 type 的概念?因为 Elasticsearch 设计初期,是直接查考了关系型数据库的设计模式,存在了 type(数据表)的概念。
    但是,其搜索引擎是基于 Lucene 的,这种 “基因”决定了 type 是多余的。Lucene 的全文检索功能之所以快,是因为倒序索引的存在。而这种倒序索引的生成是基于 index 的,而并非 type,多个type反而会减慢搜索的速度。当然这是一个很大的工程,所以es公司权衡利弊,采取逐步过渡的方式,最终推迟到 7.X 版本才将type作废。

shard:分片

index数据过大时,将index里面的数据,分为多个shard,分布式的存储在各个服务器上面。可以支持海量数据和高并发,提升性能和吞吐量,充分利用多台机器的cpu。

replica:副本

在分布式环境下,任何一台机器都会随时宕机,如果宕机,index的一个分片没有,导致此index不能搜索。所以,为了保证数据的安全,我们会将每个index的分片进行备份,存储在另外的机器上。保证少数机器宕机es集群仍可以搜索。能正常提供查询和插入的分片我们叫做主分片(primary shard),其余的我们就管他们叫做备份的分片(replica shard)。

elasticsearch核心概念 vs. 数据库核心概念

关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
数据库Database 索引Index
表Table 索引Index(原为Type)
数据行Row 文档Document
数据列Column 字段Field
约束 Schema 映射Mapping

倒排索引

倒排索引的概念是数据存储时,进行分词建立term索引库。下面是百度百科中的说明:

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。

大家看概念的话可能会抽象一点,下面我画图来讲解一下。假设有一张书籍表,现在我要对书名进行查找,比如说找出包含java的书,我们正常的写法就是:

select * from 书籍表 where name like '%java%'

这么写是没毛病的,但是当这张表有上亿条数据的时候,查询速度将是非常非常的慢。所以我们对name这一列进行分词,然后按照分词建一张辅助表,这个就是倒排索引。这时候我们在倒排索引查找java,发现记录就存在id为2和4当中,我们可以通过毫秒级就把想要搜索的数据查询出来。这张表我们可以理解为是分词与记录的mapping映射关系。

对于使用Elasticsearch进行索引时需要注意:

  • 不需要索引的字段,一定要明确定义出来,因为默认是自动建索引的
  • 同样的道理,对于String类型的字段,不需要analysis(分词)的也需要明确定义出来,因为默认也是会analysis的
  • 选择有规律的ID很重要,随机性太大的ID(比如java的UUID)不利于查询

集群搭建

首先,很多的同学在部署安装es的时候总是会出现各种各样的错误,包括可能看到网上非常多的教程却不能成功部署,而且大多数是在虚拟机中操作的,跟生产环境其实是有区别的,这里我买了三台云服务器,下面是我用这三台进行搭建的IP和端口的分配图。

第一台机器

1、新建一个es的文件夹

cd  /jackxu
mkdir es

2、下载包

这是官网的下载地址,https://www.elastic.co/cn/downloads/elasticsearch ,我这里采用的是华为镜像站的方式

wget  https://mirrors.huaweicloud.com/elasticsearch/7.9.1/elasticsearch-7.9.1-linux-x86_64.tar.gz

3、解压

tar -zxvf elasticsearch-7.9.1-linux-x86_64.tar.gz

4、指定JDK(可选)

elasticsearch是用java语言开发的,如果你的机器centOS里面已经安装了JDK就用机器的,如果没安装可以用es7.x提供的内置JDK,但是需要配置一下

vim  /jackxu/es/elasticsearch-7.9.1/bin/elasticsearch
添加以下代码
#配置ES自带的jdk
export JAVA_HOME=/jackxu/es/elasticsearch-7.9.1/jdk
export PATH=$JAVA_HOME/bin:$PATH
#添加jdk判断,注意,要带小引号
if [ -x "$JAVA_HOME/bin/java" ]; then
JAVA="/jackxu/es/elasticsearch-7.9.1/jdk/bin/java"
else
JAVA=`which java`
fi

5、配置文件修改

有的配置文件里面已经有了只需要修改下,没有的配置就自己添加

vim  /jackxu/es/elasticsearch-7.9.1/config/elasticsearch.yml#集群名称
cluster.name: jackxu-es
#节点名称
node.name: node1
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#ip地址
network.host: 0.0.0.0
#云服务器公网IP
network.publish_host: 39.103.144.86
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#es7.x 之后新增的配置,集群发现,以前版本的参数是discovery.zen.ping.unicast.hosts
discovery.seed_hosts: ["39.103.144.86:9300","42.192.77.73:9300","1.15.146.169:9300"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node1", "node2","node3"]
#数据和存储路径
path.data: /jackxu/es/elasticsearch-7.9.1/data
path.logs: /jackxu/es/elasticsearch-7.9.1/logs

这里我买的是云服务器,需要把network.host 设置成0.0.0.0,network.publish_host 设置成云服务器的公网IP,否则会连接到内网地址上,这是一个坑,我也是百度了很多久。如果还是连接不上,检查一下防火墙是否关闭,以及云服务器的控制台端口是否开放。

6、配置ES内存

按照自己的服务器设置,我这里是1核2G的,所以设置为1G

vim  /jackxu/es/elasticsearch-7.9.1/config/jvm.options
-Xms1g
-Xmx1g

下面是《Elasticsearch: 权威指南》节选,https://www.elastic.co/guide/cn/elasticsearch/guide/current/hardware.html

如果有一种资源是最先被耗尽的,它可能是内存。排序和聚合都很耗内存,所以有足够的堆空间来应付它们是很
重要的。即使堆空间是比较小的时候, 也能为操作系统文件缓存提供额外的内存。因为 Lucene 使用的许多数
据结构是基于磁盘的格式,Elasticsearch 利用操作系统缓存能产生很大效果。

64 GB 内存的机器是非常理想的, 但是32 GB 和16 GB 机器也是很常见的。少于8 GB 会适得其反(你最终需>要很多很多的小机器),大于64 GB 的机器也会有问题, 我们将在堆内存:大小和交换 中讨论。

7、切换用户

es是不允许使用root账户启动的,所以我们要新建一个用户es。

#创建用户
useradd es#更换权限,注意,需要在root权限下更换权限
chown -R es:es  /jackxu/es/elasticsearch-7.9.1#切换用户
su es

8、启动

后台启动,如果不后台启动的话,退出es就直接挂掉了

/jackxu/es/elasticsearch-7.9.1/bin/elasticsearch  -d

9、报错


遇到报错就把报错信息拷到百度一下,发现是提示虚拟内存不够

1.找到文件
vim /etc/sysctl.conf2.在文件末尾进行设置
#禁用内存和硬盘交换
vm.swappiness=1
#设置虚拟内存大小
vm.max_map_count=2621443.重新加载配置文件
sysctl -p4.验证
sysctl vm.max_map_count

10、再次启动

访问9200端口发现已经启动成功了

输入jps也能看到启动成功

第二台机器

修改配置文件

vim  /jackxu/es/elasticsearch-7.9.1/config/elasticsearch.yml#集群名称
cluster.name: jackxu-es
#节点名称
node.name: node2
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#ip地址
network.host: 0.0.0.0
#云服务器公网IP
network.publish_host: 42.192.77.73
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#es7.x 之后新增的配置,集群发现,以前版本的参数是discovery.zen.ping.unicast.hosts
discovery.seed_hosts: ["39.103.144.86:9300","42.192.77.73:9300","1.15.146.169:9300"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node1", "node2","node3"]
#数据和存储路径
path.data: /jackxu/es/elasticsearch-7.9.1/data
path.logs: /jackxu/es/elasticsearch-7.9.1/logs

启动一下,访问集群状态信息 http://42.192.77.73:9200/_cat/health?v 成功

我们这时候可以看到节点已经变成了两台


这里简单介绍一下这些参数的含义

  • cluster 集群名称
  • status 集群状态,green代表健康;yellow代表分配了所有主分片,但至少缺少一个副本,此时集群数据仍旧完整;red 代表部分主分片不可用,可能已经丢失数据。
  • node.total代表在线的节点总数量
  • node.data代表在线的数据节点的数量
  • shards 存活的分片数量
  • pri 存活的主分片数量 正常情况下 shards的数量是pri的两倍。
  • relo迁移中的分片数量,正常情况为 0
  • init 初始化中的分片数量 正常情况为 0
  • unassign未分配的分片 正常情况为 0
  • pending_tasks准备中的任务,任务指迁移分片等 正常情况为 0
  • max_task_wait_time任务最长等待时间
  • active_shards_percent正常分片百分比 正常情况为 100%

第三台机器

修改配置文件

vim  /jackxu/es/elasticsearch-7.9.1/config/elasticsearch.yml#集群名称
cluster.name: jackxu-es
#节点名称
node.name: node3
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 3
#ip地址
network.host: 0.0.0.0
#云服务器公网IP
network.publish_host: 1.15.146.169
#端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#es7.x 之后新增的配置,集群发现,以前版本的参数是discovery.zen.ping.unicast.hosts
discovery.seed_hosts: ["39.103.144.86:9300","42.192.77.73:9300","1.15.146.169:9300"]
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["node1", "node2","node3"]
#数据和存储路径
path.data: /jackxu/es/elasticsearch-7.9.1/data
path.logs: /jackxu/es/elasticsearch-7.9.1/logs

启动一下,访问集群状态信息 http://1.15.146.169:9200/_cat/health?v 成功

我们这时候可以看到节点已经变成了3台,至此,elasticsearch7.x集群搭建成功

Kibana配置和管理集群

1、创建文件夹

mkdir kibana

2、下载kibana
这里依旧选择华为镜像下载,一定要装与ES相同的版本

wget   https://mirrors.huaweicloud.com/kibana/7.9.1/kibana-7.9.1-linux-x86_64.tar.gz

3、解压

tar -zxvf kibana-7.9.1-linux-x86_64.tar.gz

4、修改配置文件

vim /jackxu/kibana/kibana-7.9.1-linux-x86_64/config/kibana.yml
# 服务名称
server.name: "jackxu_kibana"
# 端口号
server.port: 5601
# IP
server.host: "0.0.0.0"
# es的地址
elasticsearch.hosts: ["http://39.103.144.86:9200","http://42.192.77.73:9200","http://1.15.146.169:9200"]
elasticsearch.requestTimeout: 99999
#默认是英文,这个是中文设置
i18n.locale: "zh-CN"

5、启动Kibana

/jackxu/kibana/kibana-7.9.1-linux-x86_64/bin/kibana


这里提示不允许用root用户启动,可以在后面加上 –allow-root 强制启动,要么切换用户执行,但是要记得授权。

后台启动的命令:

nohup /jackxu/kibana/kibana-7.9.1-linux-x86_64/bin/kibana --allow-root &

6、访问一下

很高兴,看到这个页面的时候代表Kibana已经安装成功了


点击侧边栏-堆栈监测

这是一个大的概览页,我们能够看到es的版本号,分片以及文档信息等等,点击节点

这个页面能够看到节点的详细信息,我们发现有一个status显示是green,这代表我们的集群是健康的。下面node1旁边是星星,这表示是我们的主节点。至此,所有的搭建到这里就结束了,与本文刚开始设计的规划图一致,激动的心情。

脑裂

概念

ES在主节点上产生分歧,产生多个主节点,从而使集群分裂,使得集群处于异常状态。这个现象叫做脑
裂。

举个例子,比如有es集群, a b c d 四台机器。

  1. a b c d 之间选取一个master,比如master是a。
  2. 若某时刻 c d 访问不到a ,b能访问到a。
  3. c d之间会重新选举一个master。
  4. 这样整个a b c d的es集群就会分裂为a b 和 b c 两个集群。

ES脑裂可能的原因

  • 由于网络延迟,导致我们的主节点没有响应,这个时候我们的集群是不是就会认为我们的主节点已经死亡,然后重新选主。
  • 未做节点分离。 master与data为同一节点。当我们的节点既为主节点,又为数据节点的时候,这个时候我有非常多的数据,数据全部集中在我们的主节点,然后当我们的数据访问量过大的时候,是不是也可能会导致Master节点停止响应(假死状态)。从而导致我们的集群重新选主
  • JVM内存设置过小

解决方案

  • 设置超时时间,或者设计一个类似自我保护机制。
  • 节点分离
主节点配置为
•node.master: true
•node.data: false
•数据节点配置为
•node.master: false
•node.data: true
  • 修改JVM内存,在config/jvm.options 文件里将 -Xms 和 -Xmx 修改得更大,一般建议为服务器的内存一半。

结尾语

本文到这里就结束了,本文可以说是全网最新最全的es搭建教程,我看了网上很多的文章,有的版本比较老,一些参数也不适用了,其次是很多都是在虚拟机中搭建的,和在云服务器中搭建方法和步骤其实是不一样的,我平时在安装学习中都是在云服务器操作的,这样也能更加的贴近生产实战,下面是我用云服务器做的一些事情,非常的有意思。

《初识docker》

《教你三分钟用docker compose搭建一个自己的个人博客网站》

《RocketMQ高可用架构及二主二从异步集群部署》

本文没讲es java api的使用以及restful方式进行crud操作的步骤,这些都很简单,网上找几篇博客就能看懂了,而真正难的是es里面的原理,存储,索引,集群发现,乐观锁等等,这些需要翻阅大量的书籍去查阅去研究,我也还是小菜鸟,还在保持学习,大家共同探讨成长。

有人问我如何学习linux,我说我也没有刻意去学习,就是多安装多部署,不懂的就百度,熟能生巧,很多命令就记住了。最后当你还在问这个东西要不要学,学了有没有用的时候,我的建议是不要学了,躺在床上吃吃鸡,刷刷剧肯定是舒服的,学习本身是痛苦的,没有人生来就喜欢学习,无非是自律罢了!好,感谢大家的收看!

elasticsearch7.x集群搭建及倒排索引脑裂问题精讲相关推荐

  1. 视频教程-ElasticSearch7.x集群搭建(es7)主从读写分离搭建教程-ELK

    ElasticSearch7.x集群搭建(es7)主从读写分离搭建教程 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独特 ...

  2. Redis集群选举原理与脑裂问题

    系列文章目录 第一节 Redis的安装 第二节 Redis的五种数据结构(String.Hash.List.Set.ZSet) 第三节 Redis的持久化方式 第四节 Redis主从架构 第五节 Re ...

  3. Elasticsearch(二、高级查询+集群搭建)

    1内容概述 ElasticSearch 高级操作 ElasticSearch 集群管理 2 ElasticSearch高级操作 2.1 bulk批量操作-脚本 脚本: 测试用的5号文档 POST /p ...

  4. Centos7+Elasticsearch7.4.2+Kibana+IK分词+ElasticHD 安装配置以及集群搭建

    Centos7+Elasticsearch7.4.2+Kibana+IK分词+ElasticHD 安装配置以及集群搭建 1. elasticSearch 7.4.2 安装 1.1 关于jdk 1.2 ...

  5. Elasticsearch7.×集群搭建,生命周期策略ilm_policy、索引模板template管理(二)

    网上较多的是6.×及以下版本的集群搭建,我们就以新版本7.6搭建环境如下 环境:三台服务器192.168.11.21.192.168.11.22.192.168.11.23均安装好ES7.6版本,其中 ...

  6. elasticsearch7.0.1集群搭建(最后有ES6.7的配置)

    ** ES集群搭建 **: 说明:首先要讨论搭建几个集群,集群搭建很简单,只需要配置做好就ok; 一 : 在搭建集群之前,我们首先要了解一个es中的相关内容 cluster : 代表一个集群,集群中有 ...

  7. ES7.10集群搭建及EFK搭建教程

    本文主要介绍 Elasticsearch 集群的搭建.通过在一台服务器上创建 3 个 ES 实例来创建一个ES 集群. 以下内容参考详尽的 Elasticsearch7.X 安装及集群搭建教程, ES ...

  8. elasticsearch集群搭建

    elasticsearch ARM架构集群搭建 一.搭建环境 搭建服务器IP 环境 es版本号 路径 20.10.0.xx CentOS Linux release 7.9.2009 (AltArch ...

  9. 全分布式集群搭建总结

    全局分布式集群搭建 注: 如果之前搭建过伪分布式集群,则必须删除就hadoop的jar包,重新解压,因为之前配的文件有可能会冲突.   接下来是搭建集群的详细配置步骤 ~~   搭建集群之前的一些设置 ...

最新文章

  1. 如何从sdcard读取文件
  2. 设计模式之简单工厂模式(静态工厂方法)
  3. hive 学习之异常篇
  4. 前端基础:web语义化
  5. win7 php mysql扩展名_win7下MySQL 5.1.73安装过程(图解)并在php.ini中启用相关扩展。...
  6. mysql数据结构优化,范式和反范式
  7. Codeforces 746 G. New Roads
  8. Apache 2.4 编码GB2312中文乱码的问题
  9. python操作autocad_利用python控制Autocad:pyautocad方式
  10. firewalld 规则配置
  11. android tab吸顶,Android 顶部带Banner的TabLayout吸顶实现方案
  12. FPGA 驱动HDC1080温湿度模块
  13. java代码实现kafka消费端consumer的from-beginning功能
  14. 大数据是什么,大数据的主要特点是什么?
  15. 2024年上海美博会-上海浦东美博会(上海CBE)
  16. 人工智能学习梳理和总结
  17. Python爬虫进阶必备 | 关于MD5 Hash 的案例分析与总结
  18. 无人驾驶(目前的自动驾驶方案)
  19. 大学计算机教学内容体系,大学计算机教学内容体系建设与改革论文
  20. 康涅狄格大学计算机科学排名,学校排名|Rankings

热门文章

  1. 2023全网最新UEFI固件引导 windows 11 和 fedora 38 双系统安装
  2. 显示屏厂家的拳头产品小间距P1.5全彩LED显示屏。
  3. python爬虫:requests+pyquery实现知乎热门话题爬取
  4. 因祸得福——创建视图时改变字段的类型
  5. 查询表达式和条件表达式
  6. 山东财经大学新生赛暨天梯赛选拔赛 F.简单排序(思维)
  7. 随机变量序列 收敛 检验 matlab,利用MATLAB验证样条插值的收敛性
  8. 膜拜!终于有人把Django的MVT设计模式解释的清清楚楚了!
  9. 一文把Java反射说的明明白白,清清楚楚,记得点赞关注,距离架构师的小目标又进一步
  10. 微信企业付款到零钱功能介绍