[Solr]コレクションのインクリメンタルバックアップ
はじめに
Solr 8.9から SolrCloud におけるコレクションのバックアップの形式が変更されてインクリメンタルバックアップ対応となりました。
バックアップ
インクリメンタルバックアップ対応に伴い、コレクションAPIのBACKUPアクションのパラメータに以下の2つが追加されました。
incremental
true (デフォルト)ならインクリメンタルバックアップ、false なら従来と同様のスナップショットによるバックアップとなります。スナップショットによるバックアップは近いうちに廃止となる予定です。
maxNumBackupPoints
インクリメンタルバックアップではバックアップポイントという形で直前のバックアップとの差分が保存されていきます。
最大で何個をバックアップポイントを保存するのかを maxNumBackupPoints で指定します。
サンプル
サンプルとして大阪の施設情報を利用します。
以下のようなデータを1件ずつ追加して、その都度バックアップします。
os_1.json [{"id":"10","type":"官公庁","area":"住之江区","name":"軽自動車検査協会大阪主管事務所","address":"住之江区南港東3-4-62","address_p":"34.6164938333333,135.438210722222"}] os_2.json [{"id":"11","type":"官公庁","area":"住之江区","name":"大阪陸運支局なにわ自動車検査登録事務所","address":"住之江区南港東3-1-14","address_p":"34.6190439722222,135.442191833333"}] os_3.json [{"id":"12","type":"官公庁","area":"住吉区","name":"住吉税務署","address":"住吉区住吉2丁目17番37号","address_p":"34.6109641111111,135.491388722222"}] os_4.json [{"id":"13","type":"官公庁","area":"住之江区","name":"玉出年金事務所","address":"住之江区北加賀屋2-3-6","address_p":"34.6231918888888,135.477992138888"}]
$ curl 'http://localhost:8983/solr/backup_test/update?commit=true&indent=true' --data-binary @os_1.json -H 'Content-Type: application/json' $ curl 'http://localhost:8983/solr/admin/collections?omitHeader=true&action=BACKUP&name=backup1&collection=backup_test&location=/tmp/solr_backup&incremental=true&maxNumBackupPoints=3' { "success":{ "127.0.1.1:8983_solr":{ "responseHeader":{ "status":0, "QTime":2}, "response":[ "startTime","2021-06-28T14:00:11.906389Z", "indexFileCount",18, "uploadedIndexFileCount",18, "indexSizeMB",0.005, "uploadedIndexFileMB",0.005, "shard","shard1", "endTime","2021-06-28T14:00:11.908343Z", "shardBackupId","md_shard1_1"]}}, "response":[ "collection","backup_test", "numShards",1, "backupId",1, "indexVersion","8.9.0", "startTime","2021-06-28T14:00:11.903010Z", "indexSizeMB",0.005]} $ curl 'http://localhost:8983/solr/backup_test/update?commit=true&indent=true' --data-binary @os_2.json -H 'Content-Type: application/json' $ curl 'http://localhost:8983/solr/admin/collections?omitHeader=true&action=BACKUP&name=backup1&collection=backup_test&location=/tmp/solr_backup&incremental=true&maxNumBackupPoints=3' { "success":{ "127.0.1.1:8983_solr":{ "responseHeader":{ "status":0, "QTime":2}, "response":[ "startTime","2021-06-28T14:00:36.142084Z", "indexFileCount",35, "uploadedIndexFileCount",18, "indexSizeMB",0.01, "uploadedIndexFileMB",0.005, "shard","shard1", "endTime","2021-06-28T14:00:36.144073Z", "shardBackupId","md_shard1_2"]}}, "response":[ "collection","backup_test", "numShards",1, "backupId",2, "indexVersion","8.9.0", "startTime","2021-06-28T14:00:36.137745Z", "indexSizeMB",0.01]} $ curl 'http://localhost:8983/solr/backup_test/update?commit=true&indent=true' --data-binary @os_3.json -H 'Content-Type: application/json' $ curl 'http://localhost:8983/solr/admin/collections?omitHeader=true&action=BACKUP&name=backup1&collection=backup_test&location=/tmp/solr_backup&incremental=true&maxNumBackupPoints=3' { "success":{ "127.0.1.1:8983_solr":{ "responseHeader":{ "status":0, "QTime":4}, "response":[ "startTime","2021-06-28T14:01:38.399993Z", "indexFileCount",52, "uploadedIndexFileCount",18, "indexSizeMB",0.015, "uploadedIndexFileMB",0.005, "shard","shard1", "endTime","2021-06-28T14:01:38.404263Z", "shardBackupId","md_shard1_3"]}}, "response":[ "collection","backup_test", "numShards",1, "backupId",3, "indexVersion","8.9.0", "startTime","2021-06-28T14:01:38.398621Z", "indexSizeMB",0.015], "deleted":[[ "startTime","2021-06-28T13:56:09.437719Z", "backupId",0, "size",5223, "numFiles",18]], "collection":"backup_test"} $ curl 'http://localhost:8983/solr/backup_test/update?commit=true&indent=true' --data-binary @os_4.json -H 'Content-Type: application/json' $ curl 'http://localhost:8983/solr/admin/collections?omitHeader=true&action=BACKUP&name=backup1&collection=backup_test&location=/tmp/solr_backup&incremental=true&maxNumBackupPoints=3' { "success":{ "127.0.1.1:8983_solr":{ "responseHeader":{ "status":0, "QTime":3}, "response":[ "startTime","2021-06-28T14:02:05.875017Z", "indexFileCount",69, "uploadedIndexFileCount",18, "indexSizeMB",0.019, "uploadedIndexFileMB",0.005, "shard","shard1", "endTime","2021-06-28T14:02:05.878413Z", "shardBackupId","md_shard1_4"]}}, "response":[ "collection","backup_test", "numShards",1, "backupId",4, "indexVersion","8.9.0", "startTime","2021-06-28T14:02:05.873449Z", "indexSizeMB",0.019], "deleted":[[ "startTime","2021-06-28T14:00:11.903010Z", "backupId",1, "size",5223, "numFiles",18]], "collection":"backup_test"}
各バックアップの応答に backupId が記載されています。リストアの際に backupId を指定することで特定のバックアップポイントに戻すことができます。
4回目のバックアップの応答に deleted という項目があります。maxNumBackupPoints=3 を指定しているので、4回目のバックアップでは最初のバックアップが削除されてバックアップポイントが3個に保たれていることが分かります。
ここでインデックスの状態を確認します。ドキュメントを1件ずつ4回投入したので、全件検索すると4件ヒットします。
$ curl -s 'http://localhost:8983/solr/backup_test/select?omitHeader=true&q.op=OR&q=*%3A*&rows=0' { "response":{"numFound":4,"start":0,"numFoundExact":true,"docs":[] }}
リストア
LISTBACKUP アクションで現在利用可能なバックアップポイントを確認できます。
$ curl 'http://localhost:8983/solr/admin/collections?omitHeader=true&action=LISTBACKUP&name=backup1&location=/tmp/solr_backup' { "collection":"backup_test", "backups":[{ "indexFileCount":0, "indexSizeMB":0.0, "shardBackupIds":{"shard1":"md_shard1_2.json"}, "collection.configName":"backup_test", "backupId":2, "collectionAlias":"backup_test", "startTime":"2021-06-28T14:00:36.137745Z", "indexVersion":"8.9.0"}, { "indexFileCount":0, "indexSizeMB":0.0, "shardBackupIds":{"shard1":"md_shard1_3.json"}, "collection.configName":"backup_test", "backupId":3, "collectionAlias":"backup_test", "startTime":"2021-06-28T14:01:38.398621Z", "indexVersion":"8.9.0"}, { "indexFileCount":0, "indexSizeMB":0.0, "shardBackupIds":{"shard1":"md_shard1_4.json"}, "collection.configName":"backup_test", "backupId":4, "collectionAlias":"backup_test", "startTime":"2021-06-28T14:02:05.873449Z", "indexVersion":"8.9.0"}]}
ドキュメント2件のときのバックアップ(backupId=2)に戻します。
$ curl 'http://localhost:8983/solr/admin/collections?action=RESTORE&name=backup1&collection=backup_test&location=/tmp/solr_backup&backupId=2' { "responseHeader":{ "status":0, "QTime":599}} tfukui@deskmini:~/dev/splout_blog/sample_data$ curl -s 'http://localhost:8983/solr/backup_test/select?omitHeader=true&q.op=OR&q=*%3A*&rows=0' { "response":{"numFound":2,"start":0,"numFoundExact":true,"docs":[] }}
ドキュメント3件のときのバックアップ(backupId=3)に戻します。
$ curl 'http://localhost:8983/solr/admin/collections?action=RESTORE&name=backup1&collection=backup_test&location=/tmp/solr_backup&backupId=3' { "responseHeader":{ "status":0, "QTime":624}} tfukui@deskmini:~/dev/splout_blog/sample_data$ curl -s 'http://localhost:8983/solr/backup_test/select?omitHeader=true&q.op=OR&q=*%3A*&rows=0' { "response":{"numFound":3,"start":0,"numFoundExact":true,"docs":[] }}
既存のコレクションに対するリストアができるようになったことと併せて、コレクションのバックアップ機能がより使いやすくなりました。