Combined: Archiving issues and reindexing outside of the cluster

Jira Data Center のアップグレードで高速な再インデックスを実行

このページの内容

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

ユーザーのダウンタイムを最小化するため、課題をアーカイブしてインデックスから除外することによってインデックスのサイズを削減し、本番環境クラスタの外部でインデックスを作成します。動作するインデックスを用意して、Jira をユーザーに開放できます。後ほど、実行中の Jira で、すべてのアーカイブ済みの課題を復元して再インデックスします。

概要

このアプローチでは、課題のアーカイブと本番環境クラスタ外部での再インデックスを組み合わせます。

アーカイブの詳細...

再インデックスに影響する主な要素は、再インデックスされる課題の数とそれらのコンテンツです。Jira 8.4 の機能の 1 つである課題のアーカイブ機能を使用して、アップグレード直後は不要な課題をアーカイブし、インデックスから除外する方法について説明します。

Jira 7.x では課題のアーカイブは利用できないため、データベースを書き換えて課題をアーカイブします。Jira では新しいバージョンにアップグレードするまで課題が変更されることはありません。アップグレード後、初回の再インデックスを行います。アーカイブされた課題は除外されるため、より短い時間で完了できます。動作するインデックスを用意し、Jira をユーザーに開放したら、アーカイブ済みのすべての課題を復元し、再びインデックスを作成できます。2 回目の再インデックスは 1 回目よりも時間がかかりますが、Jira をユーザーに提供した状態で 1 つのノードで実行できます。

アップグレード後、アーカイブされた課題は読み取り専用になり、直接リンクからのみアクセスできるようになります。2 回目の再インデックスが完了するまで、ユーザーがそれらを参照したり検索することは難しくなります。このため、アーカイブ可能でクリティカルではない課題を特定する必要があります。アップグレード後のアーカイブされた課題の挙動の詳細については「課題のアーカイブ」をご参照ください。

クラスタ外部での再インデックスの詳細...

ノードは、オフラインになってクラスタに再参加するたびに、データベースから直接読み取った最新の操作でインデックスを更新し、バックグラウンドで再インデックスを行います。これはノードがインデックスを持っている場合も該当します。不足している変更は引き続きデータベースにあり (保持期間を構成できます、後述)、これらはインデックス全体の 10% よりも小さくなります。

ここでは同じメカニズムを使用します。データベースのコピーを Jira 8.5 のフレッシュ インストールに接続してインデックスを作成し、インデックスに新しいバージョンとの互換性を持たせます。インデックスはほとんどのデータを含み、ノードではアップグレードの開始後に元のデータベースに加えられた不足している変更を適用するだけで済みます。

クラスタ全体のアップグレード後、ノードは新しいインデックスを検出して不足している変更を追加します。ノードの観点では、短期間オフラインになっていたのと同じ状況と見なされます。

ユーザーに影響するダウンタイムはアップグレード自体のみとなります。Jira はアップグレード後すぐに機能するようになります。

はじめる前に

これらのステップは Jira Data Center をシャット ダウンすることなく行なえます。

アーカイブする課題の特定

このステップでは、アップグレード直後は不要な課題を特定します。

アーカイブすべき課題について

課題の数だけではなく、添付ファイル、作業ログ、カスタム フィールド、履歴、およびコメントなどの課題のコンテンツを主に考慮する必要があります。課題が "重い" ほど再インデックスに影響します。任意の課題を選択できますが、もっとも簡単な方法は、アップグレード直後に確実に必要な課題を特定し、残りすべてをアーカイブすることです。

課題をアーカイブするための SQL クエリの作成

アーカイブする課題を特定したら、それらをアーカイブする SQL クエリを作成する必要があります。弊社で用意したサンプル クエリをいくつか紹介します (PostgreSQL データベースを使用)。

例 1: 特定の日以前に作成されたすべての課題

このクエリは よりも前に作成されたすべての課題をアーカイブします。

update jiraissue 
	set 
		archived='Y', 
		archivedby='admin', 
		archiveddate=current_timestamp 
	where id in (
		select 
			i.id 
		from jiraissue i 
		where i.created < timestamp '2019-01-01'	
);
例 2: 最近更新されていないすべての課題

このクエリは 2 年間更新されていないすべての課題をアーカイブします。

update jiraissue 
	set 
		archived='Y', 
		archivedby='admin', 
		archiveddate=current_timestamp 
	where id in (
		select 
			i.id 
		from jiraissue i 
		where i.updated < (current_timestamp - interval '2 year')	
);
例 3: 特定のプロジェクトで特定の期間に作成されたラベルつきの課題

