我尝试在OSv上运行elasticsearch

尝试在OSv操作系统上运行elasticsearch

今天的内容 de

由于在OSv#4的聚会上尝试了elasticsearch,所以我将写一篇关于该内容的OSv Advent Calendar。

OSv和elasticsearch都是从GitHub上克隆下来的,并且本次OSv使用的是提交记录为b79223584b(版本号为v0.16-27-gb792235),elasticsearch使用的是提交记录为6d872843bd进行验证。

我正在使用Fedora21作为操作系统。

请问您在说的是Elasticsearch吗?

根据官方网站的介绍,elasticsearch被称为”Elasticsearch是一个灵活且功能强大的开源、分布式、实时搜索和分析引擎”,看起来它就像是一个分布式实时搜索和分析引擎(我之前一直误以为它只是一种Key Value存储的实现之一)。

Elasticsearch 的构建

我要从GitHub上clone下来的elasticsearch进行构建。原因是要从源代码构建。 elasticsearch是一个jar文件,但在运行时需要加载一个名为sigar的.so格式的系统监控库,所以无法运行已经编译好的可执行文件版本。然而,根据我看到的最新GitHub上的源文件,sigar已经被禁用了,所以即使是已编译好的版本可能也可以使用(未经确认)。

    • SIGAR – System Information Gatherer And Reporter

https://support.hyperic.com/display/SIGAR/Home
https://github.com/hyperic/sigar

请按以下步骤构建elasticsearch。由于需要Maven等构建工具,请先安装。

fedora$ git clone https://github.com/elasticsearch/elasticsearch.git
fedora$ mvn clean package -DskipTests

当构建完成后,会生成以下的jar文件。

$ ls target/elasticsearch-2.0.0-SNAPSHOT*.jar 
target/elasticsearch-2.0.0-SNAPSHOT-sources.jar
target/elasticsearch-2.0.0-SNAPSHOT-test-sources.jar
target/elasticsearch-2.0.0-SNAPSHOT-tests.jar
target/elasticsearch-2.0.0-SNAPSHOT.jar

OSv的构建

接下来开始构建OSv。为了通过REST API传输jar文件,您需要指定httpserver和java来进行构建。请不要忘记指定cli。

fedora$ make image='cli,httpserver,java'

在OSv上执行elasticsearch

如果要将应用程序移植到OSv上,需要在apps目录下准备用于构建的配置文件,以便能够通过类似于”make image=elasticsearch”的方式进行构建。但由于我们无法达到这一步骤,所以现在尝试通过执行已构建的jar文件的方法进行进展。

反过来说,在移植过程中可以按照以下试错的步骤进行,然后在一定程度上运行正常后,可能也可以将文件准备到apps目录中。

在OSv层面的准备

首先,事先创建/els和/tmp/els作为elasticsearch相关文件的存放目录。

fedora$ sudo ./scripts/run.py -n
OSv v0.16-27-gb792235
eth0: 192.168.122.89
/# mkdir /els /tmp/els

将elasticsearch复制到OSv中

接下来,我们需要将elasticsearch的jar文件集从主机操作系统传输到OSv上。你可以指定OSv在启动时显示的IP地址。
实际上,我们希望在OSv上运行ifconfig等命令来确认IP地址,但是从CRaSH切换到Lua CLI后,ifconfig命令不再可用了…。

文件传输通过REST API进行。

fedora$ curl -XPOST http://192.168.122.89:8000/file/els/elasticsearch.jar -Fname=@./target/elasticsearch-2.0.0-SNAPSHOT.jar
fedora$ for i in `find ./target/lib/*.jar`
        do
            curl -XPOST http://192.168.122.89:8000/file/els/`basename ${i}` -Fname=@${i}
        done

Elasticsearch的jar文件将被配置如下:

