幅広い知識と幅広いスキルを求められている系システムエンジニアです。リモートワークしかやりません。

Meilisearch v0.28で追加された機能でロードバランスできるぞ

ロードバランスできるぞ


2022-04-11

※ ホストが変わると同じキーが出来ないぽくて、この記事の内容はウソかもしれません。

先日(2022-07-11) Meilisearch v0.28 がリリース されました。

新機能として deterministic API keys = APIキーの決め打ち生成 機能が紹介されています。 (今まではkeyを生成する度に必ず違うkeyが生成されていました。)

Meilisearchは冗長構成やクラスタを組む機能がまだないのですが、今回のアップデートでなんとかロードバランサーの裏に持っていけるようになりました。
要は同じAPIキーを生成して、同じドキュメントを登録したインスタンスを複数用意すればなんとかなる!ということですね。

👇deterministic API keysの生成確認

旧バージョン(v0.27.1)で出来ないのを確認

# 起動
$ docker run --rm -p 7700:7700 -e MEILI_MASTER_KEY=hoge getmeili/meilisearch:v0.27.1

# インデックス作成
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/indexes -d '{"uid":"hogehoge","primaryKey":"id"}'

# uidを指定してkeyを作成する。
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/keys -d '{"indexes":["hoge"],"actions":["search"],"expiresAt":null,"uid":"3377dde9-7234-42a9-8a04-e6671e0d5595"}'
{"description":null,"key":"oBejVvEjbdb253fb11a1ce5f0d1c6b0752aba3108bc5ad27d95a90c036b10270a3990e4a","actions":["search"],"indexes":["hoge"],"expiresAt":null,"createdAt":"2022-07-13T13:29:34.664425105Z","updatedAt":"2022-07-13T13:29:34.664425105Z"}

$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X DELETE localhost:7700/keys/oBejVvEjbdb253fb11a1ce5f0d1c6b0752aba3108bc5ad27d95a90c036b10270a3990e4a

# uidを指定してkeyを作成する。1回目と違うkeyが生成される
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/keys -d '{"indexes":["hoge"],"actions":["search"],"expiresAt":null,"uid":"3377dde9-7234-42a9-8a04-e6671e0d5595"}'
{"description":null,"key":"haLXP0vnf3e17ad7263e5b95b505d988d6ba2a252775be9095e2f5cdccefbab2ed543d19","actions":["search"],"indexes":["hoge"],"expiresAt":null,"createdAt":"2022-07-13T13:31:10.937655666Z","updatedAt":"2022-07-13T13:31:10.937655666Z"}

$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X DELETE localhost:7700/keys/haLXP0vnf3e17ad7263e5b95b505d988d6ba2a252775be9095e2f5cdccefbab2ed543d19

v0.28で同じキーを生成できるのを確認

# 起動
$ docker run --rm -p 7700:7700 -e MEILI_MASTER_KEY=hoge getmeili/meilisearch:v0.28.0
Instance UID:           "34745a13-5778-45fe-af30-97d1db6bf465"

# インデックス作成
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/indexes -d '{"uid":"hogehoge","primaryKey":"id"}'

# uidを指定してkeyを作成する。responseにuidが増えている
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/keys -d '{"indexes":["hoge"],"actions":["search"],"expiresAt":null,"uid":"3377dde9-7234-42a9-8a04-e6671e0d5595"}'
{"name":null,"description":null,"key":"fb6faf8e3a411e656e1ec3515968556d1ed35711b6d7e92a7528425eac9520c7","uid":"3377dde9-7234-42a9-8a04-e6671e0d5595","actions":["search"],"indexes":["hoge"],"expiresAt":null,"createdAt":"2022-07-13T13:32:44.446853042Z","updatedAt":"2022-07-13T13:32:44.446853042Z"}

$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X DELETE localhost:7700/keys/3377dde9-7234-42a9-8a04-e6671e0d5595

# 1回目と同じuidを指定してkeyを作成する。同じkeyが生成される。
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/keys -d '{"indexes":["hoge"],"actions":["search"],"expiresAt":null,"uid":"3377dde9-7234-42a9-8a04-e6671e0d5595"}'
{"name":null,"description":null,"key":"fb6faf8e3a411e656e1ec3515968556d1ed35711b6d7e92a7528425eac9520c7","uid":"3377dde9-7234-42a9-8a04-e6671e0d5595","actions":["search"],"indexes":["hoge"],"expiresAt":null,"createdAt":"2022-07-13T13:34:11.086267801Z","updatedAt":"2022-07-13T13:34:11.086267801Z"}

$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X DELETE localhost:7700/keys/3377dde9-7234-42a9-8a04-e6671e0d5595
# 再度起動
$ docker run --rm -p 7700:7700 -e MEILI_MASTER_KEY=hoge getmeili/meilisearch:v0.28.0
Instance UID:           "606eb5cd-185c-47c9-a2d5-ee3ff246c7a1"

# インデックス作成
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/indexes -d '{"uid":"hogehoge","primaryKey":"id"}'

# 1回目と同じuidを指定してkeyを作成する。期待通り同じkeyが生成された。
$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X POST localhost:7700/keys -d '{"indexes":["hoge"],"actions":["search"],"expiresAt":null,"uid":"3377dde9-7234-42a9-8a04-e6671e0d5595"}'
{"name":null,"description":null,"key":"fb6faf8e3a411e656e1ec3515968556d1ed35711b6d7e92a7528425eac9520c7","uid":"3377dde9-7234-42a9-8a04-e6671e0d5595","actions":["search"],"indexes":["hoge"],"expiresAt":null,"createdAt":"2022-07-13T13:41:06.778164115Z","updatedAt":"2022-07-13T13:41:06.778164115Z"}

$ curl -H "Authorization: Bearer hoge" -H "Content-Type: application/json" -X DELETE localhost:7700/keys/3377dde9-7234-42a9-8a04-e6671e0d5595

インスタンスが変わっても同じkeyが生成できるのを確認できました。

Meilisearch自体は少しコントリビュートさせてもらったりしていて、まとまった記事を書きたいなとは思いつつも、楽しみな機能がきていたので書いてみました。

© 2023 @miiton