SlideShare a Scribd company logo
インフラエンジニアのお仕事
~ daemontools から systemdに乗り換えた話 ~
Kansei CHIBA @KLab
$ whoami
千葉 幹正 (CHIBA Kansei)
● 仕事
○ KLab 株式会社 2011 年新卒入社
○ インフラマネジメント部 所属
○ AWS・GCP を使ったクラウド環境でのインフラ設計・構築・運用がメイン
● 趣味
○ ここ数年は、ロードバイク一本
● AWS, GCP, Golang, Systemd...
$ groups
KLab 株式会社
● くらぶ かぶしきがいしゃ
● 2000 年発足
● サイバード社の研究開発部署から独立した会社
● 元々は、(株) ケイ・ラボラトリー で、今もたまに ケイラボ と呼ばれる
● 技術大好きな人にとって、居心地の良い会社(だと思います)
○ インフラエンジニア絶賛募集中 (公には募集してないので声かけてください)
$ login
どんな人がこの会社のインフラエンジニアに向いているか?
● 入社初日
● しーてぃーおー
「一般ユーザあげるからさ、root をどうにかして奪っといてよ(^^)」
● あなた
「....この会社超絶ブラックだわorz」 => 向いていません
「....ヤベェ、おらワクワクしてきた」=> 向いています!
$ su -
一応説明しておくと・・・
● root 取れなくてもしーてぃーおーに食べられたりはしません
● root 取るために何を考えて行動を起こしたか、起こせそうか、そんなことを
考えることに少しでもテンション上がる方を募集中
● あくまで一例です。
この分野なら俺に語らせろ、これで仕事させろ
というあなたからのお声がけをお待ちしています
要約: 人足りてません。声かけてください(TT)
宣伝終わり
プロセスの管理手段
考え直してみました
プロセスの管理どうしてますか (Linux)
制御方法
● プロセスの起動・停止・再起動は何を使って管理している?
関連して...
● プロセスの起動判定基準
● プロセスが終了した際の挙動
● プロセスの標準出力・エラー出力の取り扱い
など
これまではどうしてきた?
環境
● Debian 7 (Wheezy)
● sysvinit + daemontools
プロセスの管理
● 原則、独自に導入したアプリケーションの管理は、daemontools にお任せ
● daemontools から、各種アプリケーション向けに用意したシェルを実行
daemontools
● 任意のプログラムをデーモン化
● 起動・停止・再起動用コマンドの提供
● 自動再起動
● プログラムの標準出力,エラー出力を、ログファイルへ
● KLab では、長い間使い続けている OSS
○ http://cr.yp.to/daemontools.html
sysvinit
● 説明不要の大御所 init (ですよね?
● 多くのデストリで systemd への置き換えが進められている状況
● daemontools 同様に KLab では長い間使い続けている
○ というか、構築当初はこれ以外選択肢がなかったはず
sysvinit + daemontools
● 以前
○ Apache + modphp の組み合わせで API を提供する構成が多数
○ インフラの構成は、各案件共通で、一つのシステムで相乗り
● 現在
○ Apache, PHP 以外の OSS も採用されるように
■ nginx, uwsgi
■ python, golang で作成された自社プログラム
● 扱うものは変わったが、大抵の案件はこの構成で運用できた
プロセス管理を再考するきっかけ
以下要件でデーモンを立ち上げる必要が出た
1. プロセス終了時に自動再起動したくない
2. プロセス終了時に通知を出して欲しい
3. プロセスの標準出力/エラーはログに出力したい
プロセス管理を再考するきっかけ
以下要件でデーモンを立ち上げる必要が出た
1. プロセス終了時に自動再起動したくない
-> daemontools では運用不可と判断 (頑張ればできそうだけど、容易でない)
2. プロセス終了時に通知を出して欲しい
-> 従来のやり方で対応可能(デーモン監視ツールの運用)
3. プロセスの標準出力/エラーはログに出力したい
-> 従来のやり方で対応可能(daemontools + multilog)
作ってみた
execmon
● 任意のプログラムをデーモン化・監視(通知)・標準(エラー)出力をログに落と
し込んでくれる便利なやつ
● fork(), execve(),dup2(),pipe() あたりを利用して、バックグラウンド実行 & ロ
グ出力
● $ execmon -n ${notifycmd} -p ${pathtopid} -- cmd
● 正直、daemonize のお作法一度実装しておきたかった面がでかい\(^o^)/
execmon
運用上の懸念
● インフラ担当者として、C を触れる人をアサインする必要がある
○ そうコストが高いものではないが、新しいメンバーが、execmon のために、C を触るの?
● プロセス管理手段が複数あるの少し気になる(できたらまとめたい)
○ sysvinit (daemontools の 始動, その他システム関連)
○ daemontools (自動再起動が必要なデーモンの管理)
○ execmon(自動再起動したくないデーモンの管理)
プロセス管理手段を改めて考え直す
1. execmon を部内の共通言語で書き直す?
a. 最近の部内の共通言語は、Go・Python あたり
i. 可能なら、コード見なくても済むようにしたい
2. やっぱり、sysvinit + daemontools だけで頑張ってみる?
a. sysvinit で管理するとしても、標準(エラー)出力はどうログに書き出そう?
b. daemontools だと、起動スクリプトの実装が若干煩雑に
i. あまりシンプルな方法を思いつかない
3. それ以外の選択肢を模索?
a. sysvinit, daemontools, execmon を綺麗にまとめられる奴がいたら...
i. せめて、daemontools と、execmon だけでも
● 直近、別案件で、触る機会のあった Debian 8 の systemd を第一候補に
systemd の採用検討
● プロセスの起動/停止/再起動/自動再起動
● プロセスの起動完了判定
● プロセス終了判定時の通知
● プロセスの標準出力の扱い
● https://www.freedesktop.org/software/systemd/man/
● http://0pointer.de/blog/projects/systemd.html
● Debian, Arch, RedHat の systemd に関わるドキュメントは、
日本語での情報提供もちらほらあるので、割とすんなり情報採集できた
s/sysvinit/systemd/
● execmon は、systemd ユニット で簡単に置き換え可と判断
○ 自動再起動しない (Restart=no (default))
○ 落ちたら通知を出す (OnFailure=alert.service)
○ プロセスの標準出力/エラーはログに出力 (Journald)
● sysvinit + daemontools の置き換え
○ こちらも同様に置き換えできそうな温度感
○ 独自に作ってきた起動処理の置き換えをどう systemd で対応するか
独自の起動フロー @ AWS EC2
一つのサーバイメージから様々な役割のサーバを立ち上げる仕組み
AWS EC2 インスタンス起動時に、タグに役割を登録することで、役割ごとに設定
されているプロセスが立ち上がる
検討初期
● 設定された役割に応じて、ステータスを変えるサービスユニットの配置
(役割判定ユニット)
● 役割ごとに、役割判定ユニットを配置して、各サービスユニットは適切な役
割ユニットを前提ユニットに指定
検討初期
● 役割判定ユニットの具体例
○ WEB という役割が設定されていれば、Active になる WEB-role.service
○ DB という役割が設定されていれば、Active になる DB-role.service
■ いずれも、当該役割の設定がなければ、Fail になる
● 役割判定ユニットを前提ユニットとするサービスユニットの挙動
○ 役割判定ユニットが、
■ Active であれば、起動する
■ Fail であれば、前提ユニットとの依存関係解決に失敗して、起動しない
(Fail ステータスへ落ちる)
OnFailure が使えない..
● 設定外のサービスユニットのステータスは、Fail となる
● 担当役割外のサービスユニットに、OnFailure が設定されていると、サーバ
起動時に、発火してしまう。(そして、アラートで埋もれる...)
● OnFailure 使うのやめる?
○ これまで、自前で実装してきたプロセス監視ツールを systemd にお任せできるのは大きい
○ OnFailure はプロセスが不意に落ちた時の通知などに使いたい
※ OnFailure: プロセスが落ちた時に任意のサービスユニットを呼び出す機能
original-init.service
役割判定 & 当該役割のターゲットユニット を動的に実行するプログラムを配置
実装にあたって
KLab インフラ内でのちょっとした運用ポリシー
● シェルスクリプト運用をできるだけ回避する
● サクッとかけて便利だけど、書く人によって品質の差が出やすい
● サクッと修正できるので、環境ごとの差異が生まれやすい
(あくまで、KLab インフラG 内での認識です)
systemd API の利用
● golang (1.10)
○ 言語はなんでもいいけど、とりあえず使える人が多いものを
● go-systemd
○ https://github.com/coreos/go-systemd
● systemd v232
○ version が古いと、使えない API がいくつかある
○ https://www.freedesktop.org/wiki/Software/systemd/dbus/
systemd API の利用
Sysvinit との大きな違い
● Systemd は、各種プロセスのステータスを握っている
● Systemd 経由で、プロセスの制御はもちろん、PID や、UID、GID などの情報
を取り出したりできる
● これらは、プロパティという形で Systemd から取得できる
サービスユニットの組み方
サービスユニット の組み方?
依存先のサービスユニットは、本当にアプリケーションレベルで機能しているか?
● 標準では、exec() した瞬間に起動完了とみなすため、アプリケーションが完
全に立ち上がっていなくても、起動完了と判断される (Type=simple)
● アプリケーションが本当に機能しているかを確認するサービスユニットの導
入 (テストユニット)
サービスユニット の組み方?
結局この組み方はやめた
● テストプログラムのメンテナンスコストが大きい
● サービスユニットと、テストユニットの挙動を同期させる必要がある
○ サービスユニットが停止しているのに、テストユニットは立ち上がったまま
○ サービスユニットの再起動に合わせて、テストユニットも再起動など
■ これらを満たすには、ユニットに一手間設定を加える必要があるが、複雑性が増す
サービスユニットの組み方?
ではどうしたか?
● 説明がややこしいのと、時間がないので懇親会で(笑
インフラ利用者への対応
(再) daemontools の置き換え
インフラ 管轄の sysvinit + daemontools な処理を systemd へ置き換えたが、実環
境では、インフラ利用者(アプリ開発者)向けに、専用の daemontools を立ち上げ
ている
● インフラ利用者と協議し、daemontools -> systemd (user) への乗り換えに
● cron についても、systemd timer への乗り換え
● 勿論、systemd API も、systemd (system) 同様に利用可
systemd --user
● 一般ユーザ向けの systemd プロセス
○ ps で見ると、systemd --user で見えるハズ
● systemctl や、ライブラリ類から、systemd (user) に接続する際は、
systemd の一部環境変数を修正する必要あり
● Debian 9 だとデフォルトで利用可能だが、標準設定では、
ログイン中のみ有効となるため注意
systemd --user
インフラとして、インフラ利用者へ協力したこと
● systemd (user) がユーザログアウト後も動作するように
○ Debian 9 なのですんなりだったけど、CentOS あたりだと...
● systemd の基本的な扱い方と概念の説明
○ service, timer, target ...
○ ユニットのサンプル提供
● systemd API 利用時のサンプル作成
○ 本案件では、Golang のコードを提供
s/sysvinit with daemontools/systemd/
● 一部案件では、sysvinit + daemontools + execmon 運用を、systemd 運用へ
乗り換え完了
● 一部のパッケージが、LSB script を取り込んでくるので、一応 sysvinit 互換
は残してある
最後に
systemd で幸せになれたのか
● まだ、systemd 各所で把握できていないものがあるため、これからも様々な
調査が必要。そういった意味では、それなりの学習コストを覚悟
● 取り扱うシェルスクリプト群が減った
● プログラマブルにプロセスを管理することができるようになった
● 通知が容易になった
等から、現時点では、幸せになりつつある(笑
systemd 管理者の方、ぜひお声がけください
● systemd の罠を踏んだ方
● systemd なんてアンインストールしてやる と言う方
● systemd よりこの init の方が断然いい!!1111
● systemd のこの機能使ってる?
ぜひお声がけください
最後の最後に
相談とか共有とか
(相談) configtest
service hogefuga configtest 相当のことをやりたい
● サービスユニットで管理しているアプリケーションの設定ファイルの syntax
check とか
● syntax check 専用のサービスユニットを作るぐらいしか方法を思いつかない
● どんな運用でカバーしている?
(相談) 認証ロジック
d-bus API, systemd API の認証ロジック
● getsockopt() + SO_PEERCRED ?
● 多分それしかないと思うんだけど、違ってたら誰か教えて
(共有) systemd API の入り口
private socket & dbus socket の使い分けをどう考えるか
● systemctl や、各種ライブラリを見ていると、private socket, dbus socket に
connect() しているのが見える。
自前のプログラムからつなぐ場合はどちらを使えばいい?
● 原則として、dbus socket を利用する
○ private socket は、dbus が使えないシーンで systemctl から利用される
○ 将来、破壊的な変更が入る可能性があるため、private socket の利用は非推奨
○ systemd API 利用時は、不必要に private socket を利用しない
詳しい話は、懇親会で!

More Related Content

PDF
Keycloak拡張入門
PDF
Test Yourself - テストを書くと何がどう変わるか
PDF
O/Rマッパーによるトラブルを未然に防ぐ
PPTX
Keycloak入門
PDF
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
PDF
FIDO認証によるパスワードレスログイン実装入門
PDF
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
PDF
実装して理解するLINE LoginとOpenID Connect入門
Keycloak拡張入門
Test Yourself - テストを書くと何がどう変わるか
O/Rマッパーによるトラブルを未然に防ぐ
Keycloak入門
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
FIDO認証によるパスワードレスログイン実装入門
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
実装して理解するLINE LoginとOpenID Connect入門

What's hot (20)

PDF
FridaによるAndroidアプリの動的解析とフッキングの基礎
PDF
マルチテナントのアプリケーション実装〜実践編〜
PDF
シリコンバレーの「何が」凄いのか
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
Docker Compose 徹底解説
PPTX
継続的にテスト可能な設計を考える
PDF
Dockerからcontainerdへの移行
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
PDF
DockerとPodmanの比較
PDF
分散システムの限界について知ろう
PDF
WebSocket / WebRTCの技術紹介
PPTX
DockerコンテナでGitを使う
PDF
KubernetesでRedisを使うときの選択肢
PDF
JDKの選択肢とサーバーサイドでの選び方
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
PDF
オブジェクト指向エクササイズのススメ
PDF
今なら間に合う分散型IDとEntra Verified ID
PPTX
世界一わかりやすいClean Architecture
FridaによるAndroidアプリの動的解析とフッキングの基礎
マルチテナントのアプリケーション実装〜実践編〜
シリコンバレーの「何が」凄いのか
マルチテナント化で知っておきたいデータベースのこと
Docker Compose 徹底解説
継続的にテスト可能な設計を考える
Dockerからcontainerdへの移行
ドメイン駆動設計 ( DDD ) をやってみよう
DockerとPodmanの比較
分散システムの限界について知ろう
WebSocket / WebRTCの技術紹介
DockerコンテナでGitを使う
KubernetesでRedisを使うときの選択肢
JDKの選択肢とサーバーサイドでの選び方
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
コンテナの作り方「Dockerは裏方で何をしているのか?」
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
オブジェクト指向エクササイズのススメ
今なら間に合う分散型IDとEntra Verified ID
世界一わかりやすいClean Architecture
Ad

Similar to インフラエンジニアのお仕事 ~ daemontools から systemdに乗り換えた話 ~ (20)

PPTX
Device Farm を使ったスマホアプリの自動テスト
PDF
Automation with SoftLayer and Zabbix
PDF
Eight meets AWS
PDF
Google Cloud Platformでソーシャルゲームを1本出してみた!
PDF
NCstudy 2.5
PDF
Mroongaを社内クラウド的なMySQLプラットフォームに標準搭載している話 #groonga
PDF
20121019 engineer startup_meeting
PPTX
JAWS-UG三都物語_企業でのAWS導入のエントリーポイント
PDF
おすすめインフラ! for スタートアップ
PPTX
My First Monitoring With Mackerel
PDF
Lineにおけるspring frameworkの活用
PPTX
Hueによる分析業務の改善事例
PPTX
誰にでもできるパフォーマンスチューニング
PDF
Eureka go 2015_12_12
PDF
TopSE.20121119
PDF
Osc2013 kansai@kyoto ZABBIX-JP クラウド環境監視効率化
PDF
使ってみた!ioMemoryで実現する噂のAtomic write!
 
PDF
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
PDF
Infrastructure as Codeの取り組みと改善
PDF
退屈なブラウザ作業をpuppeteerにやらせたいお話
Device Farm を使ったスマホアプリの自動テスト
Automation with SoftLayer and Zabbix
Eight meets AWS
Google Cloud Platformでソーシャルゲームを1本出してみた!
NCstudy 2.5
Mroongaを社内クラウド的なMySQLプラットフォームに標準搭載している話 #groonga
20121019 engineer startup_meeting
JAWS-UG三都物語_企業でのAWS導入のエントリーポイント
おすすめインフラ! for スタートアップ
My First Monitoring With Mackerel
Lineにおけるspring frameworkの活用
Hueによる分析業務の改善事例
誰にでもできるパフォーマンスチューニング
Eureka go 2015_12_12
TopSE.20121119
Osc2013 kansai@kyoto ZABBIX-JP クラウド環境監視効率化
使ってみた!ioMemoryで実現する噂のAtomic write!
 
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
Infrastructure as Codeの取り組みと改善
退屈なブラウザ作業をpuppeteerにやらせたいお話
Ad

More from KLab Inc. / Tech (20)

PDF
【公開用】モバイルオンラインゲーム開発を支える早く、安く、使いやすいサーバインフラ構築
PDF
モバイルオンラインゲームのアプリ外課金の導入と運用方法について
PDF
デバイスファーム 「AirLab」 による 自動QAテストの実績と機械学習が拓く次世代QAの可能性
PDF
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
PDF
大規模モバイルオンラインゲーム開発における チーム組成とワークフロー最適化
PDF
運用中の大規模オンラインゲームで 8年ぶりにPHPバージョンアップをした話
PDF
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
PDF
生成AIが切り拓く新しいゲームの創り方・遊び方
PDF
表も裏もすべて見せます! KLab謹製大規模オンラインゲームの リアルタイムチャットマイクロサービス
PDF
モバイルオンラインゲームでの大規模観戦とチート対策 〜自社製リアルタイム通信システム「WSNet2」の事例〜
PDF
他業界からゲーム業界へ転向したときの話
PDF
KLabのゲーム開発を支える開発環境
PDF
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
PDF
「リアルISUCON」としてのモバイルオンラインゲーム開発
PDF
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
PDF
モバイルアプリの高速で安定したビルドを支えるJenkins運用術
PDF
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
PPTX
KLabのチャットシステム インフラ変遷
PPTX
Ganglia のUIにGrafanaを追加する話
PPTX
KLabのインフラエンジニア 〜 こんな感じで働いてます 〜
【公開用】モバイルオンラインゲーム開発を支える早く、安く、使いやすいサーバインフラ構築
モバイルオンラインゲームのアプリ外課金の導入と運用方法について
デバイスファーム 「AirLab」 による 自動QAテストの実績と機械学習が拓く次世代QAの可能性
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
大規模モバイルオンラインゲーム開発における チーム組成とワークフロー最適化
運用中の大規模オンラインゲームで 8年ぶりにPHPバージョンアップをした話
AirLab導入でテストコストの大幅削減と品質向上! 数十台の端末を一斉に全自動テストできる社内DeviceFarmについてご紹介
生成AIが切り拓く新しいゲームの創り方・遊び方
表も裏もすべて見せます! KLab謹製大規模オンラインゲームの リアルタイムチャットマイクロサービス
モバイルオンラインゲームでの大規模観戦とチート対策 〜自社製リアルタイム通信システム「WSNet2」の事例〜
他業界からゲーム業界へ転向したときの話
KLabのゲーム開発を支える開発環境
ゲーム開発を知らない人にも分かるKLabのゲーム開発運営
「リアルISUCON」としてのモバイルオンラインゲーム開発
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
モバイルアプリの高速で安定したビルドを支えるJenkins運用術
『ラブライブ!スクールアイドルフェスティバル ALL STARS』を支えるビルドパイプライン 〜より安定したサービス提供を目指して〜
KLabのチャットシステム インフラ変遷
Ganglia のUIにGrafanaを追加する話
KLabのインフラエンジニア 〜 こんな感じで働いてます 〜

インフラエンジニアのお仕事 ~ daemontools から systemdに乗り換えた話 ~

Editor's Notes