0x01 前言

在前些天我配置了ELK5这个技术栈(安装配置Elastic Stack 5),在使用过程中发现x-pack这个插件是需要收费的。当然也有免费授权,但是免费授权只能用于监控。对于热衷于免费开源软件的我决定另找出路。

我使用x-pack主要是因为我为Elasticsearch配置了集群模式,所以需要使用一款软件来监控集群。在深入了解过后,发现一款名为Elasticsearch-head的插件正合适我的需要。

0x02 安装

自从Elasticsearch5.0开始就不再支持site plugins,所以我们要另找出路。

首先要获取这个插件,在下载的过程中正好能仔细阅读说明文档,因为源码存放在GitHub,电信连接GitHub的速度真的是惨不忍睹。以下是Elasticsearch-head的地址:

elasticsearch-head

里面有一段安装说明:

Running as a plugin of Elasticsearch

Install elasticsearch-head:
– for Elasticsearch 5.x:
site plugins are not supported. Run elasticsearch-head as a standalone server

由此可知,我们需要将Elasticsearch-head以独立服务的形式安装使用。

首先安装nodejs和npm:

[root@web ~]# yum install nodejs npm -y

然后下载源码,我直接在root目录下clone源码:

[root@web ~]# git clone https://github.com/mobz/elasticsearch-head.git

进入目录并安装:

#进入目录
[root@web ~]# cd elasticsearch-head/

#安装
[root@web elasticsearch-head]# npm install

要注意的是,我们的网络访问nodejs的服务器确实太慢了,这里需要等上几杯茶的时间。我们可以先去喝几桶水再回来,估计就好了。

完成之后的目录里有以下文件:

[root@web elasticsearch-head]#  ll -h
总用量 48K
-rw-r--r--   1 root root  104 11月 10 21:08 elasticsearch-head.sublime-project
-rw-r--r--   1 root root 2.2K 11月 20 19:59 Gruntfile.js
-rw-r--r--   1 root root 3.5K 11月 10 21:08 grunt_fileSets.js
-rw-r--r--   1 root root 1.1K 11月 10 21:08 index.html
-rw-r--r--   1 root root  559 11月 10 21:08 LICENCE
drwxr-xr-x 325 root root 8.0K 11月 20 22:18 node_modules
-rw-r--r--   1 root root  793 11月 10 21:08 package.json
-rw-r--r--   1 root root  100 11月 10 21:08 plugin-descriptor.properties
-rw-r--r--   1 root root 5.1K 11月 10 21:08 README.textile
drwxr-xr-x   5 root root  131 11月 20 20:00 _site
drwxr-xr-x   4 root root   29 11月 10 21:08 src
drwxr-xr-x   4 root root   66 11月 10 21:08 test

最后需要在elasticsearch.yml文件中添加以下内容:

http.cors.enabled: true
http.cors.allow-origin: "*"

这是用于控制访问的域名,因为我的所有服务只能通过局域网访问并且做了防火墙规则,所以我直接设置http.cors.allow-origin值为通配符*,然后重启elasticsearch。

[root@web ~]# systemctl restart elasticsearch.service

0x03 启动

在elasticsearch-head目录里通过以下命令即可启动:

[root@web elasticsearch-head]# ./node_modules/grunt/bin/grunt server

1479877613

随后即可通过http://[ip or domain]:9100进行访问了。

如果关闭了shell,那么elasticsearch-head服务也会随之关闭。另外就是,你会发现,在非elasticsearch-head目录中启动server会失败!原因是grunt需要读取Gruntfile.js这个文件。

为了能开机启动并在后台运行,我建立了一个shell 脚本:

cd /root/elasticsearch-head
./node_modules/grunt/bin/grunt server

然后使用nohup放在后台运行:

[root@web elasticsearch-head]# nohup /usr/local/shell/elasticsearch-head.sh > /dev/null 2>&1 &

将上面这个命令放到/etc/rc.local即可实现开机启动:

[root@web elasticsearch-head]# cat /etc/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
nohup /usr/local/shell/elasticsearch-head.sh > /dev/null 2>&1 &

0x04 结语

如果你已经配置好了集群,那么通过指定地址,你将看到以下内容:

1479877614-1

每个索引都有5个分片,粗线宽的分片是主分片,细线宽的是副本。这样kibana在搜索的时候就可以从多个elasticsearch服务器上读取,压力也按比例分布在各个集群节点中。

如果你还没有建立集群,那么只能看到一个节点,而且elasticsearch集群健康值是黄色的(yellow)

最后,当数据不多的时候通过一台elasticsearch服务器也能完成任务。但是数据随着时间的推移而增多,尤其需要查询6个月、一年甚至更长时间跨度的数据时,你会发现集群有多么重要。