Skip to content

Instantly share code, notes, and snippets.

@acid-chicken
Last active December 15, 2019 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save acid-chicken/ccdfeb56b742b28eace84e9ca2366ef1 to your computer and use it in GitHub Desktop.
Save acid-chicken/ccdfeb56b742b28eace84e9ca2366ef1 to your computer and use it in GitHub Desktop.
Advent Calendar

twista 開発運用紀 2019 +α

こんにちは、硫酸鶏です。おかげさまでつい一週間ほど前にやっと 18 歳になりました。今年ももうわずかですが、一つ年齢の壁を超えたので来年はより一層暴れていきたいと思います。また皆様に様々なご迷惑ご心配をおかけすることになるかもしれませんが、これからもどうぞよろしくお願いします。

          幺夂
          小⺀
  制作・著作
━━━━━
        ⓃⒽⓀ





















おわりません。ログっぽく書いてたらめちゃくちゃ長くなってきたので障害対応の話だけ分離することにしました。そのため後半は普通に読み飛ばしてもらって大丈夫です。

まえがき

このエントリはやきゅさん主催のアイマス系 Fediverse インスタンス合同アドベントカレンダー企画であります Except imas (エクマス) Advent Calendar 2019 の 9 日目記事になります。前日の記事は石神十夜さんここで敢えてラ!の話をしよう~推し語り、虹が咲いたその先に~でした。氏は一昨日の記事(ここで敢えてラ!の話をしよう~ライブコンテツとしてのラブライブ!サンシャイン!!~)も担当されており、二日間に分けて*ラブライブ!*の記事を書いていらっしゃいました。また、翌日の記事は智絵里さん係さん【エクマスアドベントカレンダー】立入検査の話すこしするです。どの記事も長すぎずかつ読み応えのある記事でございます。(一方でこの記事は書き残すべきだと判断した内容量が多すぎて悲惨なことになっています。)

……はい。大幅に遅刻してしまい大変申し訳ありませんでした。

そもそも twista とは?

一言で表すと「シャニマス P 向け分散型 SNS」です。詳細はここでは割愛しますので twista Help の解説をご覧ください。

運用奮闘記

まずは皆様お待ちかね(ほんまか?)の運用奮闘記です。

3/18-3/19 〜最初で最後のドライブマイグレーション〜

最初の火事場イベントは開設から一週間も経たずしてやってきます。

背景

twista の初期運用構成ではアップロードされたファイルを DB に直接読み書きして管理していました。ただ、これを続けると結構な勢いで DB が肥大化し、バックアップコスト的にもパフォーマンス的にもよろしくありません。運用開始数日で過ちに気づいただけある意味良かったかもしれません。

さて、ではこれらの問題を解決するにはどうすれば良いのでしょうか。答えは簡単で、ファイル管理をするために設計された DB のようなものを使えば良いのです。これを「オブジェクトストレージ」といいます。幸いにも twista のベースである Misskey はいわゆるオブジェクトストレージのデファクトスタンダードといわれる S3 に対応しています。これを使えばこの問題は解決しそうな気がしますね。

しかし口に出すは易しで、S3 は複雑な従量課金制のため高校生の財布から契約するには少し憚られるものがありました。互換性のある minio も結局は Linux 等のファイルシステムの上に乗っけなければならず、本質的な解決になりません。

ですが、そもそも twista は ConoHa という VPS サービス上でホストされています。そんな ConoHa にも実はレンタルオブジェクトストレージがあり、それなりのお値段で利用することができます。これを使えば解決では……?と思うかもしれませんが、ConoHa のそれは OpenStack Swift と呼ばれる S3 と互換性のないオブジェクトストレージです。

そこで登場するのが S3Proxy。こいつを使うと S3 と互換性のあるエンドポイントを擬似的にホストして OpenStack Swift にアクセスすることができるようになります。

実装 〜Phase.1〜

