週刊Railsウォッチ(20190611-2/2後編)Dockerfileベストプラクティス、DBの冗長化、jQueryとの付き合い方ほか

こんにちは、hachi8833です。6月なのに寒いです。 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください 今回も6/6の第11回公開つっつき会の続きです。 ⚓クラウド/コンテナ/インフラ/Linux/Serverless ⚓Dockerfileを書くためのベストプラクティス解説編 Dockerfile を書くためのベストプラクティス解説編 from Masahito Zembutsu つっつきボイス:「BPSの社内Slackに貼っていただいたヤツです」「Zembutsuさんのこのスライドいいですよね〜😋: これ見たことあります?」「いいえまだ😅」「Zembutsuさんはまだお会いしたことはないんですが、Docker方面でとてもいい資料を作る方なので、Dockerやるときにはまずこのスライドを見るのがいいと思います😍」「作図もほんとに丁寧ですよね😋」 「Dockerって『とりあえず動かした』系の記事があまりにネットに多いので、ある程度Dockerに習熟しておかないと正しい情報を見分けられないんですよね😭」「うんうん」「Zembutsuさんの資料なら全幅の信頼をおいても大丈夫です👍」「しかも上のスライドは一次情報↓にみっちり沿っていてさらにありがたいです😂」 一次資料: Best practices for writing Dockerfiles | Docker Documentation ⚓はじめてのDocker 「ところで、お集まりの皆さんはDockerを本番環境でお使いですか?お、まだ少ないかな😅」「では開発環境では?割といらっしゃいますね☺️」「まだ導入してない方は?思ったよりいますね😳」「ありがとうございます: Dockerの導入は会社やプロジェクトにもよりますよね☺️」 「Dockerを導入しようと思うと、誰かひとりDockerメンテナーというかDockerに詳しい人がいないと大変なんですよね😭」「そうそうっ😭」「弊社はたまたま自分ともうひとりDockerに強い人がいて何とかなりました☺️」 「最近の新規案件なんかはだいたいDockerでやってますし、Dockerにしておくと新メンバーが加わったときにすぐ開発に参加できるのがとってもありがたいです😋」「うんうん」「なのでDockerはおすすめ❤️」 「実際、Dockerなしだと環境を揃えるのがホント大変😅: 『PostgreSQL動かないんですけど』というので見てみたらマイナーバージョンが違ってたとか、もうありとあらゆることが起きますし😇」「イラッとくるヤツですね😤」 「Dockerを初めてやるときに大変なのが、どこから学び始めたらいいのかがわかりにくいところなんですよ😆」「たしかに〜」「最初はいきなり自分でやるより、誰か上手な人が作ってくれたDockerfileを元にいろいろやってみるといいと思います☺️」 ⚓Linuxアプリケーションのパフォーマンス 元記事: Linux Applications Performance: Introduction - Unixism 同記事より つっつきボイス:「全7回のかなり長い記事です」「どうやら自分でzerohttpdというWebサーバー↓をC言語で書いて、実装をいろいろ変えながらLinux上でどんなふうに変わるかを見るということね☺️」「そんな感じですね」 リポジトリ: shuveb/zerohttpd: A simple HTTP server written from scratch as a teaching tool to teach Unix network program architectures 「この記事でやってるのは、あくまで自分で作ったHTTPサーバーの実装を変えながら得た結果だからな〜🤔: Nginxみたいに世の中にあるWebサーバーは最適化がもう極まっているから、実装を変えたときにどう変わるかはこの記事である程度わかるとしても、それを実際のWebサーバーに適用できるかと言うとたぶんそうはならないと思います😆」「あ〜それもそうか😳、この人にとっての結果というか」「というより、この人の実装にとっての結果ですね☺️」 「NginxクラスのWebサーバーなら、Linuxのページキャッシュにきれいに乗るようにアラインしたりとか極まった最適化をきっとやってると思うんですけど😆、特にC言語でマルチスレッド化したような手作りWebサーバーでやったときとは結果が同じになるとは考えにくいかも🧐」「ふぅ〜む」「なので参考にはなると思いますが、これだけを見て世の中のWebサーバーのパフォーマンスを考えるのはどうかなと自分は思います☺️」 「この記事を書いた人がめっちゃ勉強して熱心に調べたという証にはなるかもですね」「お、そういう意味では大学院クラスで出される課題っぽいところはあるかも😆」「あ〜」「情報系の大学院あたりの、OSのパフォーマンスをどうやって上げるかとか、どういう並列化方式があるか、みたいな授業で、気合の入った先生が出しそうな課題: で学生が半分ぐらい脱落すると😆」「😆」「😆」「米国だと学部生向けの授業でもこういうのをやってたりしますね🧐」 「結果を見るとepollとかいうのがよさげですね」「epollって誰かご存知?」「これがそれっぽいですね↓」「記事の第7回もepollで、eはどうやらイベントのeみたい」「epoll知らんけど😆、詳しく知りたい人はきっとman epollで出てくると思います: LinuxのシステムコールはPOSIXを拡張したものが多いので、こういう新しいシステムコールを使うと速くなってくれるかも?」 参考: Linux Programming、epollの話 - mixi engineer blog ⚓DB ⚓pg_auto_failover: Citus DataのPostgreSQL extension(Postgres Weeklyより) 元記事: Introducing pg_auto_failover: A high availability and automated failover Postgres extension リポジトリ: citusdata/pg_auto_failover: Postgres extension and service for automated failover and high-availability 同リポジトリより つっつきボイス:「TechRachoでも記事を翻訳させていただいたことのあるCitus Dataの記事です」「データベースのfailoverってもう自分で考えたくないんですけど🤣」「🤣」 PostgreSQLの機能と便利技トップ10(2016年版)(翻訳) ⚓自前のデータベース冗長化は後がコワい 「ところでデータベースの冗長化環境をやってらっしゃる方は?お、少ないですね」「たとえばAWS RDSならマルチアベイラビリティゾーンで起動すれば冗長化できますけど?」「それならどっかで使ってたかも😅」 参考: Amazon RDS(マネージドリレーショナルデータベース)| AWS 「ついでに、自分でセルフホスティング環境のマスター/スレーブ構成たクラスタ構成のデータベースを立ち上げたことある方は?」「あります😅」「おぉ、障害対応もやりました?😆」「keep aliveが両方見ちゃったりすると大変でした😇」「そうそう〜🤣: MySQLのマスター/スレーブ構成は止まるとマジ地獄見るので二度とやりたくないですっ😭」 「この場合『keep aliveが両方を見る』ってどういうことでしょうか?」「サーバーのIPアドレスを切り替えるときに、ちゃんと手順どおりにやらないとどっちがどっちだかわからなくなっちゃったりします😇」 「そうそう、こういうのっていろんな組み合わせがあって、マスター/スレーブの場合だとたとえばスレーブがマスターを見失うと勝手に昇格したりしますし、HA(High Availability)クラスタというのになるとIPアドレスを付け替えたりするんですけど、そこの仕組みが誤作動すると同じIPアドレスのサーバーがネットワーク上に2つ出現してものすごいことが起こったりします」「ぎょえ〜🥶」 参考: HAクラスタとは何? Weblio辞書 「しかもそのすごいことの起こり方がまた面倒くさくて、ネットワーク上に同じIPアドレスが2つ出現したときの挙動はL2スイッチによっても異なるんですよ😭」「それありそう…😅」「同じL2スイッチの下にあるノードは、L2スイッチ内のバッファがflushされるまではおそらく維持されるんですが、そのバッファが何かのタイミングでflushされると死ぬとか、L2スイッチ自体が冗長化されているとさらにややこしいことになるなんてのがあったりします🤣」「🤣」 参考: L2スイッチとは何? Weblio辞書 追記(2019/06/12): L2スイッチでの挙動には、ホスト側のARPテーブルなども影響します。 参考: Address Resolution Protocol - Wikipedia 「とにかくデータベースの冗長化は自分でやりたくないことの筆頭ですよ😭」「ましてやトラブルシューティングは勘弁😇」「Citus Dataの記事の中までは見てませんが、きっとその辺をよしなにやってくれるんでしょう😆」「Citus Dataはその部分をサービスする会社なんですね☺️」 ⚓データベースのクラスタとマスター/スレーブの違い 「ついでにデータベースのクラスタについて軽く解説してもいいでしょうか?」「お願いしま〜す」 「一般的にクラスタと呼ばれているのはマルチマスター構成です: 一方、マスター/スレーブと呼ばれている構成の多くはマスターが1台で、そのマスターがスレーブに対して同期するようになっています」「ふむふむ」「マスター/スレーブの場合マスターが単一障害点(SPOF)になっていて、マスターが落ちた場合にスレーブが昇格するなどは行いますが、あくまでマスターは1つになります」 「そういえば最近はポリコレがらみでマスター/スレーブはよろしくないなんて言われたりして😆」「主人と奴隷😆」「なので最近だとスレーブはレプリカ(replica)と言いますね☺️」 「AWS Auroraなんかだとマスターが3台にレプリカが3台だったりしますけど、マスターが複数なのでクラスタと呼ばれます🧐」 参考: Amazon Aurora DB クラスター - Amazon Aurora 「当然ながらクラスタの方が排他制御とかがずっと複雑になるので死ぬほど大変です😭: マスター/スレーブで障害が起きた場合最悪でもスレーブを全部殺してマスターからスレーブを作り直せば復帰できるんですけど、クラスタが壊れると本気でヤバイ😇」「おわ〜😅」「自分で直せる気がしません😅」「クラスタが壊れたときのヤバさを考えると、PostgreSQLのクラスタなんかは自分たちでやるより買う方がいいと思います💰: 別にオープンソースを信用しないということではなくて、単にクラスタで障害が起きたときに自分たちでトラシューするのはつらすぎるので😅」「わかります~😅」 参考: MicrosoftがPostgreSQLデータベースを加速するCitus Dataを買収、顧客をAzure化か | TechCrunch Japan サイト: Citus Data | Worry-free Postgres. Built to scale out. citusdata.comより 「そういえばCitus DataはMicrosoftの傘下に入りましたね↑」「ぽすぐれはこのCitusが強くて、MySQLだとPerconaが強いですね💪: PerconaはMySQLを独自forkしてチューニングを施していて、オープンソース版もあります😋」 … Continue reading 週刊Railsウォッチ(20190611-2/2後編)Dockerfileベストプラクティス、DBの冗長化、jQueryとの付き合い方ほか