/# ls -l /els
total 71052
-rwxrwxrwx 1 osv osv 167735   Dec 23 17:37 antlr-runtime-3.5.jar
-rwxrwxrwx 1 osv osv 448794   Dec 23 17:37 apache-log4j-extras-1.2.17.jar
-rwxrwxrwx 1 osv osv 47359    Dec 23 17:37 asm-4.1.jar
-rwxrwxrwx 1 osv osv 38090    Dec 23 17:37 asm-commons-4.1.jar
-rwxrwxrwx 1 osv osv 41123    Dec 23 17:37 commons-cli-1.2.jar
-rwxrwxrwx 1 osv osv 412739   Dec 23 17:37 commons-lang3-3.3.2.jar
-rwxrwxrwx 1 osv osv 110694   Dec 23 17:37 compiler-0.8.13.jar
-rwxrwxrwx 1 osv osv 79732    Dec 23 17:37 compress-lzf-1.0.2.jar
-rwxrwxrwx 1 osv osv 13247055 Dec 23 17:37 elasticsearch.jar
-rwxrwxrwx 1 osv osv 7065645  Dec 23 17:37 groovy-all-2.3.2-indy.jar
-rwxrwxrwx 1 osv osv 2256213  Dec 23 17:37 guava-18.0.jar
-rwxrwxrwx 1 osv osv 1307968  Dec 23 17:37 hppc-0.6.0.jar
-rwxrwxrwx 1 osv osv 225316   Dec 23 17:37 jackson-core-2.4.2.jar
-rwxrwxrwx 1 osv osv 45230    Dec 23 17:37 jackson-dataformat-cbor-2.4.2.jar
-rwxrwxrwx 1 osv osv 75008    Dec 23 17:37 jackson-dataformat-smile-2.4.2.jar
-rwxrwxrwx 1 osv osv 324650   Dec 23 17:37 jackson-dataformat-yaml-2.4.2.jar
-rwxrwxrwx 1 osv osv 914597   Dec 23 17:37 jna-4.1.0.jar
-rwxrwxrwx 1 osv osv 38460    Dec 23 17:38 joda-convert-1.2.jar
-rwxrwxrwx 1 osv osv 581571   Dec 23 17:38 joda-time-2.3.jar
-rwxrwxrwx 1 osv osv 794991   Dec 23 17:38 jts-1.13.jar
-rwxrwxrwx 1 osv osv 489884   Dec 23 17:38 log4j-1.2.17.jar
-rwxrwxrwx 1 osv osv 1529188  Dec 23 17:38 lucene-analyzers-common-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 365795   Dec 23 17:38 lucene-backward-codecs-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 2230594  Dec 23 17:38 lucene-core-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 75222    Dec 23 17:38 lucene-expressions-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 107452   Dec 23 17:38 lucene-grouping-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 139676   Dec 23 17:38 lucene-highlighter-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 65215    Dec 23 17:38 lucene-join-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 33735    Dec 23 17:38 lucene-memory-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 160334   Dec 23 17:38 lucene-misc-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 201533   Dec 23 17:38 lucene-queries-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 391276   Dec 23 17:38 lucene-queryparser-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 111979   Dec 23 17:38 lucene-sandbox-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 155557   Dec 23 17:38 lucene-spatial-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 177741   Dec 23 17:38 lucene-suggest-5.0.0-snapshot-1646179.jar
-rwxrwxrwx 1 osv osv 1302165  Dec 23 17:38 netty-3.9.3.Final.jar
-rwxrwxrwx 1 osv osv 428580   Dec 23 17:38 sigar-1.6.4.jar
-rwxrwxrwx 1 osv osv 25689    Dec 23 17:38 slf4j-api-1.6.2.jar
-rwxrwxrwx 1 osv osv 102177   Dec 23 17:38 spatial4j-0.4.1.jar
-rwxrwxrwx 1 osv osv 49754    Dec 23 17:38 t-digest-3.0.jar

确保在OSv启动时elasticsearch会自动启动。

为了让OSv基本上以单进程运行,我们会在启动时通过REST API进行配置,让 elasticsearch 而不是 Lua CLI 启动。
考虑到命令过长,可以通过Shell脚本来进行配置,这样会更好。

$ cat setup_els_to_osv.sh 
#!/bin/sh

