[Solr]分散検索でどのレプリカに検索リクエストを送るのかを制御する

SolrCloud でシャードに複数のレプリカを作った場合、検索リクエストを処理する際にどのレプリカを優先するのかを shards.preference パラメータで指定できます。

以下の形式で優先順を指定します。
shards.preference=属性1:値1,属性2:値2,…
左側にあるものほど優先度が高くなります。

指定できる属性は以下の通りです。

replica.type

レプリカの種類(PULL, TLOG, NRT)を指定します

replica.location

http://hostname:port から始まる文字列でレプリカの場所を指定します。前方一致でレプリカを選びます。

特殊なケースとして “local” を指定した場合、リクエストを処理するサーバと同じサーバにある Solr インスタンスのレプリカが選ばれます。フィールド数が多い、巨大なフィールドがある、などの理由で検索結果のデータサイズが大きい場合に有効です。特定のレプリカに障害が発生した場合の影響範囲を小さくする効果もあります。

replica.base

優先順位が同じレプリカが存在するときに、それらの間でどれを優先するかを決めるためのルールを指定します。

  • random ランダムに1つ選びます
  • stable:dividend:パラメータ名 指定したパラメータに対応する整数値をレプリカ数で割った余りで決定します
  • stable[:hash[:パラメータ名]] 指定したパラメータに対応する文字列のハッシュ値をレプリカ数で割った余りで決定します。パラメータ名が指定されない場合はメインのクエリである q の値が使われます。

node.sysprop

指定したシステムプロパティの値が同じレプリカが選ばれます。
たとえば同じラックに属する Solr インスタンスが同じ rack プロパティの値を持つように -Drack=rack1 のように設定しておき、検索時に shards.preference=node.sysprop:sysprop.rack を指定すると、リクエストを処理している Solr インスタンスと同じ rack プロパティの値を持つ(=同じラックに属する)レプリカが選ばれます。

replica.leader

リーダーレプリカを優先するかどうかを true または false で指定します。たとえばレプリカが6台ある状態で replica.leader:false が指定されるとリーダー以外の5台が分散検索の対象となります。

VS CODE for the Webを使ってみた

Stack Overflow 2019 Developer Surveyで最も人気のある開発者環境ツールとしてランクインし(wikipedia参照)、2021年現在テキストエディタ戦国時代を制した感のあるVS CODE。個人的にも以前からMicorosoftのアプリケーションでは久々の当たりだなぁと思っていたのですが、2021年10月20日にwebブラウザ版がリリースされました。

ということで少し触ってみたいと思います。

必要なことはURLを叩くだけ

ブラウザを起動して「https://vscode.dev/」にアクセスするだけでエディタが起動。たったこれだけなので割りとガチめにびっくりしますw立ち上がりも一瞬。

そしてサイドメニューの「Open Folder」をクリックするとローカルファイルにアクセスするのがすごい。

Dockerで仮想開発環境を利用してたとしてもローカルにマウントしたファイルを編集するので特に問題なくVS CODE for the Webは活用できるんじゃないでしょうか。

気になる環境設定や拡張機能について

とはいえテキストエディタといえば自分が作業しやすい設定や拡張機能を追加してなんぼというところなので、いくらWeb版があるからといってそこんところどうなの?

・環境設定はローカルストレージなどに保存している模様。一度設定した環境は維持されます
・拡張機能については一部のものだけ利用可能のようです。残念。(日本語化プラグインも未対応)
 PHP系はLINT系(構文チェック)ツールやスニペットなどはほぼほぼ対応中のようです。
 逆にHTML5やJavaScript系は割とある様子。Pythonなんかもちらほらという塩梅。
・「GitHubの機能も統合しているため、リポジトリ、コードスペース、プルリクエストの拡張機能が利用できる。 「github.dev」はWeb用VSCode向けにカスタマイズされたインスタンスで、ログインが自動で行なわれ、.comを.devに変更すればリポジトリを編集できる。とのこと(出典『「Visual Studio Code」がインストール不要に。Webブラウザで動作|PC Watch』)

vimは使えましたw

Setting Syncで同期可能

GithubもしくはMicrosoftアカウントでサインインすればローカルアプリのVS CODEの設定を引き継ぐことができるようです。

詳細はリファレンスで確認することができます。

まとめ

かなり良い線までいってるのですが拡張機能が未対応のものが多いので、Web版をメインに据えるのはまだまだ厳しそうですね。今後の動向に期待したいところ。
VS CODEでは最近、悪意のあるプラグインによるセキュリティが問題になっていたりするので、クラウド上ならセキュリティ対策が最速で対応されそうですし、その辺は価値があるかもしれません。
今のところはサーバーなどを介さずフロントのみで実行できるようなスクリプトを作成するなんかには合っているのでプログラミングのお勉強などで利用するのにはちょうど良さそうです。

SolrCloudにおけるレプリカの種類

ドキュメント数の非常に多いコレクションを扱う場合、複数のシャードを作ってデータを分けることができます。ドキュメントはそれぞれ複数のシャードのどれか1箇所にだけ属します。
シャードは1個以上のレプリカから構成されます。同じシャードに属するレプリカの内容はすべて同じです。シャードのうちどれか一つがリーダーとして選ばれます。

インデックス対象のドキュメントがSolrに送られてきたとき、まずそのドキュメントがどのシャードに属するべきかが決定され、そのシャードのリーダーにドキュメントが送られます。そして同じシャードに属する他のレプリカすべてにリーダーからドキュメントが転送されます。

