# SolrCloud 效能提升探討 ## 如何動態調整 Shard ### 1-1 設定Collection的Route Name? **答:** 在創建 Collection 時,可以指定要使用的 Router, 以下是範例指令: ```bash curl http://10.136.129.14:8981/solr/admin/collections?action=CREATE \ &name=nested-ddf \ &numShards=2 \ &replicationFactor=2 \ &router.name=implicit \ &shards=shard1,shard2 \ &collection.configName=nested ``` 參數說明: name=nested-ddf:集合名稱。 numShards=2:分片數量。 replicationFactor=2:副本數量。 router.name=implicit:路由類型設定為 implicit,允許手動控制資料的路由。 shards=shard1,shard2:手動指定 Shard 名稱。 collection.configName=nested:集合使用的配置名稱。 ### 1-2 實驗將資料放到指定的 Shard **答:** 在 `/update` 後面加上 `_route_=shard_name` 即可指定資料的 Shard。 以下是範例指令: ```bash curl http://10.136.129.14:8981/solr/nested-ddf/update?_route_=shard1 \ -H "Content-Type: application/json" \ -d '[{ "serviceType": 6, "modifiedTime": "2024-07-09T02:47:18Z", ... }]' ``` 參數說明: _route_=shard1:指定資料要寫入的 Shard。 -H "Content-Type: application/json":設定請求的內容類型為 JSON。 -d '[...]':包含要寫入的 JSON 資料。 ### 1-3 實驗根據欄位有特定字眼的資料放到指定的 Shard **答:** 可以在建collection的時候新增router.field, 就會根據欄位的資料值放進該值名稱的shard 但前提是要先有這個名稱的shard. 以下是範例指令: v1版本 ``` curl "http://10.136.129.14:8981/solr/admin/collections?action=CREATE&name=nested-ddf&numShards=2&router.name=implicit&router.field=appName&shards=shard1,shard2&collection.configName=nested" ``` v2版本 ``` curl -X POST http://10.136.129.14:8981/api/collections -H 'Content-Type: application/json' -d \ '{ "name": "nested-ddf", "config": "nested", "numShards": 2, "router": { "name": "implicit", "field": "appName" }, "shardNames": ["mydms","shard2"] }' ``` <span style="color:red">router.field</span> 的作用其實就是告訴SolrCloud 這筆資料要新增的時候要根據這個欄位的值去找對應名稱的Shard. 所以假設設定 <span style="color:red">router.field=appName</span>, 要新增的該筆資料有個欄位<span style="color:red">appName=mydms</span>, SolrCloud就會去找有沒有shard叫作<span style="color:red">mydms</span>, 將資料放進該shard的replica, 反之找不到就會報錯. 如果發現沒有該值名稱的shard, 可以透過API去新增該值名稱的shard 以下是範例指令: v1版本 ``` curl "http://10.136.129.14:8981/solr/admin/collections?action=CREATESHARD&shard=mydms&collection=nested-ddf" ``` v2版本 官網給的V2 API不能使用(算是有一個BUG, router.name使用implicit不能使用V2的API) Use SPLITSHARD for collections created with the 'compositeId' router (router.key=compositeId). ``` curl -X POST http://10.136.129.14:8981/api/collections/nested-ddf/shards -H 'Content-Type: application/json' -d \ '{ "shard":"newShardName" }' ``` 詳細資訊請參考: 建立Collection時指定router.field https://solr.dev.org.tw/guide/solr/latest/deployment-guide/collection-management.htmlhttps://solr.dev.org.tw/guide/solr/latest/deployment-guide/collection-management.html 在已存的Collection新增Shard https://solr.dev.org.tw/guide/solr/latest/deployment-guide/shard-management.htmlhttps://solr.dev.org.tw/guide/solr/latest/deployment-guide/shard-management.html ### 1-4 透過route.field 可以將特定欄位有特殊字眼的資料放到某個shard中, 可以再新增/刪除route.field嗎? **答:** 可以透過在創建 Collection 時指定 `route.field`,將資料基於該欄位的值路由到不同的 Shard。 但是,Solr 不支援在路由基礎上動態新增或刪除路由策略,只能透過重新配置 Collection 或手動處理資料。 ### 1-5 如何拆分 Shard 或將過度拆分的 Shard 合併? **答:** 1. **拆分 Shard** 可以使用 Solr 提供的 `SplitShard` API 將 Shard 拆分為多個 Shard。 範例指令: ```bash curl http://10.136.129.14:8981/solr/admin/collections?action=SPLITSHARD&collection=nested-ddf&shard=shard1 ``` ![image](https://hackmd.io/_uploads/S1zReK9BJg.png) 2. **合併 Shard** Solr 不提供直接將多個 Shard 合併的 API。 如需合併,需手動操作,可能涉及: 將資料重新導入到新的 Collection 中。 將原有的 Shard 資料進行轉移或重複分配。