Elasticsearch7.8详尽使用指南(一):ElasticSearch集群部署实践

日期 做者 版本 备注
2020-07-01 dingbin v1.0

1. ElasticSearch技术简介

ElasticSearch简称es,是当前流行、强大的基于Lucene的企业级搜索引擎。html

1.1. 基础概念

Elasticsearch有几个核心概念。从一开始理解这些概念会对整个学习过程有莫大的帮助。java

1.1.1. 接近实时(NRT)

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档可以被搜索到有一个轻微的延迟(一般是1秒)。node

1.1.2. 集群(cluster)

一个集群就是由一个或多个节点组织在一块儿,它们共同持有整个的数据,并一块儿提供索引和搜索功能。一个集群由一个惟一的名字标识,这个名字默认就是 “elasticsearch”。这个名字是重要的,由于一个节点只能经过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,可是使用默认值来进行测试/开发也是不错的。linux

1.1.3. 节点(node)

一个节点是你集群中的一个服务器,做为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群相似,一个节点也是由一个名字来标识的,默认状况 下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工做来讲挺重要的,由于在这个管理过程当中,你会去肯定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。git

一个节点能够经过配置集群名称的方式来加入一个指定的集群。默认状况下,每一个节点都会被安排加入到一个叫作“elasticsearch”的集群中,这意 味着,若是你在你的网络中启动了若干个节点,并假定它们可以相互发现彼此,它们将会自动地造成并加入到一个叫作“elasticsearch”的集群中。es6

在一个集群里,只要你想,能够拥有任意多个节点。并且,若是当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认建立并加入一个叫作“elasticsearch”的集群。github

1.1.4. 索引(index)

一个索引就是一个拥有几分类似特征的文档的集合。好比说,你能够有一个客户数据的索引,另外一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须所有是小写字母的),而且当咱们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。数据库

在一个集群中,若是你想,能够定义任意多的索引。vim

1.1.5. 类型(type)

在一个索引中,你能够定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义彻底由你来定。一般,会为具备一组共同字段的文档定义一个类型。好比说,咱们假设你运营一个博客平台而且将你全部的数据存储到一个索引中。在这个索引中,你能够为用户数据定义一个类型,为博客数据定义另外一个类型,固然,也能够为评论数据定义另外一个类型。segmentfault

1.1.6. 文档(document)

一个文档是一个可被索引的基础信息单元。好比,你能够拥有某一个客户的文档,某一个产品的一个文档,固然,也能够拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,而JSON是一个处处存在的互联网数据交互格式。

在一个index/type里面,只要你想,你能够存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。

1.1.7. 分片和复制(shards & replicas)

一个索引能够存储超出单个结点硬件限制的大量数据。好比,一个具备10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。

为了解决这个问题,Elasticsearch提供了将索引划分红多份的能力,这些份就叫作分片。当你建立一个索引的时候,你能够指定你想要的分片的数量。每一个分片自己也是一个功能完善而且独立的“索引”,这个“索引”能够被放置到集群中的任何节点上。

分片之因此重要,主要有两方面的缘由:

  • 容许你水平分割/扩展你的内容容量
  • 容许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操做,进而提升性能/吞吐量

至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是彻底由Elasticsearch管理的,对于做为用户的你来讲,这些都是透明的。

在一个网络/云的环境里,失败随时均可能发生,在某个分片/节点不知怎么的就处于离线状态,或者因为任何缘由消失了,这种状况下,有一个故障转移机制是非 常有用而且是强烈推荐的。为此目的,Elasticsearch容许你建立分片的一份或多份拷贝,这些拷贝叫作复制分片,或者直接叫复制。

复制之因此重要,有两个主要缘由:

  • 在分片/节点失败的状况下,提供了高可用性。由于这个缘由,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是很是重要的。
  • 扩展你的搜索量/吞吐量,由于搜索能够在全部的复制上并行运行

总之,每一个索引能够被分红多个分片。一个索引也能够被复制0次(意思是没有复制)或屡次。一旦复制了,每一个索引就有了主分片(做为复制源的原来的分片)和 复制分片(主分片的拷贝)之别。分片和复制的数量能够在索引建立的时候指定。在索引建立以后,你能够在任什么时候候动态地改变复制的数量,可是你过后不能改变 分片的数量。

默认状况下,Elasticsearch中的每一个索引被分片5个主分片和1个复制,这意味着,若是你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个彻底拷贝),这样的话每一个索引总共就有10个分片。

index: es里的index至关于一个数据库。

type: 至关于数据库里的一个表。

id: 惟一,至关于主键。

node:节点是es实例,一台机器能够运行多个实例,可是同一台机器上的实例在配置文件中要确保http和tcp端口不一样(下面有讲)。

cluster:表明一个集群,集群中有多个节点,其中有一个会被选为主节点,这个主节点是能够经过选举产生的,主从节点是对于集群内部来讲的。

shards:表明索引分片,es能够把一个完整的索引分红多个分片,这样的好处是能够把一个大的索引拆分红多个,分布到不一样的节点上,构成分布式搜索。分片的数量只能在索引建立前指定,而且索引建立后不能更改。

