在树莓派上跑了很多的服务,有不少是需要用到搜索功能的,如果仅仅是使用 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。 打开 ,这里提供了各种系统和架构的二进制下载。 而且还区分了完整版(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 安装包下载到本地后解压到当前目录: ```sh $ 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 等来安装成为系统服务,也用“绿色”的方式安装。 下载完然后安直接解压到当前目录即可即可: ```sh $ 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 的监听地址是:。 然后,可以用 curl 来测试一下是否启动成功: ```sh $ curl 127.0.0.1:9200 ```
```json { "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" } ``` ```sh $ curl 127.0.0.1:9200/_cluster/health ```
```json { "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 } ``` 大功告成! ## 参考 - [Setup Elasticsearch 7.x Cluster on Raspberry Pi / ASUS Tinker Board](https://medium.com/hepsiburadatech/setup-elasticsearch-7-x-cluster-on-raspberry-pi-asus-tinker-board-6a307851c801)