在SolrCloud模式下添加自定義插件

2018-12-18 14:02 更新

在SolrCloud模式下,自定義插件需要在群集的所有節(jié)點(diǎn)之間共享。

當(dāng)在SolrCloud模式下運(yùn)行Solr并且想要使用自定義代碼(例如自定義分析器、標(biāo)記器、查詢解析器和其他插件)時(shí),將jar添加到群集中所有節(jié)點(diǎn)上的類路徑可能非常麻煩。使用 Blob Store API和Config API的特殊命令,您可以將jar上傳到一個(gè)特定的系統(tǒng)級(jí)集合,并在運(yùn)行時(shí)從它們中動(dòng)態(tài)加載插件,而無需重新啟動(dòng)任何節(jié)點(diǎn)。

默認(rèn)情況下禁用此功能,除了通過在 SolrCloud 模式下運(yùn)行來要求該 solr 之外,默認(rèn)情況下此功能也是禁用的,除非所有Solr節(jié)點(diǎn)在啟動(dòng)時(shí)都使用該-Denable.runtime.lib=true選項(xiàng)運(yùn)行。在啟用此功能之前,用戶應(yīng)仔細(xì)考慮以下"安全運(yùn)行庫"部分中討論的問題

上傳Jar文件

第一步是使用Blob Store API來上傳你的jar文件。這將把您的罐子.system集合中,并將它們分布在您的SolrCloud節(jié)點(diǎn)上。這些jar被添加到一個(gè)單獨(dú)的類加載器,并且只可由配置為 runtimeLib = true 的組件訪問。這些組件被惰性加載,因?yàn)楫?dāng)一個(gè)特定的核心被加載時(shí),.system集合可能不會(huì)被加載。

配置使用Jars作為運(yùn)行時(shí)庫的API命令

運(yùn)行時(shí)庫功能為Config API使用一組特殊的命令來將blob存儲(chǔ)中當(dāng)前可用的jar文件添加、更新或刪除到運(yùn)行時(shí)庫列表中。

以下命令用于管理運(yùn)行時(shí)庫:

  • add-runtimelib
  • update-runtimelib
  • delete-runtimelib
curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json' -d '{
   "add-runtimelib": { "name":"jarblobname", "version":2 },
   "update-runtimelib": { "name":"jarblobname", "version":3 },
   "delete-runtimelib": "jarblobname"
}'

要使用的名稱是您將jar上傳到blob存儲(chǔ)區(qū)時(shí)指定的blob的名稱。您還應(yīng)該包含您要使用的blob存儲(chǔ)區(qū)中找到的jar版本。這些細(xì)節(jié)信息被添加到configoverlay.json中。

默認(rèn) SolrResourceLoader 對(duì)已定義為運(yùn)行庫的 jar 沒有可見性。有一個(gè)類加載器可以訪問這些只能提供給特殊注釋的組件的jar。

每個(gè)可插入組件都可以有一個(gè)稱為runtimeLib=true的可選的額外屬性,這意味著組件在核心加載時(shí)不會(huì)被加載。相反,他們將被按需加載。如果組件加載時(shí)所有依賴的jar都不可用,則會(huì)拋出錯(cuò)誤。

這個(gè)例子顯示了使用已經(jīng)加載到Blob存儲(chǔ)的jar創(chuàng)建一個(gè)ValueSourceParser。

curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json' -d '{
  "create-valuesourceparser": {
    "name": "nvl",
    "runtimeLib": true,
    "class": "solr.org.apache.solr.search.function.NvlValueSourceParser,
    "nvlFloatValue": 0.0 }
}'

保護(hù)運(yùn)行時(shí)庫

此功能的一個(gè)缺點(diǎn)是可以用來把惡意的可執(zhí)行代碼加載到系統(tǒng)中。但是,可以通過使用 PKI 來限制系統(tǒng)只加載受信任的 jar,以驗(yàn)證加載到系統(tǒng)中的可執(zhí)行文件是否可信。

以下步驟將允許您啟用此功能的安全性。這些指令假設(shè)您已經(jīng)使用-Denable.runtime.lib=true啟動(dòng)了所有的Solr節(jié)點(diǎn)了。

第1步:生成一個(gè)RSA私鑰

第一步是生成一個(gè)RSA私鑰。下面的示例使用512位密鑰,但是您應(yīng)該使用適合您需要的強(qiáng)度。

$ openssl genrsa -out priv_key.pem 512

步驟2:輸出公鑰

密鑰的公共部分應(yīng)該以DER格式輸出,以便Java可以讀取它。

$ openssl rsa -in priv_key.pem -pubout -outform DER -out pub_key.der

步驟3:將密鑰加載到ZooKeeper

