日期 | 作者 | 版本 | 备注 |
---|---|---|---|
2020-07-01 | 丁斌 | v1.0 | |
1. ElasticSearch技术简介
ElasticSearch简称es,是当前流行、强大的基于Lucene的企业级搜索引擎。
1.1. 基础概念
Elasticsearch有几个核心概念。从一开始理解这些概念会对整个学习过程有莫大的帮助。
1.1.1. 接近实时(NRT)
Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)。
1.1.2. 集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是 “elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的。
1.1.3. 节点(node)
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况 下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意 味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。
1.1.4. 索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。
在一个集群中,如果你想,可以定义任意多的索引。
1.1.5. 类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
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版本。
2.1. 准备工作
2.1.1. 环境准备
分布式es集群至少要求运行在3台或以上服务器上。本文讲述是基于安装在3台vmware虚拟机上,各虚拟机机器结点如下表:
本节使用的所有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
添加如下行:
修改完后不要忘记执行: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
systemctl用法简述如下:
2)开启/关闭防火墙:
开启防火墙:systemctl start firewalld
关闭防火墙:systemctl stop firewalld
禁止firewalld开机启动:systemctl disable firewalld
firewalld开机启动:systemctl enable firewalld
3)查询端口号3306 是否开启
firewall-cmd --query-port=3306/tcp
可见3306防火墙端口未开启
4)查询有哪些端口是开启的
firewall-cmd --list-port
5)重启防火墙
firewall-cmd --reload
6)开启端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
--zone #作用域
--add-port=3306/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效注意:开启端口后必须执行firewall-cmd --reload 以重启防火墙才能生效,否则不生效。
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
方案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
本文采取方案2,开启防火墙但同时开启以上3个端口,效果如下:注意:开启防火墙要执行一下:systemctl enable firewalld 保证下次开启启动防火墙。
2.1.2.3.3. es集群部署涉及需要的selinux操作
es集群部署需要把 SELINUX 值设置成 disabled
查看现在selinux的状态:sestatus
临时关闭selinux:setenforce 0
临时打开,由permissive转enforcing:setenforce 1
但再次开启时此改变会失效。要想永久生效需要修改文件/etc/selinux/config
vim /etc/selinux/config
修改文件中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行:
2) /etc/sysctl.conf配置
vi /etc/sysctl.conf
打开文件,添加如下红框中2行:
注意
:以上这几处配置改动涉及到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个软件包,分别见项目提交列表中的如下文件:
直接解压使用即可,省去漫长的下载过程。
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目录下,如下图所示:
接下来分别在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
最终结果如下:
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能发挥越高的性能。
2) Es集群配置:elasticsearch.yml
elasticsearch.yml文件是es集群的主要配置文件,一定要设置好。
先在cent7a上:vim /opt/es/app/elasticsearch-7.8.0/config/elasticsearch.yml
依次设置如下:
以上是cent7a的配置,cent7b、cent7c上的配置大体相同,除了:
node.name分别是es-node2/es-node3;
network.host分别是:192.168.0.111、192.168.0.112、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存储的文件。
分别是es进程和进程号。
然后在浏览器上输入:http://192.168.0.110:19200
即可看到如下:
输入:http://192.168.0.110:19200/_cat/nodes?v
显示如下:
输入:http://192.168.0.110:19200/_cat/health?v
显示如下:
可见集群共有3个节点,集群健康状态是status:green,绿色表示健康。
至此es集群部署完毕。
2) 关闭es:
分别在3台机器上分别执行:pkill -F /opt/es/app/pid即可。