2021年03月27日

Elasticsearchデータ修復

今回はelasticsearchのデータが破損してしまった場合(シングルノード)の修復方法について紹介します。簡易的なデータストレージとしてelasticsearchを使用する場合、クラスター化させずにシングルノードで使用する場合があります。データが冗長化されていないため、誤って電源断をしてしまった時やストレージに障害が発生した時にインデックスがred状態となってしまう場合があります。最悪のケースとしては.kibana_*等のElasticのシステム系インデックスがred状態になるとkibanaが起動できなくなり、開発consoleでコマンド操作といったkibanaの操作が一切できません。

重要なデータでない場合はred状態のindexを丸ごと削除するということが多いと思います。一方で重要でないが可能なら残っているデータを可能な限り復元、修復したいといった場合もあると思います。障害の種類によって修復方法が異なりますが、今回はtranslogの破損による障害の修復方法を紹介します。

translogの細かい説明はここではしませんが、負荷を分散させるためにインデックス内のデータを書き込む前にデータを一時保存するファイルです。translogの破損によってred状態となっている場合、一時保存された直近のデータは消える可能性があります。ただ、red状態で該当するインデックスのすべてのデータにアクセスできない、新規データ投入できない状態から回復したいという場合に有効です。

まずはブラウザやcurlコマンドで下記を実行し、red状態のノードを確認します。修復で使用するため、red状態となったインデックス名のUUIDも合わせて確認します。

続いて、ブラウザやcurlコマンドで下記を実行し、red状態の理由を確認します。

理由として表示された内容で下記の様にTranslog関連の障害が発生している場合は今回の方法で修復できます。unassigned_infoのdetailsにTranslogCorruptedExceptionと表示されており、translog関連の障害と分かります。TranslogCorruptedException以外にもtranslog整合性が合わないといった障害も同様に今回の方法で修復できます。

err_info.jpg


破損したtranslogファイル等を削除して新規に空のtranslogファイルを生成するために下記のコマンドを実行します。なお、ファイル操作を伴うため、elastcisearchを終了させた状態で実行します。また、破損ファイルを削除するため、必要に応じてdataフォルダのバックアップをしてください。インデックスに反映される前のtranslogにのみ記録された直近のデータは削除される場合があります。コマンドラインから下記のコマンドを実行します。

Elasticsearch7以降
bin/elasticsearch-shard remove-corrupted-data --index (インデックス名) --shard-id 0

Elasticsearch6以前
bin/elasticsearch-translog truncate -d (データフォルダ)/elasticsearch/data/nodes/0/indices/(UUID)/0/translog/

elasticsearch7以降の場合は下記のように表示され、translogの破損を発見した場合、修復の有無を聞いてきます。yキーを押して修復させます。

------------------------------------------------------------------------
WARNING: Elasticsearch MUST be stopped before running this tool.
-----------------------------------------------------------------------
Please make a complete backup of your index before using this tool.
-----------------------------------------------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
No problems were detected with this index.
Took 0.025 sec total.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> Translog is corrupted at \data\nodes\0\indices\~\0\translog
-----------------------------------------------------------------------
Documents inside of translog files will be lost.
The following files will be DELETED at \0\translog
--> translog-2_.tlog
--> translog.ckp
WARNING: YOU MAY LOSE DATA.
-----------------------------------------------------------------------
Continue and remove corrupted data from the shard ?
Confirm [y/N] y
Checking existing translog files
Reading translog UUID information from Lucene commit from shard at
Translog UUID :
History UUID :
Removing existing translog files
Creating new empty checkpoint at \translog\translog.ckp]
Creating new empty translog at [translog\translog-1.tlog]
Marking index with the new history uuid :
Changing allocation id to
You should run the following command to allocate this shard:
POST /_cluster/reroute
{
 "commands" : [
  {
   "allocate_stale_primary" : {
    "index" : "(インデックス名)",
    "shard" : 0,
    "node" : "(UUID)",
    "accept_data_loss" : false
   }
  }
 ]
}
You must accept the possibility of data loss by changing the `accept_data_loss` parameter to `true`.
上記は一部を書き換えています。

上記のコマンドだけでは修復したインデックスはred状態のままです。続いて、elasticsearchを起動させ、下記のコマンドを実行して再割り当てを行います。先ほどの修復コマンドの最後に表示されているように、accept_data_lossをtrueにしてcurlコマンドで下記のように実行すると再割り当てが行われ、red状態から回復します。

