[树莓派] 在树莓派上手动安装并搭建 Elasticsearch 搜索引擎集群

陪她去流浪 桃子 2020年01月04日 编辑 阅读次数:5283

在树莓派上跑了很多的服务,有不少是需要用到搜索功能的,如果仅仅是使用 MySQL 数据库自带的 LIKE 语句来搜索,还是太弱了。 所以折腾了好几次,准备在树莓派上跑一个 Elasticsearch 全文搜索服务后端,供全部的服务共同使用。 但是,之前尝试过几次按照网上的安装方法,大多失败。于是自己摸索出了办法,这篇文章总结一下。(有点语无伦次,改过几版)。

遇到的一些困难

Java 运行时 不提供 ARM 版本

Elasticsearch 本身是 Java 写的,意味着需要安装 Java 运行时(这里指 OpenJDK)。 但是非常可惜的是 Java 官方并没有提供 ARM 版本的 Java 供下载。在网上进行大量搜索,很的源也基本不可用。

Elasticsearch 不提供 ARM 版本

Elasticsearch 官方也没有提供 ARM 版本的安装包,甚至连 Docker 镜像也没有(上面的 Java 也没有)。所以,这很棘手。

内存吃紧

Java 应用程序通常来说比 C++/Go 等程序更吃内存。而且 Elasticsearch 的底层 Lucene 引擎本来就是严格依靠内存来提供搜索服务的。 所以,在仅 1G 内存的树莓派 3B 上来说,还是非常吃紧的。

要知道,我在公司维护的 Elasticsearch 集群每个实例都有 30G+ 内存可用,而且好几百实例。相形见绌。

存储性能问题

我提供的是用户内容(UGC)搜索服务,不是日志搜索服务。所以不会强调有多高的 QPS。但是用 SD 卡也不太好,不过好在我有一块 USB 连接的外部硬盘,4T。

安装过程

鉴于采用安装包的方式有诸多的困难,所以我采用了“绿色”的安装方式:解压后直接运行。

安装 Java(OpenJDK)

我在网上能搜索到的通过 apt-get 等方式的安装方式通通失败:找不到源。 无奈手动安装。因为我准备安装最新版本的 Elasticsearch,所以对 Java 的版本也要求比较高。这里安装 JDK11。

由于官方没有 ARM 版本的二进制,所以这里安装 Liberica OpenJDK。 打开 https://www.bell-sw.com/java.html,这里提供了各种系统和架构的二进制下载。 而且还区分了完整版(full)和精简版(lite),但是该官网说精简版也是完全能工作的,只是把 JavaFx 模块去掉了(非 Javaer 不懂这是什么),还做了一些压缩。所以我选择了精简版。

因为我的树莓派是 3B,构架是 ARMv7l,所以我选择了Linux ARM v7 & v8 32 bit HardFloat 11.0.2版本的 JDK,60+ MB。 文件名是:bellsoft-jdk11.0.2-linux-arm32-vfp-hflt-lite.tar.gz,tgz 压缩包。

注意:Elasticsearch 二进制运行时按理说依赖的是 JRE 而不是 JDK。但不清楚为什么 Elasticsearch 官方提到的是 JDK。 这里我不仔细甄别区别,直接安装 JDK。

把 JDK 安装包下载到本地后解压到当前目录:

1
2
$ curl -O https://download.bell-sw.com/java/11.0.2/bellsoft-jdk11.0.2-linux-arm32-vfp-hflt-lite.tar.gz
$ tar xvf bellsoft-jdk11.0.2-linux-arm32-vfp-hflt-lite.tar.gz

会得到目录:jdk-11.0.2-lite

安装 Elasticsearch

我直接到官网下载了最新的没有 JDK 的 Elasticsearch 的版本。注意路径中有 no-jdk 字样。

注意,我是下载的linux-x86_64.tar.gz构架的版本,并不是 ARM。因为根本没有 ARM 版本可下载。所以,其实有一些东西是不能用的,比如 X-Pack 里面的机器学习,那里面很多动态库文件。所以 Java 真的能跨平台吗?试试便知。

Elasticsearch 本身的安装是很容易的。由于并不是系统兼容的安装包,所以我在这里并不推荐使用安装工具比如 apt 和 dpkg 等来安装成为系统服务,也用“绿色”的方式安装。

下载完然后安直接解压到当前目录即可即可:

1
2
$ curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-no-jdk-linux-x86_64.tar.gz
$ tar xvf elasticsearch-7.5.1-no-jdk-linux-x86_64.tar.gz

会得到目录:elasticsearch-7.5.1

然后进行一些配置。

首先把 Java 直接放到 Elasticsearch 的目录内:mv jdk-13.0.1-lite elasticsearch-7.5.1/jdk

然后,Elasticsearch X-Pack 的机器学习没法用,直接到 Elasticsearch 目录里的配置文件里面关闭。

编辑config/elasticsearch.yml文件,在最后(其实无所谓)加上一行:xpack.ml.enabled: false

由于我不准备配置成一个多节点的集群,仅单个 Elasticsearch 节点,所以配置一下集群信息。取消注释并修改相关配置。

  • 集群名字:cluster.name: elasticsearch

  • 节点名:node.name: master

  • 既是 master 也是 data,还是 ingest 节点,增加以下两行:

    • node.master: true
    • node.data: true
  • 数据目录的路径,建议改一下。毕竟存在 SD 卡上也太慢了吧。

    • path.data: /path/to/data,改成你自己的目录。

还要修改一下 jvm 的配置,比如内存。配置文件:config/jvm.options

首先是初始堆内存和最大堆内存。由于树莓派内存非常有限。所以我设置得很小。

  • 初始内存:-Xms128m,128M
  • 最大内存:-Xmx512m,512M

实在是太少了,有没有??

运行 Elasticsearch

直接在 Elasticsearch 的根目录下执行./bin/elasticsearch即可。

可能会等好几分钟才能启动起来。

可能会产生一些警告,可以忽略。

当看到有一条类似这样的日志时,Elasticsearch 就启动好了:

[2020-01-04T05:21:09,391][INFO ][o.e.h.AbstractHttpServerTransport] [master] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}

它告诉我们 Elasticsearch 的监听地址是:http://127.0.0.1:9200

然后,可以用 curl 来测试一下是否启动成功:

1
$ curl 127.0.0.1:9200
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "name" : "master",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "JZmMdBNMRmKsxXXkYCi0rg",
  "version" : {
    "number" : "7.5.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
    "build_date" : "2019-12-16T22:57:37.835892Z",
    "build_snapshot" : false,
    "lucene_version" : "8.3.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
1
$ curl 127.0.0.1:9200/_cluster/health
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{
  "cluster_name": "elasticsearch",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 1,
  "number_of_data_nodes": 1,
  "active_primary_shards": 0,
  "active_shards": 0,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 100
}

大功告成!

参考

标签:树莓派 · ElasticSearch