任何方式来访问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您的数据添加到状态。然后,您可以更新主服务器上的群集状态,并在所有节点上侦听插件中的群集状态更改。
您是否有任何自定义数据工厂用法的示例?我一定是做错了;我通过'ClusterState.registerFactory'添加了一个自定义工厂,但它的任何方法('readFrom' /'writeTo' /'toXContent')似乎都没有被调用。谢谢! – gatoatigrado 2013-04-05 18:44:44
看看IndexWarmersMetaData。 – imotov 2013-04-05 20:54:00
非常感谢。然而,最终,我发现使用Elasticsearch Zookeeper插件更简单,更不容易出错,并将需要的状态值存储在Zookeeper中。 (这可以从外部工具看到它们的附加好处。)如果看起来有用,我可能会发布解决方案。 – gatoatigrado 2013-04-09 22:42:13