前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【ES三周年】03-ElasticSearch环境

【ES三周年】03-ElasticSearch环境

原创
作者头像
传说之下的花儿
发布2023-04-11 19:43:20
3100
发布2023-04-11 19:43:20
举报

ElasticSearch环境

3.1 相关概念

3.1.1 单机&集群

单台ElasticSearch服务器提供服务,往往都有最大的承载能力,超过这个阈值,服务器性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中。

除了负载能力,单点服务器也存在其他问题:

  • 单台机器存储容量有量。
  • 单服务器容易出现单点故障,无法实现高可用。
  • 单服务的并发处理能力有限。

配置服务器集群时,集群中节点的数量没有限制,大于等于2个节点就可以看做是一个集群了。一般出于高性能及高可用方面来考虑集群节点数量都是3个以上。

3.1.2 集群 Cluster

一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。

一个Elasticsearch 集群有一个唯一的名字标识,这个名字默认就是"elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

3.1.3 Node 节点

集群中包括很多服务器,一个节点就是其中一个服务器。作为集群的一部分,它存储数据,参与集群的索引和搜索功能。

只要多个节点在同个网络中,节点就可以通过 指定集群的名称 加入其中,与集群中的其他节点相互感知。

和集群类似,一个节点也是由一个唯一名字来标识的。默认情况下,这个名字是一个随机的漫威漫画角色名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于 ES 集群中的哪些节点。

一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch"的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。

3.2 Windows集群部署

3.2.1 部署集群

  1. 创建elasticsearch-cluster文件夹,在内部复制3个ElasticSearch服务(将之前的单点解压缩的那个es文件夹复制过来)

点开之后会看到有data,logs两个文件夹,因为之前使用过,所以里面是有数据和日志的,因为我们需要用一个全新的集群环境,所以把data文件夹删除,logs文件夹清空。

然后就是进行配置,集群和单点是不一样的,单点直接双击elasticsearch.bat文件启动即可,但是集群的话是需要配置的。

打开elasticsearch.yml文件

修改的部分:

代码语言:yaml
复制
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
# 集群名称,必须要一致
cluster.name: my-application
代码语言:yaml
复制
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
# 节点名称,集群内要唯一
node.name: node-8001
node.master: true
node.data: true
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
代码语言:yaml
复制
# ---------------------------------- Network -----------------------------------
#
# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
# ip地址
network.host: localhost
# http端口
http.port: 8001
# tcp监听端口
transport.tcp.port: 9301
#
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:
#
#
代码语言:yaml
复制
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
# 跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

修改完之后:

进入bin目录,启动node-8001,可以看到:

然后打开postman,查询集群健康状态:

响应:

代码语言:json
复制
{
    "cluster_name": "my-application",
    "status": "green", // 可以看到为健康状态为绿色
    "timed_out": false,
    "number_of_nodes": 1, // 当前的节点为1个
    "number_of_data_nodes": 1, // 当前的数据节点为1个 
    "active_primary_shards": 1,
    "active_shards": 1,
    "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
}

如此复制一份,并命名node-8002,删除data目录,清空logs目录,修改elasticsearch.yml文件(添加到对应模块即可):

代码语言:yaml
复制
# ---------------------------------- Cluster -----------------------------------
# 集群名称,必须要一致
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
# 节点名称,集群内要唯一
node.name: node-8002
node.master: true
node.data: true
# ---------------------------------- Network -----------------------------------
# ip地址
network.host: localhost
# http端口
http.port: 8002
# tcp监听端口
transport.tcp.port: 9302
# --------------------------------- Discovery ----------------------------------
# discovery es中的一个特殊的查找模块,用来查找节点的。
# 你第一台机器启动就不用写了,因为他启动就他一个,但是第二台就需要,因为他要去找第一台去
# 9301为内部通讯端口,是第一台机器的tcp监听端口
discovery.seed_hosts: ["localhost:9301"]
discovery.zen.fd.ping_timeout: 1m
discovery.zne.fd.ping_retries: 5

