ククログ

株式会社クリアコード > ククログ > Groongaサポートサービスの事例紹介 - Groongaのバージョンアップ

Groongaサポートサービスの事例紹介 - Groongaのバージョンアップ

Groongaのサポートサービスを担当している阿部です。

Groongaのバージョンアップをサポートした事例を紹介します。

はじめに: Groongaの後方互換性について

Groongaは後方互換性を大事にしています。 そのため、既存の環境を崩さずに安心してアップデートできます。 さらに、様々なOS向けに公式パッケージを提供しているので、常に最新機能を利用しながら、スムーズで負担の少ないバージョンアップを実現しています。

バージョンアップサポートの概要

上述の「Groongaの後方互換性について」を読むと簡単にバージョンアップができそうな気持ちになりますが、環境によってはひと手間かかる場合があります。

今回サポートしたケースでは「外部と通信不可の環境」でした。 取り扱うデータによってはそのような環境で構築されているシステムも多いと思います。

「外部と通信不可の環境」の場合、パッケージのバージョンアップやインストールに手間がかかる場合があります。 具体的にどのようにパッケージのバージョンアップやインストールに手間がかかるのでしょうか。 擬似的に外部との通信ができない状態をつくり、Groongaをインストールしてどのような手間か確認し、どのようなサポートをしたのか説明します。

「外部と通信不可の環境」にGroongaをインストールする

「外部と通信不可の環境」はDockerを使って再現します。 --network=noneオプションを付けて実行すると外部と通信できない状況になるので、そこでインストールを試みます。

ドキュメント通りにGroongaをインストールする

ドキュメントにある次のコマンドでインストールします。 (Dockerコンテナ内ではrootで実行するのでsudoは省略しています。)

dnf install -y https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm
dnf install -y https://packages.groonga.org/almalinux/9/groonga-release-latest.noarch.rpm
dnf install -y --enablerepo=epel --enablerepo=crb groonga

まずはドキュメントにあるdnf install -y https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpmのみを実行してみます。

実行コマンド:

$ docker container run -it --rm --network=none almalinux:9 \
  dnf install --disablerepo='*' -y https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm
[MIRROR] apache-arrow-release-latest.rpm: Curl error (6): Couldn't resolve host name for https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm [Could not resolve host: packages.apache.org]
[MIRROR] apache-arrow-release-latest.rpm: Curl error (6): Couldn't resolve host name for https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm [Could not resolve host: packages.apache.org]
[MIRROR] apache-arrow-release-latest.rpm: Curl error (6): Couldn't resolve host name for https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm [Could not resolve host: packages.apache.org]
[MIRROR] apache-arrow-release-latest.rpm: Curl error (6): Couldn't resolve host name for https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm [Could not resolve host: packages.apache.org]
[FAILED] apache-arrow-release-latest.rpm: Curl error (6): Couldn't resolve host name for https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm [Could not resolve host: packages.apache.org]
Curl error (6): Couldn't resolve host name for https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm [Could not resolve host: packages.apache.org

(追加した--disablerepo='*'オプションについては後で補足します。)

実行する前から想像できたかもしれませんが、失敗しました。 外部と通信できないので、apache-arrow-release-latest.rpmのダウンロードを試みて失敗しています。

RPMファイルをダウンロードしておいてGroongaをインストールする

apache-arrow-release-latest.rpmのダウンロードで失敗していたので、次は事前にダウンロードしておく方法を試してみます。 ホスト側でapache-arrow-release-latest.rpmをダウンロードしておいて、コンテナ内でそれを指定してインストールをします。

実行コマンド:

$ wget -q https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm
$ docker container run -it --rm -v ${PWD}:/rpmfiles --network=none almalinux:9 \
  dnf install --disablerepo='*' -y /rpmfiles/apache-arrow-release-latest.rpm
Error: 
 Problem: conflicting requests
  - nothing provides dnf-command(config-manager) needed by apache-arrow-release-21.0.0-1.el9.noarch from @commandline
  - nothing provides epel-release needed by apache-arrow-release-21.0.0-1.el9.noarch from @commandline
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

失敗しました。 apache-arrow-release-latest.rpmには依存しているパッケージがあり、それが存在しないので失敗しています。

外部と通信ができる環境であればdnfコマンドがよしなに依存関係を解決してくれるのですが、外部と通信できないためこのような結果になりました。

「外部と通信不可の環境」にGroongaをインストールするときの大変ポイントまとめ

これらの例からわかる通り、必要なパッケージをすべて事前にダウンロードしておかないと「外部と通信不可の環境」ではインストールができません。

