微前端架构如何改变企业的开发模式与效率提升
1879
2022-10-27
【超详细】手把手教你ElasticSearch集群搭建
ElasticSearch快速入门
1.1. 基本介绍
ElasticSearch特色Elasticsearch是实时的分布式搜索分析引擎,内部使用Lucene做索引与搜索
实时性:新增到 ES 中的数据在1秒后就可以被检索到,这种新增数据对搜索的可见性称为“准实时搜索”分布式:意味着可以动态调整集群规模,弹性扩容集群规模:可以扩展到上百台服务器,处理PB级结构化或非结构化数据各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作
Lucene是Java语言编写的全文搜索框架,用于处理纯文本的数据,但它只是一个库,提供建立索引、执行搜索等接口,但不包含分布式服务,这些正是 ES 做的
ElasticSearch使用场景ElasticSearch广泛应用于各行业领域, 比如维基百科, GitHub的代码搜索,电商网站的大数据日志统计分析, BI系统报表统计分析等。
ElasticSearch基本概念介绍
ElasticSearch | Relational Database |
Index | Database |
Type | Table |
Document | Row |
Field | Column |
Mapping | Schema |
Everything is indexed | Index |
Query DSL | SQL |
GET class="table-last-row" data-id="t1b895c3-Nq9uN74S" style="vertical-align: top; min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default;"> SELECT * FROM table... | |
PUT class="table-last-column table-last-row" data-id="t16089ba-UGG0XKKF" style="vertical-align: top; min-width: auto; overflow-wrap: break-word; margin: 4px 8px; border: 1px solid rgb(217, 217, 217); padding: 4px 8px; cursor: default;"> UPDATE table SET... |
索引(Index)相比传统的关系型数据库,索引相当于SQL中的一个【数据库】,或者一个数据存储方案(schema)。类型(Type)一个索引内部可以定义一个或多个类型, 在传统关系数据库来说, 类型相当于【表】的概念。文档(Document)文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,采用JSON格式表示。相当于传统数据库【行】概念集群(Cluster)集群是由一台及以上主机节点组成并提供存储及搜索服务, 多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。节点(Node)Node为集群中的单台节点,其可以为master节点亦可为slave节点(节点属性由集群内部选举得出)并提供存储相关数据的功能切片(shards)切片是把一个大文件分割成多个小文件然后分散存储在集群中的多个节点上, 可以将其看作mysql的分库分表概念。 Shard有两种类型:primary主片和replica副本,primary用于文档存储,每个新的索引会自动创建5个Primary shard;Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。
注意: ES7之后Type被舍弃,只有Index(等同于数据库+表定义)和Document(文档,行记录)。
1.2 ElasticSearch安装
-ElasticSearch服务-最新版ElasticSearch7.10.2:-xvf elasticsearch-7.10.2-linux-x86_64.tar.gz
ElasticSearch不能以Root身份运行, 需要单独创建一个用户
1. groupadd elsearch2. useradd elsearch -g elsearch -p elasticsearch3. chown -R elsearch:elsearch /usr/local/elasticsearch-7.10.2
执行以上命令,创建一个名为elsearch用户, 并赋予目录权限。修改配置文件vi config/elasticsearch.yml, 默认情况下会绑定本机地址, 外网不能访问, 这里要修改下:
# 外网访问地址network.host: 0.0.0.0
关闭防火墙
systemctl stop firewalld.servicesystemctl disable firewalld.service
指定JDK版本
最新版的ElasticSearch需要JDK11版本, -JDK11压缩包, 并进行解压。修改环境配置文件vi bin/elasticsearch-env参照以下位置, 追加一行, 设置JAVA_HOME, 指定JDK11路径。
JAVA_HOME=/usr/local/jdk-11.0.11# now set the path to javaif [ ! -z "$JAVA_HOME" ]; then JAVA="$JAVA_HOME/bin/java"else if [ "$(uname -s)" = "Darwin" ]; then # OSX has a different structure JAVA="$ES_HOME/jdk/Contents/Home/bin/java" else JAVA="$ES_HOME/jdk/bin/java" fifi
启动ElasticSearch
切换用户su elsearch以后台常驻方式启动bin/elasticsearch -d
问题记录出现max virtual memory areas vm.max_map_count [65530] is too low, increase to at least 错误信息修改系统配置:
vi /etc/sysctl.conf添加vm.max_map_count=655360执行生效sysctl -pvi /etc/security/limits.conf在文件末尾添加
* soft nofile 65536* hard nofile 131072* soft nproc 2048* hard nproc 4096elsearch soft nproc 125535elsearch hard nproc 125535
重新切换用户即可:su - elsearch
1.3 Kibana服务安装
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。
到官网-,Kibana安装包, 与之对应7.10.2版本, 选择Linux 64位版本-,并进行解压。
tar -xvf kibana-7.10.2-linux-x86_64.tar.gz
Kibana启动不能使用root用户, 使用上面创建的elsearch用户, 进行赋权:
chown -R elsearch:elsearch kibana-7.10.2-linux-x86_64
修改配置文件vi config/kibana.yml , 修改以下配置:
# 服务端口server.port: 5601# 服务地址server.host: "0.0.0.0"# elasticsearch服务地址elasticsearch.hosts: ["-q
看到以下日志, 代表启动正常
log [01:40:00.143] [info][listening] Server running at 要检查集群各节点的日志, 确保服务正常运行状态。访问服务 ES的基础操作
PUT orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 2 } }}
PUT orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 0 } }}
将分片数设为0, 再次查看, 则显示正常:
索引3.1 新建索引orders
## 创建索引PUT orders
3.2 查询索引orders
## 查询索引GET orders
通过查询命令, 能查看到对应信息, 默认分片数和副本数都为1:
"number_of_shards" : "1", ## 主分片数 "number_of_replicas" : "1", ## 副分片数
3.3 删除索引
## 删除索引 DELETE orders
3.4 索引的设置
## 设置索引 PUT orders { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 0 } } }
文档4.1 创建文档
## 创建文档,生成默认的文档idPOST orders/_doc{ "name": "袜子1双", "price": "200", "count": 1, "address": "北京市"}## 创建文档,生成自定义文档idPOST orders/_doc/1{ "name": "袜子1双", "price": "2", "count": 1, "address": "北京市"}
4.2 查询文档
## 根据指定的id查询GET orders/_doc/1## 根据指定条件查询文档GET orders/_search{ "query": { "match": { "address": "北京市" } }}## 查询全部文档GET orders/_search
4.3 更新文档
## 更新文档POST orders/_doc/1{ "price": "200"}## 更新文档POST orders/_update/1{ "doc": { "price": "200" }}
4.4 删除文档
## 删除文档DELETE orders/_doc/1
域对于映射,只能进行字段添加,不能对字段进行修改或删除,如有需要,则重新创建映射。
## 设置mapping信息PUT orders/_mappings{ "properties":{ "price": { "type": "long" } }}## 设置分片和映射PUT orders{ "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 0 } }, "mappings": { "properties": { "name": { "type": "text" }, "price": { "type": "long" }, "count": { "type": "long" }, "address": { "type": "text" } } }}
1.5 ES数据类型
整体数据类型结构:
String 类型主要分为text与keyword两种类型。两者区别主要在于能否分词。
text类型会进行分词处理, 分词器默认采用的是standard。keyword类型不会进行分词处理。在ES的倒排索引中存储的是完整的字符串。
Date时间类型数据库里的日期类型需要规范具体的传入格式, ES是可以控制,自适应处理。传递不同的时间类型:
PUT my_date_index/_doc/1{ "date": "2021-01-01" } PUT my_date_index/_doc/2{ "date": "2021-01-01T12:10:30Z" } PUT my_date_index/_doc/3{ "date": 1520071600001 }
查看日期数据:
GET my_date_index/_mapping
数据节点数据节点负责数据的存储和CRUD等具体操作,数据节点对机器配置要求比较高、,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统CPU、Memory和IO的性能消耗都很大。通常随着集群的扩大,需要增加更多的数据节点来提高可用性。数据节点的参数设置:
node.master = falsenode.data = true
客户端节点客户端节点不做候选主节点, 也不做数据节点的节点,只负责请求的分发、汇总等等,增加客户端节点类型更多是为了负载均衡的处理。
node.master = falsenode.data = false
提取节点(预处理节点)能执行预处理管道,有自己独立的任务要执行, 在索引数据之前可以先对数据做预处理操作, 不负责数据存储也不负责集群相关的事务。参数设置:
node.ingest = true
协调节点协调节点,是一种角色,而不是真实的Elasticsearch的节点,不能通过配置项来指定哪个节点为协调节点。集群中的任何节点,都可以充当协调节点的角色。当一个节点A收到用户的查询请求后,会把查询子句分发到其它的节点,然后合并各个节点返回的查询结果,最后返回一个完整的数据集给用户。在这个过程中,节点A扮演的就是协调节点的角色。ES的一次请求非常类似于Map-Reduce操作。在ES中对应的也是两个阶段,称之为scatter-gather。客户端发出一个请求到集群的任意一个节点,这个节点就是所谓的协调节点,它会把请求转发给含有相关数据的节点(scatter阶段),这些数据节点会在本地执行请求然后把结果返回给协调节点。协调节点将这些结果汇总(reduce)成一个单一的全局结果集(gather阶段) 。部落节点在多个集群之间充当联合客户端, 它是一个特殊的客户端 , 可以连接多个集群,在所有连接的集群上执行搜索和其他操作。 部落节点从所有连接的集群中检索集群状态并将其合并成全局集群状态。 掌握这一信息,就可以对所有集群中的节点执行读写操作,就好像它们是本地的。 请注意,部落节点需要能够连接到每个配置的集群中的每个单个节点。
2.2 ElasticSearch集群原理
2.2.1 集群分布式原理
ES集群可以根据节点数, 动态调整主分片与副本数, 做到整个集群有效均衡负载。
单节点状态下:
两个节点状态下, 副本数为1:
三个节点状态下, 副本数为1:
三个节点状态下, 副本数为2:
2.2.2 分片处理机制
设置分片大小的时候, 需预先做好容量规划, 如果节点数过多, 分片数过小, 那么新的节点将无法分片, 不能做到水平扩展, 并且单个分片数据量太大, 导致数据重新分配耗时过大。
假设一个集群中有一个主节点、两个数据节点。orders索引的分片分布情况如下所示:
PUT orders{ "settings":{ "number_of_shards":2, ## 主分片 2 "number_of_replicas":2 ## 副分片 4 }}
整个集群中存在P0和P1两个主分片, P0对应的两个R0副本分片, P1对应的是两个R1副本分片。
2.2.3 新建索引处理流程
写入的请求会进入主节点, 如果是NODE2副本接收到写请求, 会将它转发至主节点。主节点接收到请求后, 根据documentId做取模运算(外部没有传递documentId,则会采用内部自增ID),如果取模结果为P0,则会将写请求转发至NODE3处理。NODE3节点写请求处理完成之后, 采用异步方式, 将数据同步至NODE1和NODE2节点。
2.2.4 读取索引处理流程
读取的请求进入MASTER节点, 会根据取模结果, 将请求转发至不同的节点。如果取模结果为R0,内部还会有负载均衡处理机制,如果上一次的读取请求是在NODE1的R0, 那么当前请求会转发至NODE2的R0, 保障每个节点都能够均衡的处理请求数据。读取的请求如果是直接落至副本节点, 副本节点会做判断, 若有数据则返回,没有的话会转发至其他节点处理。
2.3 ElasticSearch集群部署规划
准备一台虚拟机:
192.168.116.140: Node-1 (节点一), 端口:9200, 9300
192.168.116.140: Node-2 (节点二),端口:9201, 9301
192.168.116.140: Node-3 (节点三),端口:9202, 9302
2.4 ElasticSearch集群配置
解压安装包:
mkdir /usr/local/clustercd /usr/local/clustertar -xvf elasticsearch-7.10.2-linux-x86_64.tar.gz
将安装包解压至/usr/local/cluster目录。修改集群配置文件:
vi /usr/local/cluster/elasticsearch-7.10.2-node1/config/elasticsearch.yml
192.168.116.140, 第一台节点配置内容:
# 集群名称cluster.name: my-application#节点名称node.name: node-1# 绑定IP地址network.host: 192.168.116.140# 指定服务访问端口9200# 指定API端户端调用端口transport.tcp.port: 9300#集群通讯地址discovery.seed_hosts: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#集群初始化能够参选的节点信息cluster.initial_master_nodes: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#开启跨域访问支持,默认为falsetrue##跨域访问允许的域名, 允许所有域名"*"
修改目录权限:
chown -R elsearch:elsearch /usr/local/cluster/elasticsearch-7.10.2-node1
复制ElasticSearch安装目录:复制其余两个节点:
cd /usr/local/clustercp -r elasticsearch-7.10.2-node1 elasticsearch-7.10.2-node2cp -r elasticsearch-7.10.2-node1 elasticsearch-7.10.2-node3
修改其余节点的配置:192.168.116.140 第二台节点配置内容:
# 集群名称cluster.name: my-application#节点名称node.name: node-2# 绑定IP地址network.host: 192.168.116.140# 指定服务访问端口9201# 指定API端户端调用端口transport.tcp.port: 9301#集群通讯地址discovery.seed_hosts: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#集群初始化能够参选的节点信息cluster.initial_master_nodes: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#开启跨域访问支持,默认为falsetrue##跨域访问允许的域名, 允许所有域名"*"
192.168.116.140 第三台节点配置内容:
# 集群名称cluster.name: my-application#节点名称node.name: node-3# 绑定IP地址network.host: 192.168.116.140# 指定服务访问端口9202# 指定API端户端调用端口transport.tcp.port: 9302#集群通讯地址discovery.seed_hosts: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#集群初始化能够参选的节点信息cluster.initial_master_nodes: ["192.168.116.140:9300", "192.168.116.140:9301","192.168.116.140:9302"]#开启跨域访问支持,默认为falsetrue##跨域访问允许的域名, 允许所有域名"*"
启动集群节点先切换elsearch用户, 在三台节点依次启动服务:
su elsearch/usr/local/cluster/elasticsearch-7.10.2-node1/bin/elasticsearch -d/usr/local/cluster/elasticsearch-7.10.2-node2/bin/elasticsearch -d/usr/local/cluster/elasticsearch-7.10.2-node3/bin/elasticsearch -d
注意: 如果启动出现错误, 将各节点的data目录清空, 再重启服务。集群状态查看集群安装与启动成功之后, 执行请求:ElasticSearch集群分片测试
修改kibana的配置文件,指向创建的集群节点:
elasticsearch.hosts: ["进入控制台:
orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 2 } }}
可以看到, 这次结果是正常:
集群并非可以随意增加副本数量, 创建索引(超出副本数量范围):
PUT orders{ "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 5 } }}
可以看到出现了yellow警告错误:
好了,至此ES集群搭建完毕,欢迎志同道合的小伙伴,一起交流学习成长。进阶架构师,Fighting!!!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~