レプリカにはいくつか種類があります。

NRT(= NearRealTime)

  • デフォルトの設定。トランザクションログを保持しつつ自身のローカルのインデックスの更新も行う。
  • リーダー選出の候補となる。

TLOG

  • トランザクションログの維持はするが、自身ではローカルのインデックス更新は行わない。
  • このタイプのレプリカはコミットを実行する必要が無いのでインデックスの速度向上が見込める。
  • このタイプのレプリカでインデックスを更新するには、リーダーからインデックスをレプリケートする。
  • リーダー選出の候補となる。
  • もしもリーダーに選出された場合には、NRTレプリカと同様に動作する。

PULL

  • トランザクションログの維持もローカルのインデックス更新もせず、リーダーのインデックスのレプリケーションのみを行う。
  • リーダー選出の候補にはならない。

レプリカのうちどれかはリーダーにならなければならないので、シャードのレプリカをすべてPULLだけで構成することはできません。
Solrリファレンスでお薦めされているレプリカタイプの組み合わせは以下の通りです。

すべてNRT

更新のリアルタイム性が必要でありインデックス更新のスループットがそれほど大きくない場合、この組み合わせにする。
特にSoft Commitが必要な場合はNRTしか選択肢が無い。

すべてTLOG

インデックス更新のリアルタイム性が必要でなくシャード内のレプリカが非常に多い場合、すべてのレプリカで更新リクエストを扱えるようにしておきたいと考えるならば、この組み合わせにする。

TLOGとPULLの組み合わせ

インデックス更新のリアルタイム性が必要でなくシャード内のレプリカが非常に多い場合、多少古い検索結果を許容しつつ検索クエリへの応答能力拡大をするにはこの組み合わせにする。

 姿勢のお話

こんにちわ。
リエです。

職業病とも言えますが、ここ数年反り腰での腰痛やストレートネックでの首の痛み、肩こりに悩まされております。

整体などへ定期的に行くべきかと思いますが、中々行けず自分で少しでも改善できないかと思い最近寝る前に簡単なストレッチをするようになりました。
YouTubeに動画を出してくださっている方ありがとうございます🙏

長年蓄積されてきたものなので日々のストレッチでの劇的な改善変化は難しいと思いますが、ストレッチを始める前よりも少し腰や首の負荷が軽減されたなという体の変化を感じております。
変化を感じると毎日やろうというモチベーションへと繋がりますね。

寝る前の数十分。いつもはスマホを見てダラダラしてしまう時間をストレッチに当てることで入眠もスムーズになりました。最初はめんどくさいなと思っていましたが、今は逆にストレッチをしないと気持ち悪く感じるようになり三日坊主の私が数週間続いております。

体の調子をもっと整えれるようこれからもストレッチを続けます✊✨

経験の浅いプログラマーにVimを推奨すべきかせぬべきか

エディターは人それぞれですし歴史があり宗教戦争に発展するので他人にとやかくいうものではないと思います。でもそこに経験の浅いプログラマーが入ってきた場合は?この場合おすすめするかどうかは非常に悩みどころです。

遠い遠い昔の初めてプログラミングを行った専門学校の時代はPCに入っていたメモ帳での開発でした。当時のことを思い返せばよくもまぁ全角スペースすら見落としやすいメモ帳で100ファイル近くのファイルを管理してjavaで卒業作品にゲームを作ったなと思います。その後に最初の会社でEmEditorに出会いこんなに便利なエディターがあるんだと感動しEclipceの当時の重さに苦慮しつついつからかVimがおすすめと言われてVimを使い出しました。

vim

vimは便利です。慣れれば今でも十分使えるし使いやすいエディタだと思っています。大体のUnix系OSに入ってるので特にサーバーで作業する際とか緊急時の対応とかに助かります。軽いしターミナルだけで作業できるしマウスいらずで便利です。でもこれはvimを長年使っているから言えることです。

vimは最初のとっかかりに戸惑います。いろいろ操作やコマンドを覚えたり設定を行なったりプラグインを入れたりすればすごく使いやすいのですがそこまでいくのに時間がかかります。入ってすぐにいろいろなことを覚えないといけない状況でVimまで覚えることになると負担が大きいので基本的になしかなと個人的に思ってます。今ならもうvim以外のエディターで軽くてお手軽に始められて拡張性もよく使い勝手のいいものは既に出てるのでは?と考えてしまうことも多々あります。メモ帳代わりに使ってますがVSCode辺りがそれに近そうです。

自分の出した結論は基本的には推奨すべきでない。仕事に慣れて余裕ができて興味があってようやくレベルかなと・・・ターミナルだけで作業できてマウスいらずで便利なんですけどね

上記だけで終わるとアレなので自分がよく使っているコマンド等を記載して終わります。

1行削除の「dd」
1行コピーの「yy」
ペーストの「p」
末尾に移動する「$」
123行目へ移動する「123G」
特定の文字に囲まれている中を削除する「di’」「di”」
ビジュアルモードでの加工や範囲選択での置換
インサートモードから抜けるEscの代わりに「jj」
=などのインデントを自動で行ってくれる自動整形プラグイン
構文エラーチェックのシンタックスエラー検知のプラグイン

特に行番号への移動や行コピーや行削除、ビジュアルモードでの加工はよく使います。