2013-04-05 71 views
1

我想存儲一些簡單的狀態(鍵值對),通過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版本升級合理穩健。

在此先感謝!

回答

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"); 
    } 
} 

至於替代品,你可以通過實現和註冊自己的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