全栈开发之ElasticSearch8.0分布式搜索引擎集群及其高可用测试

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 全栈开发之ElasticSearch8.0分布式搜索引擎集群及其高可用测试

背景


如今人们的行为在网络中的各类系统中留下了清晰的足迹,各行各业的数据都在源源不断地产生着:收集的日志数据越积越多,用户的订单数据越来越多,网络爬取得到的数据不断增长,在这些可能用到搜索引擎的场景中,将搜索服务升级为集群以保证高可用是不得不面临的一个操作。好在 ElasticSearch 本身具备极为强大的横向扩展能力,所以这项工作操作起来并不太难。


学习一项新技术,实践是最好的方式,这不, ElasticSearch 8.0来了;今天就来试试 ElasticSearch 的分布式集群搭建,并验证其高可用。

image.png


系统环境


在三台虚拟主机上,搭建3个节点的 ElasticSearch 的搜索引擎集群,三台主机配置相同,主机信息如下:

[root@hadoop1 local]# uname -a
Linux hadoop1 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@hadoop1 local]# cat /proc/version
Linux version 3.10.0-1127.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Mar 31 23:36:51 UTC 2020
[root@hadoop1 local]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
内存:4G
处理器:2*2
硬盘:100G

Note:三台主机的名称分别为 hadoop1hadoop2hadoop3


集群配置


ElasticSearch 8.0的集群配置相对更方便一些,只需要将第一个实例上生成的 enrollment token 附带上,在后续的两个节点上执行启动命令即可。


其实在第一个 ElasticSearch 实例运行成功后,控制台输出了以下内容:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Elasticsearch security features have been automatically configured!
✅ Authentication is enabled and cluster connections are encrypted.
Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  9SWTTFDuibtaS2*L0NRv
HTTP CA certificate SHA-256 fingerprint:
  75480a9fc93649e2ebd8dd0a9f0721247e8cff32fdbc78abf0b30d7ac9c8e8bd
Configure Kibana to use this cluster:
• Run Kibana and click the configuration link in the terminal when Kibana starts.
• Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
  eyJ2ZXIiOiI4LjAuMCIsImFkciI6WyIxOTIuMTY4LjQ0LjEyNzo5MjAwIl0sImZnciI6Ijc1NDgwYTlmYzkzNjQ5ZTJlYmQ4ZGQwYTlmMDcyMTI0N2U4Y2ZmMzJmZGJjNzhhYmYwYjMwZDdhYzljOGU4YmQiLCJrZXkiOiJWYjg0RW44QnVQdHBqaU9BTUgxZjpnNFpjeUFDWVJYQ2xLRVp2eXF3U3RBIn0=
Configure other nodes to join this cluster:
• On this node:
  ⁃ Create an enrollment token with `bin/elasticsearch-create-enrollment-token -s node`.
  ⁃ Uncomment the transport.host setting at the end of config/elasticsearch.yml.
  ⁃ Restart Elasticsearch.
• On other nodes:
  ⁃ Start Elasticsearch with `bin/elasticsearch --enrollment-token <token>`, using the enrollment token that you generated.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

其中,写明了构建集群的步骤:


  • 在第一个实例上的操作:


  1. 先在第一个实例上创建enrollment token
  2. 将配置文件config/elasticsearch.yml中的transport.host取消注释;
  3. 重启当前实例;


  • 在后续节点上执行启动命令,附带enrollment token: bin/elasticsearch --enrollment-token <token>


至此,集群配置完成。

image.png

  • 完整搭建过程


在三个节点上执行以下命令完成,下载、安装、启动。

[root@hadoop1 ~]# cd /usr/local/
[root@hadoop1 local]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.0.0-linux-x86_64.tar.gz
[root@hadoop1 local]# tar -xvf elasticsearch-8.0.0-linux-x86_64.tar.gz
[root@hadoop1 local]# mv elasticsearch-8.0.0 elasticsearch
[root@hadoop1 local]# cd elasticsearch
# 添加用户es-admin
[root@hadoop1 elasticsearch]# useradd es-admin
# 赋予对elasticsearch目录的权限
[root@hadoop1 elasticsearch]# chown -R es-admin:es-admin /usr/local/elasticsearch
# 切换至es-admin
[root@hadoop1 elasticsearch]# su es-admin
# 切换至root
[es-admin@hadoop1 elasticsearch]$ exit
exit
# 编辑vi /etc/security/limits.conf,在最后添加以下内容,注意要退出root用户重新登录后才会生效
[root@hadoop1 elasticsearch]# vi /etc/security/limits.conf
*               soft    nofile          65536
*               hard    nofile          65536
# 编辑vi /etc/sysctl.conf,在最后添加:
[es-admin@hadoop1 elasticsearch]$ vi /etc/sysctl.conf
vm.max_map_count = 262144
# 记得使用sysctl -p刷新配置文件
[root@hadoop1 elasticsearch]# sysctl -p
# 切换到es-admin用户
[root@hadoop1 elasticsearch]# su es-admin
# 尝试启动ElasticSearch
[es-admin@hadoop1 elasticsearch]$ ./bin/elasticsearch
  • 后续节点加入过程
