ElasticSearch集群搭建图文解析

ElasticSearch集群搭建图文解析/前言/      ElasticSearch作为一个分布式搜索引擎有着广泛的应用场景,而搜索服务在在一个项目中的权重还是比较高的,所以我们要想办法去提高搜索服务的可用性,这就是ElasticSearch集群的作用,为搜索服务提供高可用的特性       何为高可用呢,其实就是字面意思,假设我们的搜索服务可以一直不停的提供服务,那么高可用性就是100%,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

/ 前言 /

       ElasticSearch作为一个分布式搜索引擎有着广泛的应用场景, 而搜索服务在在一个项目中的权重还是比较高的, 所以我们要想办法去提高搜索服务的可用性, 这就是ElasticSearch集群的作用, 为搜索服务提供高可用的特性

        何为高可用呢, 其实就是字面意思, 假设我们的搜索服务可以一直不停的提供服务, 那么高可用性就是100%, 如果一周之内停机了30分钟, 那可用性就是99.7%

        本文主要包含以下内容

ElasticSearch的信息存储机制
ElasticSearch的节点类型
ElasticSearch启动常见异常及解决方案
如何搭建ElasticSearch集群
如何关闭ElasticSearch服务(附Shell脚本)

/ 1 / 了解ElasticSearch

1 . 1 ElasticSearch版本的事情

这里我们重点关注7.x版本, 这个版本有俩个事情需要知道

  • 内置JDK(根据ES版本内置不同版本的JDK), 如7.7内置的就是JDK13
  • Security功能免费使用, 但是高级安全功能任然需要付费
1 . 2 集群如何保证数据不会丢失(信息存储机制)

我们知道宕机是无法避免的, 我们只能减小因宕机而造成的损失, 那么ElasticSearch集群是如何避免的呢?

我们需要先了解俩个概念, 分片(Shard)和副本(Replica)

  • 分片(Shard) : 我们知道ElasticSearch中会存在多个数据库, 每个数据库会生成5(默认)个分片, 数据存储在分片中, ElasticSearch会将分片均匀的分布在进群中, 避免一台主机宕机后数据无法访问
  • 副本(Replica) : 每个分片同时会生成一个副本, 副本的内容同分片一致, 分片和副本几乎不会被分配在同一台主机, 这样做是为了防止分片所在的主机和数据库所在的主机同时宕机后导致这部分数据无法访问

       总结来说就是ElasticSearch会为当前的数据库默认生成5个分片和5个副本, 副本是分片中数据的备份, ElasticSearch会将其尽可能的均匀分布开来, 分片和对应的副本尽量不会分配到同一台主机, 这样就可以保证即使有一台主机突然宕机了我还可以用过分片或者副本将数据还原

1 . 3 集群中的节点
  • 主节点(Master): 这个概念大家应该不陌生了, 它就相当于管理者, 负责管理集群, 分片和副本的分配也是它负责的, 没了管理者的后果是什么啊, 那就是分裂山头, 各自为王, 你不搭理我我不搭理你, 所以主节点非常重要, 一般都会有替补, 因为我们上面已经说过了, 宕机是不可避免的, 我们能做的只有尽量避免因宕机而造成的损失
  • 数据节点(Data) : 存储数据的节点, 负责数据的增删改查, 对内存及磁盘要求较高, 一般数据节点在集群中的占比最高
  • 路由/负载节点(client) : 负责搜索请求的分发, 协调节点将请求转发到保存数据的数据节点, 并将结果返回给路由节点, 减缓数据节点的压力, 一般在大型集群中可以看到 . 如果当前节点既不是主节点也不是数据节点, 那么就会成为路由节点
  • 部落节点(tribe) : 在7.x中被删除, 负责协调多个ES集群, 充当联络官, 会将所有集群合并为全局集群, 可以对全局集群中单独的节点执行本地读写操作, 但是无法操作全局集群中重复的索引
  • 提取节点(Ingest) : 负责对文档进行预处理操作, 例如进行数据转换, 将String转换为日期或是将整数/浮点数转换为字符串 . 默认情况下, 所有节点都支持提取功能

如何进行节点的配置

  • 一个节点 : 当前节点既是主节点也是数据节点
  • 3 – 5个节点 : 通常为所有节点都是数据存储节点, 并全部设置为主节点, 让集群自动选举. 也可以根据数据量和请求流量来进行拆分为单独的主节点及数据节点. 并且为了防止发生脑裂, 主节点数量必须>=((节点数量/2) + 1)
  • 6 – n : 拆分独立的主节点、数据节点、路由节点, 并且要保证主节点的数量, 防止发生脑裂

