单台ElasticSearch服务器提供服务,往往都有最大的承载能力,超过这个阈值,服务器性能就会大大降低甚至不可用,所以生产环境中,一般都是运行在指定服务器集群中。
除了负载能力,单点服务器也存在其他问题:
配置服务器集群时,集群中节点的数量没有限制,大于等于2个节点就可以看做是一个集群了。一般出于高性能及高可用方面来考虑集群节点数量都是3个以上。
一个集群就是由一个或多个服务器节点组织在一起,共同持有整个的数据,并一起提供索引和搜索功能。
一个Elasticsearch 集群有一个唯一的名字标识,这个名字默认就是"elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
集群中包括很多服务器,一个节点就是其中一个服务器。作为集群的一部分,它存储数据,参与集群的索引和搜索功能。
只要多个节点在同个网络中,节点就可以通过 指定集群的名称 加入其中,与集群中的其他节点相互感知。
和集群类似,一个节点也是由一个唯一名字来标识的。默认情况下,这个名字是一个随机的漫威漫画角色名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于 ES 集群中的哪些节点。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch"的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。
elasticsearch-cluster
文件夹,在内部复制3个ElasticSearch服务(将之前的单点解压缩的那个es文件夹复制过来)点开之后会看到有data,logs两个文件夹,因为之前使用过,所以里面是有数据和日志的,因为我们需要用一个全新的集群环境,所以把data文件夹删除,logs文件夹清空。
然后就是进行配置,集群和单点是不一样的,单点直接双击elasticsearch.bat
文件启动即可,但是集群的话是需要配置的。
打开elasticsearch.yml文件
修改的部分:
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
# 集群名称,必须要一致
cluster.name: my-application
# ------------------------------------ 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
# ---------------------------------- 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:
#
#
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
# 跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
修改完之后:
进入bin目录,启动node-8001
,可以看到:
然后打开postman,查询集群健康状态:
响应:
{
"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
文件(添加到对应模块即可):
# ---------------------------------- 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,查询集群健康状态:
响应:
{
"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
:
# ---------------------------------- 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,查询集群健康状态:
响应:
{
"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
# 集群名称,必须要一致
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: "*"
[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
没有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目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。
xftp
将压缩包上传到/usr/loca/applications
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
文件夹,如果嫌名字长,可以改了:
mv elasticsearch-7.8.0 es
因为安全问题,ElasticSearch 不允许root用户直接运行,
所以要创建新用户,在root用户中创建新用户:
useradd user_es # 新增user_es用户
passwd user_es # 为user_es设置密码 020826
# userdel -r user_es #如果创建错了,可以删除
# 文件夹所有者
chown -R user_es /usr/local/applications/es
修改/usr/local/applications/elasticsearch-7.8.0/config/elasticsearch.yml
文件
# 这是我的es配置文件的地方
vi /usr/local/applications/es/config/elasticsearch.yml
进去之后可以看到都是被注释的,添加以下配置:
# 集群名称
cluster.name: elasticsearch
# 节点名称
node.name: node-1
# 不管它
network.host: 0.0.0.0
# 端口号
http.port: 9200
# 设置主节点,把node-1节点设置为主节点
cluster.initial_master_nodes: ["node-1"]
/etc/security/limits.conf
vi /etc/security/limits.conf
# 在文件末尾加入以下内容
# 每个进程可以打开的文件数的限制
user_es soft nofile 65536
user_es hard nofile 65536
/etc/security/limits.d/20-nproc.conf
(这个文件我没有,新建的)vi /etc/security/limits.d/20-nproc.conf
user_es soft nofile 65536
user_es hard nofile 65536
# 操作系统级别对每个用户的创建的进程数的限制:
* hard nproc 4096
# * 代表Linux所有用户名
/etc/sysctl.conf
(我设置之后启动报错)vi /etc/sysctl.conf
# 在文件中增加一下部分:
# 一个进程可以拥有的VMA(虚拟内存区域)的数量,默认为65536
vm.max_map_count=655360
重新加载:
sysctl -p
# 切换用户,不允许root用户启动es
su user_es
cd /usr/local/applications/es
bin/elasticsearch
data
目录,重新启动es即可。 我这里使用的腾讯云的轻量级服务器,并且使用了宝塔,所以要在腾讯云和宝塔那里放行9200
端口。
Postman发起GET
请求:http://ip:9200/_cluster/health
响应:
{
"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 删除。