任何方式来访问ElasticSearch插件中的瞬态集群设置/状态?

问题描述:

我想存储一些简单的状态(键值对),通过ElasticSearch集群共享一个插件。 (NB - 插件不只是车辆/方法来存储状态,我想在插件使用这种状态)我试着通过集群更新设置API这样做,任何方式来访问ElasticSearch插件中的瞬态集群设置/状态?

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

但,不幸的是,这将无法正常工作,因为MY_SETTING未在IndexDynamicSettingsModule中注册。我无法弄清楚如何挂钩到该模块(可能是其addDynamicSetting方法)。 有没有办法将自定义键值存储在瞬态集群设置? (c.f. HTTP API)。

至于替代方案,似乎节点状态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"); 
    } 
} 

至于替代品,你可以通过实现和注册自己的custom data factory您的数据添加到状态。然后,您可以更新主服务器上的群集状态,并在所有节点上侦听插件中的群集状态更改。

+0

您是否有任何自定义数据工厂用法的示例?我一定是做错了;我通过'ClusterState.registerFactory'添加了一个自定义工厂,但它的任何方法('readFrom' /'writeTo' /'toXContent')似乎都没有被调用。谢谢! – gatoatigrado 2013-04-05 18:44:44

+1

看看IndexWarmersMetaData。 – imotov 2013-04-05 20:54:00

+0

非常感谢。然而,最终,我发现使用Elasticsearch Zookeeper插件更简单,更不容易出错,并将需要的状态值存储在Zookeeper中。 (这可以从外部工具看到它们的附加好处。)如果看起来有用,我可能会发布解决方案。 – gatoatigrado 2013-04-09 22:42:13