/ 2 / 搭建ElasticSearch集群

2 . 1 搭建前准备
  • 准备主机

    192.168.0.1
    192.168.0.2
    192.168.0.3
    192.168.0.4
    192.168.0.5
    
  • 主机之间相互可以ping通

  • 建议关闭所有主机的防火墙, 或者打开9200及9300的端口

  • ElasticSearch7.x以下版本需要准备JDK, 并且版本必须跟ElasticSearch对应

2 . 2 安装ElasticSearch

ElasticSearch官方下载地址

  • 下载安装包

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-linux-x86_64.tar.gz
    
  • 解压安装包

    # /opt是你指定的安装目录
    tar -xf elasticsearch-7.7.0-linux-x86_64.tar.gz -C /opt
    
  • 建立软链接

    # /elasticsearch是指定的软连接目录,可以为空,在建立软连接是自动创建
    ln -s /opt/elasticsearch-7.7.0   /opt/elasticsearch
    

    软连接建立失败的话elasticsearch文件夹是红色, 建立成功是蓝色的
    ElasticSearch集群搭建图文解析

2 . 3 修改配置文件

elasticsearch.yml

# 集群名称
cluster.name: es-cluster
  
# 节点名称,注意:同一集群内节点名称不能相同
node.name: "node-1"
  
# 当前节点是否是主节点
node.master: true
  
# 当前节点是否是数据节点
node.data: true
  
# 是否禁用提取节点
node.ingest: false
  
# 一台主机能运行的节点最大数量
node.max_local_storage_nodes: 1
  
# 集群中符合主节点条件的节点数量, 数量为(节点数量 / 2 + 1)
discovery.zen.minimum_master_nodes: 2
  
# 集群自举配置, 只在首次启动集群时游泳, 集群初始化时会读取该参数去寻找符合主节点条件的节点的主机名或 IP 地址
cluster.initial_master_nodes: ["node-1","node-2"]
#cluster.initial_master_nodes: ["192.168.0.1","192.168.232.137"]

# 绑定的ip地址,当前主机的ip地址
network.bind_host: 192.168.0.1
  
# 节点交互的端口,注意该端口仅负责节点之间交互,无法直接访问
transport.tcp.port: 9300
  
# 对外服务的端口,可以根据该端口查看当前节点状态和集群状态
http.port: 9200
  
# 是否允许跨域
http.cors.enabled: true
  
# 允许跨域的地址
http.cors.allow-origin: "http://192.168.0.1:8080"
  
# 集群中其它节点与当前节点通信的ip地址,可以设置为当前主机ip,也可根据实际情况设置
network.publish_host: 192.168.0.1
  
# 设置为当前主机ip不允许外网访问,想要允许外网访问可以设置为0.0.0.0
network.host: 192.168.0.1
  
# 所有的主节点列表, 用于被集群发现
discovery.zen.ping.unicast.hosts: ["192.168.0.1:9300","192.168.0.2:9300"]

不同的主机修改node.namenetwork.hostnetwork.bind_host即可

2 . 4 启动ElasticSearch

ElasticSearch从5.0版本开始就不允许再使用root用户启动服务了, 所以我们需要为单独创建一个用户用来启动ES

# 创建用户,除了root用户外,其余用户都可以存放在/home下
useradd -d /home/es es

# 赋予用户权限
chmod -R es /opt/elasticsearch

启动ElasticSearch

cd elasticsearch
# 切换为ES启动用户
su es
# 日志打印在终端中
./bin/elasticsearch

# 后台启动
./bin/elasticsearch -d

# 后台启动并将日志打印到文件中
nohup ./bin/elasticsearch -d &

启动时会输出一条日志, 无需理会

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.

验证是否启动

