当前位置:首页 > 资讯 > 正文

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

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

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

es的特点:

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

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

近实时

  • 写入数据时,过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)中。例如:

 

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的书,我们正常的写法就是:

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

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

第一台机器

1、新建一个es的文件夹

 

2、下载包

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

 

3、解压

 

4、指定JDK(可选)

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

 

5、配置文件修改

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

 

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

6、配置ES内存

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

 

下面是《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。

 

8、启动

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

 

9、报错

 

10、再次启动

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

输入jps也能看到启动成功

第二台机器

修改配置文件

 

启动一下,访问集群状态信息 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%

第三台机器

修改配置文件

 

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

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

1、创建文件夹

 

2、下载kibana
这里依旧选择华为镜像下载,

 

3、解压

 

4、修改配置文件

 

5、启动Kibana

 
 

后台启动的命令:

 

6、访问一下

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

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

概念

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内存设置过小

解决方案

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

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

《初识docker》

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

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

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

最新文章