# 在第一个实例上执行获取token
[root@hadoop1 elasticsearch]# ./bin/elasticsearch-create-enrollment-token -s node
warning: ignoring JAVA_HOME=/usr/local/jdk; using bundled JDK
eyJ2ZXIiOiI4LjAuMCIsImFkciI6WyIxOTIuMTY4LjQ0LjEyNzo5MjAwIl0sImZnciI6Ijc1NDgwYTlmYzkzNjQ5ZTJlYmQ4ZGQwYTlmMDcyMTI0N2U4Y2ZmMzJmZGJjNzhhYmYwYjMwZDdhYzljOGU4YmQiLCJrZXkiOiJYS2JXRlg4QlQyWXhuck1FTlRpdTpyeW9qSF92T1MzNnNOQ05ZQUh5d0pRIn0=
# 传输到第2台服务器hadoop2
[root@hadoop1 local]# scp elasticsearch-8.0.0-linux-x86_64.tar.gz root@hadoop2:/usr/local/
Warning: Permanently added the ECDSA host key for IP address '192.168.44.130' to the list of known hosts.
elasticsearch-8.0.0-linux-x86_64.tar.gz       100%  491MB  68.1MB/s   00:07 
# 传输到第3台服务器hadoop3
[root@hadoop1 local]# scp elasticsearch-8.0.0-linux-x86_64.tar.gz root@hadoop3:/usr/local/
# 在后续实例上,第一次启动时,附带token
[root@hadoop2 elasticsearch]# su es-admin
[es-admin@hadoop2 elasticsearch]$ ./bin/elasticsearch --enrollment-token eyJ2ZXIiOiI4LjAuMCIsImFkciI6WyIxOTIuMTY4LjQ0LjEyNzo5MjAwIl0sImZnciI6Ijc1NDgwYTlmYzkzNjQ5ZTJlYmQ4ZGQwYTlmMDcyMTI0N2U4Y2ZmMzJmZGJjNzhhYmYwYjMwZDdhYzljOGU4YmQiLCJrZXkiOiJYS2JXRlg4QlQyWXhuck1FTlRpdTpyeW9qSF92T1MzNnNOQ05ZQUh5d0pRIn0=


高可用测试


通过以下两个接口确定集群的状态(Note:以下是三个节点构成的集群的状态信息),在测试之前可以导入部分数据更直观地测试读、写可用性。

image.png

192.168.44.130 32 92  5 0.10 0.33 0.32 cdfhilmrstw - hadoop2
192.168.44.127 40 94 11 0.35 0.49 0.53 cdfhilmrstw * hadoop1
192.168.44.132 47 97  4 0.21 0.20 0.23 cdfhilmrstw - hadoop3

结果中:*代表 master 节点;-代表 slave 节点。


<!-- https://hadoop1:9200/_cat/health -->
1645340882 07:08:02 elasticsearch green 3 3 26 13 0 0 0 0 - 100.0%

// https://hadoop1:9200/_cluster/health
{
    "cluster_name": "elasticsearch",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 3,
    "number_of_data_nodes": 3,
    "active_primary_shards": 13,
    "active_shards": 26,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 100.0
}

结果中:关注颜色状态green : 有完整的主版本和副本,一切正常;yellow : 数据完整,但是没有完整的副本,相当于警告;red : 数据不完整,部分主分片不可用,相当于故障;


停掉一个从节点


这里我们停掉第3个节点,即 hadoop3 上的 ElasticSearch 服务,查看集群状态,此时变为2个节点的集群,状态为 yellow



192.168.44.127 38 81 4 0.11 0.32 0.43 cdfhilmrstw * hadoop1
192.168.44.130  7 92 3 0.11 0.28 0.29 cdfhilmrstw - hadoop2
1645341764 07:22:44 elasticsearch yellow 2 2 18 13 0 0 8 0 - 69.2%


再停掉一个从节点


这里我们继续停掉第2个节点,即 hadoop2 上的 ElasticSearch 服务,查看集群状态,此时变为单节点的集群,状态为未连接,即不可用。


{
    "error": {
        "root_cause": [
            {
                "type": "master_not_discovered_exception",
                "reason": null
            }
        ],
        "type": "master_not_discovered_exception",
        "reason": null
    },
    "status": 503
}
{
    "error": {
        "root_cause": [
            {
                "type": "master_not_discovered_exception",
                "reason": null
            }
        ],
        "type": "master_not_discovered_exception",
        "reason": null
    },
    "status": 503
}


仅停掉主节点