curl -XPOST localhost:9200/_cluster/reroute --header "Content-Type: application/json" --data "{\"commands\":[{\"allocate_stale_primary\":{\"index\":\"(インデックス名)\",\"shard\" : 0,\"node\" : \"(UUID)\",\"accept_data_loss\" : true}}]}"


再度、下記のコマンドで再割り当てされたノードを確認します。red状態から回復していれば修復完了です。

今回はelasticsearchのtranslog破損時の修復方法について紹介しました。elasticsearch-shard remove-corrupted-dataコマンドはtranslogの破損以外にも対応できるようで他の障害でも使えそうです。

もし、正常な状態のバックアップデータ(スナップショット)がある場合、邪道な方法ではありますが、該当するインデックスのtranslogファイルを丸ごと置き換える方法もあります。http://localhost:9200/_cat/indices?vでインデックス名とUUIDの関係を調べ、dataフォルダ内の該当するUUIDフォルダを見つけます。その中にtranslogフォルダがあり、同じUUIDの正常なtranslogフォルダを丸ごと置き換えます。translog自体の破損は修復できますが、インデックスデータとの整合性が合わない可能性が出てきます。ただ、この方法の場合、コマンド操作が不要なため、ダメ元で修復したい場合は作業として非常に楽になります。なお、当然ではありますが異なるUUIDのtranslogフォルダを置き換えた場合は整合性が取れないため、red状態のままです。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2021年02月27日

楽天UNLIMITルーター

今回は電子工作や組込系から少し離れた話題となりますが、メイン回線として耐えうる楽天UNLIMITに最適なモバイルルーターを紹介します。キャリア以外から購入可能なモバイルルーターは数年前に比べると数が絞られています。楽天UNLIMITで使用可能なモバイルルーターは主にこちらの3つです。NEC MP02LN富士ソフト FS030WHUAWEI E5785です。

現状、コロナ禍で海外旅行は難しいものの、今後、海外での利用を考えるとバンドがより多い方が好ましいです。また、キャリアを変更した際にそのまま使用可能かを考えるとよりマルチバンドが好ましいです。この時点でNEC MP02LNはLNとLSで対応バンド毎に機種が異なるため、除外しました。残る候補として、富士ソフト FS030WとHUAWEI E5785になります。実際に使ってみて違いをまとめてみました。


■富士ソフト FS030W
・対応バンド
B1,B3,B8,B11,B18,B19,B21
・有線LAN対応
・最大150Mbps
 USBEthernetアダプタで有線LANでの接続が可能になります
・バッテリ無動作
 バッテリを抜いた状態で使用できます
・バッテリ劣化軽減機能
 電池充電を70%程度に抑えて劣化を抑制します

■HUAWEI E5785
・対応バンド
B1,B3,B5,B7,B8,B18,B19,B20,B28,B32,B38,B41,B42
・最大300Mbps
・SMS対応
 専用アプリorブラウザ経由の設定画面からSMSを確認できます

正直、モバイルルーターに付帯する機能としては圧倒的に富士ソフト FS030Wが便利です。特に有線LANやバッテリ無動作は自宅でメイン回線として使用する場合に非常に便利です。一方、HUAWEI E5785はモバイルルーターの基本機能に徹しており、正直あまり特徴がありません。

それぞれ2週間ほど2つを使ってみた結論はHUAWEI E5785です。電波が強く安定している場所では富士ソフト FS030Wで問題ありませんが、電波の弱い場所や室内では富士ソフト FS030Wの速度低下が大きく、速度が不安定になりがちでした。また、FS030Wは一度掴んだバンドが気づいたらローミングになっているということが多々ありました。


横浜の自宅マンションにてスピードテストで確認した結果を下記に記します。高速モードをOFFにして速度が低下の有無でパートナー回線か確認しています。楽天回線で土曜日の夜9時に測定しました。


fs_speed2.jpg
富士ソフト FS030Wの結果


hw_speed.jpg
HUAWEI E5785

上記の結果ではHUAWEI E5785よりも富士ソフト FS030Wが早い結果となっています。ただ、体感としては圧倒的にHUAWEI E5785が早いと感じました。上記の結果で各図中央の速度変化の推移をみると分かりますが、HUAWEI E5785の方が速度の立ち上がりが早く、以降は安定して推移しています。一方、富士ソフト FS030Wは立ち上がりが遅く、以降も速度が上下して安定していません。