replicas:表明索引副本,es能够设置多个索引的副本,副本的做用一是提升系统的容错性,当个某个节点某个分片损坏或丢失时能够从副本中恢复。二是提升es的查询效率,es会自动对搜索请求进行负载均衡。

2. ElasticSearch集群部署

本节将叙述从elasticsearch官网https://www.elastic.co/cn/公布的当前最新的es版本:7.8.0版本,在3台centos7.5 操做系统服务器上,以专门的特定用户(本文是用户es,不须要root或sudo权限),安装任意用户指定的路径(本文是/opt/es)的实践流程细节。

此外,鉴于es集群要想提供中文索引和检索的服务,离不开中文分词功能。本文在综合分析了目前市面上多种主流的中文分词组件功能优劣后,选择了效果较好的ik分词组件,嵌入到es中,以提供分词功能。考虑到es版本是7.8.0,ik分词组件版本必须与其一直。所以Ik分词程序包是从ik分词官网git网址:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0下载的v7.8.0版本。

注意:

本文所述设计的全部的程序安装包和相关源代码均提供下载: es7.8package.rar 提取码: x4gg
解压后内容以下图:(其中esproj.zip是本文开源的es构建全量或实时索引的相关java源代码)
image.png

2.1. 准备工做

2.1.1. 环境准备

分布式es集群至少要求运行在3台或以上服务器上。本文讲述是基于安装在3台vmware虚拟机上,各虚拟机机器结点以下表:
image.png
本节使用的全部vmware虚拟机配置均为CPU:8核,内存6G,硬盘足够。

2.1.2. 系统准备

2.1.2.1. 新建专门的es用户和组

新建专门的linux用户es和组es,以便安全方式运行进程

groupadd es
建立group es
vim /etc/group
会发现最后一行有es用户组
adduser -g es es
建立es用户,同时加入es用户组,自动建立es的homedir为/home/es
vim /etc/passwd, 能够看到最后一行是es用户。
passwd es
为es用户新设立密码
将es用户加入sudo权限
注意:本步骤非必须,可选。
chmod +w /etc/sudoers
vim /etc/sudoers
添加以下行:

image.png
修改完后不要忘记执行:chmod -w /etc/sudoers以恢复/etc/suders系统文件的非默承认写属性。

2.1.2.2. 建立es集群的basedir路径

在3台机器上统一特定路径位置建立es集群的basedir。后续该basedir目录下将分别建立出es集群的app/data/logs/tmp 4个子目录等。必须保证basedir路径的硬盘空间适应将来业务数据增加的需求,硬盘空间足够大。本文basedir路径为/opt/es。

mkdir /opt/es/app
mkdir /opt/es/data
mkdir /opt/es/tmp
mkdir /opt/es/logs
chown -R es:es /opt/es
以上的data、logs 2个目录将分别是es服务的datadir、logdir;app目录用于存放安装es程序的目录;用于自定义指定的es服务的tmp目录。

chown -R es:es /opt/es是修改es集群的basedir路径/opt/es的所属user和group为es用户名和es组。

2.1.2.3. 防火墙、selinux和端口准备

CentOS7 端口的开放关闭查看都是用防火墙来控制的,Centos 从6升级到7以后,再也不是用以前的iptables 命令控制linux端口,centos7取而代之的是用firewalld代替了原来centos6的iptables。

2.1.2.3.1. Centos7防火墙用法简述

如下简述centos7防火墙相关操做用法:

1) 查看防火墙状态:(active (running) 便是开启状态)

systemctl status firewalld
image.png
systemctl用法简述以下:
image.png

2)开启/关闭防火墙:

开启防火墙:systemctl start firewalld
关闭防火墙:systemctl stop firewalld
禁止firewalld开机启动:systemctl disable firewalld
firewalld开机启动:systemctl enable firewalld
image.png

3)查询端口号3306 是否开启

firewall-cmd --query-port=3306/tcp
image.png
可见3306防火墙端口未开启

4)查询有哪些端口是开启的

firewall-cmd --list-port
image.png

5)重启防火墙

firewall-cmd --reload

6)开启端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent

--zone #做用域
--add-port=3306/tcp #添加端口,格式为:端口/通信协议
--permanent #永久生效,没有此参数重启后失效
注意:开启端口后必须执行firewall-cmd --reload 以重启防火墙才能生效,不然不生效。
image.png

2.1.2.3.2. es集群部署涉及须要的防火墙端口操做

如前文章节所述,es集群须要默认开放3个端口:9200和9300和54328。其中:

9200:  做为 Http 协议,主要用于外部通信
9300:  数据传输端口:9300 用于集群之间交换数据
54328: 组播端口(UDP)

要部署es集群,若是打开了防火墙,必定要记得将以上3个端口开放。本文由于体现定制性,将9200和9300端口分别改为了19200和19300。

方案1:关闭防火墙

systemctl stop firewalld

image.png

方案2:开启防火墙可是同时开放3个端口以下

systemctl start firewalld
firewall-cmd --zone=public --add-port=19200/tcp --permanent
firewall-cmd --zone=public --add-port=19300/tcp --permanent
firewall-cmd --zone=public --add-port=54328/udp --permanent
firewall-cmd --reload