このクエリは、Jira プロジェクトで archive ラベルを持ち、から の間に作成された課題をアーカイブします。

update jiraissue 
	set 
		archived='Y', 
		archivedby='admin', 
		archiveddate=current_timestamp 
	where id in (
		select 
			i.id 
		from jiraissue i 
		inner join project p on i.project = p.id
		inner join label l on l.issue = i.id
		where UPPER(p.pkey) = 'JIRA' 
			and l.label = 'archive'
			and i.created  between timestamp '2019-01-01' and timestamp '2019-10-01'	
);

データベースの書き換え

ダウンタイムを最小化するため、稼動中のデータベースで次のステップを実行できます。

これらのステップはデータベース スキームを書き換え、課題のアーカイブに必要なコラムを含めるようにします。

  1. 課題のアーカイブをサポートするようにデータベース スキームを書き換えます。次の SQL クエリは、jiraissue  テーブルに 3 つの新しいコラムを追加します。 

    • PostgreSQL

      alter table jiraissue
              add archived char default null,
              add archivedby varchar(255) default null,
              add archiveddate timestamp with time zone default null;
    • Oracle

      alter table jiraissue add (
          archived CHAR default null,
          archivedby varchar2(255) default null,
          archiveddate date default null);
  2. 新しいコラムが追加されたら、すべての課題のステータスを "not archived" に設定する別の SQL クエリを実行します。 

    update jiraissue set archived='N', archivedby=null, archiveddate=null;
  3. 念のため、Jira を開き、新しい課題をいくつか作成して、すべてが正常に動作していることを確認します。

  4. 選択した課題をアーカイブする SQL クエリを実行します。これは「課題をアーカイブするための SQL クエリを作成する」で用意したものです。ソース バージョンの 7.x では、"archived" 課題が変更されることはありません。

クラスタ外部でインデックスを作成

データベースのコピーを作成し、Jira 8.5 をそれに接続します。これにより、本番環境クラスタの外部で Jira 8 との互換性を持つインデックスを作成できます。

1. NodeIndexCounter テーブルのコピー

  • データベースで NodeIndexCounter テーブルのコピーを作成します。

この操作が必要な理由

NodeIndexCounter テーブルは、個々のノードからそれらのインデックスのコピーに適用された変更を記録します。このタイミングでコピーし、元のデータベースにあとから (アップグレード中に) 復元することで、この時点でユーザーが行った可能性があるすべての変更をアップグレードされたノードに含めることができます。

2. データベースのコピー

  • 稼動中のデータベースのコピーを作成します。あとから元のデータベースに切り替えるため、ユーザーによる新規データの追加について心配する必要はありません。

これらのステップは実際のアップグレードに可能な限り近いタイミングで行う必要があります。これにより、元のデータベースとクローンされたデータベースの違いを最小限に抑え、保持期間を超過しないようにします。

保持期間の詳細について...

既定の最大期間は 2 日です。これは、最近の操作がデータベース (テーブル: ReplicatedIndexOperations) に保管される最長の期間です。この期間を超えた場合、2 日よりも古い変更は削除されるため、ノードで不足しているすべての変更を元のデータベースから追加することはできません。保持期間を延長できますが、変更がインデックス全体の 10% を超えた場合はノードで完全な再インデックスが必要になる点にご注意ください (10% を超える可能性は高くはありませんが、実際のユーザーの変更量に依存します)。


3. データベースのコピーを Jira 8.5 に接続

データベースのコピーを接続する、別の Jira 8.5 環境が必要です。この環境の要件は次のとおりです。

  • Jira 8.5 である必要があります。

  • 本番環境インスタンスと同じプラグインを持っている必要があります (プラグインはカスタム フィールドからの値を保持していたり、再インデックス中にインデックスにデータを追加したりしている可能性があります)。

  • Data Center ライセンスを使用している必要があります (Server 版では課題のアーカイブが認識されません)。ただし、シングル ノード構成を使用できます。


この環境をセットアップするもっとも簡単な方法は、次のステップを完了することです。

次のステップでは、別の 8.5 インスタンスをインストールし、自動再インデックスを無効化し、プラグインをインストール (または本番環境からコピー) して、準備が整ったら手動で再インデックスを実行します。

  1. Jira Data Center のアップグレード」の「最初のノードで Jira をアップグレードする」の手順に従います。Jira 8.5 を構成する際は、ここまでのステップで作成したデータベースのコピーに接続するようにします。

  2. Jira Data Center のアップグレード」の「最初のノードでのアップグレード後の手順」の手順に従います。 