我们启动停止的 hadoop2hadoop3 上的 ElasticSearch 服务(直接使用 ./bin/elasticsearch 启动服务即可,仅在第一次启动加入集群时需要附带 enrollment token ),先看下状态信息。


192.168.44.130 31 95 8 0.41 0.55 0.39 cdfhilmrstw * hadoop2
192.168.44.132  6 96 6 1.44 0.57 0.32 cdfhilmrstw - hadoop3
192.168.44.127 44 80 4 0.16 0.18 0.27 cdfhilmrstw - hadoop1
1645342672 07:37:52 elasticsearch green 3 3 26 13 0 0 0 0 - 100.0%


我们发现 master 节点发生了变化:由开始的hadoop1变为hadoop2。

那么这时,我们停掉master节点hadoop2进行测试,查看集群状态,此时变为2个节点的集群,状态为 yellow ;另外需要注意的是,群龙不可无首,国不可一日无君,那么一个集群必须要有一个master。


192.168.44.127 24 86 17 0.37 0.88 0.82 cdfhilmrstw * hadoop1
192.168.44.132 37 96 15 0.48 0.65 0.48 cdfhilmrstw - hadoop3
1645344470 08:07:50 elasticsearch yellow 2 2 18 13 0 0 8 0 - 69.2%

我们可以看到 hadoop1 又成了 master ,即当我们停掉原来的 master 后,会自动选举出新的 master


小总结


ElasticSearch 8.0的集群搭建更便捷,只需要将第一个实例上生成的 enrollment token 附带上,在后续的两个节点上执行启动命令即可。


  1. ES集群扩容极其便捷;
  2. 数据分片,可以避免单点故障;
  3. 实现负载均衡,应对高并发场景。
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
16天前
|
存储 分布式计算 分布式数据库
【专栏】云计算与分布式系统架构在数字化时代的关键作用。云计算,凭借弹性、可扩展性和高可用性,提供便捷的计算环境
【4月更文挑战第27天】本文探讨了云计算与分布式系统架构在数字化时代的关键作用。云计算,凭借弹性、可扩展性和高可用性,提供便捷的计算环境;分布式系统架构则通过多计算机协同工作,实现任务并行和容错。两者相互依存,共同推动企业数字化转型、科技创新、公共服务升级及数字经济发展。虚拟化、分布式存储和计算、网络技术是其核心技术。未来,深化研究与应用这些技术将促进数字化时代的持续进步。
|
2天前
|
存储 自然语言处理 搜索推荐
分布式搜索引擎ElasticSearch
Elasticsearch是一款强大的开源搜索引擎,用于快速搜索和数据分析。它在GitHub、电商搜索、百度搜索等场景中广泛应用。Elasticsearch是ELK(Elasticsearch、Logstash、Kibana)技术栈的核心,用于存储、搜索和分析数据。它基于Apache Lucene构建,提供分布式搜索能力。相比其他搜索引擎,如Solr,Elasticsearch更受欢迎。倒排索引是其高效搜索的关键,通过将词条与文档ID关联,实现快速模糊搜索,避免全表扫描。
28 2
|
5天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
8 0
|
13天前
|
存储 搜索推荐 Java
Java远程连接本地开源分布式搜索引擎ElasticSearch
Java远程连接本地开源分布式搜索引擎ElasticSearch
|
1月前
|
监控 搜索推荐 安全
面经:Elasticsearch全文搜索引擎原理与实战
【4月更文挑战第10天】本文是关于Elasticsearch面试准备的博客,重点讨论了四个核心主题:Elasticsearch的分布式架构和数据模型、CRUD操作与查询DSL、集群管理与性能优化,以及安全与插件扩展。文中通过代码示例介绍了如何进行文档操作、查询以及集群管理,并强调理解Elasticsearch的底层原理和优化策略对面试和实际工作的重要性。
32 6
|
1月前
|
监控 数据可视化 搜索推荐
初识Elasticsearch:打造高效全文搜索与数据分析引擎
【4月更文挑战第7天】Elasticsearch,一款由Elastic公司开发的分布式搜索引擎,以其全文搜索和数据分析能力在全球范围内广泛应用。它基于Apache Lucene,支持JSON,适用于日志分析、监控等领域。Elasticsearch的亮点包括:精准快速的全文搜索,通过倒排索引和分析器实现;强大的数据分析与实时响应能力,提供丰富聚合功能;弹性扩展和高可用性,适应水平扩展和故障恢复;以及完善的生态系统,与Kibana、Logstash等工具集成,支持多种编程语言。作为大数据处理的重要工具,Elasticsearch在企业级搜索和数据分析中扮演关键角色。
29 1
|
2月前
|
存储 负载均衡 NoSQL
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
54 1
|
2月前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
43 1
|
2月前
|
存储 缓存 监控
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)
47 0
|
16天前
|
NoSQL Java 关系型数据库
【Redis系列笔记】分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
116 2

热门文章

最新文章