Elasticsearch 的安装和部署

374 阅读7分钟

1. 安装与部署

1.1 安装JavaJDK

1.1.1 解压

tar -xvf  OpenJDK11U-jdk_x64_linux_hotspot_11.0.8_10.tar.gz

1.1.2 更改目录名称java

 mv jdk-11.0.8+10 java

1.1.3 配置环境变量

使用vim /etc/profile 编辑profile文件 输入: vim /etc/profile 向文件里面追加以下内容:

#set java environment
JAVA_HOME=/soft/es/java
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH

1.1.4 使文件生效

source /etc/profile

1.1.5 测试配置是否成功

java -version

1.2 安装ES

1.2.1 解压

tar -xvf elasticsearch-7.6.1-linux-x86_64.tar.gz

1.2.2 更改名称

mv elasticsearch-7.6.1 es

2. 启动ES

2.1 ES不能用root用户登录

需要创建用户,创建一个名叫es的用户

useradd es

为es用户设置密码

passwd es

给用户es访问es目录的权限

chown -R es /usr/local/jdk/es

2.2 jvm的内存需要重新配置

启动内存默认1G 如果配置低需要修改启动内存

可以更改成256m

2.3 因为2.1 权限问题需要更改一些文件

/etc/security/limits.conf

增加内容

es soft nofile 65536
es hard nofile 65536
es soft nproc 4096
es hard nproc 4096

/etc/security/limits.d/20-nproc.conf

增加内容

es   soft nproc 4096
root soft nproc unlimited

/etc/sysctl.conf

增加内容

vm.max_map_count=655360

已root 用户执行命令

sysctl -p

2.4 启动es

2.4.1 切换用户

su es

2.4.2 修改es配置文件

