elasticsearch,Plugins,elasticsearch" /> elasticsearch,Plugins,elasticsearch" />

Plugins 有没有办法访问ElasticSearch插件中的临时群集设置/状态?

Plugins 有没有办法访问ElasticSearch插件中的临时群集设置/状态?,plugins,elasticsearch,Plugins,elasticsearch,我想为插件存储一些在ElasticSearch集群中共享的简单状态(键值对)。(注意——插件不仅仅是一种存储状态的工具/方法,我希望在插件中使用这种状态。)我已经尝试通过集群更新设置API来实现这一点 Settings newSettings = ImmutableSettings.settingsBuilder() .put(MY_SETTING, MY_VALUE).build(); client.admin().cluster().prepareUpdateSettings()

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

Settings newSettings = ImmutableSettings.settingsBuilder()
    .put(MY_SETTING, MY_VALUE).build();
client.admin().cluster().prepareUpdateSettings()
    .setTransientSettings(newSettings).execute().actionGet();
但是,不幸的是,这不起作用,因为
MY_设置
未在
IndexDynamicSettingsModule
中注册。我不知道如何连接到该模块(可能是它的
addDynamicSetting
方法)是否有办法在临时群集设置中存储自定义键值?(c.f.)

至于备选方案,节点状态API似乎可以返回自定义值,但这些是插件计算和返回的更多内容,而不是可以存储为状态的内容。将值存储在静态变量中,并使用广播操作在集群中分发这些值是一种选择,但如果存在,我更喜欢简单的方法

任何解决方案都需要对ElasticSearch版本升级具有合理的鲁棒性


提前谢谢

动态设置的注册方式在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");
    }
}

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

您有自定义数据工厂用法的示例吗?我一定是做错了;我通过
ClusterState.registerFactory
添加了一个自定义工厂,但是它的方法(
readFrom
/
writeTo
/
toXContent
)似乎都没有被调用。谢谢看看IndexWarmersMetaData。非常感谢。然而,最后,我发现它更简单&只利用Elasticsearch Zookeeper插件,并将我需要的状态值存储在Zookeeper中,不容易出错。(这还有一个额外的好处,就是可以从外部工具查看它们。)如果这个解决方案看起来有用,我可能会发布它。