# 跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

然后启动node-8002可以看到:

可以看到node-8001找到了node-8001服务。

使用postman,查询集群健康状态:

响应:

代码语言:json
复制
{
    "cluster_name": "my-application",
    "status": "green", // 健康状态为绿色
    "timed_out": false,
    "number_of_nodes": 2, // 当前集群中的节点为2个
    "number_of_data_nodes": 2, // 当前集群中的数据节点为2个
    "active_primary_shards": 1,
    "active_shards": 2,
    "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
}

如此同node-8002修改一份node-8003,删除data目录,清空logs目录,修改elasticsearch.yml:

代码语言:yaml
复制
# ---------------------------------- Cluster -----------------------------------
# 集群名称,必须要一致
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
# 节点名称,集群内要唯一
node.name: node-8003
node.master: true
node.data: true
# ---------------------------------- Network -----------------------------------
# ip地址
network.host: localhost
# http端口
http.port: 8003
# tcp监听端口
transport.tcp.port: 9303
# --------------------------------- Discovery ----------------------------------
# discovery es中的一个特殊的查找模块,用来查找节点的。
# 你第一台机器启动就不用写了,因为他启动就他一个,但是第二台就需要,因为他要去找第一台去
# 9301为内部通讯端口,是第一台机器的tcp监听端口
discovery.seed_hosts: ["localhost:9301","localhost:9302"]
discovery.zen.fd.ping_timeout: 1m
discovery.zne.fd.ping_retries: 5

# 跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

然后启动node-8003服务,可以看到:

启动成功:

使用postman,查询集群健康状态:

响应:

代码语言:json
复制
{
    "cluster_name": "my-application",
    "status": "green", // 健康状态为绿色
    "timed_out": false,
    "number_of_nodes": 3,  // 当前集群中的节点为3个
    "number_of_data_nodes": 3, // 当前集群中的数据节点为2个
    "active_primary_shards": 1,
    "active_shards": 2,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 2,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 43810,
    "active_shards_percent_as_number": 100.0
}

注意:

这种方式要按照顺序启动,如果修改了配置文件,需要删除data目录,重启elasticsearch

3.2.1.1 配置文件参考:
代码语言:yaml
复制
# 集群名称,必须要一致
cluster.name: my-application

# 节点名称,集群内要唯一
node.name: node-8001
node.master: true
node.data: true

# ip地址
network.host: localhost
# http端口
http.port: 8001
# tcp监听端口
transport.tcp.port: 9301

# 查找节点(第一个节点的配置文件无需添加)
discovery.seed_hosts: ["localhost:9301"]
discovery.zen.fd.ping_timeout: 1m
discovery.zne.fd.ping_retries: 5

# 集群内的可以被选为主节点的节点列表	
#cluster.initial_master_nodes: ["node-1","node-2","node-3"]

# 跨域配置
#action.destructive_requires_name: true
http.cors.enabled: true
http.cors.allow-origin: "*"
3.2.1.2 部署时遇到的异常:
代码语言:shell
复制
[2022-03-22T20:49:21,573][WARN ][o.e.c.c.ClusterFormationFailureHelper] [node-8001] master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [node-8001, node-8002, node-8003] to bootstrap a cluster: have discovered 
# master not discovered yet,此节点之前没有加入一个bootstrapped (v7+)集群,并且该节点必须发现主合格的节点[node-8001, node-8002, node-8003]来引导一个已经发现的集群

原因:

很多问题都出现在第一次配置失败。假如你Es项目路径下有建立了data的目录,那就要在每次改配置的时候去清掉里面的东西,像是缓存垃圾,导致后面每次修改都不生效。

解决方法:

关闭es,删除data目录,重启es

3.3 Linux 单节点部署

没有Java环境的,先部署java环境

Linux 部署java环境:https://blog.csdn.net/weixin_43520670/article/details/106344655

下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-0

/usr文件系统  

/usr 文件系统经常很大,因为所有程序安装在这里. /usr 里的所有文件一般来自Linux distribution;

