本文最后更新于 320 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
ElasticSearch集群部署
一.集群脚本准备
1.配置免密登录
[root@elk101.oldboyedu.com ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# ssh-copy-id elk101.oldboyedu.com
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# ssh-copy-id elk101.oldboyedu.com
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# ssh-copy-id elk101.oldboyedu.com
[root@elk101.oldboyedu.com ~]#
2.编写rsync集群同步脚本
[root@elk101.oldboyedu.com ~]# vim /usr/local/sbin/data_rsync.sh
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# cat /usr/local/sbin/data_rsync.sh
#!/bin/bash
if [ $# -ne 1 ];then
echo "仅支持一个路径参数."
exit
fi
# 判断文件是否存在
if [ ! -e $1 ];then
echo "[ $1 ] dir or file not find!"
exit
fi
# 获取父路径
fullpath=`dirname $1`
# 获取子路径
basename=`basename $1`
# 进入到父路径
cd $fullpath
for ((host_id=102;host_id<=103;host_id++))
do
# 使得终端输出变为绿色
tput setaf 2
echo ===== elk${host_id}.oldboyedu.com: $basename =====
# 使得终端恢复原来的颜色
tput setaf 7
# 将数据同步到其他两个节点
rsync -az $basename `whoami`@elk${host_id}.oldboyedu.com:$fullpath
if [ $? -eq 0 ];then
echo "命令执行成功!"
fi
done
[root@elk101.oldboyedu.com ~]#
三.部署ElasticSearch集群
1.解压elasticsearch软件包并配置环境变量
[root@elk101.oldboyedu.com ~]# tar zxf elasticsearch-7.12.1-linux-x86_64.tar.gz -C /oldboy/softwares/
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# cd /oldboy/softwares/
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# ll
总用量 0
drwxr-xr-x. 9 root root 155 4月 21 05:00 elasticsearch-7.12.1
lrwxrwxrwx. 1 root root 12 5月 16 11:56 jdk -> jdk1.8.0_291
drwxr-xr-x. 8 10143 10143 273 4月 8 03:26 jdk1.8.0_291
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# ln -sv elasticsearch-7.12.1 elasticsearch
"elasticsearch" -> "elasticsearch-7.12.1"
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# ll elasticsearch/
总用量 556
drwxr-xr-x. 2 oldboy oldboy 4096 4月 21 05:01 bin # 存储的是一些可执行的脚本文件。
drwxr-xr-x. 3 oldboy oldboy 199 5月 16 15:02 config # 存储的是配置文件
drwxr-xr-x. 9 oldboy oldboy 107 4月 21 05:01 jdk # ES内置的OpenJDK环境,通常情况下我们都不会去使用,而是使用咱们自己部署的。
drwxr-xr-x. 3 oldboy oldboy 4096 4月 21 05:00 lib # 存放依赖包的目录,基本上都是一些jar包文件。
-rw-r--r--. 1 oldboy oldboy 3860 4月 21 04:54 LICENSE.txt
drwxr-xr-x. 2 oldboy oldboy 30 5月 16 14:42 logs # 存放日志的目录。
drwxr-xr-x. 60 oldboy oldboy 4096 4月 21 05:01 modules # 存储模块的目录。
-rw-r--r--. 1 oldboy oldboy 545323 4月 21 04:58 NOTICE.txt
drwxr-xr-x. 2 oldboy oldboy 6 4月 21 04:58 plugins # 存储插件的目录。
-rw-r--r--. 1 oldboy oldboy 2710 4月 21 04:54 README.asciidoc
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# vim /etc/profile.d/es.sh
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# cat /etc/profile.d/es.sh
#!/bin/bash
export ES_HOME=/oldboy/softwares/elasticsearch
export PATH=$PATH:$ES_HOME/bin
[root@elk101.oldboyedu.com /oldboy/softwares]#
[root@elk101.oldboyedu.com /oldboy/softwares]# source /etc/profile.d/es.sh
[root@elk101.oldboyedu.com /oldboy/softwares]#
2.创建普通用户并修改文件属主权限
[root@elk101.oldboyedu.com ~]# useradd oldboy
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# chown oldboy:oldboy -R /oldboy/softwares/elasticsearch-7.12.1
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# mkdir -pv /oldboy/data/elsticsearch
mkdir: 已创建目录 "/oldboy/data/elsticsearch"
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# chown oldboy:oldboy /oldboy/data/elsticsearch
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# ll /oldboy/data/elsticsearch/ -d
drwxr-xr-x. 2 oldboy oldboy 6 5月 16 14:52 /oldboy/data/elsticsearch/
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# mkdir -pv /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# ll -d /oldboy/logs/elsticsearch
drwxr-xr-x. 2 root root 4096 5月 16 14:43 /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# chown oldboy:oldboy /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# ll -d /oldboy/logs/elsticsearch
drwxr-xr-x. 2 oldboy oldboy 4096 5月 16 14:43 /oldboy/logs/elsticsearch
[root@elk101.oldboyedu.com ~]#
3.修改ES配置文件,配置文件解释
单机版配置文件:
[root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]# vim elasticsearch.yml
[root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]#
[root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]# egrep ^[a-z] elasticsearch.yml
cluster.name: oldboy-linux
node.name: elk101.oldboyedu.com
path.data: /oldboy/data/elasticsearch
path.logs: /oldboy/logs/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["elk101.oldboyedu.com"]
cluster.initial_master_nodes: ["elk101.oldboyedu.com"]
[root@elk101.oldboyedu.com /oldboy/softwares/elasticsearch/config]#
集群版配置文件:
[oldboy@elk101.oldboyedu.com ~]$ egrep -v "^$|^#" /oldboy/softwares/elasticsearch/config/elasticsearch.yml
cluster.name: oldboy-linux
node.name: elk101.oldboyedu.com
path.data: /oldboy/data/elasticsearch
path.logs: /oldboy/logs/elasticsearch
network.host: 0.0.0.0
discovery.seed_hosts: ["elk101.oldboyedu.com","elk102.oldboyedu.com","elk103.oldboyedu.com"]
cluster.initial_master_nodes: ["elk101.oldboyedu.com","elk102.oldboyedu.com","elk103.oldboyedu.com"]
[oldboy@elk101.oldboyedu.com ~]$
配置文件参数说明:
cluster.name:
指定节点名称。
node.name:
节点名称,在同一个集群中,集群内要唯一。
node.master:
指定当前节点是否可以成为主节点。
node.data:
指定当前节点是否可以成为数据节点。
network.host:
指定可以访问的ES的主机的网络IP,说白了就是绑定ElasticSearch的地址。
http.port:
指定http协议RESTful端口。
transport.tcp.port:
指定elasticsearch集群间组件的通信端口。
discovery.zen.ping.unicast.hosts:
ES 7.x 已经弃用了该参数,但为了兼容性,其已经是有效的。指定所有master角色的单播节点,
如果不指定数据传输端口(transport.tcp.port),默认的端口为9300。
discovery.seed_hosts:
ES 7.x新增的配置,此设置以前称为discovery.zen.ping.unicast.hosts。
它的旧名称已被弃用,但为了保持向后兼容性,它继续有效。对旧名称的支持将在以后的版本中删除。
discovery.zen.minimum_master_nodes:
指定成为master角色最低限度的票数,假设集群的数量为N,则该数字通常设置为"N / 2 + 1",
cluster.initial_master_nodes:
ES 7.x新增的配置,设置全新集群中符合主机要求的节点的初始集合。
默认情况下,该列表为空,这意味着该节点希望加入已经被引导的集群。
在开发模式下,如果未配置发现设置,则此步骤由节点本身自动执行。
由于此自动引导本质上是不安全的,因此当您在生产模式下启动全新集群时,必须明确列出符合条件的节点的名称或IP地址,这些节点的投票应在第一次选举中计算。
cluster.routing.allocation.cluster_concurrent_rebalance:
允许控制在集群范围内允许多少并发分片重新平衡,默认为2。生产环境可以适当调大,比如等于你服务器的CPU核心数。
请注意,由于群集中的不平衡,此设置仅控制并发碎片重定位的数量。此设置不限制由于分配过滤或强制感知而导致的碎片重定位。
cluster.routing.allocation.node_concurrent_incoming_recoveries:
一个节点上允许进行多少并发的传入分片恢复。传入恢复是在节点上分配目标分片(很可能是副本,除非重新分配分片)的恢复,默认为2。
cluster.routing.allocation.node_concurrent_outgoing_recoveries:
一个节点上允许进行多少并发的传出分片恢复。传出恢复是指在节点上分配了源分片(很可能是主分片,除非重新分配分片)的恢复。默认为2。
cluster.routing.allocation.node_concurrent_recoveries:
同时设置cluster.routing.allocation.node_concurrent_incoming_recoveries和cluster.routing.allocation.node_concurrent_outgoing_recoveries。
生产环境可以适当调大,比如等于你服务器的CPU核心数。
cluster.routing.allocation.node_initial_primaries_recoveries
虽然副本的恢复是通过网络进行的,但节点重启后未分配的主数据库的恢复将使用本地磁盘中的数据。
这些操作应该很快,以便可以在同一节点上并行发生更多的初始主要恢复。默认为4。生产环境可以适当调大,比如等于你服务器的CPU核心数。
http.cors.enabled:
如果启用了HTTP端口,那么此属性会指定是否允许跨源REST请求。
http.cors.allow-origin:
如果http.cors.enabled的值为true,那么该属性会指定允许REST请求来自何处。
http.max_content_length
指定最大的数据传输大小。
gateway.recover_after_nodes:
只要有这么多数据或master节点已加入集群,就可以进行恢复。
network.tcp.no_delay:
启用或禁用TCP无延迟设置。默认为true。
network.tcp.keep_alive:
配置SO_KEEPALIVE此套接字的选项,该选项确定是否发送TCP keepalive探针。
参考链接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/important-settings.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html
4.调优集群的初始化参数
(1)修改文件描述符的最大打开数量
[root@elk101.oldboyedu.com ~]# vim /etc/security/limits.d/es.conf
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# cat /etc/security/limits.d/es.conf
# Add by yinzhengjie for Elasticsearch
* soft nofile 65535
* hard nofile 65535
[root@elk101.oldboyedu.com ~]#
温馨提示:
需要重启当前会话方能生效,可以使用"ulimit -Hn","ulimit -Sn"查看文件打开数量。
(2)修改虚拟内存区域映射大小
[root@elk101.oldboyedu.com ~]# vim /etc/sysctl.d/es.conf
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# cat /etc/sysctl.d/es.conf
vm.max_map_count=262144
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# sysctl -p /etc/sysctl.d/es.conf # 必须操作
vm.max_map_count = 262144
[root@elk101.oldboyedu.com ~]#
5.启动ElasticSearch服务
[root@elk101.oldboyedu.com ~]# su -l oldboy
上一次登录:日 5月 16 15:53:24 CST 2021pts/1 上
[oldboy@elk101.oldboyedu.com ~]$
[oldboy@elk101.oldboyedu.com ~]$ elasticsearch -h
warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
Future versions of Elasticsearch will require Java 11; your Java version from [/oldboy/softwares/jdk1.8.0_291/jre] does not meet this r
equirement. Consider switching to a distribution of Elasticsearch with a bundled JDK. If you are already using a distribution with a bundled JDK, ensure the JAVA_HOME environment variable is not set.Starts Elasticsearch
Option Description
------ -----------
-E <KeyValuePair> Configure a setting
-V, --version Prints Elasticsearch version information and exits
-d, --daemonize Starts Elasticsearch in the background
-h, --help Show help
-p, --pidfile <Path> Creates a pid file in the specified path on start
-q, --quiet Turns off standard output/error streams logging in console
-s, --silent Show minimal output
-v, --verbose Show verbose output
[oldboy@elk101.oldboyedu.com ~]$
[oldboy@elk103.oldboyedu.com ~]$ elasticsearch -d
[oldboy@elk101.oldboyedu.com ~]$
[oldboy@elk101.oldboyedu.com ~]$ curl elk101.oldboyedu.com:9200 # 查看当前节点是否启动成功
{
"name" : "elk101.oldboyedu.com",
"cluster_name" : "oldboy-linux",
"cluster_uuid" : "XBcIl64LT5CIRIZdUUjjvg",
"version" : {
"number" : "7.12.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "3186837139b9c6b6d23c3200870651f10d3343b7",
"build_date" : "2021-04-20T20:56:39.040728659Z",
"build_snapshot" : false,
"lucene_version" : "8.8.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
[oldboy@elk101.oldboyedu.com ~]$
[oldboy@elk101.oldboyedu.com ~]$ ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
...
LISTEN 0 128 [::]:9300 [::]:*
LISTEN 0 128 [::]:9200 [::]:*
...
[oldboy@elk101.oldboyedu.com ~]$
[oldboy@elk101.oldboyedu.com ~]$ curl elk101.oldboyedu.com:9200/_cat/nodes # 查看集群的节点数量。
172.200.3.103 54 52 0 0.00 0.01 0.05 cdfhilmrstw - elk103.oldboyedu.com
172.200.3.101 44 56 0 0.08 0.03 0.05 cdfhilmrstw - elk101.oldboyedu.com
172.200.3.102 61 96 0 0.01 0.02 0.05 cdfhilmrstw * elk102.oldboyedu.com
[oldboy@elk101.oldboyedu.com ~]$
6.停止ElasticSearch服务
[root@elk101.oldboyedu.com ~]# jps
15760 Elasticsearch
16139 Jps
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# kill 15760
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# jps
16157 Jps
[root@elk101.oldboyedu.com ~]#
四.安装PostMan工具
1.下载PostMan工具
下载地址:
https://www.postman.com/downloads/
2.安装PostMan工具
双击运行安装后,注册用户即可。
五.ElasticSearch-head插件部署
1.ElasticSearch-head概述
由于ElasticSearch官方并没有为ElasticSearch提供界面管理工具,仅仅是提供了后台的服务。Elas
ticSearch-head是一个为ElasticSearch开发的一个页面客户端工具,其源码托管于GitHub。
GitHub地址:
https://github.com/mobz/elasticsearch-head
elasticsearch-head提供以下几种安装方式:
(1)源码安装,通过npm run start启动;
(2)通过docker安装;
(3)通过chrome插件安装(需要"科学上网");
(4)通过elasticsearch的plugin方式安装;
温馨提示:
随着Kibana组件的成熟,已经可以实现对ES集群的管理,因此ElasticSearch-head插件的作用在
逐步削弱,所以此处选择基于Google插件的方式进行部署。
2.ElasticSearch-head部署
我这里就基于最简单的部署方式,直接使用Google浏览器插件部署。
Google浏览器插件部署操作步骤如下:
(1)先解压我给的压缩包;
(2)点击浏览器的"扩展程序";
(3)点击"加载已解压的扩展程序";
(4)加载成功后,我们就可以正常使用该插件了;
六.今日作业
(1)部署ES集群;
(2)部署PostMan插件;
(3)安装ES-head插件;
# 调优,让他进程占用内存设置为256
[root@elk101.oldboyedu.com oldboy]#grep ^- /oldboy/softwares/elasticsearch/config/jvm.options
-Xms256m
-Xmx256m
# 查看修改情况
[root@elk101.oldboyedu.com ~]#jps
26737 Elasticsearch
26904 Jps
[root@elk101.oldboyedu.com ~]#jmap -heap 26737
# 查看内容
[root@elk103.oldboyedu.com ~]#jmap -heap 26737|grep MaxHeapSize
MaxHeapSize = 268435456 (256.0MB)
七.部署elasticsearch可能会遇到的错误
1.java.lang.RuntimeException: can not run elasticsearch as root
解决方案:
创建一个普通用户运行ES即可。但要注意权限信息。
2.Exception in thread "main" java.nio.file.AccessDeniedException: /oldboy/softwares/elasticsearch/config/jvm.options.d
问题原因:
运行用户无权限访问ES的安装目录
解决方案:
修改权限。
3.java.lang.IllegalStateException: Unable to access 'path.data' (/oldboy/data/elsticsearch)
问题原因:
数据目录路径无权限访问。
解决方案:
方案1:
[root@elk101.oldboyedu.com ~]# mkdir -pv /oldboy/data/elsticsearch
mkdir: 已创建目录 "/oldboy/data/elsticsearch"
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# chown oldboy:oldboy /oldboy/data/elsticsearch
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# ll /oldboy/data/elsticsearch/ -d
drwxr-xr-x. 2 oldboy oldboy 6 5月 16 14:52 /oldboy/data/elsticsearch/
[root@elk101.oldboyedu.com ~]#
方案2:
对"/oldboy/data"这个路径的其它人的权限分配"w".
4.the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
问题原因:
未配置ES的discovery选项。
解决方案:
修改配置文件的"discovery.seed_hosts"和"cluster.initial_master_nodes"。
5.max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]ERROR: Elasticsearch did not exit normally - check the logs at /oldboy/logs/elsticsearch/oldboy-linux.log
问题原因:
最大虚拟内存区域太低。
解决方案:
[root@elk101.oldboyedu.com ~]# sysctl -q vm.max_map_count
vm.max_map_count = 65530
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# vim /etc/sysctl.d/es.conf
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# cat /etc/sysctl.d/es.conf
vm.max_map_count=262144
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# sysctl -p /etc/sysctl.d/es.conf # 加载配置文件,全局会话立即生效!
vm.max_map_count = 262144
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# sysctl -q vm.max_map_count
vm.max_map_count = 262144
[root@elk101.oldboyedu.com ~]#
6.max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]ERROR: Elasticsearch did not exit normally - check the logs at /oldboy/logs/elsticsearch/oldboy-linux.log
问题原因:
最大的文件描述符设置过低,可通过"ulimit -Hn"查看硬限制。
解决方案:(配置后需要重启当前会话方能生效!)
[root@elk101.oldboyedu.com ~]# vim /etc/security/limits.d/es.conf
[root@elk101.oldboyedu.com ~]#
[root@elk101.oldboyedu.com ~]# cat /etc/security/limits.d/es.conf
# Add by yinzhengjie for Elasticsearch
* soft nofile 65535
* hard nofile 65535
[root@elk101.oldboyedu.com ~]#
7.max number of threads [3805] for user [oldboy] is too low, increase to at least [4096]
问题原因:
线程数限制太低。
解决方案:
[root@elk1 ~ 16:51:37]# cat /etc/security/limits.d/es.conf
# Add by yinzhengjie for Elasticsearch
...
* soft nproc 4096
* hard nproc 4096
[root@elk1 ~ 16:52:08]#
8. setting [cluster.initial_master_nodes] contains duplicates: [elk101.oldboyedu.com, elk101.oldboyedu.com, elk101.oldboyedu.com]
问题原因:
初始化master节点的名称一致。
解决方案:
可以指定多个不同的master节点,也可以指定一个。
9.master not discovered yet, this node has not previously joined a bootstrapped
问题原因:
尚未发现主节点,此节点以前未加入引导节点。
解决方案:
请检查"cluster.initial_master_nodes"参数是否生效。
10.java.net.BindException: Cannot assign requested address
问题原因:
绑定地址在当前服务器上找不到相关的接口.
解决方案:
请检查ES的配置文件(elasticsearch.yml)中"network.host"是否指令了正确的IP地址.
后记: ----> 防坑小技巧
防坑小技巧:
(1)不能使用root用户启动es服务;
(2)给ES的安装目录授权相关的运行用户,该用户必须是一个普通用户哟;
(3)配置文件是否些错误;