次のような手順で進めていきます。

  1. twista のドライブ格納先を S3Proxy に変更。
  2. 既存のファイルをオブジェクトストレージに移す。

当然 1 は設定をいじるだけなのですんなりできた(つもりでいた)のですが、2 にきてアップロードが失敗する問題に直面します。そう、実は S3Proxy はあまり安定して稼働せず、そもそも JVM 実装であることも相まってメモリの少ないマシンでホストすると、とても使えたようなものではない動きを見せてくれるのです。

再考

計画は振り出しに戻りました。いや、振り出しに戻ったどころか先ほどの 2 の際に盛大におかしくなってくれたおかげでドライブのファイルがほぼアクセス不能になってしまいました。

既存のファイルを諦めたとしても、もう残された方法は一つしかありません。そう、こうなれば twista から直接 OpenStack Swift を叩くのみです。

実装 〜Phase.2〜

最初にぶっちゃけると OpenStack Swift を使っている人なんてほとんどいませんでした。Node.js 向けラッパーライブラリも依存関係の脆弱性がたんまりとかいう惨状です。しかしながら足踏みしていくとどんどん悪化していくのは目に見えているので、不安を抱えつつも作業を開始します。

計画としてはざっくり次のような感じです。

  1. まずオブジェクトストレージに接続できるようにする。
  2. 既存のファイルをオブジェクトストレージに移す。

とりあえず実装できたので動かしてみましょう。……動きませんね。 ライブラリを変えてみましょうか。……悪化しましたね。

かれこれ数時間の格闘の末、ライブラリのドキュメントが間違っていたことに気づきました。該当箇所を直したらあまりにもすんなり動いてしまい、思わず絶句してしまうほど。

反省

今回はテストに minio をローカルホストした程度だったのでこのような事態を招いてしまいました。

ちゃんと可能な限り運用環境と同じ構成のテスト用環境を作りましょう。(なお財布)

3/27 〜依存性の崩壊〜

対応に手間取ってしまい、数時間ほどのサービス断を起こしてしまった障害です。

背景

twista の更新作業を行っていたら〜、

現象

意図しない依存関係の更新で gulp が壊れました〜。

反省

チクショー!! #きちんと--frozen-lockfileしよう

10/18-10/19 〜ENOSPC に潜む罠〜

一番辛かったです。

背景

twista を開くとたまに HTTP 520 エラーが帰ってきたりするようになりました。原因を辿ってみると inode が枯渇したのか ENOSPC が発生していました。inode が枯渇するというのは正直ストレージが満杯になるよりも厄介で、ろくに何もできなくなってしまいます。「とりあえず再起動をするしかない」と思ってしまった私はこの後罠にハマることになるのです。

悪化

さて、再起動をするとカーネルパニックが起きるようになりました。実はこの現象はある程度想定済みで、Arch Linux の ISO を読み込ませてやることでブート時の問題を軽減して起動できると踏んでいました。しかしそんな幻想は叶わず、カーネルパニックは依然として画面の座を退こうとしません。

挑戦

想定外の範囲にまで問題が広がっていることがわかったので、インターネットの海を彷徨うことにしました。失敗したら台無しになりそうな方法は避けたうえでいろいろトライしてみましたが、全滅。結局、頭が回らないので一旦寝ることにしました。

助舟

起きてから、いろいろ知り合いに相談してみることにしました。すると、「systemd が飛んでいるかもしれないので再インストールしてみて」というアドバイスを頂き、この方法で無事復旧させることができました。実際に起動してみたら他にもいくつかファイルが壊れていましたが、こちらは自力でなんとか安定稼働できる状態にまで復旧させることができました。

考察

inode が枯渇すると思わぬものまで壊れてしまうみたいです。枯渇させないように気をつけましょう。

第一四半期活動ログ

