docker composeでqdrantのクラスタ構成を構築する

ベクトル検索エンジンのqdrantをdocker-composeを使ってクラスタ構築した際のメモ。

結論

composeファイルはこんな感じ。

version: "3.9"
services:
  qdrant_primary:
    image: "qdrant/qdrant:v1.4.1"
    ports:
      - "6333:6333"
    environment:
      QDRANT__CLUSTER__ENABLED: "true"
    command: [ "./qdrant", "--uri", "http://qdrant_primary:6335" ]
  qdrant_secondary:
    image: "qdrant/qdrant:v1.4.1"
    environment:
      QDRANT__CLUSTER__ENABLED: "true"
    command:
      [
        "./qdrant",
        "--bootstrap",
        "http://qdrant_primary:6335"
      ]

説明

環境変数を使う場合は、QDRANT__CLUSTER__ENABLED をTrueにする。

qdrantでクラスタ構築する場合は、config.ymlか環境変数クラスタモードを指定する必要がある。

今回はお手軽に環境変数で指定する。

ノード間での内部通信ができるようにする

qdrantではデフォルトで内部通信にport 6335が使われる。 クラスタ管理する際はすべてノードがこのportで通信できるようにしておく必要がある。

またクラスタ内の全ノードと連携するために、二つ目以降のノードはいずれかの一つのノードを知っておく必要がある。なので、最初のノードが自身のURLを提供するようにしておく。

このあたりの設定はCLIでserver起動する際の引数で指定する。

github.com

今回使うのは --uri--bootstrapの二つ。

--uriでノードのURIを指定する。このURIは他のノードが到達できるようにしておく必要がある。

--bootsrapで--uriで指定された既存のノードのURIを指定する。

qdrant.tech

問題

100%再現していないけど、docker imageのv1.4.1を使うと稀にqdrant_secondaryのほうでleader is not established within 10 secsというエラー(panic)が発生して、qdrant_secondaryがクラスタに追加されなかった。

他にも、collectionを作成しようとするとqdrant_primaryのほうでleader is not establishedが発生して安定しない時期があった。 v1.4.0を使うと発生しなくなり、その後v1.4.1に戻してからは発生していない。

自分の環境の問題な気がするけど問題の切り分けができてない。

参考

qdrant.tech

www.youtube.com