网上查询了一下Elasticsearch,这里终结一下,仅供参考。
Elasticsearch,简称为ES。 ES是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据。
Elasticsearch是面向文档的一种数据库,这意味着其不再需要行列式的表格字段约束。
ES会存储整个构造好的数据或文档,然而不仅仅是储存数据,这使得文档中每个数据可以被标识,进而可以被检索。在ES中,执行index,search,sort或过滤文档等操作都不是传统意义上的行列式的数据。
ES从根本上对数据的不同思考方式也正是他能应对复杂数据结构的全文检索的原因之一。
模糊查询
数据库的select * from user where name like 'xxx':
mysql中like进行模糊查询时,如果用前导模糊查询"%程序控"则不会走索引,如果用非前导模糊查询"程序控%"则会走索引。
=》
正排索引存储会以ID作为索引,来查询相应的数据。如果数据量很大,则会导致经常性的全表扫描。
=》
倒排索引。
结果排序
搜索引擎肯定是根据用户搜索得出最符合用户搜索条件的放在最前面,这一点数据库是无法支持的,es中会根据搜索的数据的评分进行排序,越符合条件评分越高,原生支持这一点。
正向索引 VS 倒排索引
以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。
由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率
架构优势
分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
负载再平衡和路由在大多数情况下自动完成。
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)。
支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。
为什么可以实现快速的“模糊匹配”/“相关性查询”? =》分词 + 倒排索引
在所有节点上安装elasticsearch及插件
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
国内下载地址(elasticsearch中文社区下载地址):下载中心 - Elastic 中文社区
这里以linux系统为例:
tar -zxvf elasticsearch-8.5.1-linux-x86_64.tar.gz
mv elasticsearch-8.5.1-linux-x86_64 /opt/elasticsearch
useradd elastic
chown -R elastic:elastic /opt/elasticsearch
elasticsearch.yml
: elasticsearch服务相关的配置jvm.options
: elasticsearch的JAVA虚拟机相关的配置cluster.name: search-center
node.name: node-200
path.data: /home/elastic/data
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 192.168.0.200
http.port: 9200
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)
-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
elasticsearch是运行于操作系统这个大容器中,因此系统中对资源的一些限制会对elasticsearch服务有重要的影响
A 资源限制:ulimit
作用:资源限制 (如文件描述述最大数量等)
ulimit -n 65535 -u 4096
/etc/security/limits.conf
# -
* 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
su elastic
cd /opt/elasticsearch
bin/elasticsearch -d
主要启动参数
xpack.security.http.ssl:
enabled: false
./elasticsearch-reset-password -u elastic -i
注:如果配置了https证书,可以将https启用配置打开
在以下节点安装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 |
节点角色说明:
注:一般来说,在生产环境中,为了节省资源一个节点一般都是有多个角色,很少将节点作为单一角色来使用
useradd elastic
chown -R elastic:elastic /opt/elasticsearch
cluster.name: search-center
# 改成每个节点的名称
node.name: node-200
path.data: /home/elastic/data
path.logs: /var/log/elasticsearch
#改成每个的IP或主机名
network.host: 192.168.0.200
http.port: 9200
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
:集群初始化时主节点列表在3个主节点上配置如下
node.roles: [master]
node.roles
原来有其他角色,要合并到一起,如原来是data节点,那么就设置为[data,master]
node.roles:[]
node.roles: [data]
node.roles
原来有其他角色,要合并到一起,如原来是master节点,那么就设置为[master,data]
依次启动各节点,如果节点启动失败,可根据错误来进行处理
通过ip:9200
的形式在浏览器中访问,查看各节点是否启动成功
如 http://192.168.0.200:9200
,如果可以成功访问说明启动成功
官网下载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
注:
*
: 是主节点-
: 不是主节点注:cerebro是一个操作cerebro的界面操作工具(github中搜索即可)
首先,添加一个索引,并设置几条数据
PUT commodity_item
{
"mappings": {
"properties": {
"id":{
"type":"long"
},
"name":{
"type":"text"
}
}
},
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"aliases": {
"item": {}
}
}
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个节点(虚线是副本分片;实线为主分片)
ES集群至少需要三台服务器:
192.168.100.230 master
192.168.100.231 slave1
192.168.100.232 slave2
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 -------------------------
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 -------------------------
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目录下的文件全部删除,再试试。
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
mkdir certs
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 安装及集群搭建 诗心博客
Elasticsearch 8 集群配置_elasticsearch8 群指定配置文件方式启动-CSDN博客
Elastic Search 8.6.2集群安装部署 - 知乎