/usr/local/jdk/es/config/elasticsearch.yml

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: my-application
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: node-1
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data: /usr/local/jdk/es/data
#
# Path to log files:
#
path.logs: /usr/local/jdk/es/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.seed_hosts: ["host1", "host2"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["node-1"]
#
# For more information, consult the discovery and cluster formation module documentation.
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
#gateway.recover_after_nodes: 3
#
# For more information, consult the gateway module documentation.
#
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true

http.cors.enabled: true # elasticsearch中启用CORS
http.cors.allow-origin: "*" # 允许访问的IP地址段,* 为所有IP都可以访问

2.4.3 正式启动ES

 ./bin/elasticsearch

3. 安装es-head 可视化插件

3.1 安装nodeJs

# 下载安装包
wget https://nodejs.org/dist/v12.18.1/node-v12.18.1-linux-x64.tar.xz
# 解压
tar -xvf node-v12.18.1-linux-x64.tar.xz
# 重命名
mv node-v12.18.1-linux-x64.tar.xz node
# 添加环境变量
vim /etc/profile -- 编辑文件
# 添加以下内容
export PATH=$PATH:/usr/local/jdk/node/bin
# 刷新
source /etc/profile
# 测试
node -v
npm -v

3.2 上传 elasticsearch-head-master.zip

# 解压
unzip elasticsearch-head-master.zip
# 重命名
mv elasticsearch-head-master es-head
# 进入目录
cd es-head
# 安装依赖
npm install
# 关闭防火墙
firewall-cmd --add-port=9100/tcp --permanent
# 重启防火墙
firewall-cmd --reload
# 启动
npm run start

3.3 安装kibana

也会存在不能root 启动

# 解压
tar -xvf kibana-7.6.1-linux-x86_64.tar.gz
# 重命名
mv kibana-7.6.1-linux-x86_64 kibana
# 创建用户 密码 和 权限
useradd kibana 
passwd lsn25511042 
chown -R kibana /usr/local/jdk/kibana

# 关闭防火墙
firewall-cmd --add-port=5601/tcp --permanent
# 重启防火墙
firewall-cmd --reload
# 允许外部访问
/usr/local/jdk/kibana/config/kibana.yml
修改 server.host "0.0.0.0"
# 启动
进入./kibana/bin目录启动 ./kibana

4 ES的基本概念

4.1 Es和关系型数据库的区别

关系型数据库ElasticSearch
数据库索引
类型
文档
字段字段

elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包 含多 个文档(行),每个文档中又包含多个字段(列)。

物理设计

elasticsearch 在后台把每个索引划分成多个分片,每分分片可以在集群中的不同服务器间迁移 一个人就是 一个集群!默认的集群名称就是 elaticsearh

逻辑设计

一个索引类型中,包含多个文档,比如说文档1,文档2。 当我们索引一篇文档时,可以通过这样的一各 顺 序找到 它: 索引 ▷ 类型 ▷ 文档ID ,通过这个组合我们就能索引到某个具体的文档。 注意:ID不必是整 数, 实际上它是个字 符串。

之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,elasticsearch 中,文档有几个 重要属性 :

  • 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含 key:value!
  • 可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的! {就是一个json对象! fastjson进行自动转换}
  • 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用, 在 elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个 新的字 段。

尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类 型, 可以是字符 串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种 映射具 体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。

索引

就是数据库!

索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段 和其他设置。 然后它们被存储到了各个分片上了。 我们来研究下分片是如何工作的。

一个集群至少有一个节点,而一个节点就是一个elasricsearch进程,节点可以有多个索引默认的,如果 你创 建索引,那么索引将会有个5个分片 ( primary shard ,又称主分片 ) 构成的,每一个主分片会有一个 副本 ( replica shard ,又称复制分片 )

上图是一个有3个节点的集群,可以看到主分片和对应的复制分片都不会在同一个节点内,这样有利于某 个 节点挂掉 了,数据也不至于丢失。 实际上,一个分片是一个Lucene索引,一个包含倒排索引的文件 目 录,倒排索引的结构使 得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的 关键 字。 不过,等等,倒排索引是什 么鬼?

倒排索引

elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索作为底层。这种结构适用于快速的 全文 搜索, 一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表。

如果要搜索含有 python 标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快 的 多。只需要 查看标签这一栏,然后获取相关的文章ID即可。完全过滤掉无关的所有数据,提高效率!

elasticsearch的索引和Lucene的索引对比

在elasticsearch中, 索引 (库)这个词被频繁使用,这就是术语的使用。 在elasticsearch中,索引被 分为 多个分片,每份 分片是一个Lucene的索引。所以一个elasticsearch索引是由多个Lucene索引组成 的。别问 为什么,谁让elasticsearch使用Lucene作为底层呢! 如无特指,说起索引都是指elasticsearch 的索引。

接下来的一切操作都在kibana中Dev Tools下的Console里完成。基础操作!

4.2 ik分词器

4.2.1 安装

在elasticsearch目录的plugins解压elasticsearch-analysis-ik-7.6.1.zip

unzip elasticsearch-analysis-ik-7.6.1.zip

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中 或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如:

"中国的花"会被分为"中","国","的","花",这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题

如果要使用中文,建议使用ik分词器!

IK提供了两个分词算法:ik_smart 和 ik_max_word,其中 ik_smart 为最少切分,ik_max_word为最细 粒度划分!

4.2.2 分词

ik_smart为最少切分

ik_max_word为最细粒度划分!穷尽词库的可能!字典!

5 elasticsearch基本操作

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交 互 类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

基本Rest命令说明:

methodurl地址描述
PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)
POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档
DELETElocalhost:9200/索引名称/类型名称/文档id删除文档
GETlocalhost:9200/索引名称/类型名称/文档id查询文档通过文档id
POSTlocalhost:9200/索引名称/类型名称/_search查询所有数据

关于索引的基本操作

1、创建一个索引!

PUT /索引名/~类型名~/文档id {请求体}
  1. 指定字段类型
  • 字符串类型 text 、 keyword
  • 数值类型 long, integer, short, byte, double, float, half_float, scaled_float
  • 日期类型 date PUT /索引名/类型名/文档id {请求体}
  • 布尔值类型 boolean
  • 二进制类型 binary
  • 等等

6 后台启动Es

Elasticsearch在linux下使用命令sh elasticsearch start,按键ctrl+c的时候程序就会stop掉,如何 将程序在后台启动呢?

需要使用:./elasticsearch -d 
这时执行的时候会出现没有权限./elasticsearch: Permission denied 
需要授权执行命令:chmod +x bin/elasticsearch 
再次执行./elasticsearch -d即可启动 
使用ps aux|grep elasticsearch可以查看是否启动 

7 npm 后台启动

yum provides */nohup
nohup npm start &

原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。

停止程序

ps -ef | grep npm
ps -ef | grep node