cmdline=""
cmdline="$cmdline java.so "
cmdline="$cmdline -Djava.awt.headless=true "
cmdline="$cmdline -Des.foreground=yes "
cmdline="$cmdline -Des.path.home=/tmp/els"
cmdline="$cmdline -cp /els/elasticsearch.jar:/els/* "
cmdline="$cmdline org.elasticsearch.bootstrap.Elasticsearch"

curl -X POST -d cmdline="$cmdline" http://192.168.122.89:8000/os/cmdline
curl -XGET http://192.168.122.89:8000/os/cmdline

完成設定後,可以重新啟動 OSv(也可以透過 REST API 重新啟動)。

/# reboot
OSv v0.16-27-gb792235

再启动后,会突然发生异常,但请保持冷静并坚持不慌。

/# reboot
OSv v0.16-27-gb792235
Failed to configure logging...
org.elasticsearch.ElasticsearchException: Failed to load logging configuration
        at org.elasticsearch.common.logging.log4j.LogConfigurator.resolveConfig(LogConfigurator.java:139)
        at org.elasticsearch.common.logging.log4j.LogConfigurator.configure(LogConfigurator.java:89)
        at org.elasticsearch.bootstrap.Bootstrap.setupLogging(Bootstrap.java:96)
        at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.java:171)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:32)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at io.osv.ContextIsolator.runMain(ContextIsolator.java:233)
        at io.osv.ContextIsolator.access$400(ContextIsolator.java:32)
        at io.osv.ContextIsolator$3.run(ContextIsolator.java:118)
Caused by: java.nio.file.NoSuchFileException: /tmp/els/config
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
        at sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:55)
        at sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:144)
        at sun.nio.fs.LinuxFileSystemProvider.readAttributes(LinuxFileSystemProvider.java:97)
        at java.nio.file.Files.readAttributes(Files.java:1684)
        at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:109)
        at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:69)
        at java.nio.file.Files.walkFileTree(Files.java:2600)
        at org.elasticsearch.common.logging.log4j.LogConfigurator.resolveConfig(LogConfigurator.java:123)
        ... 11 more
log4j:WARN No appenders could be found for logger (node).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
WARNING: fcntl(F_SETLK) stubbed
40171 [Thread-3] DEBUG Sigar  - no libsigar-amd64-linux.so in java.library.path
org.hyperic.sigar.SigarException: no libsigar-amd64-linux.so in java.library.path
        at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172)
        at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:100)
        at org.elasticsearch.monitor.sigar.SigarService.<init>(SigarService.java:40)
        at org.elasticsearch.monitor.MonitorModule.configure(MonitorModule.java:70)
        at org.elasticsearch.common.inject.AbstractModule.configure(AbstractModule.java:60)
        at org.elasticsearch.common.inject.spi.Elements$RecordingBinder.install(Elements.java:204)
        at org.elasticsearch.common.inject.spi.Elements.getElements(Elements.java:85)
        at org.elasticsearch.common.inject.InjectorShell$Builder.build(InjectorShell.java:130)
        at org.elasticsearch.common.inject.InjectorBuilder.build(InjectorBuilder.java:99)
        at org.elasticsearch.common.inject.Guice.createInjector(Guice.java:93)
        at org.elasticsearch.common.inject.Guice.createInjector(Guice.java:70)
        at org.elasticsearch.common.inject.ModulesBuilder.createInjector(ModulesBuilder.java:59)
        at org.elasticsearch.node.internal.InternalNode.<init>(InternalNode.java:200)
        at org.elasticsearch.node.NodeBuilder.build(NodeBuilder.java:159)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:66)
        at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.java:196)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:32)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at io.osv.ContextIsolator.runMain(ContextIsolator.java:233)
        at io.osv.ContextIsolator.access$400(ContextIsolator.java:32)
        at io.osv.ContextIsolator$3.run(ContextIsolator.java:118)
76791 [Thread-3] DEBUG threadpool  - [Key] creating thread_pool [generic], type [cached], keep_alive [30s]
77264 [Thread-3] DEBUG threadpool  - [Key] creating thread_pool [index], type [fixed], size [4], queue_size [200]

当名为“例外”的风暴过去后,elasticsearch将开始启动。