1-3 月に暴れた内容を懺悔を兼ねてログっぽく以下に記していきたいと思いますが、多分長くなると思います。なお twista はまだ生まれてから 9 ヶ月しか経ってないので、1-2 月は twista と全然関係ない話しかしません。また 3 月も関係ない話が混ざると思います。加えて BBMB 等の話題が混入します。ご理解の程よろしくお願いします。

1 月上旬

正月早々丼民と工場長やってました。早速話題が脱線しますが、バージョン 1.0 が 2020/9/25 にリリースされることが決まったみたいです。0.12 あたりからやっていたので、本当にただただ長かったなというのが正直な感想です。

……そんなことはどうでもよくて、2 月まで駆け足で行きます。

1 月中旬

某所でいろいろされる。この時期あたりから某プロジェクト本流開発への完全依存を避けることを決意します。(某プロジェクト本流の Collaborator をやめるわけではない。)

1 月下旬

第三次BEMYBABY合作に参加しました。さすがだ。お前といると日本のロックがまだ死んではいないということを確信できる。

2 月上旬

Webpack のパッケージが壊れた(具体的には webpack の依存関係である terser のリリースにバグ入りが混入した)りいろいろありましたね。ここら辺で「Node.js やだ」をこじらせます。

2 月中旬

大体この時期にSSSS.パリッとマンが流行り出します。

2/13

Qiita にネタ記事を投下してトレンドに居座りました。

2/14

(おそらくSSSS.パリッとマンに影響を受けて)シャニマスを始めます。

2/15

アイマストドンの皆さんの御指南も相まってシャニマス W.I.N.G. 初優勝。

またこの日のつぶやきがプチバズりし、Misskey への新規流入者がその日だけでもおよそ 50 人以上増加します。

2/16

(腹痛で特に何もしなかった一日だった)

2/17

後世に語り継がれないあのクソデカ耳垢事件が起き、アイマストドンの皆さんにご心配をおかけしてしまいました。

クソデカ耳垢事件 #とは (クリックまたはタップで展開)

朝起きたら(午後起きですが)右耳が聞こえなくなっており、数ヶ月前に Twitter の知り合いで突発性難聴になった方がいらっしゃったこともあってパニックに。ただ家に誰もおらず、財布は寒くでなかなか病院に足を運ぶのを躊躇していました。(結果論では結局躊躇しててセーフではあったものの、本来よくない。)昼になって帰宅した父親に相談したところ、その場で耳の中を見てもらい、巨大な耳垢が穴を完全に塞いでいたことが発覚。そのまま次の朝に耳鼻科で耳垢を取ってもらい、出てきた 1cm ほどの耳垢に仰天したというオチです。

この一件で、知見として「耳掃除不要論などもあるが、やはり体質によって耳掃除の必要性はそれぞれなので、定期的に耳鼻科に通うべし」を得ました。

2/18

そして初 True End。記念すべき最初の True はヤバい方の三峰でした。

2/19

アクアリウム甘奈で True End。

そして二人の True 石でメイド夏葉をめっ↑ちゃ↓引き当ててしまい(累計 40 連で 2 凸突入)、後々に担当が決定する際の大きなきっかけになります。

2/20

昨日の勢いでメイド夏葉 4 凸完了(累計 70 連)。

シャニマス世界に存在する SNS ことツイスタを知りその勢いで 283.cloud ドメインを購入。何を考えているかはもはや言わずもがな。

またこの日から既にシャニマス世界線未来説を脳内で提唱し始めます。(詳細についてはベベカレで執筆予定。)

2 月下旬

この時期から twista が計画され始めます。

2/21

この日震度 6 弱の地震が北海道を襲い、某サーバーなどでも甚大な被害が発生します。

2/22

COMPLEX BEST をポチる。

2/23

夏休みBEMYBABY合作(旧称第四次BEMYBABY合作)が計画され始めたので、放クラロゴパロをロゴ案として提出してしまい、そしてそのまま採用されてしまいます。

2/25