然后, 從步驟2輸出的. der 文件應(yīng)加載到一個(gè)節(jié)點(diǎn)/密鑰/exe 下的管理員, 以便在每個(gè)節(jié)點(diǎn)中都可用。您可以將任意數(shù)量的公鑰加載到該節(jié)點(diǎn)上, 并且全部都是有效的。如果從目錄中刪除了某個(gè)密鑰, 則該密鑰的簽名將不再有效。因此, 在刪除密鑰之前, 請(qǐng)確保使用更新 runtimelib 命令更新運(yùn)行庫配置, 并使用有效的簽名。
在目前的時(shí)間, 你只能使用動(dòng)物園管理員 zkCli (或 zkCli 在 Windows 上) 腳本來發(fā)出這些命令 (Solr 版本具有相同的名稱, 但不相同)。如果你有自己的動(dòng)物園管理員合奏已經(jīng)運(yùn)行, 你可以找到腳本在 $ZK _install/斌/zkCli (或 zkCli, 如果您正在使用的 Windows)。


完成第二步后應(yīng)該將從步驟2輸出的.der文件加載到/keys/exe節(jié)點(diǎn)下的ZooKeeper中,以便在每個(gè)節(jié)點(diǎn)中都可用。您可以將任意數(shù)量的公鑰加載到該節(jié)點(diǎn),并且全部都是有效的。如果從目錄中刪除一個(gè)密鑰,該密鑰的簽名將不再有效。因此,在刪除密鑰之前,請(qǐng)確保使用該update-runtimelib命令更新運(yùn)行時(shí)庫配置的有效簽名。

目前,您只能使用ZooKeeper zkCli.sh(或Windows中的zkCli.cmd)腳本來發(fā)出這些命令(Solr版本具有相同的名稱,但不一樣)。如果您已經(jīng)擁有自己的ZooKeeper集成,則可以在其中找到該腳本$ZK_INSTALL/bin/zkCli.sh(或者zkCli.cmd,如果您使用的是Windows)。

如果您正在運(yùn)行的是包含在 Solr 中的嵌入式ZooKeeper,則您已經(jīng)沒有此腳本;為了使用它,您將需要從 http://zookeeper.apache.org/下載一個(gè)ZooKeeper v3.4.10的副本。不用擔(dān)心配置下載,您只是想獲取命令行實(shí)用程序腳本。當(dāng)您啟動(dòng)腳本時(shí),您將連接到嵌入式ZooKeeper。

要加載密鑰,您需要使用zkCli.sh連接到ZooKeeper,創(chuàng)建目錄,然后創(chuàng)建密鑰文件,如下例所示:

# Connect to ZooKeeper
# Replace the server location below with the correct ZooKeeper connect string for your installation.
$ .bin/zkCli.sh -server localhost:9983

# After connection, you will interact with the ZK prompt.
# Create the directories
[zk: localhost:9983(CONNECTED) 5] create /keys
[zk: localhost:9983(CONNECTED) 5] create /keys/exe

# Now create the public key file in ZooKeeper
# The second path is the path to the .der file on your local machine
[zk: localhost:9983(CONNECTED) 5] create /keys/exe/pub_key.der /myLocal/pathTo/pub_key.der

在此之后,任何加載jar的嘗試都將失敗。您的所有 jar 必須與您的一個(gè)私鑰簽名,以便Solr信任它。在步驟4-6中概述了為 jar 簽名和使用簽名的過程。

第4步:簽署jar文件

接下來,您需要簽署jar文件的sha1摘要并獲取base64字符串。

$ openssl dgst -sha1 -sign priv_key.pem myjar.jar | openssl enc -base64

此步驟的輸出將是一個(gè)字符串,您將需要在下面的步驟6中將該jar添加到您的類路徑中。

第5步:將jar加載到Blob Store

使用Blob Store API將您的jar加載到Blob存儲(chǔ)區(qū)。這一步不需要簽名;您將需要在步驟6中的簽名將其添加到您的類路徑中。

curl -X POST -H 'Content-Type: application/octet-stream' --data-binary @{filename}
http://localhost:8983/solr/.system/blob/{blobname}

您在此步驟中給出jar文件的blob名稱將被用作下一步中的名稱。

第6步:將jar添加到Classpath

最后,使用Config API將jar添加到類路徑,如上所述。在這一步中,您將需要提供您在步驟4中獲得的jar的簽名。

curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json'  -d '{
  "add-runtimelib": {
    "name":"blobname",
    "version":2,
    "sig":"mW1Gwtz2QazjfVdrLFHfbGwcr8xzFYgUOLu68LHqWRDvLG0uLcy1McQ+AzVmeZFBf1yLPDEHBWJb5KXr8bdbHN/
           PYgUB1nsr9pk4EFyD9KfJ8TqeH/ijQ9waa/vjqyiKEI9U550EtSzruLVZ32wJ7smvV0fj2YYhrUaaPzOn9g0=" }
}'
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)