1

我想为插件存储一些在 ElasticSearch 集群中共享的简单状态(键值对)。(注意——插件不仅仅是一种存储状态的工具/方法,我想在插件中使用这种状态。)我尝试通过集群更新设置 API 执行此操作,

Settings newSettings = ImmutableSettings.settingsBuilder()
    .put(MY_SETTING, MY_VALUE).build();
client.admin().cluster().prepareUpdateSettings()
    .setTransientSettings(newSettings).execute().actionGet();

但是,不幸的是,这不起作用,因为MY_SETTING没有在IndexDynamicSettingsModule. 我不知道如何连接到那个模块(可能是它的addDynamicSetting方法)。有没有办法在瞬态集群设置中存储自定义键值?(参见HTTP API)。

至于替代方案,似乎节点状态 API 可以返回自定义值,但这些更多的是人们可以通过插件计算和返回的东西,而不是可以存储为状态的东西。将值存储在静态变量中,并通过广播操作将这些值分布在整个集群中是一种选择,但如果它存在,我更喜欢简单的东西。

任何解决方案都需要对 ElasticSearch 版本升级相当稳健。

提前致谢!

4

1 回答 1

2

动态设置的注册方式在 0.90 中进行了更改。因此,没有任何解决方案可以同时兼容 0.20.x 和 0.90.x 版本。对于 0.90.x 版本,您可以使用addDynamicSettings以下方法注册动态设置:

public class MyPlugin extends AbstractPlugin {

    /* ... */

    public void onModule(IndexDynamicSettingsModule indexDynamicSettingsModule) {
        indexDynamicSettingsModule.addDynamicSettings("index.my.setting");
    }
}

至于替代方案,您可以通过实现和注册自己的自定义数据工厂来将数据添加到状态中。然后,您可以在主节点上更新集群状态并在所有节点上监听插件中的集群状态变化。

于 2013-04-05T10:35:19.997 回答