- A+
网上查询了一下Elasticsearch,这里终结一下,仅供参考。
Elasticsearch简介
Elasticsearch,简称为ES。 ES是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据。
Elasticsearch是面向文档的一种数据库,这意味着其不再需要行列式的表格字段约束。
ES会存储整个构造好的数据或文档,然而不仅仅是储存数据,这使得文档中每个数据可以被标识,进而可以被检索。在ES中,执行index,search,sort或过滤文档等操作都不是传统意义上的行列式的数据。
ES从根本上对数据的不同思考方式也正是他能应对复杂数据结构的全文检索的原因之一。
ES优势
引擎(搜索引擎)
- Solr查询快,但更新索引时慢、插入删除慢
- Elasticsearch建立索引快、查询慢
Elasticsearch VS 数据库
模糊查询
数据库的select * from user where name like 'xxx':
- 1. 不走索引,数据库量很大时,查询慢。
- 2. 往往会返回大量的数据。
- 3.用户输入的内容可能并不准确。
mysql中like进行模糊查询时,如果用前导模糊查询"%程序控"则不会走索引,如果用非前导模糊查询"程序控%"则会走索引。
=》
正排索引存储会以ID作为索引,来查询相应的数据。如果数据量很大,则会导致经常性的全表扫描。
=》
Elasticsearch优势:
倒排索引。
- 模糊搜索速度很快: 写入数据到Elasticsearch的时候会进行分词。
- 搜索到的数据可以根据评分排序,过滤掉大部分的内容。
- 能匹配有相关性的记录,没有那么准确的关键字也能搜出相关的结果。
结果排序
搜索引擎肯定是根据用户搜索得出最符合用户搜索条件的放在最前面,这一点数据库是无法支持的,es中会根据搜索的数据的评分进行排序,越符合条件评分越高,原生支持这一点。
正向索引 VS 倒排索引
- 正向索引:书的章节目录就是正向索引,通过章节名称就找到对应的页码。
- 正排索引存储会以ID作为索引,来查询相应的数据。如果数据量很大,则会导致经常性的全表扫描。
- 倒排索引:先对目录分词,对待查找的词找到对应记录。
以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。
由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率
架构优势
- 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
- 实时分析的分布式搜索引擎。
分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
负载再平衡和路由在大多数情况下自动完成。
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)。
支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
为什么可以实现快速的“模糊匹配”/“相关性查询”? =》分词 + 倒排索引
一.单个节点安装及配置
在所有节点上安装elasticsearch及插件
1.下载elasticsearch二进制包
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
国内下载地址(elasticsearch中文社区下载地址):下载中心 - Elastic 中文社区
- 系统:根据自己的操作系统选择系统对应的包
- 版本:根据自己的需要选择对应的版本
2.解压安装
这里以linux系统为例:
tar -zxvf elasticsearch-8.5.1-linux-x86_64.tar.gz
mv elasticsearch-8.5.1-linux-x86_64 /opt/elasticsearch
3.建立管理elasticsearch服务的用户
useradd elastic
chown -R elastic:elastic /opt/elasticsearch
4.配置elasticsearch
elasticsearch.yml
: elasticsearch服务相关的配置jvm.options
: elasticsearch的JAVA虚拟机相关的配置
(1)elasticsearch主配置核心参数配置
cluster.name: search-center
path.data: /home/elastic/data
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.0.200
discovery.seed_hosts: ["192.168.0.200:9300", "192.168.0.201:9300","192.168.0.202:9300"]
cluster.initial_master_nodes: ["node-200", "node-201","node-202"]
gateway.recover_after_nodes: 3
cluster.name
: 集群名称,具有相同集群名称的节点可以组成一个集群node.name
: 节点名称node.master
: 当前节点是否设置为主节点(候选节点)node.data
: 当前节点是否为数据节点node.ingest
: 当前节点是否为预处理任务节点node.ml
: 当前节点是否为机器学习节点
注:如果节点不是master节点,也不是data节点,也不是ingest节点,也不是ml节点,那么它只能是协调节点(coordinating node),只用于转发请求,不处理实际数据
path.data
: 数据文件存储路径path.logs
: 日志文件存储路径bootstrap.memory_lock
: 启动时是否锁定内存network.host
: 绑定的主机名或地址(如设置为服务器的内网地址,可供网络访问,如果设置为127.0.0.1那只能本地访问)http.port
: 对外提供的http访问端口(默认为9200)transport.port
: 用于集群中与其他节点通信的端口(默认为9300)discovery.seed_hosts
: 集群的节点地址列表(以7.2有以下的低版本为discovery.zen.ping.unicast.hosts)cluster.initial_master_nodes
: 集群初始化时主节点的侯选节点列表(即可参与主节点选举的节点列表)
注:discovery.seed_hosts是一个数组,每个数组项为节点的IP地址(也可以是IP:port的形式,其中port为集群通信的端口,一般为9300)
(2)JVM参数配置
-Xms 4G
-Xmx 4G
-Xms
: JVM堆内存最小大小,如-Xms2g
(单个节点最大堆内存不要超过32G)-Xmx
: JVM堆内存最大小,如-Xmx2g
(单个节点最大堆内存不要超过32G)-XX:+UseG1GC
: 使用G1垃圾回收器-Djava.io.tmpdir
: JVM临时文件目录-XX:+HeapDumpOnOutOfMemoryError
: 当分配内存空间失败时生成dump文件-XX:HeapDumpPath
: dump文件存储位置-XX:ErrorFile
: 存储JVM严重错误文件地址
注:
-
这和java应用项目的jvm配置类似,配置的堆内存最好不要超宿主机内存的1/2,因宿主机操作系统也需要相应的运行内存
-
官方建议最大堆内存不要超过32G,一般建议最大为31G
(3)操作系统相关配置
elasticsearch是运行于操作系统这个大容器中,因此系统中对资源的一些限制会对elasticsearch服务有重要的影响
A 资源限制:ulimit
作用:资源限制 (如文件描述述最大数量等)
- 临时修改:
ulimit -n 65535 -u 4096
- 永久修改:修改
/etc/security/limits.conf
# <domain> <type> <item> <value>
* hard nofile 65535
* soft nofile 65535
* hard nproc 4096
* soft nproc 4096
列编号 | 列标识 | 含义 | 备选项 |
---|---|---|---|
第1列 | domain | 被限制的对象 | 用户名 : 对某个用户限制 用户组名: 对某个用户组限制 * : 对所有用户都限制 |
第2列 | type | 限制的类型 | soft : 软限制(超过限制会有警告) hard : 硬性限制(不能超过的限制) |
第3列 | item | 被限制的资源 | core : 程序运行出现段错误生成的coredump文件最大大小 (KB) data:最大数据大小 (KB) fsize : 最大文件大小 (KB) memlock : 最大locked-in-memory地址空间 (KB) nofile: 打开的文件描述符最大数量限制 rss:最大的resident set大小 (KB) stack : 栈最大大小 (KB) cpu : 占用CPU最大时间 (分钟) nproc : 最大进程数量 as : 地址空间限制 (KB) maxlogins : 当前用户最多登录次数 maxsyslogins : 当前系统最多登录次数 priority : 运行用户进程的优先级 locks: 用户最多可持有的文件锁的数量 sigpending:最大的pending signals的数目 msgqueue : POSIX消息队列可用的最大内存容量(bytes) nice :允许提高到的最大优先级 - rtprio:最大实时优先级 chroot :更改根目录 |
第4列 | value | 限制值 |
B.禁用内存交换 swappiness
内存交换是指当内存不够用时,把内存中某些数据存储到磁盘上
- 临时禁用
sudo swapoff -a
- 永久禁用
修改 /etc/sysctl.conf
文件,添加以下内容:
vm.swappiness=1
C.虚拟内存设置
- 临时设置
sysctl -w vm.max_map_count=262144
- 永久禁用
修改 /etc/sysctl.conf
文件,添加以下内容:
vm.max_map_count=262144
D.关闭防火墙
systemctl stop firewalld.service
注,如果想永久关闭防火墙,使用
systemctl disable firewalld.service
5.启动elasticsearch
su elastic
cd /opt/elasticsearch
bin/elasticsearch -d
主要启动参数
- d : 以后台进程的方式启动
- p : 指定存入elasticsearch进程号的文件地址
- E key=value : 指定配置参数
6.重新设置elasticsearch的密码
- 首先要关闭https访问
- 重置密码
./elasticsearch-reset-password -u elastic -i
- 根据提示重置密码即可
注:如果配置了https证书,可以将https启用配置打开
二.配置集群
1.按照第一个个步骤安装配置各节点
(1)节点如下
在以下节点安装elasticsearch以及需要的第三方插件
节点名称 | 节点IP | 节点角色 | 其他说明 |
---|---|---|---|
node-200 | 192.168.0.200 | 数据节点 1 + 主节点1 | |
node-201 | 192.168.0.201 | 数据节点 2 + 主节点2 | |
node-202 | 192.168.0.202 | 数据节点 3 + 主节点3 | |
node-203 | 192.168.0.203 | 协调节点1 | |
node-204 | 192.168.0.204 | 协调节点2 | |
node-205 | 192.168.0.205 | 协调节点3 |
节点角色说明:
- 主节点是管理集群状态的(对所有资源要求都不高)
- 协调节点是接受客户端请求并分发到相应数据节点的,并合并搜索结果(对网络资源要求高,对CPU和内存也有一定的要求)
- 数据节点是读写数据的(对内存、CPU和IO要求高)
注:一般来说,在生产环境中,为了节省资源一个节点一般都是有多个角色,很少将节点作为单一角色来使用
- 最小的集群:将一个节点当作所有角色来使用(每个节点既是数据节点,也是主节点和协调节点)
- 初等规模:分成主节点和其他节点(数据节点也是协调节点);分成协调节点和其他节点(数据节点也是主节点);
- 中高等规模:将数据节点、主节点和协调节点分开
(2)为elasticseach新增管理用户
useradd elastic
chown -R elastic:elastic /opt/elasticsearch
2.在每个节点上都打开以下配置
(1)在每个节点上加入以入以下配置
cluster.name: search-center
path.data: /home/elastic/data
path.logs: /var/log/elasticsearch
network.host: 192.168.0.200
discovery.seed_hosts: ["192.168.0.200:9300", "192.168.0.201:9300","192.168.0.202:9300","192.168.0.203:9300","192.168.0.204:9300","192.168.0.205:9300"]
cluster.initial_master_nodes: ["192.168.0.200:9300", "192.168.0.201:9300","192.168.0.202:9300"]
注:
node.name
:每个节点要改成对应节点的名称network.host
:每个节点要改成对应节点的主机名或IPdiscovery.seed_hosts
:集群中的节点列表cluster.initial_master_nodes
:集群初始化时主节点列表
(2)在主节点上加入以下配置
在3个主节点上配置如下
node.roles: [master]
- 注:如果
node.roles
原来有其他角色,要合并到一起,如原来是data节点,那么就设置为[data,master]
(3)在所有协调节点上配置
node.roles:[]
- 注:没有任何指定角色的节点就是协调节点(默认所有的节点都是协调节点)
(4)在所有数据节点上加入以下配置
node.roles: [data]
- 注:如果
node.roles
原来有其他角色,要合并到一起,如原来是master节点,那么就设置为[master,data]
3.启动各节点
-
依次启动各节点,如果节点启动失败,可根据错误来进行处理
-
通过
ip:9200
的形式在浏览器中访问,查看各节点是否启动成功
如 http://192.168.0.200:9200
,如果可以成功访问说明启动成功
4.检测集群是否搭建成功
(1)在浏览器直接查看
官网下载kibana即可(需要与elasticsearch版本对应)
kibana配置中elasticsearch的地址只需要写集群中的某个节点的地址即可
查看节点情况:
http://192.168.0.200:9200/_cat/nodes
结果类似于:
# host load role master nodeName
192.168.0.201 33 96 1 0.19 0.18 0.19 dim - node-201
192.168.0.200 22 94 0 0.13 0.22 0.18 dim * node-200
192.168.0.202 16 81 1 0.18 0.32 0.20 dim - node-202
192.168.0.205 17 96 1 0.40 0.32 0.19 - - node-205
192.168.0.203 15 78 1 0.27 0.34 0.22 - - node-203
192.168.0.204 15 95 0 0.48 0.45 0.25 - - node-204
注:
- role那一行中,是多个角色的组合
- d: 数据节点(data)
- i: 预处理节点(ingest)
- m: 主节点备选节点(master)
- master那一行,表示当前节点是否为主节点
*
: 是主节点-
: 不是主节点
(2)通过cerebro查看集群情况
注:cerebro是一个操作cerebro的界面操作工具(github中搜索即可)
首先,添加一个索引,并设置几条数据
POST _bulk
{"create":{"_index":"commodity_item","_id":1}}
{"id":1,"name":"华为p40"}
{"create":{"_index":"commodity_item","_id":2}}
{"id":2,"name":"魅族18"}
{"create":{"_index":"commodity_item","_id":3}}
{"id":3,"name":"苹果12"}
- 分片情况
a.和我们预想的一样,数据都分布到了数据节点上,没有分布到coordinating节点上
b.因为设置了3个分片,共3个节点(虚线是副本分片;实线为主分片)
配置集群2
1、准备
ES集群至少需要三台服务器:
192.168.100.230 master
192.168.100.231 slave1
192.168.100.232 slave2
2、配置
1、192.168.100.230 master 配置
cluster.name: es-sassycoder #配置elasticsearch的集群名称,默认是my-application。建议修改成一个有意义的名称。
node.name: es-node-230 #节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
network.host: 0.0.0.0 #绑定ip地址
http.port: 9200 #暴露的http端口
transport.profiles.default.port: 9300 #内部通信端口
path.data: /usr/local/elasticsearch-8.3.1/data #索引目录
path.logs: /usr/local/elasticsearch-8.3.1/logs #日志目录
# 允许通配符删除索引
action.destructive_requires_name: true
# 配置集群初始时,作为master的主机,单节点时配置本节点名称(node.name)
# 必须使用完整的 node.name
# 重新启动集群或向现有集群添加新节点时,不要使用此设置
cluster.initial_master_nodes: ["es-node-230"]
# 配置启动时要发现的master列表(IP 或 可解析的域名),端口默认为9300
# 单节点时不用配置或配置为本节点IP
discovery.seed_hosts: ["192.168.100.230:9300","192.168.100.231:9300","192.168.100.232:9300"]
#使用head等插件监控集群信息,需要打开以下配置项
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically
# generated to configure Elasticsearch security features on 04-07-2022 09:25:53
#
# --------------------------------------------------------------------------------
# Enable security features
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: false
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
2、192.168.100.231 slave1配置
cluster.name: es-sassycoder #配置elasticsearch的集群名称,默认是my-application。建议修改成一个有意义的名称。
node.name: es-node-231 #节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
network.host: 0.0.0.0 #绑定ip地址
http.port: 9200 #暴露的http端口
transport.profiles.default.port: 9300 #内部通信端口
path.data: /usr/local/elasticsearch-8.3.1/data #索引目录
path.logs: /usr/local/elasticsearch-8.3.1/logs #日志目录
# 允许通配符删除索引
action.destructive_requires_name: true
# 配置集群初始时,作为master的主机,单节点时配置本节点名称(node.name)
# 必须使用完整的 node.name
# 重新启动集群或向现有集群添加新节点时,不要使用此设置
#cluster.initial_master_nodes: ["es-node-230","es-node-231","es-node-232"]
# 配置启动时要发现的master列表(IP 或 可解析的域名),端口默认为9300
# 单节点时不用配置或配置为本节点IP
discovery.seed_hosts: ["192.168.100.230:9300","192.168.100.231:9300","192.168.100.232:9300"]
#使用head等插件监控集群信息,需要打开以下配置项
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically
# generated to configure Elasticsearch security features on 04-07-2022 09:25:53
#
# --------------------------------------------------------------------------------
# Enable security features
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: false
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
3、192.168.100.232 slave2配置
cluster.name: es-sassycoder #配置elasticsearch的集群名称,默认是my-application。建议修改成一个有意义的名称。
node.name: es-node-232 #节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理
network.host: 0.0.0.0 #绑定ip地址
http.port: 9200 #暴露的http端口
transport.profiles.default.port: 9300 #内部通信端口
path.data: /usr/local/elasticsearch-8.3.1/data #索引目录
path.logs: /usr/local/elasticsearch-8.3.1/logs #日志目录
# 允许通配符删除索引
action.destructive_requires_name: true
# 配置集群初始时,作为master的主机,单节点时配置本节点名称(node.name)
# 必须使用完整的 node.name
# 重新启动集群或向现有集群添加新节点时,不要使用此设置
#cluster.initial_master_nodes: ["es-node-232"]
# 配置启动时要发现的master列表(IP 或 可解析的域名),端口默认为9300
# 单节点时不用配置或配置为本节点IP
discovery.seed_hosts: ["192.168.100.230:9300","192.168.100.231:9300","192.168.100.232:9300"]
#使用head等插件监控集群信息,需要打开以下配置项
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically
# generated to configure Elasticsearch security features on 05-07-2022 07:55:16
#
# --------------------------------------------------------------------------------
# Enable security features
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: false
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
启动过程如果有报错,先把elasticsearch/data目录下的文件全部删除,再试试。
签发CA
签发CA证书(一直回车)
sh /usr/local/setup/elasticsearch-8.6.2/bin/elasticsearch-certutil ca
签发节点证书(一直回车)
sh /usr/local/setup/elasticsearch-8.6.2/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
创建好的ca证书和server证书默认名称为elastic-stack-ca.p12和elastic-certificates.p12,存放在$ES_HOME目录。
cd /usr/local/setup/elasticsearch-8.6.2/config
mv /usr/local/setup/elasticsearch-8.6.2/elastic-*.p12 /usr/local/setup/elasticsearch-8.6.2/config/certs/
将证书发送到另外两个节点。
scp /usr/local/setup/elasticsearch-8.6.2/config/certs/elastic-* node2:/usr/local/setup/elasticsearch-8.6.2/config/certs
scp /usr/local/setup/elasticsearch-8.6.2/config/certs/elastic-* node3:/usr/local/setup/elasticsearch-8.6.2/config/certs/
再次修改配置文件
vi /usr/local/setup/elasticsearch-8.6.2/config/elasticsearch.yml
#启用节点上Elastic Search的xpack安全功能
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
参考
https://www.cnblogs.com/tanghaorong/p/16324481.html
ElasticSearch 8.5 安装及集群搭建 诗心博客
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