跳到主要内容

集群安装

参考地址

https://juejin.cn/post/7017473363657949221

安装的注意

elasticsearch和kibana要对上

安装elasticsearch

官网下载地址

https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-6-2

解压

tar -zxvf elasticsearch-7.6.2-linux-x86_64.tar.gz

单机模式

  • 配置jdk 因为解压的es中自带了jdk,所以不需要单独下载jdk,只需要在linux服务配置好java环境即可。

修改文件vim /etc/profile

JAVA_HOME=/data/elasticsearch-7.15.0/jdk
PATH=$PATH:./:$JAVA_HOME/bin
export PATH JAVA_HOME

生效配置文件source /etc/profile

  • 创建用户 因为es不能在root用户下运行。
groupadd te
useradd te -g te
chown -R te:te /data/elasticsearch-7.15.0/
  • 启动es 切换用户到te su te,然后到解压的es目录下面运行 ./bin/elasticsearch

集群模式

  • 首先需要准备三台服务器

  • 安装第一个环节中上传包,并且配置jdk环境

  • 修改运行所需要的配置文件

修改系统配置文件

修改文件vim /etc/security/limits.conf 在最后一行添加如下:

* soft nofile 65536
* hard nofile 131072
* soft nproc 65536
* hard nproc 131072

修改文件 /etc/security/limits.d/20-nproc.conf 在最后一行添加如下:

* soft nofile 65536
* hard nofile 131072
* soft nproc 65536
* hard nproc 131072

查看是否生效(要重新开启一个新的连接)

ulimit -a

修改文件vim /etc/sysctl.conf,添加如下:

vm.max_map_count=655360

生效文件sysctl -p

创建启动用户

新建elsearch用户组 以及elsearch用户
useradd elsearch

将对应的elasticsearch-7.3.2目录授权给elsearch
chown -R elsearch:elsearch /opt/shengheApp/elasticsearch/elasticsearch-7.3.2

切换用户进行es的启动

su elsearch #切换账户
cd elasticsearch/bin #进入你的elasticsearch目录下的bin目录

修改es配置文件

修改主节点配置文件如下:vim config/elasticsearch.yml:

cluster.name: es-cluster
node.name: ${HOSTNAME}
path.data: /data/elasticsearch-7.15.0/data
path.logs: /data/elasticsearch-7.15.0/logs
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.seed_hosts: ["hadoop1", "hadoop2", "hadoop3"]
cluster.initial_master_nodes: ["hadoop1", "hadoop2", "hadoop3"]
http.cors.enabled: true
http.cors.allow-origin: "*"

其他节点子配置文件需要修改node.name 就行

如果运行的过程中保证几台机子能互通,并且关闭了防火墙

修改jvm.options文件,配置jvm内存大小

-Xms4g
-Xmx4g

相关解释

# ---------------------------------- Cluster -----------------------------------
# Use a descriptive name for your cluster:

# 集群名称,用于定义哪些elasticsearch节点属同一个集群。
cluster.name: bigdata

# ------------------------------------ Node ------------------------------------
# 节点名称,用于唯一标识节点,不可重名
node.name: server3

# 1、以下列出了三种集群拓扑模式,如下:
# 如果想让节点不具备选举主节点的资格,只用来做数据存储节点。
node.master: false
node.data: true

# 2、如果想让节点成为主节点,且不存储任何数据,只作为集群协调者。
node.master: true
node.data: false

# 3、如果想让节点既不成为主节点,又不成为数据节点,那么可将他作为搜索器,从节点中获取数据,生成搜索结果等
node.master: false
node.data: false

# 这个配置限制了单机上可以开启的ES存储实例的个数,当我们需要单机多实例,则需要把这个配置赋值2,或者更高。
#node.max_local_storage_nodes: 1

# ----------------------------------- Index ------------------------------------
# 设置索引的分片数,默认为5 "number_of_shards" 是索引创建后一次生成的,后续不可更改设置
index.number_of_shards: 5

# 设置索引的副本数,默认为1
index.number_of_replicas: 1

# 索引的刷新频率,默认1秒,太小会造成索引频繁刷新,新的数据写入就慢了。(此参数的设置需要在写入性能和实时搜索中取平衡)通常在ELK场景中需要将值调大一些比如60s,在有_template的情况下,需要设置在应用的_template中才生效。
index.refresh_interval: 120s

# ----------------------------------- Paths ------------------------------------
# 数据存储路径,可以设置多个路径用逗号分隔,有助于提高IO。 # path.data: /home/path1,/home/path2
path.data: /home/elk/server3_data

# 日志文件路径
path.logs: /var/log/elasticsearch

# 临时文件的路径
path.work: /path/to/work

# ----------------------------------- Memory -------------------------------------
# 确保 ES_MIN_MEM 和 ES_MAX_MEM 环境变量设置为相同的值,以及机器有足够的内存分配给Elasticsearch
# 注意:内存也不是越大越好,一般64位机器,最大分配内存别才超过32G

# 当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下,你应该保证它不会写入交换空间
# 设置这个属性为true来锁定内存,同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过 `ulimit -l unlimited` 命令

bootstrap.mlockall: true

# 节点用于 fielddata 的最大内存,如果 fielddata
# 达到该阈值,就会把旧数据交换出去。该参数可以设置百分比或者绝对值。默认设置是不限制,所以强烈建议设置该值,比如 10%。
indices.fielddata.cache.size: 50mb

# indices.fielddata.cache.expire 这个参数绝对绝对不要设置!