今回参照したドキュメントの手順は次の通りだったので、apache-arrow-release-latest.rpmgroonga-release-latest.noarch.rpmgroonga.rpmの3つのRPMファイルをダウンロードしておく必要があります。

dnf install -y https://packages.apache.org/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm
dnf install -y https://packages.groonga.org/almalinux/9/groonga-release-latest.noarch.rpm
dnf install -y --enablerepo=epel --enablerepo=crb groonga

それに加え、3つのRPMが依存しているパッケージも事前にダウンロードしておく必要があります。

確認したのはインストールの例でしたが、バージョンアップについても同様のことが言えます。 バージョンアップの場合は最新バージョンのRPMファイルをダウンロードしておき、それを使ってバージョンアップをする必要があります。

「外部と通信不可の環境」にてバージョンアップをサポートした事例紹介

大変ポイントの提示でどのようなサポートだったのかだいたい想像がつくと思いますが、「外部と通信不可の環境」でのバージョンアップのサポートでは、インストールに必要なRPMファイルをひとつにまとめて提供する、というサポートを行いました。

提供したファイルを一箇所に配置することで次のようなコマンドで簡単にインストールできるようになります。

# ディレクトリ`/rpmfiles`以下に必要なRPMファイルを配置
dnf install --disablerepo='*' -y /rpmfiles/*

合わせてバージョンアップ後の確認方法や何か問題があったときの元のバージョンに戻す手順も同梱して提供しています。

成果を自由なソフトウェアとして公開

必要なRPMファイルをひとつひとつダウンロードするのは大変手間なので、いい感じにダウンロードするスクリプトを作成して公開しました。

クリアコードでは、お客様の課題を解決するためにソフトウェア開発や技術サポートを行うだけでなく、業務を通じて得られた知見やツールを可能な限り公開することを重視しています。 例えば、今回のように作成したスクリプトを自由なソフトウェアとして公開することで、同じ課題を抱えている他のユーザーもその成果を活用できるようになります。 また、スクリプトの公開によって外部からのフィードバックや改善提案を受ける機会も増え、より良質なソフトウェアへと発展させていくことができます。

まとめ

GroongaサポートサービスでをGroongaのバージョンアップをサポートしたときの事例を紹介しました。

「外部と通信不可の環境」での事例を紹介しましたが、他にも「バージョンの差が大きいとき(例えば10系から15系へバージョンアップ)のバージョンアップ」や「OS自体がEOLなのでOSのバージョンアップも実施しつつ、Groongaもバージョンアップ」といった様々なケースに対応可能ですので、バージョンアップに関連してお困りの場合はお問い合わせフォームよりご連絡ください。

補足: dnfコマンドの--disablerepo='*'オプション

--disablerepoオプションは無効にしたいパッケージリポジトリを指定できます。 --disablerepo='*'と指定するとすべてのリポジトリを無効にします。

もともと有効になっているパッケージのリポジトリがあるので、dnfコマンドはそれのメタデータを取得しようとします。 しかし今回の例では外部と通信ができないので、それも失敗します。

メタデータ取得の失敗だと、今回示したかった失敗と少しずれるので、もともと有効になっているリポジトリをすべて無効にして失敗しないようにするために使いました。

メタデータの取得で失敗している例:

$ docker container run -it --rm --network=none almalinux:9 \
  dnf install -y https://apache.jfrog.io/artifactory/arrow/almalinux/9/apache-arrow-release-latest.rpm
AlmaLinux 9 - AppStream                                                                               0.0  B/s |   0  B     00:00    
Errors during downloading metadata for repository 'appstream':
  - Curl error (6): Couldn't resolve host name for https://mirrors.almalinux.org/mirrorlist/9/appstream [Could not resolve host: mirrors.almalinux.org]
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: Curl error (6): Couldn't resolve host name for https://mirrors.almalinux.org/mirrorlist/9/appstream [Could not resolve host: mirrors.almalinux.org]

補足: インストール対象のRPMファイルについて

記事中の例ではドキュメントのインストール手順との対比でわかりやすさのためにapache-arrow-release-latest.rpmgroonga-release-latest.noarch.rpmgroonga.rpmと3つのRPMファイルを使いましたが、「外部と通信不可の環境」においてこれは間違いです。

apache-arrow-release-latest.rpmgroonga-release-latest.noarch.rpmは外部のリポジトリ情報をインストールするためのパッケージで、外部にアクセスできない環境に置いてこれらのパッケージは不要です。

またgroonga.rpmというファイル名については正確な表現ではありませんが、イメージが伝われば良いのでこのように記載しました。