そんな今日この頃でして、、、

コード書いたり映画みたり。努力は苦手だから「楽しいこと」を探していきたい。

Dockerを本番投入した話

このまま忘れてしまうのも勿体無いので記録に残しておこうかなと。

blue1st.hateblo.jp

技術系のネタは最近は別ブログの方でやってたけど、具体的なコードなんかは無いので今回はこっちで。

blue1st-tech.hateblo.jp

思い出した・思いついたら随時追記していく予定。


概要

フィーチャーフォンの時代からのサービスで、 無茶な拡張や教育不足や委託によるアレな開発状況によって、 コードも環境も技術的負債が山盛りの状態だった。

幸いにしてサーバを移設する機会に恵まれたので、 状況を改善するべく検討を進めた。

解決したかった問題

様々な部分において、環境ごとの差異が看過できない状態になっていた。

サーバによってインストールされているランタイムやモジュールのバージョンが異なることもあれば、 パスが異なることをコードにベタに記述してバージョン管理しないことにより対処している部分があったり、 そもそも環境によって同名のスクリプトの内容が書き換えられていたり。

バージョン管理ももはや正しく機能していなくて、必要なファイルだけ明示的に本番環境に上げるような綱渡りな運用になっていた。

おそらくリアルタイムでは、「急いで対応しなきゃいけないから仕方ない、後でちゃんと揃えよう」とかなんとか考えていたのかもしれないが、 往々にしてそういう意識は長続きしないもの。

結果として、どのサーバ環境での挙動が「正」なのかも分からない状態となっていた。

こうなってくると新たに環境を構築するのも困難だし、 リリース前の検証作業も不確実なものとなってしまう。

Dockerの導入

もちろんそれぞれ個別には対処法はあるにはあるんだけど、 それを全て長期的に完全に徹底していくことは困難なように思えた。

個人的には「気をつければ」とか「ちゃんと確認すれば」とかいった前提で成り立っているような運用というのは即ち無用にリソースを消費している状態なので、 今問題ないからといって看過すべきではなくすぐにでも改善すべきだと思っている。

そういったストレスを抱えながら開発運用していくよりも、 Dockerを用いた「可搬性ある形」を前提として使い方を習得してもらうほうが現実的で長期的なメリットもあると考え導入に踏み切ることにした。

(とはいえ、僕が使いたかったから理由を揃えて押し切ったという側面はちょっとある。 退社時期的にちょっと申し訳ない気もしている。)


続きを読む

Consulに自動でDockerコンテナのサービスを登録する

ここのところすっかりマイ・フェイバリット・ツールなConsulとDockerの話題。

blue1st.hateblo.jp


別件を色々調べてたんだけど、なんだか便利なものを見つけたので。

Registrator

大雑把に言えば、ホスト上で起動しているコンテナの情報を読み取って、 うまい感じにConsulのAPIを通じてサービスを登録してくれるツール。

続きを読む

Consulを導入する

www.consul.io

DNS、サービス検知、KVS、イベント検知、Webフロントエンド・・・etc

Consulには単一バイナリながら様々な機能が含まれている。

多機能さゆえにConsulなるものが何であるかを一口で説明するのはなかなか骨が折れるのだが、 実際に手を動かしてそれらを使ってみると「系としての運用を効率化してくれるツール」としてそれらがまとめられていることが分かる。

サービス検知とそれに紐付いたDNS制御によりホストの増減に自動で対応するなんてことも考えられるし、 Consul-Templateと組み合わせてWebUIをさながらミドルウェアの集中管理画面として使用することも可能だ。

システムの中心に据えることで運用にまつわる諸々の面倒を無くしてくれる便利なツールなのだ。


Consulは本来は多数のサーバを運用するような場面で真価を発揮するツールではあるが、 単一サーバの運用においても役立つ要素はある。

単純にサービスの使用ポートと死活状態が一括で確認できるだけでもありがたいし、 先にも述べたミドルウェアの管理画面として活用するという面でも利用価値はあると思う。

(個人的には1コンテナ1機能主義に反するけど、Dockerのコンテナ内にConsulを収めて連携させるみたいな活用法もあるしね。)

そんなわけで自宅サーバ(Ubuntu 16.04)に導入してみた。

続きを読む

Dockerのプライベートリポジトリを立てる

またDockerまわりを色々いじる機会があったのでメモ。

ホスト一台だけで使うだけならともかく複数台ホストがある環境で運用しようという場合、 プライベートリポジトリを立ててそこから各ホストにイメージを配信したくなる。

幸いにしてプライベートリポジトリ自体がイメージとして配布されており、 鍵を用意して適切に設定することにより簡単にプライベートリポジトリを立てることができる。

docs.docker.com

続きを読む

MySQLのlast_insert_id()は「最後にインサートしたレコードのID」じゃなかった

今日たまたま引っかかってへ~っと思ったネタ。

ごく単純に「インサートしたレコードのIDを取りたいならlast_insert_id()使えば良い」と認識していたので、ちょっと驚いたというか勉強になったというか。

↓こんなテーブルを考える。

mysql> desc tbl;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| value | text    | YES  |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
続きを読む

