💡

private-isuのメンテナンスよもやま話

2023/08/26に公開

ISUCON 夏祭り 2023 発表資料

自己紹介

ISUCON本書影

private-isuの歴史

サポート情報

言語

  • サポート済:Ruby(オリジナル実装)、Go、PHP
  • 放置中:Node.js(リポジトリ内はJavaScript、最近のISUCONではTypeScriptが主流)

環境

  • VM構築:Ansible
    • provisioning済みのAMIも提供
  • 動作確認:Docker Compose

時代の変遷への追従

  • Ubuntu LTSの新バージョン
  • Go, Ruby, PHPのアップデート
  • ライブラリのバージョンアップ

Ubuntu 22.04 対応

  • ISUCON本はUbuntu 20.04ベースだが、最新のLTSは22.04
    • 20.04と22.04でISUCON本上の手順の変更はなし
    • 22.04のAMIを提供
  • PHPバージョン差異:
    • Ubuntu 20.04: PHP 7.4
    • Ubuntu 22.04: PHP 8.1
  • Ubuntu 22.04ではホームディレクトリの権限変更
    • デフォルト権限が0700になり、PHP実装が動かなくなったので対応

PHP実装の対応

Ruby実装のトラブルと対処

  • rackの変更で、ベンチマーカーが利用するGoのhttp.Clientの自動リダイレクトが不具合を引き起こすように
  • Goのhttp.ClientのRedirectはCheckRedirectでカスタマイズ可能
    • だが、ISUCON本で紹介している負荷試験ツールk6ではカスタマイズ方法がない
  • rack middlewareでGET時のContent-Typeを削除
class DropContentTypeFromGet
  def initialize(app)
    @app = app
  end

  def call(env)
    env.delete "CONTENT_TYPE" if env.fetch('REQUEST_METHOD') == 'GET'
    @app.call(env)
  end
end

use DropContentTypeFromGet

Go実装の変更

  • gojiを使用していると、private-isuのURL形式である/@user_nameを実現できないため、独自実装
    • chiを使用するとこの問題を回避でき、さらにchiの方が現在人気があるため、chiへの移行を選択
    • ISUCON本ではgojiについての言及はなく、patchもそのまま適用可能であったため、変更をmerge済み
    • https://github.com/catatsuy/private-isu/pull/293/files
  • gorilla/sessionsが一時的にメンテナンスを停止していたが、再度活動を再開
    • しかし、新しいタグのリリースはまだ行われておらず、現在メーリングリストでその点について質問中

renovateの活用

  • renovateを導入することで、ライブラリの更新やDocker imageの更新を自動化できる
  • メンテナンスで課題となっていたのは、Ansible上のRubyとGoのバージョンアップ
  • renovate.jsonに設定を記述することで、スムーズに更新を行うことができるように
  "regexManagers": [
    {
      "fileMatch": [
        "provisioning/image/ansible/04_xbuild.yml"
      ],
      "matchStrings": [
        "datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\n.*?-install (?<currentValue>[0-9.]*).*\n"
      ]
    },
    {
      "fileMatch": [
        "provisioning/bench/ansible/02_golang.yml"
      ],
      "datasourceTemplate": "golang-version",
      "depNameTemplate": "golang",
      "matchStrings": [
        "go(?<currentValue>[0-9]*.[0-9]*.[0-9]*)"
      ]
    }
  ],
# datasource=golang-version depName=golang

現状できていないこと

  • CI
    • ベンチマーカーをE2Eテストとして利用するためには、初期データ(結構大きい)をMySQLに入れる必要がある
  • AMI自動作成
    • やることはAnsibleの実行とREADMEの変更
    • AMIは1年で消えるので定期的に作成する必要がある
    • 「できたらいいな」というレベル

最後に

  • メンテナンスは大変だが、業界のため続けるつもり
    • 当初の予想を超える展開に驚き😂
  • 多くの環境での対応は、皆さんの期待に応えるため
    • 活用したら教えてくれるとうれしいです
  • メンテナンス協力者を募集中!

Discussion