0%

elasticsearch(八)-集群

下载

安装

1
tar -zxf  elasticsearch-7.12.1-linux-x86_64.tar.gz

集群搭建

创建普通用户

​ ES为了安全,不允许直接使用root用户启动,需要创建普通用户来运行程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
############# 方式一 ###############
#创建用户:elasticsearch
adduser elasticsearch
#创建用户密码,需要输入两次
passwd elasticsearch
#切换到es文件夹上,将对应的文件夹权限赋给该用户
chown -R elasticsearch elasticsearch-7.10.1
############# 方式二 ###############
#创建用户组
groupadd esgroup
#创建用户
useradd -g esgroup elasticsearch
#设置权限
chown -R elasticsearch:esgroup elasticsearch-7.10.1
#设置密码
passwd elasticsearch

#切换至elasticsearch用户
su elasticsearch

创建data和logs目录

​ 为了以后elasticsearch更新升级不影响到数据和日志,需要创建独立存放数据和日志的文件目录,并为用户授权

1
2
3
4
5
mkdir -p /var/elasticsearch/data
mkdir -p /var/elasticsearch/logs

chown -R elasticsearch /var/elasticsearch/data
chown -R elasticsearch /var/elasticsearch/logs

集群配置

vim config/elasticsearch.yml

node-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#---------------------------------- Cluster -----------------------------------
#配置文件配置相同的集群名称
cluster.name: my-application

# ------------------------------------ Node ------------------------------------
#各个节点需要有不同的结点名称
node.name: node-1

# ----------------------------------- Paths ------------------------------------
#节点存储数据目录 生产环境不要使用默认目录
path.data: /var/elasticsearch/data
#节点存储日志目录 生产环境不要使用默认目录
path.logs: /var/elasticsearch/logs

# ----------------------------------- Memory -----------------------------------
#开启引导检查的内存锁,关闭使用swapp分区,防止因为内存不足而使用swap分区造成机器性能下降,生产环境必须设置为true
bootstrap.memory_lock: true

# ---------------------------------- Network -----------------------------------
#把当前节点绑定到以下IP上,如果配置了该项,会触发ES的引导检查
network.host: 192.168.243.131
#默认可以不用配置,区间[9200,9300)
#服务端口
http.port: 9200
#通讯端口,用于集群不同节点的通讯
transport.tcp.port: 9300

# --------------------------------- Discovery ----------------------------------
#当进行Master时,有哪些节点能参与竞选(node.master: true的节点)
discovery.seed_hosts: ["192.168.243.131:9300", "192.168.243.132:9300", "192.168.243.133:9300"]
#设置集群启动时竞选Master的节点列表
cluster.initial_master_nodes: ["node-1"]
#绕过引导检查(生产环境不能配置该项)
#discovery.type: single-node

http.cors.enabled: true
#允许跨域访问 *代表所有
http.cors.allow-origin: "*"

#标记该节点具备竞争master的资格
node.master: true
#该节点进行数据存储
node.data: true

node-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#---------------------------------- Cluster -----------------------------------
#配置文件配置相同的集群名称
cluster.name: my-application

# ------------------------------------ Node ------------------------------------
#各个节点需要有不同的结点名称
node.name: node-2

# ----------------------------------- Paths ------------------------------------
#节点存储数据目录 生产环境不要使用默认目录
path.data: /var/elasticsearch/data
#节点存储日志目录 生产环境不要使用默认目录
path.logs: /var/elasticsearch/logs

# ----------------------------------- Memory -----------------------------------
#开启引导检查的内存锁,关闭使用swapp分区,防止因为内存不足而使用swap分区造成机器性能下降,生产环境必须设置为true
bootstrap.memory_lock: true

# ---------------------------------- Network -----------------------------------
#把当前节点绑定到以下IP上,如果配置了该项,会触发ES的引导检查
network.host: 192.168.243.132
#默认可以不用配置,区间[9200,9300)
#服务端口
http.port: 9200
#通讯端口,用于集群不同节点的通讯
transport.tcp.port: 9300

