日記9750
ADWGroupとITRC運営してます。
趣味
- ほぼ無計画書き gptも何も使わない。 炎上しなければええやろ精神の低レベル記事書くの好き。 ただし最近は図にするのを目標に頑張ってる。
- ほぼ無計画旅
全く考えないでいく旅が好き。
ただし18きっぷが連続5日になったから考え改めないとなって思ってる。 - ほぼ無計画コーディング
思い至ったら、とりあえずコードにする。 - ブルアカ
ソシャゲなんてやるか( *`ω´) とか言ってたけど始めたら案外ハマった作品の一つ。 正直これでいいんだよ。僕は望んでいた。
かわいそうなのはかわいそうなの方です。
好きな言語
- rust
- java
いつも使ってるリポジトリ
https://mirror.hashy0917.net/
※自動変更スクリプトも書いてます。 よければ使ってください。 → change0917
リンクとか
My Parser Project
CommandAPIを用いて生成したプロセスの標準入出力を管理するプログラムを書いていて、 その実験用に登場した「DesperatelyRustyToolBox」が 独自のコマンドラインを持つプログラムであった。
このプログラムをもっと拡張できるよう、高度な構文解析が必要と考えて登場したのがこのプロジェクト。
他にも登場経緯はあるが割愛。
自分用標準構成
自分用とあるが、実際rustで開発するにあたって必要であるカスタム型、便利ツール、開発方法、モデルを定義したもの。
要素は以下の通り
- CI/CDを実現するためにGithubActionsを積極採用
cargo build
とcargo test
を自動化。さらに、cargo doc
も自動化。
mainにマージされた時はクリーンなコードを保てる。 - テスト駆動開発で開発を行う
せっかくCI/CDでテストの自動化を行ったんだから、書かないわけにはいかない。
公式にもある通り、テスト駆動開発で目標の見える化を実現。 - エラートレイトを実装したオリジナルのカスタムエラー型を用意
ちゃんとsourceまであるならsourceまで実現。
エラー発生箇所の特定を容易にするだけでなく、
From
の実装で?
シュガーシンタックスに対応、コードがより見やすく。 - 一般的なブランチモデルを採用
いわゆる
git flow
に基づいたブランチモデルを採用する。
また、名前規則やコメント規則等々も今後まとめていきたい。
最終目標
このプロジェクトを使い回していけるように頑張りたい。
参考とか
- Rust でパーサコンビネータを作ってみる/nojima様
パーサーコンビネータの基本のきがここに載ってます。とても参考になります。
当プロジェクトでは部分的に実装を変えたりしてるが、ほとんど参考にして作ってます。 - BNFや構文解析についてのメモ
四則演算パーサー実装時に参考にしました。
ceph-monってなに?
ceph-mon 私もこの記事を書いている時点ではあまりよくわかってないんですが、 わかる範囲で例えるなら「図書館司書」
ところで、私の好きなゲームの話なのですが、図書館に引きこもりなんですが、本が、とても大好きな子がいるんです。
コミュ障なところがほんと好き。
ちなみに、コスト削減してくれるので結構有能です。
cephの概要
Cephは、複数のサーバーが連携して動作するクラスタシステムで、ストレージを共有・管理できるシステムのこと。 つまり、各サーバーが持つストレージを、一つのストレージとしてみることができます。
オブジェクト
Cephはオブジェクトストレージ。 データ一つ一つがオブジェクトと呼ばれています。
レプリケーション
冗長性を保つため、各サーバーストレージに複製を保存する機能です。 kubernetesでも似た様な技術が見られます。
OSD
Cephでは、ストレージ単体のことをOSD(Object Storage Device)と言います。 OSDはサーバー自体ではなく、サーバー内のストレージデバイスを指すので注意。
Ceph Monitor(ceph-mon)
Ceph Monitor (以下mon) はcephシステムの入口的存在。 役割は以下の通り
- 監視機能:OSDの状態を常に監視
- オブジェクト管理:オブジェクトがどのOSDに記録されているかを記録
ここが消えてしまえば、ストレージにアクセスすることはできません。 そのためmonは冗長化されています。
Map
地図です。データの配置や構造を記録されてます。
- ObjectMap: オブジェクトの位置を記録するMap
- MonMap: 冗長化されているmon同士が、どの様に働いているかを記録するMap
全てのmonは、このMapを同期しあい、ユニークになる様にしています。
図書館で例えると
- オブジェクトは本。
- OSDは書棚。
- monは司書。
書棚には本が置かれています。 そして(優秀な)司書は、本がどこに置かれているのか、 はっきりわかるわけです。 また、司書は仕事として、本の質を確認して回っています。
mapの場合は
Mapは司書が持っているツールです。 ObjectMapは本がどの書棚にあるかを記録 MonMapは司書同志の連絡帳ですね。
Mapの同期が取れてないと、別の司書が本を移した時、 「そこにあると思われていた本がない」といったトラブルにつながるわけです。
MonMapとIP
monmapは図書館で例えている時、連絡帳と書きました。 この連絡帳にはIPが書かれています。
epoch 16
fsid 12345678-abcd-1234-zyxw-9876-abcdefghijklm
last_changed 2025-01-20T12:40:16.621338+0000
created 2024-10-27T05:57:33.339382+0000
min_mon_release 18 (reef)
election_strategy: 1
0: [v2:192.168.1.10:3300/0,v1:192.168.1.10:6789/0] mon.node1
1: [v2:192.168.1.20:3300/0,v1:192.168.1.20:6789/0] mon.node2
dumped monmap epoch 16
これがmonmap。 至ってシンプルです。
epoch <monmapのバージョン>
fsid <cephシステムに使われる固有の識別子, id>
last_changed <最終更新日>
created <作成日>
min_mon_release 18 (reef) <おそらくmonの最低要件バージョン>
election_strategy: 1 <よくわからん...>
0: <monのipと名前>
...
dumped monmap epoch 16
monmapは、内部でバージョン管理されていて、 やろうと思えばロールバックができる構造になってます。 (...やり方知りませんが...)
monmapの取得方法
たくさんあります
ceph
コマンドが生きてる場合
cephコマンドが使える場合は、
ceph mon dump
で取得可能です。
ceph
コマンドが生きてない場合
ceph-mon
コマンドを使います。
そもそもこのコマンドは、monそのものなので
systemctlで立ち上げる場合、内部でコマンドが用いられます。
ceph-mon -i <monの名前> --extract-monmap <出力したい場所, ex: ~/monmap>
次に、monmaptool
を使います。
monmaptool --print <出力した場所, ex: ~/monmap>
その他
ほかにも ceph-monstore-tool
を用いる方法もあります。
ceph-monstore-tool <mon storeの場所> get monmap -r
monstore
monstoreとは、monが持つ小さなデータベースです。 MonMapとObjectMapが保管されています。
場所
- microceph:
/var/snap/microceph/common/data/mon/<monの名前>
- ceph:
/var/lib/ceph/mon/<monの名前>
monの名前を忘れた時、ここをみるとわかるかもしれません。
monmapを手動書き換えする
ceph-mon
コマンドで取得したmonmapは、monmaptool
を用いることで
書き換えることが可能です。
monmap関係でトラブルが発生した時はこの方法を用いることで解決できると思います。
また、書き換えたmonmapを再びmonstoreに戻す時は
ceph-mon -i <monの名前> --inject-monmap <出力した場所, ex: ~/monmap>
とすることで対応可能です。 なお、injectしたmonmapのバージョンは、自動的に引き上げられます。
コマンドリファレンス
参考
で、結局お前何やらかしたの?
ceph mon set-addrs <name> <addrs>
こういうコマンドがあります。 このコマンドはアドレスを変えるコマンドです。 うちでmonが動いているサーバーには複数のipがあります。
二個目のipに対応させるため、いい方法を探してたらこのコマンドを見つけたわけです。
もともと3ノードあったのですが、3ノード目で1ノードと同じipを設定したら、 1,3ノードともに動作しなくなりました。
結局、monmaptoolで3ノード目を消して解決しました。
...二週間。 学生でよかったと思った瞬間でした。