image.png

本文采起方案2,开启防火墙但同时开启以上3个端口,效果以下:
image.png
注意:开启防火墙要执行一下:systemctl enable firewalld 保证下次开启启动防火墙。

2.1.2.3.3. es集群部署涉及须要的selinux操做

es集群部署须要把 SELINUX 值设置成 disabled
查看如今selinux的状态:sestatus
image.png

临时关闭selinux:setenforce 0
临时打开,由permissive转enforcing:setenforce 1
但再次开启时此改变会失效。要想永久生效须要修改文件/etc/selinux/config
vim /etc/selinux/config
image.png
修改文件中SELINUX=disable便可。

2.1.2.3.4. Es程序启动必须的linux内核系统配置

在大多数linux版本下,Es程序启动必须设置一些特定的相关系统内核功能,不然es程序是启动不起来的。这很是重要,必定要设置,不然es启动不起来,且会报告各类莫名的错误。Es官网也给出了相关的系统配置建议,可参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html 。本节讲述的是在centos7上必须进行的系统内核相关的系统配置以下:

1) /etc/security/limits.conf 配置
vi /etc/security/limits.conf打开文件,添加以下红框中3行:
image.png

2) /etc/sysctl.conf配置
vi /etc/sysctl.conf打开文件,添加以下红框中2行:
image.png

注意:以上这几处配置改动涉及到centos内核,建议重启centos操做系统使其永久生效。

至此,es集群安装所需的所有准备工做所有完成。下面开始安装es集群。

2.2. 部署es集群

2.2.1. 下载软件包

如前所述,部署es7.8集群还同时须要安装配套的分词组件包:ik7.8。分别从官网地址:

https://www.elastic.co/cn/
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0下载的v7.8.0

便可下载到当前(20200701)最新的版本7.8。由于下载速度极其缓慢,整个下载过程持续约长达3-4个小时。文本已经下载好了这2个软件包,分别见项目提交列表中的以下文件:
image.png
直接解压使用便可,省去漫长的下载过程。

2.2.2. 安装和部署es集群

2.2.2.1. 安装es程序和ik组件

分别在cent7a、cent7b、cent7c 3台机器上解压项目提交列表中的es压缩包文件:elasticsearch-7.8.0-linux-x86_64.tar.gz到 /opt/es/app目录下,以下图所示:
image.png

接下来分别在3台机器上的/opt/es/app/elasticsearch-7.8.0/plugins目录下新建ik目录,而后将项目提交列表中的ik组件程序包:elasticsearch-analysis-ik-7.8.0.zip 解压到该ik插件目录下:/opt/es/app/elasticsearch-7.8.0/plugins/ik
最终结果以下:
image.png

2.2.2.2. 配置es集群
1) jvm相关配置
注意:es服务是java语言编写的,内部依赖jdk。但自从es6以后,es程序包内部内嵌了新版本的jdk,再也不须要用户本身单独安装jdk。

vim /opt/es/app/elasticsearch-7.8.0/config/jvm.options 设置以下图所示最小堆空间和最大堆空间,建议都设置成同样的值。 本文部署实际中由于vmware虚拟机总共6G内存限制同时机器上还部署了其余耗内存的服务,所以只设置了3g 堆内存空间。实际生产环境下为保证es能发挥正常性能,该2值很关键,强烈设置在5g以上,但最大不该超过32g。在此范围内越大越好,越大es能发挥越高的性能。
image.png
此外以下图设置heapDumpPath为/opt/es/logs目录下:
image.png

2) Es集群配置:elasticsearch.yml

elasticsearch.yml文件是es集群的主要配置文件,必定要设置好。
先在cent7a上:vim /opt/es/app/elasticsearch-7.8.0/config/elasticsearch.yml依次设置以下:
image.png
image.png
image.png
image.png

以上是cent7a的配置,cent7b、cent7c上的配置大致相同,除了:
node.name分别是es-node2/es-node3;
network.host分别是:192.168.0.1十一、192.168.0.1十二、192.168.0.113。

2.2.2.3. 启动/关闭es集群服务
1) 启动es:

依次在cent7a/cent7b/cent7c上执行命令:

/opt/es/app/elasticsearch-7.8.0/bin/elasticsearch -d -p /opt/es/app/pid

-d表示之后台服务方式运行, -p表示pid存储的文件。
image.png
而后在每一个机器上执行:jps –lm和cat /opt/es/app/pid
便可看到以下:
image.png
分别是es进程和进程号。

而后在浏览器上输入:http://192.168.0.110:19200 便可看到以下:
image.png

输入:http://192.168.0.110:19200/_cat/nodes?v显示以下:
image.png

输入:http://192.168.0.110:19200/_cat/health?v 显示以下:
image.png

可见集群共有3个节点,集群健康状态是status:green,绿色表示健康。
至此es集群部署完毕。

2) 关闭es:
分别在3台机器上分别执行:pkill -F /opt/es/app/pid便可。

未完待续,下一篇:Elasticsearch7.8详尽使用指南(二):ElasticSearch集群构建索引实践

相关文章
相关标签/搜索