MastodonをTime4VPSに移行してみた

# 挨拶

はじめまして、決済丼( [mstdn.kessai-otaku.club](https://mstdn.kessai-otaku.club) )のサバ缶をしてるpitoruです。

この記事は、 [分散SNS Advent Calendar 2019](https://adventar.org/calendars/4408) の8日目の記事になります。分散SNSとは、アドベントカレンダーとは？みたいな話は割愛させていただいて本題に入りましょう。

# 決済丼、海外に移設す

## 事の発端

事の発端は、複数ありまして、

- 雰囲気で立てたMastodonを一度再構築することで理解を完全なるものにしたい
- マネージドDBを使っておらず、バックアップ機構も備えていなかった当サーバーでは、冗長性が確保されていないために、せっかくのDB分離がヒューマンエラーによるAPPサーバーの全消し消失防止以外のメリットを享受できていない
- 運営費用を抑えたい

といった事があり、追々サーバーのマイグレーションをしたいと思っていました。そこで目をつけたのが、Time4VPS( [https://www.time4vps.com/](https://www.time4vps.com/) )です。

## Time4VPSとは

リトアニアのホスティング業者が運営するVPSです。こちらの価格表を見てもらえればわかるんですが、めちゃくちゃやすいです。一番安いプランでも、国内の1200円/月くらいするスペックでありながら、お値段は国内相場の約半額。コンテナ型に関しては更に1ユーロ安いという破格ぶり。

安すぎるし、大丈夫かと心配になるものの、リトアニアでは大手のホスティング業者らしいし、評判も上々(まあただ結構ネット広告にお金かけてそうなので、さくら記事みたいなのも多そうですが)。

ただし、やはりリトアニアという物理的距離が理由でレスポンスは遅延するので、どの程度まともに使えるかをテストするのも兼ねて、使ってみることにしました。最悪だめでも小規模のインスタンスなのでもとに戻せばいいし、割と使えるならコスト削減できるし、悪いことなし。ということでマイグレーションすることにしました。

### LinuxVPS

| Linux 2        | Linux 4       | Linux 8       | Linux 16       |
|:--------------:|:-------------:|:-------------:|:--------------:|
| CPU:1×2.6Ghz   | CPU:1×2.6Ghz  | CPU:2×2.6Ghz  | CPU:4×2.6Ghz   |
| RAM:2GB        | RAM:4GB       | RAM:8GB       | RAM:16GB       |
| Storage:20GB   | Storage:40GB  | Storage:80GB  |Storage:160GB   |
| Bandwidth:2TB  | Bandwidth:4TB | Bandwidth:8TB | Bandwidth:16TB |
| 3.99EUR/month  | 5.99EUR/month | 9.99EUR/month | 17.99EUR/month |

### ContainerVPS(OpenVZ Container)

| Linux 2        | Linux 4       | Linux 8       | Linux 16       |
|:--------------:|:-------------:|:-------------:|:--------------:|
| CPU:1 vCPU     | CPU:1 vCPU    | CPU:2 vCPU    | CPU:4 vCPU     |
| RAM:2GB        | RAM:4GB       | RAM:8GB       | RAM:16GB       |
| Storage:20GB   | Storage:40GB  | Storage:80GB  |Storage:160GB   |
| Bandwidth:2TB  | Bandwidth:4TB | Bandwidth:8TB | Bandwidth:16TB |
| 2.99EUR/month  | 3.99EUR/month | 5.99EUR/month | 9.99EUR/month  |

# 仕様策定・設計・移行

今回の目的は、今の環境と同じ性能を担保しつつ、運営コストを圧縮することが目的。

## 従来

![決済丼をTime4VPSに移行してみた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/5fa194e2-695b-819e-d0a8-bd6f63feef65.png)

従来、カゴヤVPSを使用していた。カゴヤVPSも国内の業者の割には、値段の割にRAMの搭載量が多く、コスパは良かったです。MastodonのRails APP・Redisと、DBを分けて、DBはAPPからローカルLANからアクセスする構成としていました。

## 第1次移行

![決済丼をTime4VPSに移行してみた (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/d2fde843-98b4-e6a9-fe95-c50ffb727558.png)

とりあえずテストや！！！と雑にDB以外をTime4VPSに移行。無事成功はしましたが・・・・

![決済丼をTime4VPSに移行してみた (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/0669ac1a-1fda-0a52-6983-df9e1609cb97.png)


日本からリトアニアにHTTPリクエストが送られ、リトアニアから日本にあるDBにクエリを送り、それをリトアニアで受け取って・・・

要するにDBとAPPがむちゃくちゃ離れてるせいで、レスポンス遅延が2000-3000msにまで膨れ上がりました。もちろんまともにMastodonなんてやってられません。翌々日にDBも移行しました。

## 第2次移行

![決済丼をTime4VPSに移行してみた (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/43e64e1f-f942-f692-8b23-592d6e54118a.png)

DBも別途Time4VPSにインスタンスを立てようか悩みましたが、分けたところで、APPサーバーと分けるメリットが、先述の通りAPPサーバー全損時のDB破損リスクが減るだけ・・・

「だけ」とはいえそれがいいという話なんですが、費用対効果が・・・でもマネージドDBはコストが嵩むのがなぁ・・・まあS3に日時DBバックアップを取ればヨシ！ということにしました。

## 最適化

![決済丼をTime4VPSに移行してみた (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/89117bf8-98f6-cd35-212b-30b05af38b58.png)

### DB自動バックアップ化

まずは、毎日cronでwasabiへpg_dump。成功するとadminアカウントがバックアップの成功可否を投稿してくれます。

<img width="332" alt="スクリーンショット 2019-12-08 13.55.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/9d33c7fa-6042-b263-4a5f-90f59922ab8b.png">

<img width="340" alt="スクリーンショット 2019-12-08 13.55.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/eef444f3-1192-a4de-e303-1131d7853922.png">

これはほんのちょっとした作業(多分権限周り？)をいじっただけで、ずっと失敗続きだったcronが成功して驚いてる様子です。

### CDNで遅延最小化

小さいインスタンスですが、場所が場所なので、CDNを通すことで日本国内に一部リソースが配置される事と通信経路が多少最適化されることを期待して、cloudflareを通しました。無料枠で運用しています。

### wasabiのホストリージョンを変更

この辺りの作業ついでにwasabiのリージョンも新規開設されたEUリージョンに移しました。CDNのキャッシュを有効に使いためにバケット名を変えたかったし、EUにもリージョンできたならそこでええやん、となったからです。

# 効果測定

国内のVPSをフル活用しており、かつリソースが比較的潤沢な理想的な環境で動作している不眠丼( [mstdn.nere9.help](mstdn.nere9.help) )と比較しました。とは言っても、条件が違いすぎるのであくまで参考値です。

## トゥート投稿

適当に投稿してみます(雑)

nere9
<img width="360" alt="スクリーンショット 2019-12-08 13.36.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/1dd3c255-d409-4506-2eaf-23f92dd5430e.png">

kessai-otaku
<img width="359" alt="スクリーンショット 2019-12-08 13.38.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/fea4560f-fa18-1c81-dfe5-3cdfc6553087.png">

Content Downloadがやはり3倍ほど掛かってますね。ただ、TTFBはむしろ3分の1というのが意外。やはりCDNの効果が効いているのでしょうか？

## 画像読み込み

同じ画像をクリックして拡大表示した時に読み込む画像の読み込みを見てみます。

nere9
<img width="395" alt="スクリーンショット 2019-12-08 13.52.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/2c08cf2e-7909-7d29-d1ab-85c8ca0c05da.png">

kessai-otaku
<img width="447" alt="スクリーンショット 2019-12-08 13.51.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104876/a4b28536-7cae-608f-d7b8-e978374c3d4c.png">

画像となると、やはりTTFBもContent Downloadも両方ともnere9の3倍以上掛かってますね。どうしてもCDNのキャッシュが効いていない画像はEU内でも画像データをやりとりして日本に転送されてくる以上、遅くなってしまいました。まあサムネイル程度の画像ならいうほど気にならないでしょうし、気にしないことにしましょう。

実験は成功だ！

# まとめ

- 分散SNS運営はインフラのお勉強になる上にマイTwitterサーバーを実質所有できてお得
- 運営費用が出せない？それはただの怠慢だ(暴言)
- お一人様インスタンスはいいぞ(といいつつ私はテーマ丼ですが)
- Time4VPSは雑にVM使うウェブサービス組んで置いておくにはむちゃくちゃ便利だぞ

ということで、Mastodon以外でも積極的に活用したいですね。