書評「Webエンジニアのためのデータベース技術[実践]入門」

Web系ベンチャー、ソシャゲSAPと実務経験をしていく中で、データベース周りに課題を感じる機会が少なからずある。

データベース周りにももう少し知識付けないといかんなと思い本書を読んでみた。

(正確にはだいぶ前に購入したのだが、なかなか手を付けられてなかった)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

  • 作者: 松信嘉範
  • 出版社/メーカー: 技術評論社
  • 発売日: 2012/03/09
  • メディア: 単行本(ソフトカバー)
  • 購入: 20人 クリック: 486回
  • この商品を含むブログを見る




本書の一章でも述べられていることだが、学生の頃にデータベースに興味を持つことは難しい。

いわゆるプログラミングとは違って単体で何か動くものが作れるわけでもなく、また授業の演習や小規模な卒研レベルではそれほどきっちりしたテーブル設計をしなくてもなんとか動いてしまうため、データベースの重要度を実感できる機会はまずない。


どうしても新しい言語だったりフレームワークの使い方といった、派手さのある分野に目が行きがちになってしまう。


しかし、実際の業務である程度大きな規模のデータを扱うようになってくると、否が応にもデータベースの知識が必要となってくる。

正しくインデックスを用いなければまともに動かなくなるし、適切なデータモデリングを行わなければ実装時には問題無くとも後々に使いづらくなってしまう。





さて、本書はどのような内容かというと、データベースがなぜ必要かや現在主流のRDBMSがどのように動いているかといった概要から、大規模なサービスでは必ず目にすることになるShardingやReplicationについてもどのようなものかまで平易な文章で述べられている。

いわゆる具体的な問題解決のためのTips集ではないが、課題を解決するためにはどのようなことに注視すべきか理解するのに役立つ内容となっている。



理想は学生の頃にプログラミングを学ぶのと並行してこのような書籍を読んでおくと良いと思うが、社会人数年目の新人がデータベースを意識してシステムを組むため、またなぜ今そのような構成になっているか理解するために読むのにも調度良いと思う。


目次
第1章 データベースがないと何が困るのか
第2章 インデックスで高速アクセスを実現する
第3章 テーブル設計とリレーション
第4章 SQL文の特徴とその使いこなし方
第5章 可用性とデータの複製
第6章 トランザクションと整合性・耐障害性
第7章 ストレージ技術の変遷とデータベースへの影響
第8章 データベース運用技術の勘どころ
第9章 MySQLに学ぶデータベース管理
第10章 MySQLのソースコードを追ってみよう
第11章 データベース技術の現在と未来
第12章 ビッグデータの時代のデータベース設計


Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

  • 作者: 松信嘉範
  • 出版社/メーカー: 技術評論社
  • 発売日: 2012/03/09
  • メディア: 単行本(ソフトカバー)
  • 購入: 20人 クリック: 486回
  • この商品を含むブログを見る

MySQLのエラーが出続けて困った話

いつまでもトップ記事がオタク語りなのもなんなので、たまにはエンジニアっぽい備忘録でも。

ミドルウェアは、知らないとそもそも取っ掛かりが無くて調べることすらおぼつかないとこが多いから苦手だったりする。

特に僕なんかは英語苦手なので、日本語のドキュメントが少ないレアな奴だったりすると本当に死ねる。


そんなわけで週末にあったMySQLのトラブルのお話。



事象
なんだかDBサーバのIOが異常に上がってる!
よくよく見ると、MySQLのエラーログがガンガン肥大化して行ってる!!


ログの内容を確認してみると・・・
なんかの処理でデッドロックが発生したっぽい!!!


じゃあそのプロセス殺せばいいんじゃね?
と思ってshow processlist;してみても該当のはとっくに死んでそう











実は・・・
innodb_monitorとinnodb_lock_monitorなるエラーを記録しておくテーブルがあって、どうもこいつらがある限りガンガンエラーログが出力され続けるらしい↓
日々の覚書: InnoDB Monitorの仲間たち(InnoDBエンジン本体のアレ)
MySQL リファレンスマニュアル :: 7.5.10.1 SHOW INNODB STATUS と InnoDB モニタ



対策は
とりあえずエラー内容を確認したらちゃっちゃと上記2つをdrop tableすることでエラーログの出力は止まる。



便利機能なんだろうけど、知らなかったので焦った・・・




ーーーーー余談ーーーーー
前にハンターハンターの念能力をメタファーにしてエンジニアの技能について語っている記事があって面白いなぁとおもったのだけれども、実際僕みたいなアプリ寄りのエンジニアって「えいやっ!」とコード組んで作るのは好きでも、ミドルウェアを緻密に設定するのは苦手だったりすることが多いんじゃないかと思う。

しかしそうは言ってもミドルウェアによって最適解は変わるし、何より自力で作る際には否が応でも触る必要がでてくる。


そんなこんなで最近勉強しているのがchef↓

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code


Rubyやjsonのファイルとしてミドルウェアの構成を記述することで、コーディングをするようにサーバをセッティングできる。



というかここでもRubyが出てくるあたり、教養として押さえておかなきゃいけない言語な感すら出てきたな。