GitLabのアーキテクチャの概要
単体のアプリケーションで成り立っているミドルウェアではなく複数の内部アプリケーションが存在し各ミドルウェアが連携しあって処理を行っています。
GitLabで利用されているミドルウェア
主要ミドルウェア
GitLabは下記5つのソフトウェアが主要ミドルウェアになります。
- Nginx
- Unicorn
- PostgreSQL
- Sidekiq
- Redis
Nginx
GitLabのWebインターフェイスです。「GitLab-Workhouse」や「GitLab Pages」にProxyPass設定を行うことでリクエスト別にルーティングを行っています。
Unicorn
Railsで作成されたアプリを動かすためのアプリケーションサーバです。主要アプリケーションの「GitLab-Rails」が稼働しています。
PostgreSQL
GitLabで使用するデータの全てが格納されています。もちろん、内部に含まれているPostgreSQLの利用は必須ではなく外部のPostgreSQLやMySQL等を利用する事も可能です。
Sidekiq
複数のタスクを非同期に実行できるRedisの非同期処理ライブラリです。下記のような機能を実装してくれます。
- マルチスレッドによるメモリの有効活用
- リトライ処理
- メール処理やバッチ処理等の重い処理の負荷分散
Redis
メモリ上にデータを保存できるKeyValueストアです。下記のようなデータが保存されます。
- Sidekiqのタスク情報
- ログインユーザーのセッション情報
その他ミドルウェア
他には下記のようなミドルウェアも含まれています。
- Promethus
- Logrotate
GitLabのアプリケーション
主要アプリケーション
GitLab-Rails
ユーザーから要求されたタスク処理を行っているGitLabのコアアプリケーションです。基本はモノシリックですが徐々に機能を外部化してきておりパフォーマンスも改善されてきています。
下記のAPIも提供しています。
- Redisに入っているセッション情報の確認
- Sidekiqへのタスクの作成
- データベースへのデータの出し入れ
補完アプリケーション
- GitLab-Shell
- GitLab-Workhorse
- Gitaly
GitLab-Shell
SSH経由でGitコマンドを受け付けてGit操作を行うためのアプリケーションです。
GitLab-Workhorse
GitLab-RailsへのHTTPリクエストを一旦全てこれが受け付けています。リクエストがGitLab-Rails宛かGit本体宛なのかを判断して転送するGo言語で記述されたリバースプロキシになります。元々はNginxやGitLab-Railsで行っていた処理を設定の負荷分散や負荷を軽減するために作られたアプリケーションになります。
Gitaly
ストレージ(実ディスク)に保存されたGitリポジトリへのアクセス処理を行います。元々GitLab-Shellの中にこの機能は含まれていましたがRedis連携のキャッシュ機能や、gRPCを利用したI/O最適化の用途で使われていたりします。
この記事へのコメントはありません。