# --------------------------------- Discovery ----------------------------------
#当进行Master时,有哪些节点能参与竞选(node.master: true的节点)
discovery.seed_hosts: ["192.168.243.131:9300", "192.168.243.132:9300", "192.168.243.133:9300"]
#设置集群启动时竞选Master的节点列表
cluster.initial_master_nodes: ["node-1"]
#绕过引导检查(生产环境不能配置该项)
#discovery.type: single-node

http.cors.enabled: true
#允许跨域访问 *代表所有
http.cors.allow-origin: "*"

#标记该节点具备竞争master的资格
node.master: false
#该节点进行数据存储
node.data: true

node-3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#---------------------------------- Cluster -----------------------------------
#配置文件配置相同的集群名称
cluster.name: my-application

# ------------------------------------ Node ------------------------------------
#各个节点需要有不同的结点名称
node.name: node-3

# ----------------------------------- Paths ------------------------------------
#节点存储数据目录 生产环境不要使用默认目录
path.data: /var/elasticsearch/data
#节点存储日志目录 生产环境不要使用默认目录
path.logs: /var/elasticsearch/logs

# ----------------------------------- Memory -----------------------------------
#开启引导检查的内存锁,关闭使用swapp分区,防止因为内存不足而使用swap分区造成机器性能下降,生产环境必须设置为true
bootstrap.memory_lock: true

# ---------------------------------- Network -----------------------------------
#把当前节点绑定到以下IP上,如果配置了该项,会触发ES的引导检查
network.host: 192.168.243.133
#默认可以不用配置,区间[9200,9300)
#服务端口
http.port: 9200
#通讯端口,用于集群不同节点的通讯
transport.tcp.port: 9300

# --------------------------------- Discovery ----------------------------------
#当进行Master时,有哪些节点能参与竞选(node.master: true的节点)
discovery.seed_hosts: ["192.168.243.131:9300", "192.168.243.132:9300", "192.168.243.133:9300"]
#设置集群启动时竞选Master的节点列表
cluster.initial_master_nodes: ["node-1"]
#绕过引导检查(生产环境不能配置该项)
#discovery.type: single-node

http.cors.enabled: true
#允许跨域访问 *代表所有
http.cors.allow-origin: "*"

#标记该节点具备竞争master的资格
node.master: false
#该节点进行数据存储
node.data: true

端口开放

1
2
3
4
5
6
#修改完配置后,切换回root会用户关闭防火墙;
systemctl stop firewalld
#或者开放9200、9300端口
firewall-cmd --zone-public --add-port=9200/tcp --permanent
firewall-cmd --zone-public --add-port=9300/tcp --permanent
firewall-cmd --reload

修改linux内核参数

我们需要修改Linux文件的最大打开数,否则会启动报错

1
2
3
4
5
6
7
8
9
vim /etc/security/limits.conf 

* hard nofile 65536
* soft nofile 65536
* soft nproc 4096
* hard nproc 4096
----------------------------------------------------------------------------------
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

后台启动

1
2
#进入bin目录启动 -d:表示后台启动  启动如果报错请参见下文解决问题
./elasticsearch -d

如果克隆了服务器或者拷贝了多份elasticsearch目录,需要去path.data:配置的路径下删除节点信息,否则会造成ID重复的冲突。