結果

手動の再インデックスを完了したら、データベースのコピーの情報に基づいた Jira 8 インデックスを用意できます。コピーの作成後に元のデータベースに加えられた情報は含まれませんが、不足している変更エントリのノードでの追加は、インデックス全体をゼロから作成するよりも簡単に行えます。

インデックスをノードにコピー

Jira 8 のインデックスは既存のクラスタに影響しないよう、古いバージョンとは別のディレクトリに保管されます。新しいインデックスを各ノードにコピーし、ノードでのダウンロードを不要にできます。

  1. Jira 8 のインデックスを各ノードの次のディレクトリにコピーします。 

    <local-home-directory>/caches/indexesV1

Jira Data Center のアップグレード

ここでは Jira Data Center をシャットダウンし、アップグレードを開始する必要があります。

最初のノードのアップグレード

Jira Data Center のアップグレードでは時間の削減のため、1 つのノードを選択してそれをアップグレードし、インストール ディレクトリをほかのノードにコピーすることをおすすめします。ここでは任意のノードを選択できます。

  1. クラスタを停止します。

  2. この手順の最初にコピーした NodeIndexCounter テーブルを元のデータベースに復元します。これにより、アップグレードの開始後に元のデータベースに追加されたすべての情報について、ノードでエントリが作成されます。

  3. 最初のノードをアップグレードします。「Jira Data Center のアップグレード」の「最初のノードで Jira をアップグレードする」の手順に従います。作業を開始する前に次のメモをご確認ください。 

    自動再インデックスの無効化

    リンク先の手順の最後のステップには、自動再インデックスを無効化する旨の説明があります (ステップ 5: 自動再インデックスの無効化)。この手順を確実に完了するようにします。未完了の場合、Jira で自動再インデックスが開始され、この手順の目的を果たすことができません。

  4. 最初のノードでアップグレード後の手順を完了します。「Jira Data Center のアップグレード」の「最初のノードでのアップグレード後の手順」の手順に従います。 

    ステップの 1 つでインデックスを再インデックスするように促されます。このステップは除外するようにします。インデックスはクラスタ外部で作成済みのため、再作成する必要はありません。

実行される内容について

最初のノードの開始後、データベースがアップグレードされます。次のステップとして、ノードはインデックスの状態を確認し、必要に応じて再インデックスします。ただし、互換性のあるインデックスをすでにコピー済みであるため、ノードはこれを検出し、不足している変更のエントリ (元のデータベースと、Jira 8 インデックスを作成するために使用したクローンされたデータベースとの違い) の追加のみを行います。ノードの観点では、短期間オフラインになっていたのと同じ状況と見なされます。

オプション: インデックスのスナップショットのリクエスト

このオプションのステップでは、ノードでデータベースの更新を処理するのではなく、最初のノードのインデックスのスナップショットをダウンロードします。

詳細を読む...

弊社では一般に、このステップは除外してノードで更新を処理することをおすすめしています。しかしながら、インデックスのサイズが大きすぎず、アップグレード後の更新の数が大量にある場合、スナップショットを取得するほうが時間がかからない可能性があります。

ノードでスナップショットをダウンロードするには、残りのノード (最初のノードではない) でインデックス ファイルを削除する必要があります。ノードはホーム ディレクトリにインデックスがない状態で、最初のノードにスナップショットをリクエストします。

残りのノードのアップグレード

これで、インストール ディレクトリを残りのノードにコピーしてそれらをアップグレードできます。

  1. 残りのノードをアップグレードします。「Jira Data Center のアップグレード」の「残りのノードのアップグレード」の手順に従います。

アーカイブされた課題の復元と再インデックス

Jira Data Center のアップグレードが完了し、機能していることを確認したら、アーカイブされた課題を復元して再びインデックスを作成します。再インデックスは 1 つのノードで行われるため、ユーザーは引き続き Jira を利用できます。

  1. アーカイブされた課題のステータスを "not archived" に変更する、逆の SQL クエリを実行します。次のクエリを使用してすべての課題のステータスを変更できます。

  2. 再インデックスを実行します。

    1. > [システム] > [再インデックス] に移動します ("." を押して検索できます)。

    2. [完全な再インデックス] を選択します。 

再インデックスの完了には時間がかかりますが、ユーザーは引き続き Jira を利用できます。完了後、新しいインデックスが残りのノードに自動的に配布されます。

最終更新日 2020 年 9 月 16 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.