curl 192.168.0.1:9200
{ 
   
  "name" : "node-1",
  "cluster_name" : "es-cluster",
  "cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
  "version" : { 
   
    "number" : "7.4.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
    "build_date" : "2019-10-28T20:40:44.881551Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

当返回数据中cluster_uuid有值就代表着集群已经启动了

ElasticSearch常见启动异常及解决方案请看我的另一篇博文

ElasticSearch常见启动异常及解决方案

查看集群状态,数据太多了我们就只展示一部分

curl 192.168.0.1:9200/_cluster/state?pretty

{ 
   
  "cluster_name" : "es-cluster",
  "cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
  "version" : 23,
  "state_uuid" : "BBECx15qS5iEV8TQ36Lb4Q",
  # 主节点的uuid,我们可以看到当前主节点是node-2
  "master_node" : "jj2lwwPTT_-RC6Hj6Hv5Ww",
  "blocks" : { 
    },
  # 集群的全部节点
  "nodes" : { 
   
    "jj2lwwPTT_-RC6Hj6Hv5Ww" : { 
   
      "name" : "node-2",
      "ephemeral_id" : "F_pgnQRYS_2W7CR3f-L0BQ",
      "transport_address" : "192.168.232.137:9310",
      "attributes" : { 
   
        "ml.machine_memory" : "1019826176",
        "ml.max_open_jobs" : "20",
        "xpack.installed" : "true"
      }
    },
    "KfUN9MUtTGCM8qMpsWX-Zw" : { 
   
      "name" : "node-1",
      "ephemeral_id" : "mjcI-PyqRnukT15-KfxVLg",
      "transport_address" : "192.168.232.136:9310",
      "attributes" : { 
   
        "ml.machine_memory" : "1019826176",
        "ml.max_open_jobs" : "20",
        "xpack.installed" : "true"
      }
    }
  },
  "metadata" : { 
   
    "cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
    "cluster_coordination" : { 
   
      "term" : 2,
      "last_committed_config" : [
        "jj2lwwPTT_-RC6Hj6Hv5Ww"
      ],
      "last_accepted_config" : [
        "jj2lwwPTT_-RC6Hj6Hv5Ww"
      ],
      "voting_config_exclusions" : [ ]
    },
    ...
  }
  ...
}

/ 3 / 关闭ElasticSearch

ElasticSearch的关闭只能通过kill命令来杀掉ES的进程

ps -ef|grep elasticsearch
kill -9 12311

为大家提供一个Shell脚本来实现关闭ES

PID=$(ps -ef|grep elasticsearch|grep -v grep|awk '{print $2}')
if [ -z $PID ]; then
        echo "process elasticsearch not exist"
        exit
else
        echo "process id: $PID"
        kill -9 ${PID}
        echo "process elasticsearch killed"
fi

[es@node-1 opt]$ sh kill.sh
process id: 9292
process elasticsearch killed

参考文章 :

ElasticSearch官方文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182460.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • StartActivityForResult的用法「建议收藏」

    StartActivityForResult的用法「建议收藏」当一个OneActivity跳转到TwoActivity时,TwoActivity关闭时要把数据传回到OneActivity,这个时候就得用到StartActivityForResult。使用这个方法特别要注意的是:一个Activity中可能包含多个按钮,并调用多个startActivityForResult方法来打开不同的Activity处理业务,当这些新Activity关闭后,系统会调用前…

  • Ubuntu虚拟机蓝屏

    问题分析启动Ubuntu可以进入登录界面,但是系统界面蓝屏,说明系统是可以运行起来的。证明系统是没有问题的。应该是系统插件发生了错误。没有发生大块的核心数据损坏,linux系统一般都以修复,一定要淡定。解决方法问题是之前的暴力关机损坏了Ubuntu的图形系统配置,导致图形界面无法正常起来。所以就看到能够登录,却只有一片蓝色。问题解决这次要求助古老的字…

  • Data Mining资源大全

    Data Mining资源大全

  • 十天征服单片机百度云_郭天祥十天征服单片机视频下载地址

    十天征服单片机百度云_郭天祥十天征服单片机视频下载地址高级教材《十天学会单片机和C语言编程》ed2k://|file|[十天学会单片机和C语言编程].Lesson1.rar|449712628|262b8896ad6828cd33ed7189fe94cb2d|h=76MXIF34BFV3VUPLLBN3ASNOVCACHTO3|7b&Y0}8J9w,P0E:|-}’Oed2k://|file|[十天学会单片机和C语言编程]…

  • UVA 10600 ACM contest and Blackout(次小生成树)

    UVA 10600 ACM contest and Blackout(次小生成树)

  • 关于input type=“file”的及其files对象的深层探究

    关于input type=“file”的及其files对象的深层探究我们都知道,html5中有个inputtype=file元素。用该元素可以实现页面上传文件的功能但一般的做法只是简单的在表单中操作,我来研究一下深层东西想要了解它,就要知道它的内置对象,files页面上写一个input,然后选俩个图片,打印这个input对象$(“input[name=’file1′]”).change(function(e){console.log…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号