投稿做者:喜马拉雅以南
编辑整理:JackTian
微信公众号:杰哥的IT之旅(ID:Jake_Internet)node
1、为何要搭建 Elasticsearch 的集群?
Elasticsearch 是一个开源的高扩展的分布式全文检索引擎。linux
经过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。bootstrap
ES主要解决问题:
检索相关数据vim
返回统计结果bash
速度要快服务器
1. 高可用性
经过设计减小系统不能提供服务的时间,假设某个时刻服务节点宕机则该节点为临时不可用,若是系统能一直提供服务,则它的可用性为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 会尽可能把一个索引的不一样分片存储在不一样的主机上,分片的副本也尽量存在不一样的主机上,这样能够提升容错率,从而提升高可用性。 null **2. 健康状态** Elasticsearch集群存在三种健康状态,单节点 Elasticsearch 也能够算是一个集群。 green(绿色):表明全部索引的主分片和副本均已分配且可用,集群是 100% 可用; yellow(黄色):主分片已分配且所有主分片可用,但全部的副本不所有可用,多是缺失,也有多是某个索引的副本未被分配,能够经过move cancel allocate命令所属的 API 进行分配或移动分片到指定节点,使用这里要注意主分片和其副本毫不能在同一节点。此时系统容错性和集群高可用被弱化; red(红色):全部的主分片不所有可用,这表明颇有可能存在丢失数据的风险,若是只有一个单节点 Elasticsearch 那么属于一种 yellow 状态,由于没有副本; **3. 存储空间** 多个节点的 ES 集群,那么相对单节点来讲拥有更多的存储空间,能够设置elasticsearch.yml设置data和log的挂载目录。 **2、ES 集群及节点类型** 集群由多个节点构成,每一台主机则称为一台节点,在伪集群中每个 ES 实例则为一个节点。  上述图中则为一个集群,其中 Node-1 是主节点,主节点有权限控制整个集群,有权限控制整个集群。每一个节点都有三个分片,其中P0 P1 P2表明 Primary 为主分片,R开头的则表明为每一个主分片对应的副本分片,一共是 3 个主分片,每一个主分片有两个对应的副本分片。 主节点:即 Master 节点。主节点的主要职责是和集群操做相关的内容,如建立或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是很是重要的。默认状况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操做会占用大量的 cpu,内存,io 资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也能够协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽量作尽可能少的工做; 数据节点:即 Data 节点。数据节点主要是存储索引数据的节点,主要对文档进行增删改查操做,聚合操做等。数据节点对 CPU、内存、IO 要求较高,在优化的时候须要监控数据节点的状态,当资源不够的时候,须要在集群中添加新的节点; 负载均衡节点:也称做 Client 节点,也称做客户端节点。当一个节点既不配置为主节点,也不配置为数据节点时,该节点只能处理路由请求,处理搜索,分发索引操做等,从本质上来讲该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是很是有用的,他协调主节点和数据节点,客户端节点加入集群能够获得集群的状态,根据集群的状态能够直接路由请求; 预处理节点:也称做 Ingest 节点,在索引数据以前能够先对数据作预处理操做,全部节点其实默认都是支持 Ingest 操做的,也能够专门将某个节点配置为 Ingest 节点。以上就是节点几种类型,一个节点其实能够对应不一样的类型,如一个节点能够同时成为主节点和数据节点和预处理节点,但若是一个节点既不是主节点也不是数据节点,那么它就是负载均衡节点。具体的类型能够经过具体的配置文件来设置; **Elasticsearch 处理查询请求时节点工做流程:** 请求被交给主节点; 主节点接收请求,将请求广播到该索引在数据节点上的每一个分片(shard); 每一个分片执行搜索请求,并将结果返回; 分片的Result在主节点上进行合并,排序后返回给用户; **3、搭建 Elasticsearch7.X 伪集群** **一、下载 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
二、修改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
**三、配置 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"`
**四、复制当前 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端口
**五、建立 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
**六、由于 ES 不能用 root 用户启动,因此要新建用户**
groupadd es # 新建用户组es useradd es -g es# 新建用户并添加到es用户组 passwd es # 也能够更改用户密码(输入 123123)
**七、受权 ES 用户对目录的操做权限**
chown -R es:es /data/es-master/
chown -R es:es /data/es-node1/
chown -R es:es /data/es-node2/app
**八、启动 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}
**4、启动异常(系统资源限制层面)** **一、超过当前最大文件描述符** 若是出现max file descriptions,修改limits.conf
vim /etc/security/limits.conf # 修改限制文件负载均衡
向文件内添加文件数
**二、超过当前最大线程数** 若是出现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
三、超过当前最大虚拟内存 若是出现virtual memory areas,修改sysctl.conf vim /etc/sysctl.conf 修改参数
vm.max_map_count=262144 # 也可以使用下面命令临时修改内存限制 sysctl -w vm.max_map_count=262144
**5、在主节点机器上进行验证** 当咱们配置好并启动集群后,由于主节点打开了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