查看集群信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/_cat/allocation      	#查看单节点的shard分配整体情况
/_cat/shards #查看各shard的详细情况
/_cat/shards/{index} #查看指定分片的详细情况
/_cat/master #查看master节点信息
/_cat/nodes #查看所有节点信息
/_cat/indices #查看集群中所有index的详细信息
/_cat/indices/{index} #查看集群中指定index的详细信息
/_cat/segments #查看各index的segment详细信息,包括segment名, 所属shard, 内存(磁盘)占用大小, 是否刷盘
/_cat/segments/{index}#查看指定index的segment详细信息
/_cat/count #查看当前集群的doc数量
/_cat/count/{index} #查看指定索引的doc数量
/_cat/recovery #查看集群内每个shard的recovery过程.调整replica。
/_cat/recovery/{index}#查看指定索引shard的recovery过程
/_cat/health #查看集群当前状态:红、黄、绿
/_cat/pending_tasks #查看当前集群的pending task
/_cat/aliases #查看集群中所有alias信息,路由配置等
/_cat/aliases/{alias} #查看指定索引的alias信息
/_cat/thread_pool #查看集群各节点内部不同类型的threadpool的统计信息,
/_cat/plugins #查看集群各个节点上的plugin信息
/_cat/fielddata #查看当前集群各个节点的fielddata内存使用情况
/_cat/fielddata/{fields} #查看指定field的内存使用情况,里面传field属性对应的值
/_cat/nodeattrs #查看单节点的自定义属性
/_cat/repositories #输出集群中注册快照存储库
/_cat/templates #输出当前正在存在的模板信息

基于Docker

不建议使用ES启动docker,因为很麻烦!!!

1
2
3
4
5
[root@localhost /]# docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
[root@localhost /]# docker run -d -p 9200:9200 -p 9300:9300 --name es elasticsearch:7.10.1

#启动命令参考
[root@localhost /]# docker run -d -p 9200:9200 -p 9300:9300 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e discovery.type=single-node --name es elasticsearch:7.10.1

问题

1
2
3
4
5
6
问题1:error='Cannot allocate memory' 
原因:ES 5.x+堆内存大小默认配置为2G ES 7.x+默认4G
解决:
vi config/jvm.options
-Xms4g → -Xms512m
-Xmx4g → -Xmx512m
1
2
3
4
5
问题2:WARNING: IPv4 forwarding is disabled. Networking will not work.
解决: vi /etc/sysctl.conf
net.ipv4.ip_forward=1
restart network && systemctl restart docker
sysctl net.ipv4.ip_forward
1
2
3
4
5
6
7
8
9
问题3: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解释: 5.0以后,ES使用mmapfs作为默认的文件系统存储类型。可以通过配置index.store.type来设置ES默认的文件系统存储类型。
Niofs(非阻塞文件系统) mmapfs(内存映射文件系统)
配置:index.store.type: niofs
解决:sysctl -w vm.max_map_count=262144
查看是否生效:
或:vi /etc/sysctl.conf
vm.max_map_count=262144
grep vm.max_map_count /etc/sysctl.conf
1
2
3
4
问题4:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
解决:vi /etc/security/limits.conf,最后添加以下内容。
* soft nofile 65536
* hard nofile 65536
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
问题5:max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]
解决:
vi /etc/security/limits.d/90-nproc.conf
修改如下内容(注意星号):
* soft nproc 1024 => * soft nproc 4096

当引导检查报未开启内存锁时,需要修改一下配置:
vi /etc/security/limits.conf,最后添加以下内容。
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
* hard memlock unlimited
* soft memlock unlimited
vi /etc/systemd/system.conf ,分别修改以下内容。
vi /etc/systemd/system.conf
注意 修改操作系统配置需要重启系统才能生效,如果宿主机内存过小,可能导致容器无法启动。开发模式内存建议4G以上,生产建议32G以上.
1
2
问题6:docker中的es无法加入集群
elasticsearch.yml配置中增加 network.publish_host:192.168.1.129
1
其他问题:如路径的权限问题、多网卡问题、引导检查问题

IK分词器

下载编译后的安装包

1
2
3
4
5
6
7
# 创建插件文件夹
cd /usr/local/elasticsearch/plugins/ && mkdir ik
# 将编译后的zip上传进ik文件夹中解压
unzip elasticsearch-analysis-ik-7.12.1.zip
#授权
chown -R elasticsearch ik
#重启启动切换其账户启动es

两种分词器analyzer

  • ik_max_word:细粒度
  • ik_smart:粗粒度