indices.breaker.fielddata.limit 默认值是JVM堆内存的60%,注意为了让设置正常生效,一定要确保 indices.breaker.fielddata.limit 的值
大于 indices.fielddata.cache.size 的值。否则的话,fielddata 大小一到 limit 阈值就报错,就永远道不了 size 阈值,无法触发对旧数据的交换任务了。

#------------------------------------ Network And HTTP -----------------------------
# 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0
network.bind_host: 192.168.0.1

# 设置其它节点和该节点通信的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址
network.publish_host: 192.168.0.1

# 同时设置bind_host和publish_host上面两个参数
network.host: 192.168.0.1

# 设置集群中节点间通信的tcp端口,默认是9300
transport.tcp.port: 9300

# 设置是否压缩tcp传输时的数据,默认为false,不压缩
transport.tcp.compress: true

# 设置对外服务的http端口,默认为9200
http.port: 9200

# 设置请求内容的最大容量,默认100mb
http.max_content_length: 100mb

# ------------------------------------ Translog -------------------------------------
#当事务日志累积到多少条数据后flush一次。
index.translog.flush_threshold_ops: 50000

# --------------------------------- Discovery --------------------------------------
# 这个参数决定了要选举一个Master至少需要多少个节点,默认值是1,推荐设置为 N/2 + 1,N是集群中节点的数量,这样可以有效避免脑裂
discovery.zen.minimum_master_nodes: 1

# 在java里面GC是很常见的,但在GC时间比较长的时候。在默认配置下,节点会频繁失联。节点的失联又会导致数据频繁重传,甚至会导致整个集群基本不可用。

# discovery参数是用来做集群之间节点通信的,默认超时时间是比较小的。我们把参数适当调大,避免集群GC时间较长导致节点的丢失、失联。
discovery.zen.ping.timeout: 200s
discovery.zen.fd.ping_timeout: 200s
discovery.zen.fd.ping.interval: 30s
discovery.zen.fd.ping.retries: 6

# 设置集群中节点的探测列表,新加入集群的节点需要加入列表中才能被探测到。
discovery.zen.ping.unicast.hosts: ["10.10.1.244:9300",]

# 是否打开广播自动发现节点,默认为true
discovery.zen.ping.multicast.enabled: false
indices.store.throttle.type: merge
indices.store.throttle.max_bytes_per_sec: 100mb

安装header插件

下载 elasticsearch-head-master.zip

安装ik分词

https://github.com/medcl/elasticsearch-analysis-ik/tags

下载对应版本的ik

解压以后

将解压后的文件夹移动到es的plugins目录下

mkdir analysis-ik

cd analysis-ik

unzip elasticsearch-analysis-ik-7.6.2.zip

测试ik分词器

IK分词器包含两种模式:

  • ik_smart:最少切分

  • ik_max_word:最细切分

GET /_analyze
{
"analyzer": "standard",
"text":"中国"
}

GET /_analyze
{
"analyzer": "ik_smart",
"text":"中国人"
}

GET /_analyze
{
"analyzer": "ik_max_word",
"text":"中国人"
}

集群关闭

在elasticsearch集群中,当集群发现某个节点关闭时,将延迟一分钟后(默认)再开始将该节点上的分片复制到集群中的其他节点,这可能涉及很多I / O。由于该节点不久将要重新启动,因此该I / O是不必要的。您可以通过在关闭节点之前禁用副本分配来避免。

正确关闭方式

禁止分片自动分布

curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
'

执行同步刷新

curl -X POST "localhost:9200/_flush/synced?pretty"

注意:

执行同步刷新时,请检查响应以确保没有失败。尽管请求本身仍返回200 OK状态,但在响应正文中列出了由于挂起索引操作而失败的同步刷新操作。如果失败,请重新发出请求。

关闭所有节点

如果您使用以下命令运行Elasticsearch systemd:
sudo systemctl stop elasticsearch.service

如果您正在使用SysV运行Elasticsearch init:
sudo -i service elasticsearch stop

如果您将Elasticsearch作为守护程序运行:
kill $(cat pid.txt)

正确重启方式

执行完操作后逐个启动节点

cd $ES_HOME
./bin/elasticsearch -d -p $ES_HOME/pid.txt

等所有节点启动完成后,可以通过执行如下请求查看集群状态:

curl -X GET "localhost:9200/_cat/health?pretty"
curl -X GET "localhost:9200/_cat/nodes?pretty"

状态分别有:red,yellow,green。

当节点加入集群时,它开始恢复本地存储的所有主分片。该_cat/healthAPI最初将报告status中red,表明并非所有的初级碎片已被分配。一旦节点恢复了其本地分片,集群status就会切换到 yellow,表示所有主分片都已恢复,但并非所有副本分片都已分配。这是可以预期的,因为您尚未重新启用分配。将副本的分配延迟到所有节点都yellow可用之后,主服务器便可以将副本分配给已经具有本地分片副本的节点。

启用分片自动分布

curl -X PUT "localhost:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
'

重新启用分配后,集群便开始将副本分片分配给数据节点。此时,恢复索引和搜索是安全的,但是如果您可以等待直到成功分配了所有主分片和副本分片并且所有节点的状态为,集群就会恢复得更快green。

您可以使用_cat/health和 _cat/recoveryAPI 监视进度

curl -X GET "localhost:9200/_cat/health?pretty"
curl -X GET "localhost:9200/_cat/recovery?pretty"