最高速度で比較するとどちらも互角ですが、立ち上がりや速度安定が大きく異なりました。特に画像検索や動画の視聴で差が出ました。電波が強く安定している場所では差は感じにくいですが、電波が弱い場所で立ち上がりや速度安定に顕著な差がでました。


ここでは詳細については述べませんし、対応有無等はすべて自己責任の範囲となりますが、ファーウェイはバンド固定や確認ツール[1]が非常に充実しています。huawei_band_tool_config.txtで事前設定して各バッチファイルをクリックすることで任意のバンドに変更、状態の確認ができます。

これらの含めて、貿易摩擦の中で日本国内の存在感が薄れていますが、HUAWEI E5785が楽天UNLIMITに最適なモバイルルーターだと思いました。なお、電波は利用場所や設置環境によって大きく異なるため、参考の情報となります。また、速度や結果を保証するものではありません。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2020年05月02日

SBCへのElasticsearch&Kibanaインストール7.6.X版

今回はSBC(シングルボードコンピュータ)へElasticsearchとKibanaをインストールする方法を改めて紹介します。対象のSBCはTinkerboardSです。以前にもSBCへElasticsearchとKibanaをインストールする方法を紹介しましたが、以前に比べて状況が変わっているため、改めて紹介します。

ARMベースのシングルボード上でElasticsearchとKibanaをアプリケーションとして動かすのではなく、サービスとして登録して運用する手順を紹介します。

■Java11ダウンロードとインストール
以前はoracleからarmhf版のJavaも配信されていましたが、最近のバージョンでは配信されていません。こちらのbellソフトウェアサイトからarmhf用のパッケージをダウンロードしてインストールします。

sudo dpkg -i bellsoft-jdk11-linux-arm32-vfp-hflt.deb

■elasticsearchダウンロード
最近のelasticsearchからJavaがバンドルされており、以前のようにJavaインストール関連のトラブルで起動しないといったことが起きづらくなりました。一方でSBCにインストールする際にはarm版である必要があるため、バンドルされたJavaは使えません。こちらのサイトからJavaがバンドルされていないバージョンのelasticsearchをダウンロードします。



■kibanaダウンロード
こちらのサイトからkibanaをダウンロードします。

合わせて、Armhf版現行のkibanaに対応したNodejsの10.16.0をダウンロードします。


■elasticsearchインストール
amd64用にパッケージされているため、そのままではインストールできません。

@強制的にARM環境にAMD64を追加するために設定を変更する
sudo dpkg --add-architecture amd64
※逆に削除する場合は dpkg --remove-architecture amd64

elasticsearchインストール
sudo dpkg -i --force-all --ignore-depends=libc6 elasticsearch-7.6.2-no-jdk-amd64.deb

Aフォルダ権限変更
sudo chmod -vR 777 /etc/elasticsearch/
sudo chmod -vR 777 /var/lib/elasticsearch/
sudo chmod -vR 777 /usr/share/elasticsearch/
sudo chmod -vR 777 /var/log/elasticsearch/

BJavaディレクトリパス設定
Jdkのパスを通します。

