DevOps文化 & SRE实战分享平台

0%

CentOS 7.9部署Elasticsearch 7.9.1单机版


文章声明:此文基于木子实操撰写
生产环境:CentOS Linux release 7.9.2009 (Core), Elasticsearch 7.9.1, Kibana 7.9.1
问题关键字:bootstrap checks failed,Unassigned_shards


ES基础知识

Elasticsearch是目前最流行的全文搜索引擎,它可以快速地存储、搜索和分析海量数据,维基百科、Github均在使用。Elasticsearch的底层是开源库Lucene,但是你没法直接用Lucene,必须自己写代码去调用它的接口。Elasticsearch是Lucene的封装,提供了REST API操作接口开箱即用。本文从零开始,讲解如何使用Elasticsearch搭建自己的全文搜索引擎。Elasticsearch既可以单机部署,也可以集群部署。这仅仅只是一个单机版简单安装入门教程,想要更多的了解Elasticsearch,可以参考其官方文档。

系统基础配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 数据盘配置
# 格式化
mkfs.ext4 /dev/sdb
# 临时挂载
mkdir /data
mount /dev/sdb /data
# 获取磁盘UUID信息
blkid | grep sdb
/dev/sdb: UUID="ecd05e62-2ec8-44c0-be25-0b4f5f88d74f" TYPE="ext4"
# 永久挂载
vi /etc/fstab
UUID=ecd05e62-2ec8-44c0-be25-0b4f5f88d74f /data ext4 defaults 0 0

# 临时禁用SELINUX
setenforce 0
# 永久禁用SELINUX
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 禁用防火墙
systemctl disable firewalld && systemctl stop firewalld && systemctl status firewalld

# 基础需求包安装
yum install wget unzip net-tools

ES安装与配置

安装ES

1
2
3
# 这里从华为云仓库下载,相对来说速度比较快
wget https://mirrors.huaweicloud.com/elasticsearch/7.9.1/elasticsearch-7.9.1-x86_64.rpm
yum localinstall elasticsearch-7.9.1-x86_64.rpm

配置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
# ES官方建议内存设置为物理内存的一半
vi /etc/elasticsearch/jvm.options
-Xms8g
-Xmx8g

# 配置ES服务器参数
cat /etc/elasticsearch/elasticsearch.yml | grep -v "^#" | grep -v "^$"
# 集群名字
cluster.name: idc-es
# 节点名称
node.name: node-1
# ES数据存放目录
path.data: /data/esdata
# ES日志存放目录
path.logs: /data/eslogs
# 锁定物理内存地址,防止ES内存被交换出去,也就是避免ES使用swap交换分区,频繁的交换会导致IOPS变高,这里设置以后在启动ES服务的时候会出现报错的情况,在后面的[常见问题]中,木子会提供解决方法。
bootstrap.memory_lock: true
# 网络监听配置
network.host: 0.0.0.0
# 绑定端口
http.port: 9200
# 设置集群主节点
cluster.initial_master_nodes: ["node-1"]
# 设置ES允许跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
# 启用ES安全认证
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# 因为木子调整了ES数据与日志存放位置,所以这里创建应对目录,并设置对应权限。
mkdir /data/esdata/
mkdir /data/eslogs/
chown -R elasticsearch:elasticsearch /data/es*

安装ES插件

ES所有插件的安装方法都是相同的,木子这里以安装analysis-ik中文分词插件为例,这个插件也是阿里云ES默认集成插件。安装插件的方法有两种:

  • 直接使用命令安装
  • 下载对应插件包、解包,放于ES插件目录。
1
2
3
4
5
6
7
8
9
10
# 方法一
/usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip

# 方法二
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip
mkdir /usr/share/elasticsearch/plugins/ik
unzip -d /usr/share/elasticsearch/plugins/ik ./elasticsearch-analysis-ik-7.9.1.zip

# 查看插件是否安装成功
/usr/share/elasticsearch/bin/elasticsearch-plugin list

启动ES服务

1
2
systemctl daemon-reload
systemctl enable elasticsearch && systemctl start elasticsearch && systemctl status elasticsearch

设置访问ES密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
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]:
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]

ES可视化工具

ES可视化工具最简单的方法就是使用Chrome浏览器插件elasticsearch-head,还可以单独安装Kibana

Elasticsearch-head

Chrome浏览器插件:elasticsearch-head,此插件需要从Chrome网上商店下载。

Kibana

安装Kibana

1
2
wget https://mirrors.huaweicloud.com/kibana/7.9.1/kibana-7.9.1-x86_64.rpm
yum localinstall kibana-7.9.1-x86_64.rpm