135654 [elasticsearch[Key][clusterService#updateTask][T#1]] INFO gateway  - [Key] recovered [0] indices into cluster_state
135714 [elasticsearch[Key][clusterService#updateTask][T#1]] DEBUG cluster.service  - [Key] processing [local-gateway-elected-state]: done applying updated cluster_state (version: 2)
142373 [elasticsearch[Key][clusterService#updateTask][T#1]] DEBUG cluster.service  - [Key] processing [routing-table-updater]: execute
142460 [elasticsearch[Key][clusterService#updateTask][T#1]] DEBUG cluster.service  - [Key] processing [routing-table-updater]: no change in cluster_state

我想试试一下Elasticsearch。

立即从主机操作系统(Fedora)上触摸OSv上的elasticsearch。

首先,让我们尝试获取elasticsearch的信息。

fedora$ curl -X GET http://192.168.122.89:9200/
{
  "status" : 200,
  "name" : "Magnus",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.0.0",
    "build_hash" : "6d872843bd30c485a4137b2f418bd833d963cc91",
    "build_timestamp" : "2014-12-23T16:49:13Z",
    "build_snapshot" : true,
    "lucene_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

接下来,我会随便注册一些看起来差不多的数据。

fedora$ curl -XPUT 'http://192.168.122.89:9200/naruko/user/mimori' -d '{ "name": "東郷美森" }'
{"_index":"naruko","_type":"user","_id":"mimori","_version":1,"created":true}
$ curl -XPUT 'http://192.168.122.89:9200/naruko/tweet/1' -d '
{                        
    "user"    : "mimori",             
    "postDate": "2014-23-23T21:30:00",                              
    "message" : "次こそはぼた餅食べてくださいね。有無は言わせない。"
}'
{"_index":"naruko","_type":"tweet","_id":"1","_version":1,"created":true}

我尝试获取已注册的数据。看起来可以用于勇者部成员的聊天应用的后端。

fedora$ curl -XGET 'http://192.168.122.89:9200/naruko/user/mimori?pretty=true'
{
  "_index" : "naruko",
  "_type" : "user",
  "_id" : "mimori",
  "_version" : 1,
  "found" : true,
  "_source":{ "name": "東郷美森" }
}
fedora$ curl -XGET 'http://192.168.122.89:9200/naruko/tweet/1?pretty=true'
{
  "_index" : "naruko",
  "_type" : "tweet",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source":
{
    "user"    : "mimori",
    "postDate": "2014-23-23T21:30:00",
    "message" : "次こそはぼた餅食べてくださいね。有無は言わせない。"
}
}

已知的问题

现在,虽然在OSv上成功运行了elasticsearch,但目前似乎如果启动elasticsearch并让其保持运行,OSv会遇到以下错误并崩溃。
与之前在CLI仍然是CRaSH时运行elasticsearch时,同样的错误再次出现了…。

[backtrace]
0x00000000003ea99c <sched::timer_list::fired()+1100>
0x0000000000393576 <interrupt_descriptor_table::invoke_interrupt(unsigned int)+166>
0x000000000039369b <interrupt+91>
0x0000000000391ebc <???+3743420>
0x00000000003ed67f <sched::cpu::idle()+31>
0x00000000003ed6ae <???+4118190>
0x00000000003ed8e7 <thread_main_c+39>
0x0000000000391ee5 <???+3743461>

一旦在OSv上运行应用程序…

虽然存在类似的问题,但如果将应用程序迁移到OSv上,可以尝试向OSv的ML发送补丁并可能被采纳。

由于@deep_tkkn在12/3的OSv节日日历中撰写了关于如何发送OSv补丁的文章,我将参考此文章来发送补丁。

仅提供一种中文翻译:
然而,关于elasticsearch,我只能在Lua CLI环境下运行,所以能够执行”make image=elasticsearch”还有很长的路要走……。

总结

我原本打算早点在OSv Advent Calendar上写一篇文章,但一直拖延不下去。

既然在Java应用程序中,对于将其移植到OSv相对而言较为简单,我打算寻找其他有趣的应用程序来尝试一下。
(不过,先发送补丁可能更为重要…)

广告
将在 10 秒后关闭
bannerAds