本地安装的程序和其他东西在/usr/local 下.这样可能在升级新版系统或新distribution时无须重新安装全部程序.

/opt:用户级的程序目录

这里主要存放那些可选的程序。你想尝试最新的firefox测试版吗?那就装到/opt目录下吧,这样,当你尝试完,想删掉firefox的时候,你就可 以直接删除它,而不影响系统其他任何设置。安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。

  1. 下载后,使用xftp将压缩包上传到/usr/loca/applications
代码语言:shell
复制
cd /usr/local/applications
# 解压
tar zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz
# 删除压缩包
rm -f elasticsearch-7.8.0-linux-x86_64.tar.gz

这时候applications目录里会多个elasticsearch-7.8.0文件夹,如果嫌名字长,可以改了:

代码语言:shell
复制
mv elasticsearch-7.8.0 es
  1. 创建用户

因为安全问题,ElasticSearch 不允许root用户直接运行,

所以要创建新用户,在root用户中创建新用户:

代码语言:shell
复制
useradd user_es # 新增user_es用户
passwd user_es # 为user_es设置密码 020826

# userdel -r user_es #如果创建错了,可以删除
# 文件夹所有者
chown -R user_es /usr/local/applications/es
  1. 修改配置文件

修改/usr/local/applications/elasticsearch-7.8.0/config/elasticsearch.yml文件

代码语言:shell
复制
# 这是我的es配置文件的地方
vi /usr/local/applications/es/config/elasticsearch.yml

进去之后可以看到都是被注释的,添加以下配置:

代码语言:yaml
复制
# 集群名称
cluster.name: elasticsearch
# 节点名称
node.name: node-1
# 不管它
network.host: 0.0.0.0
# 端口号
http.port: 9200
# 设置主节点,把node-1节点设置为主节点
cluster.initial_master_nodes: ["node-1"]
  1. 修改/etc/security/limits.conf
代码语言:shell
复制
vi /etc/security/limits.conf
# 在文件末尾加入以下内容
# 每个进程可以打开的文件数的限制
user_es soft nofile 65536
user_es hard nofile 65536
  1. 修改/etc/security/limits.d/20-nproc.conf(这个文件我没有,新建的)
代码语言:shell
复制
vi /etc/security/limits.d/20-nproc.conf

user_es soft nofile 65536
user_es hard nofile 65536
# 操作系统级别对每个用户的创建的进程数的限制:
* hard nproc 4096
# * 代表Linux所有用户名
  1. 修改/etc/sysctl.conf(我设置之后启动报错)
代码语言:shell
复制
vi /etc/sysctl.conf
# 在文件中增加一下部分:
# 一个进程可以拥有的VMA(虚拟内存区域)的数量,默认为65536
vm.max_map_count=655360

重新加载:

代码语言:shell
复制
sysctl -p
  1. 启动ElasticSearch
代码语言:shell
复制
# 切换用户,不允许root用户启动es
su user_es
代码语言:shell
复制
cd /usr/local/applications/es
bin/elasticsearch
  1. 如果报错了,就查看上面步骤有哪里配置出错了,或者哪个字母错了,然后删除data目录,重新启动es即可。
  2. 服务器防火墙:

我这里使用的腾讯云的轻量级服务器,并且使用了宝塔,所以要在腾讯云和宝塔那里放行9200端口。

Postman发起GET请求:http://ip:9200/_cluster/health

响应:

代码语言:json
复制
{
    "cluster_name": "elasticsearch",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 1,
    "number_of_data_nodes": 1,
    "active_primary_shards": 0,
    "active_shards": 0,
    "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
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ElasticSearch环境
    • 3.1 相关概念
      • 3.1.1 单机&集群
      • 3.1.2 集群 Cluster
      • 3.1.3 Node 节点
    • 3.2 Windows集群部署
      • 3.2.1 部署集群
    • 3.3 Linux 单节点部署
    相关产品与服务
    Elasticsearch Service
    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档