配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
1) IKAnalyzer.cfg.xml:IK分词配置文件
2) 主词库:main.dic
3) 英文停用词:stopword.dic,不会建立在倒排索引中
4) 特殊词库:
a. quantifier.dic:特殊词库:计量单位等
b. suffix.dic:特殊词库:后缀名
c. surname.dic:特殊词库:百家姓
d. preposition:特殊词库:语气词
5) 自定义词库:比如当下流行词:857、emmm...、渣女、舔屏、996
6) 热更新:
a. 修改ik分词器源码
b. 基于ik分词器原生支持的热更新方案,部署一个web服务器,提供一个http接口,通过modified和tag两个http响应头,来提供词语的热更新

设置访问密码

config/elasticsearch.yml中添加

1
2
3
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

进入bin目录下执行./elasticsearch-setup-passwords interactive(此初始化密码命令只能执行一次,之后如果想要执行该命令,需要在es中删除.security索引才能再次使用),为保留用户elastic、apm_system、kibana、kibana_system、logstash_system、beats_system、remote_monitoring_user初始化设置密码。

  • elastic:es内置超级用户
  • apm_system:apm服务器在es中存储监视信息时使用的账户
  • kibana(新版本推荐使用kabana_system):kibana连接es的账户
  • logstash_system:logstash将采集的日志输出到es时使用的账户
  • beats_system:beats在存储数据输出到es时使用的账户
  • remote_monitoring_user:metribeat用户在es中收集和存储监视信息时使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
esuser@host:/usr/local/elk/elasticsearch/bin$ ./elasticsearch-setup-passwords interactive
future versions of Elasticsearch will require Java 11; your Java version from [/usr/jdk1.8.0_241/jre] does not meet this requirement

Your cluster health is currently RED.
This means that some cluster data is unavailable and your cluster is not fully functional.

It is recommended that you resolve the issues with your cluster before running elasticsearch-setup-passwords.
It is very likely that the password changes will fail when run against an unhealthy cluster.

Do you want to continue with the password setup process [y/N]y

Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Passwords do not match.
Try again.
Enter password for [elastic]:
Reenter password for [elastic]:
Passwords do not match.
Try again.
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Passwords do not match.
Try again.
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

修改密码

1
2
修改密码api
curl -H "Content-Type:application/json" -XPOST -u elastic 'http://127.0.0.1:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'

节点通讯安全性

未启用加密的集群将以纯文本格式(包括密码)发送所有数据。如果启用了es安全功能,除非具有使用许可证,否则需配置SSL/TLS进行节点通信。

1、确认xpack.security.enabled设置为true

2、生成节点证书:TLS需要X.509证书才能对与之通信的应用程序执行加密和身份验证。为了使节点之间的通信真正安全,必须对证书进行验证。在es集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。这样,将节点添加到集群时,它们只需要使用由同一CA签名的证书,即可自动允许该节点加入集群。此外,建议证书包含与节点IP地址和DNS名称相对应的主题备用名称(SAN),以便可以执行主机名验证。

  • 为es集群创建证书颁发机构

    可以配置集群来信任所有拥有这个CA签署证书的节点。elastic-stack-ca.p12文件是PKCS#12秘钥存储库,其中包含CA的公共证书和用于为每个节点签署证书的秘钥。elasticsearch-certutil命令将提示输入密码以保护文件和秘钥。如果将来计划在集群中添加更多节点,请保留该文件的副本并记住其密码。

    ./bin/elasticsearch-certutil ca

    生成的elastic-stack-ca.p12文件包含CA的公共证书和用于每个节点的证书签名的私钥。生成过程中设置的密码在日后集群的横向扩容中需要用到,因此牢记

  • 为集群中每个节点生成私钥及证书

    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

    生成的elastic-cerificates.p12文件包含节点证书、节点秘钥和CA证书。生成时的密码可以直接enter设置为空。节点证书默认不包含主机信息,所以每个节点都可以使用此证书,但是节点必须闭关主机认证。

  • 把节点证书复制到各节点的config目录下

3、每个节点配置文件加上以下配置,启动TLS,transport层必须配置,http层非必须,但是建议配置。

1
2
3
4
5
6
7
xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
#证书配置
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-cerificates.p12
xpack.security.transport.ssl.trustore.path: elastic-cerificates.p12

4、重启集群