投稿作者:喜马拉雅以南 编辑整理:JackTian
Elasticsearch 是一个开源的高扩展的分布式全文检索引擎
。
通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
通过设计减少系统不能提供服务的时间,假设某个时刻服务节点宕机
则该节点为临时不可用,如果系统能一直提供服务,则它的可用性为100%,因此为了减少 Elasticsearch 服务不可用时间,集群的作用就体现出来了。
当然如果要保证在宕机期间
,ES 的数据保证不丢失,则需要对其数据进行备份,因此有了分片
和副本
的概念。
分片:将数据切分成多个部分,在ES中所有数据都存储于
索引(index)
之上,但实际索引只是维护了与多个分片之间的联系,数据则是被路由到多个分片。例如一个索引有5个分片,则该索引将会有0,1,2,3,4,这五个分片
,其指定每个文档数据存储在哪个分片是根据路由运算公式has(_routing)%number_of_primary_shards
指定,使数据均匀分布
在集群当中。 如果存在某个或某几个分片存储数据量特别大,可以使用索引分区
既index.routring_partition_size
, 但使用后限制有无法创建join_feild 关系映射
、_routing 将成为写入数据必要传入参数
副本:副本是
主分片
的复制分片,可以灵活调整,提高了整个集群的容错性
,且需要注意的是副本分片不能与主分片在同一个节点
。一般来说,Elasticsearch 会尽量把一个索引的不同分片存储在不同的主机上,分片的副本也尽可能存在不同的主机上,这样可以提高容错率,从而提高高可用性。
Elasticsearch集群存在三种健康状态,单节点 Elasticsearch 也可以算是一个集群。
未被分配
,可以通过move cancel allocate
命令所属的 API 进行分配或移动分片到指定节点,使用这里要注意主分片和其副本绝不能在同一节点
。此时系统容错性和集群高可用被弱化;多个节点的 ES 集群,那么相对单节点来说拥有更多的存储空间,可以设置elasticsearch.yml
设置data
和log
的挂载目录。
集群由多个节点构成,每一台主机则称为一台节点,在伪集群中每一个 ES 实例则为一个节点。
上述图中则为一个集群,其中 Node-1 是主节点
,主节点有权限控制整个集群,有权限控制整个集群。每个节点都有三个分片,其中P0 P1 P2
代表 Primary 为主分片,R开头的则代表为每个主分片对应的副本分片,一共是 3 个主分片,每个主分片有两个对应的副本分片。
1、下载 ES
这里我们把 ES 安装在服务器的opt
目录下
# 使用华为镜像超快!! 并重命名 elasticsearch7.4-x86.tar.gz(x86是系统指令架构)
$ wget -O elasticsearch7.4-x86.tar.gz https://mirrors.huaweicloud.com/elasticsearch/7.4.0/elasticsearch-7.4.0-linux-x86_64.tar.gz
# 解压
$ tar -zxvf elasticsearch7.4-x86.tar.gz
2、修改jvm.options
和elasticsearch.yml
配置 ES
# 进入es配置目录
$ cd /opt/elasticsearch7.4-x86/config
# 修改jvm相关参数,调整jvm堆内存大小
$ vim jvm.options
# 对es进行配置
$ vim elasticsearch.yml
jvm.options 配置
## 修改 IMPORTANT: JVM heap size ,内存小我就设置成这样了
-Xms512m
-Xmx512m
配置 elasticsearch.yml
# 不要在该文件中设置索引相关配置
cluster.name: waybill-center # 设置集群名比较重要!
# ------------------------------------ Node ------------------------------------
node.name: es-master # 配置节点名
node.master: true # 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.data: false # 是否存储索引数据,默认 true,大集群中推荐一个角色一个类节点,不要身兼多职
node.ingest: false #默认情况下所有节点均可以做ingest节点
# ----------------------------------- Paths ------------------------------------
#path.conf: /opt/elasticsearch7.4-x86/config # 设置配置文件存储路径,默认是es根目录下的config目录
path.data: /data/es-master/data # 设置索引数据存储路径,默认是es根目录下的data目录
path.logs: /data/es-master/log # 设置日志文件存储路径,默认是es根目录下的log目录
# ----------------------------------- Memory -----------------------------------
#bootstrap.memory_lock: true # 锁住内存不进行swapping,避免系统内存不够时压制JVM虚拟内存
# ---------------------------------- Network -----------------------------------
#network.host: 192.168.0.1 # 同时设置bind_host 和 publish_host
network.bind_host: 0.0.0.0 # 设置节点绑定ip,可用于http访问
network.publish_host: x.x.x.x # 设置其他节点与该节点交互ip,可以使内网ip单必须是真实ip
# Set a custom port for HTTP:
http.port: 9200 # 设置对外服务http端口
transport.tcp.port: 9300 # 设置节点之间交互的tcp端口
transport.tcp.compress: true # 设置是否压缩tcp传输时的数据,默认为false
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.seed_hosts: ["x.x.x.x:9300", "x.x.x.x:9301","x.x.x.x:9302"]
# 集群各节点IP地址,也可以使用els、els.shuaiguoxia.com等名称,需要各节点能够解析
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["es-master"]
discovery.zen.minimum_master_nodes: 2 # 为了避免脑裂,集群节点数最少为 半数+1
# For more information, consult the discovery and cluster formation module documentation.
# ---------------------------------- Gateway -----------------------------------
gateway.recover_after_nodes: 3 # 设置集群中N个节点启动时进行数据恢复,默认为1
3、配置 ES 使用自己的所带的 jdk (推荐)
修改bin
目录下的Elasticsearch
脚本文件
source "`dirname "$0"`"/elasticsearch-env # 这里可以看出先加载的 elasticsearch-env 脚本设置环境
# use es internal jdk
export JAVA_HOME=$ES_HOME/jdk/
export PATH=$JAVA_HOME/bin:$PATH
查看elasticsearch-env
#!/bin/bash
set -e -o pipefail
CDPATH=""
SCRIPT="$0"
# SCRIPT might be an arbitrarily deep series of symbolic links; loop until we
# have the concrete path
while [ -h "$SCRIPT" ] ; do
ls=`ls -ld "$SCRIPT"`
# Drop everything prior to ->
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
SCRIPT="$link"
else
SCRIPT=`dirname "$SCRIPT"`/"$link"
fi
done
# determine Elasticsearch home; to do this, we strip from the path until we find
# bin, and then strip bin (there is an assumption here that there is no nested
# directory under bin also named bin)
ES_HOME=`dirname "$SCRIPT"` # 这里可以看出已经设置了ES_HOME
# now make ES_HOME absolute
ES_HOME=`cd "$ES_HOME"; pwd`
while [ "`basename "$ES_HOME"`" != "bin" ]; do
ES_HOME=`dirname "$ES_HOME"`
done
ES_HOME=`dirname "$ES_HOME"`
4、复制当前 es 构建其他数据节点
复制当前 ES 目录
# 复制两份数据节点的目录
cp -r /opt/elasticsearch7.4-x86 /opt/es-data-node1
cp -r /opt/elasticsearch7.4-x86 /opt/es-data-node2
修改两个数据节点的配置文件,先修改第一数据节点
# vim /opt/es-data-node1/config/elasticsearch.yml
node.name: es-node1 # 配置节点名
node.ingest: false #默认情况下所有节点均可以做ingest节点
node.master: false # 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.data: true # 是否存储索引数据,默认 true
#path.conf: /opt/es-data-node1/config # 设置配置文件存储路径,默认是es根目录下的config目录
path.data: /data/es-node1/data # 设置索引数据存储路径,默认是es根目录下的data目录
path.logs: /data/es-node1/log # 设置日志文件存储路径,默认是es根目录下的log目录
http.port: 9201 # 设置对外服务http端口
transport.tcp.port: 9301 # 设置节点之间交互的tcp端口
修改两个数据节点的配置文件,再修改第二个数据节点
# vim /opt/es-data-node2/config/elasticsearch.yml
node.name: es-node2 # 配置节点名
node.master: false # 是否有资格被选举为master,ES默认集群中第一台机器为主节点
node.data: true # 是否存储索引数据,默认 true
#path.conf: /opt/es-data-node2/config # 设置配置文件存储路径,默认是es根目录下的config目录
path.data: /data/es-node2/data # 设置索引数据存储路径,默认是es根目录下的data目录
path.logs: /data/es-node2/log # 设置日志文件存储路径,默认是es根目录下的log目录
http.port: 9202 # 设置对外服务http端口
transport.tcp.port: 9302 # 设置节点之间交互的tcp端口
5、创建 ES 存储数据和 log 目录
# 根据之前每个节点的配置文件内配置path进行创建或修改
mkdir -p /data/es-master/data
mkdir -p /data/es-node1/data
mkdir -p /data/es-node2/data
mkdir -p /data/es-master/log
mkdir -p /data/es-node1/log
mkdir -p /data/es-node2/log
6、因为 ES 不能用 root 用户启动,所以要新建用户
groupadd es # 新建用户组es
useradd es -g es# 新建用户并添加到es用户组
passwd es # 也可以更改用户密码(输入 123123)
7、授权 ES 用户对目录的操作权限
chown -R es:es /data/es-master/
chown -R es:es /data/es-node1/
chown -R es:es /data/es-node2/
8、启动 ES 集群
# 需切换为es用户
su es
# 启动服务
./opt/elasticsearch7.4-x86/bin/elasticsearch -d
./opt/es-data-node1/bin/elasticsearch -d
./opt/es-data-node2/bin/elasticsearch -d
后台运行 ES 可以加入 -p 命令,让 ES 在后台运行, -p 参数记录进程 ID 为一个文件 # 设置后台启动
./opt/elasticsearch7.4-x86/bin/elasticsearch -p /tmp/elasticsearch-pid -d
结束进程
# 查看运行的pid
cat /tmp/elasticsearch-pid && echo
# 结束进程
kill -SIGTERM {pid}
1、超过当前最大文件描述符
如果出现max file descriptions
,修改limits.conf
vim /etc/security/limits.conf # 修改限制文件
向文件内添加文件数
* soft nofile 65536
* hard nofile 65536
2、超过当前最大线程数
如果出现max number of threads
,修改limits.d/20-nproc.conf
vim /etc/security/limits.d/20-nproc.conf
修改参数
* soft nproc 4096
* hard nproc 4096
# 或者不限制也行
# root soft nproc unlimited
3、超过当前最大虚拟内存
如果出现virtual memory areas
,修改sysctl.conf
vim /etc/sysctl.conf
修改参数
vm.max_map_count=262144
# 也可使用下面命令临时修改内存限制
sysctl -w vm.max_map_count=262144
当我们配置好并启动集群后,因为主节点打开了http.port
并且主节点主要用于整个集群的管理,所以建议在配置kibana
时只配置主节点就好。
不过在我们验证时可以通过以下命令进行验证集群的搭建状况
curl -X GET http://localhost:9200/_cat/nodes # get请求查看集群健康状态
# 将会响应如下,带星号的就是指向的主节点
127.0.0.1 69 93 1 0.06 0.07 0.06 dilm * es-master
127.0.0.1 69 93 1 0.06 0.07 0.06 dil - es-node1
127.0.0.1 56 93 1 0.06 0.07 0.06 dil - es-node2