配置Kibana

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat /etc/kibana/kibana.yml  | grep -v "^#" | grep -v "^$"
# 设置监听
server.host: "0.0.0.0"
# 设置ES服务器
elasticsearch.hosts: ["http://127.0.0.1:9200"]
# 设置ES认证账号密码
elasticsearch.username: "elastic"
elasticsearch.password: "xxx"
# 设置语言为中文
i18n.locale: "zh-CN"

# 配置Kibana的堆大小
# 对于在Kibana 7.6.X版本上的安装,建议增加Kibana的堆大小以确保正常安装Kibana的插件:
vi /etc/default/kibana
NODE_OPTIONS="--max_old_space_size=2048"

启动Kibana

1
2
systemctl daemon-reload
systemctl enable kibana.service && systemctl start kibana.service && systemctl status kibana.service

WEB访问Kibana

默认Kibana端口为5601,访问地址:http://IP:5601,账号密码即登录ES账号密码。

常见问题

bootstrap checks failed

如前面所述在ES上启用bootstrap.memory_lock: true后,启动ES服务,会出现以下错误:

1
2
3
4
systemctl status elasticsearch
ERROR: [1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
ERROR: Elasticsearch did not exit normally - check the logs at /data/eslogs/idc-es.log

解决方法
CentOS 6及以下版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited

# 这里的*代表所有用户,可以更换为指定用户名
# 另:这里有个坑就是如果/etc/security/limits.d文件夹下有配置文件,那么会覆盖刚才修改的文件,所以请确保该目录没有其它文件。

# 修改/etc/sysctl.conf
sudo echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p
# 这个参数的作用是告诉Linux内核尽量少使用swap分区,不等于禁用swap,通过少使用swap来提高性能。

# 重启服务器,生效配置
reboot

CentOS 7及以上版本:
此方法适用于Systemd管理的发行版,在CentOS 7系统中,使用Systemd替代了之前的SysV,/etc/security/limits.conf文件的配置作用域缩小了,/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对Systemd的service的资源限制不生效。
对于systemd service的资源限制,如何配置呢?
全局的配置放在文件/etc/systemd/system.conf和/etc/systemd/user.conf。 同时,也会加载两个对应的目录中的所有.conf文件/etc/systemd/system.conf.d/*.conf和 /etc/systemd/user.conf.d/*.conf。其中system.conf是系统实例使用的,user.conf用户实例使用的。一般sevice使用system.conf中的配置即可。systemd.conf.d/*.conf中配置会覆盖system.conf。

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
# 全局生效方式
vi /etc/systemd/system.conf
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity

# 局部生效方式:(针对包管理器安装elasticsearch的形式)
systemctl edit elasticsearch
# 此命令会在/etc/systemd/system下创建elasticsearch.service.d/override.conf文件
# 添加如下内容
[Service]
LimitMEMLOCK=infinity

# 保存,退出,执行如下命令生效
sudo systemctl daemon-reload

echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p

# 查看限制是否生效
cat /proc/$(cat /var/run/elasticsearch/elasticsearch.pid)/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 4096 4096 processes
Max open files 65535 65535 files
Max locked memory unlimited unlimited bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 63955 63955 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

Unassigned 警告

因为木子部署的是单节点,而默认ES模板创建的时候会设置副本数为1,这样就会出现Unassigned_shards问题,集群状态变成yellow,解决这个问题的方法有几种:

  • 扩容ES集群
  • 修改ES创建索引的默认模板副本数为0
  • 在手动创建索引的时候指定副本数为0
  • 手动修改已创建的索引副本数为0



如上图所示,木子已创建的索引出现了Unassigned问题,我们先查看一下对应的索引配置,可以看到number_of_replicas为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
# 查看指定索引副本数
root@iZ2zectqa75n2gzg8jsr45Z ~]# curl --user username:password -XGET http://localhost:9200/<索引名称>/_settings | jq
{
"索引名称": {
"settings": {
"index": {
"creation_date": "160933944887",
"number_of_shards": "1",
# 副本数
"number_of_replicas": "1",
"uuid": "GGmkdaBzdasddaC_46A",
"version": {
"created": "7090199"
},
"provided_name": "索引名称"
}
}
}
}

# 修改指定索引副本数
curl --user username:password -H "Content-Type: application/json;charset=UTF-8" -XPUT 'http://localhost:9200/<索引名称>/_settings' -d '{
"index": {
"number_of_replicas": "0"
}
}'
# 结果返回如下所示,即为成功
{"acknowledged":true}

# 修改所有索引副本数为0
curl --user username:password -H "Content-Type: application/json;charset=UTF-8" -XPUT 'http://localhost:9200/_settings' -d '{
"index": {
"number_of_replicas": "0"
}
}'

坚持原创技术分享,您的支持与鼓励,是我持续创作的动力!