sudo mkdir -p /usr/share/elasticsearch/jdk
sudo cp -rf /usr/lib/jvm/java-11-openjdk-armhf/* /usr/share/elasticsearch/jdk


Celasticsearch.yml設定変更
amd64専用の機能などを無効化しないと起動に失敗します。
少しおまじないを追加します。
sudo leafpad /etc/elasticsearch/elasticsearch.yml

xpack.ml.enabled: false
bootstrap.system_call_filter: false

※必要に応じて下記も追記する。
network.host: "0.0.0.0"
http.port: 9200
transport.host: localhost
transport.tcp.port: 9300

DJava設定
必要に応じてElasticsearchのメモリ割り当てを変更します。
sudo leafpad /etc/elasticsearch/jvm.options

デフォルトは
-Xms1g
-Xmx1g
-server
でメモリ1GをElasticsearchに割り当てる設定です。Tinkerboardならメモリ2GBなのでデフォルトでも問題ありませんが、raspberryPIの場合はメモリ1GBなのでシステム領域が全く確保できなくなってしまいます。設定したメモリ領域+200MBが実際のプロセス上で使用するため、raspberryPIの場合は
-Xms500m
-Xmx500m
-server
が妥当だと思います。


E一時フォルダ設定
sudo leafpad /etc/elasticsearch/jvm.options

-Djava.io.tmpdir=${ES_TMPDIR}
から
-Djava.io.tmpdir=/usr/share/elasticsearch/tmp
に変更します。

また、一時フォルダの作成と権限付与を行います。
sudo mkdir -p /usr/share/elasticsearch/tmp
sudo chmod -vR 777 /usr/share/elasticsearch/tmp


Fjna置き換え
デフォルトではarmhf環境でsystemctl elasticsearchサービスを起動させると途中で起動に失敗(関連リンク1関連リンク2)する不具合があるようです。jnaを置き換えます。

sudo mv /usr/share/elasticsearch/lib/jna-4.5.1.jar /usr/share/elasticsearch/lib/jna-4.5.1.jar.old


Gサービス起動設定変更
デフォルトでは自動再起動の設定が無効のため、
下記のファイルに追記します。
sudo /bin/systemctl enable elasticsearch.service#ファイル生成
sudo leafpad /etc/systemd/system/multi-user.target.wants/elasticsearch.service

[Service]
・・・・
Restart=always
・・・・
Environment=ES_TMPDIR=/usr/share/elasticsearch/tmp
↑2行追加する
・・・・


Eサービス登録
下記のコマンドでサービスを有効化します。
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
sudo service elasticsearch start

これでElasticsearchがシステム起動時に自動的に起動します。

sudo service elasticsearch statusでサービス状態を確認できます。
http://localhost:9200へアクセスして確認してもよいと思います。

statusで問題なくても9200へアクセスできない場合は
elasticsearch.ymlかjavaの設定に何か問題があることが多いです。


■Kibanaインストール
Kibanaはamd64用にパッケージされているため、そのままではインストールできません。

@強制的にARM環境にAMD64を追加するために設定を変更する(elasticsearchで実行済の場合は不要)
sudo dpkg --add-architecture amd64
※逆に削除する場合は dpkg --remove-architecture amd64

AAMD64が追加されているか確認する
sudo dpkg --print-foreign-architectures

BKibanaインストール
sudo dpkg -i kibana-7.6.2-amd64.deb

CARM版Nodejs解凍
tar xfv node-v10.16.0-linux-armv7l.tar.gz

DARM版Nodejsへ置き換え
sudo cp  node-v10.16.0-linux-armv7l/bin/node /usr/share/kibana/node/bin
sudo cp  node-v10.16.0-linux-armv7l/bin/npx /usr/share/kibana/node/bin
sudo cp  node-v10.16.0-linux-armv7l/bin/npm /usr/share/kibana/node/bin

Dkibana.yml設定変更
sudo leafpad /etc/kibana/kibana.yml
下記を追記する
server.host: "0.0.0.0"
i18n.locale: "ja-JP"

Eサービス登録
下記のコマンドでサービスを有効化します。
sudo /bin/systemctl enable kibana.service
sudo service kibana start
これでKibanaがシステム起動時に自動的に起動します。
sudo service kibana statusでサービス状態を確認できます。
http://localhost:5601へアクセスして確認してもよいと思います。

■おまけ
・Tinkerboard RTC設定方法

・日本語入力IME追加
 sudo apt-get install ibus-mozc im-config

・Nodejsインストール
 curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -

・Node-Redインストール
 sudo npm install -g --unsafe-perm node-red

・Node-Red serialportインストール
 sudo npm install -g --unsafe-perm node-red-node-serialport

・apt-getで依存関係エラーが残ってしまう場合の対処方法
 下記のコマンドでエディタを開き、依存関係エラーに関連するライブラリ名を検索し、対象のライブラリ数行を丸ごと削除して保存する。
 sudo leafpad /var/lib/dpkg/status

以上の手順でシングルボードコンピュータへElasticsearchとKibanaをインストールすることができます。以前に比べてArm版のJavaがoracleから配布されなくなったり、elasticsearchにjdkがデフォルトでバンドルされたりといろいろ状況が変わっていました。ElasticStack7.2前後はnode系のgitバイナリ絡みの依存でSBCに根本的にインストールできない状況でしたが、ElasticStack7.6では解消されています。一方でelasticsearchのjna絡みでトラブルを抱えているため、jnaの置き換えが必要な状況でした。今回はdokcerを使わずにそのままElasticStackをサービスとして使用する方法を紹介しました。dockerを活用すればArm版への対応作業は必要ですが、多少、設定は楽になると思われます。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2020年03月21日

SBC OSイメージリサイズ方法

RaspberrypiやTinkerboardといったシングルボードコンピュータ(SBC)ではOSを記録する媒体としてmicroSDカードやeMMCを使用しています。Win32DiskImagerといったツールでmicroSDカードやeMMCのバックアップを取った後に別のmicroSDカードやeMMCにリストアするとサイズ違いでエラーが発生し、リストアできない場合が時々あります。

microSDカードやeMMCは同じ容量でもロットやメーカによってセクタサイズが若干、異なります。小さい容量のバックアップデータから同じ容量もしくは大きい容量にリストアする場合は問題ありませんが、容量が小さい場合、エラーが発生して起動できません。パーティションに空きがあったとしてもパーティションサイズは不正なため、起動に失敗します。このような場合にはバックアップデータファイルのパーティションを操作とイメージファイルの編集が必要です。今回はバックアップしたイメージファイルをLinux(ubuntu)上で編集してOSイメージをリサイズする方法を紹介します。


■大まかな流れ
1. 縮小したいイメージファイル(*.img)をマウント
2. gpartedでドライブを縮小
3. 縮小して未使用の領域を除く

■手順
1. *.imgファイルをマウントするために空きのループデバイスを確認する。下記のコマンドで空いているループデバイス一覧が表示されます。
   sudo losetup -f

2. イメージファイル(*.img)を空きのループデバイスにマウントする。下記の例では空きのloop8にXXX.imgをマウントした場合を示す。
        sudo losetup /dev/loop8 XXX.img

loop1.jpg

3. ループデバイスを更新する。
   sudo partprobe /dev/loop8

4. パーティションを編集するためにパーティションツールを起動させる。
        sudo gparted /dev/loop8
 ※gparted がインストールされていない場合は事前にsudo apt-get install gparted を実行しておく。


5. GUI上でドライブのext4パーティション(パーティション2)を右クリックし、[リサイズ/移動]をクリックする。右端をスライドさせてパーティションを縮小する。今回はセクタサイズの若干の差のため、数MiBでも大丈夫だと思いますが念のために100MiB~500MiB程度、縮小しました。

gparted1.jpg


gparted2.jpg


6. gparted の適用ボタンを押して変更を反映させる。

※この時点ではシステム上のパーティションサイズが小さくなっただけでイメージファイル(*.img)の容量は変わっていません。イメージファイルの未使用パーティションの空き領域をイメージファイルから削除する必要があります。


gparted3.jpg

7. イメージファイルのパーティションセクタサイズを確認する。
    sudo fdisk -l /dev/loop8
       ↑エル

 下記のように表示されます。Endのセクタ位置が重要です。パーティションの最終セクタの位置をメモします。
  デバイス ブート  Start   End      Block  Id   System
  UUUUUUU         BBBB   CCCC    AAAA   *  Fat
  WWWWW    *    YYYY   ZZZZ     AAAA   *  Linux


8. ループデバイスを解除する。(追記)
  sudo losetup -d /dev/loop8

9. イメージファイルの空き領域を削除します。
         sudo truncate --size=$[(ZZZZ+1)*512] XXX.img
※重要な点は最終セクタから次の空き領域を削除するため、パーティションの最終セクタ+1を設定する点です。

terminal.jpg

これでイメージファイル(*.img)を縮小することができました。今回はVirtualBox上で実行したUbuntuでファイル操作を行いました。他にも専用スクリプトやresize2fsを使用する方法などありますが、環境によってうまくいかない場合がありました。上記の方法だと手間はかかりますが、RaspberrypiやTinkerboard、Nanopiといった様々なSBCでも適用できると思います。

posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする

2020年02月22日

おすすめMakerプロジェクトサイト

今回は電子工作やモノづくりのヒントや種を見つける際に便利なサイトを紹介します。

■電子工作系プロジェクトサイト

■ハイレベルな電子工作系プロジェクトサイト

■メカ・ハードウェア系プロジェクトサイト

■日本のモノづくり紹介サイト

■海外電子部品CtoCサイト

■3Dプリント向けの3Dデータサイト

■電子部品販売サイト Digikey 新製品情報

■電子部品販売サイト Mouser 新製品情報

時間がある時に見ているとモノづくりのモチベーションが上がるサイトばかりです。単に情報収集だけでなく、応用や関連情報を探すのにも非常に役立ちます。
posted by Crescent at 00:00| Comment(0) | ナレッジ | このブログの読者になる | 更新情報をチェックする