夏休みBEMYBABY合作の計画が始動。なお参加者のうち 3 名がアイマストドンユーザー。ちなみに同日に関係のない動画を一本ニコニコ動画に投稿。

またこの日に、後に twista がホストされることとなる VPS マシンが契約され、そのままとりあえず Misskey のセットアップが秘密裏に行われます。

2/26

夏休みBEMYBABY合作が旧称から改題。

確か VavletRose の二人が初登場したのもこの日だったと思います。

2/27

この日あたりから暇なときにちまちま twista の fork 準備作業を進め始めます。

2/28

何かを踏んでしまい何かに気づく

3 月上旬

この月に twista は生まれました。

3/1

シンデレラガールズのとあるドカベン系列合作の投稿作品に先日の気づきをチラッとネジ込んだものの、特に反応は得られず。

3/2

なんなんすかねこれ?

3/3

Mastodon が計画する投票機能に合わせて Misskey の既存の投票機能を少々調整したり。

3/4

先日の作業の結果、Misskey から Mastodon への投票がとりあえず成功。

3/5

先日に続いて試行錯誤する。

3/6

できた。作業完了報告をアイマストドンで投稿した結果、オイゲン砲が発動しアイマストドンに一時的とはいえ結構な負荷をかけてしまった(懺悔)様子はこちら(画像)

3/7

ただアイマストドン鯖缶さん的には投票機能は「外したいレベルで嬉しくない」らしく、後に作った本家追従 PR では投票作成機能のみを削る結果に(作業中だけど)。

あと貢いだ

3/8

Node.js つらい

3/9

こないだの何らかが何らかになる

3/10

この日飛行機墜落事故が二件もあったらしい。)

3/11

久しぶりにシャニマスの話に戻りますが、pR で W.I.N.G. 初優勝(ちなみに A ランク)しました

3/12

そして、S ランクで W.I.N.G. 初優勝も成し遂げ、完全に数日間興奮状態に。

3/13

興奮からかそのまま勢いで twista 爆誕

この日の更新内容

3/14

興奮はちょっとやそっとじゃ収まらず、バリバリ開発は続いていく。この日の twista 最終リリースは tf.9 です。

この日の更新内容

3/15

はい。この日の twista 最終リリースは tf.11 です。

この日の更新内容

3/16

この日は大した変更はやっておらず、強いて言うならスタイルの微調整や細かいバグ修正ばかりやっていました。この日の twista 最終リリースは tf.16 です。

3/17

リリースだけは大量に切ってる割には、この日の更新量は全体で見るとあまり多くないです。この日の twista 最終リリースは tf.29 です。

この日の更新内容

3/18

この日から最初で最後のドライブマイグレーションが行われました。この日の twista 最終リリースは tf.35 です。

この日の更新内容

3/19

オブジェクトストレージへ乗り換える作業をしていたので、バックエンド(見えない部分)の変更がいろいろありましたが、逆にフロントエンド(見える部分)の変更は一切ありません。よってこの日のリリースもありません。

この日の更新内容

3/20

ここからしばらくめぼしい更新はないです。この日の twista 最終リリースは tf.36 です。

3/21

この日の twista 最終リリースは tf.43 です。

3/22

この日の twista 最終リリースは tf.44 です。

3/23

この日の twista 最終リリースは tf.46 です。

3/24

この日の twista 最終リリースは tf.49 です。

3/25

3/26

この日の twista 最終リリースは tf.51 です。

3/27

この日の twista 最終リリースは tf.54 です。

3/28

この日の twista 最終リリースは tf.56 ですが、 tf.55 に差し戻されました

3/29

3/30

3/31

第二四半期活動ログ

長すぎるのでカット(要望あれば時間のあるときに書きます)

第三四半期活動ログ

長すぎるのでカット(二回目)

第四四半期活動ログ

長すぎるのでカット(三回目)

あとがき

盛大に遅刻してしまい、本当に申し訳ありませんでした。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment