読者です 読者をやめる 読者になる 読者になる

Mercari Engineering Blog

メルカリのエンジニアブログです。技術情報を日々発信していきます。

WEB+DB PRESS Vol.94にてメルカリSREチームによる連載第3回が掲載されました

SREチームの@siroken3です。WEB+DB PRESSの連載第3回が 本日発売の Vol.94に掲載されました。

gihyo.jp

前回に引き続き @siroken3 が執筆いたしました。

今回はデータベースのバックアップと題して、メルカリの運用をベースにしてMySQLのバックアップについて執筆しました。バックアップの考え方から始まり、採用しているツールについて動作の仕組みも併せて詳細に解説させていただきました。またメルカリでのバックアップ事例に関しても紹介しています。

特にMySQLを使った大量のデータを扱うサービスにおいて、如何にシステムを稼働させつつ、データの整合性を担保してバックアップを実施するかについて力を入れて解説したつもりです。連載第3回もぜひご覧いただければ幸いです。

f:id:siroken3:20160823143608j:plain

nginxによるTCPロードバランサー

SREチームの@cubicdaiyaです。今回はnginxによるTCPレイヤーでのロードバランスについて解説します。

ロードバランサーとしてのnginx

nginxはHTTPやTCP、UDP等の複数のレイヤーでロードバランサーとして稼働させることができます。(TCPロードバランサーは1.9.0以降、UDPロードバランサーは1.9.13以降で利用可能です)

また、ngx_http_ssl_modulengx_stream_ssl_module を利用することでそれぞれのレイヤーでTLSを有効化することも可能です。

TCPロードバランサー用のモジュールを有効にする

HTTPレイヤーでロードバランスするためのモジュールはデフォルトで組み込まれますが、TCP(とUDP)レイヤーでロードバランスするにはnginxのconfigureスクリプトに--with-stream(あるいは --with-stream=dynamic)を付与してビルドする必要があります。

cd nginx-1.11.3
./configure --with-stream
make
sudo make install

以下はTCPロードバランサー向けに明示的に組込む必要があるモジュールの一覧です。

$ ./configure --help | grep with-stream         
  --with-stream                      enable TCP/UDP proxy module
  --with-stream=dynamic              enable dynamic TCP/UDP proxy module
  --with-stream_ssl_module           enable ngx_stream_ssl_module
  --with-stream_geoip_module         enable ngx_stream_geoip_module
  --with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module

nginxの標準モジュールで明示的に組み込む必要があるモジュールについてはこのように --with- で始まるオプションが用意されています。一方デフォルトで組み込まれるモジュールについては --without- で始まるオプションが用意されており、特定のモジュールを無効する際に指定します。

# ngx_stream_geo_moduleとngx_stream_map_moduleを無効にする
./configure \
  --with-stream \
  --without-stream_geo_module \
  --without-stream_map_module
続きを読む

DockerとMakeを利用したRPMパッケージのビルド環境

f:id:cubicdaiya:20160812131620p:plain

SREチームの@cubicdaiyaです。今回はDockerとMakeを利用したメルカリの自作RPMパッケージのビルド環境について紹介します。

メルカリの自作RPMパッケージ事情とVagrant、そしてDocker

メルカリの開発およびプロダクション環境では現在CentOS6と7を利用しており、随時CentOS7へ移行中です。そのため、自作RPMパッケージをビルドする際はCentOS6と7向けにそれぞれビルドしています。ビルドしたパッケージはyumリポジトリサーバにアップロードした後、必要に応じてyumでインストール、Ansibleのplaybook化を行います。

RPMパッケージの作成はSREチームのメンバーが行っており、各自のローカルマシン上において make {パッケージ名} を実行するだけでCentOS6と7向けのRPMパッケージをビルドできる環境をDockerで構築しています。

make nginx       # nginxのRPMパッケージをビルド
make nginx-build # nginx-buildのRPMパッケージをビルド
make gaurun      # gaurunのRPMパッケージをビルド
make slackboard  # slackboardのRPMパッケージをビルド
make cachectl    # cachectlのRPMパッケージをビルド
(etc)

これの良いところはMac上でもCentOS向けにRPMパッケージを作成できる点です。当初はVagrantを利用していましたが、最近Dockerを利用するように変更しました。Vagrant上でビルドするのと比べるとパフォーマンスが良く、特にコンテナの起動や破棄が高速なのが大きなメリットです。また、Cプログラムのコンパイルが以前よりも早く終わるようになりました。(もっとも最近はGoプログラムのRPMパッケージが多いのですが)

続きを読む

PHPカンファレンス関西2016で基調講演してきました

サーバーサイドエンジニアの@Hirakuです。 2016年7月16日(土)、 PHPカンファレンス関西2016 にて基調講演をしてきましたので、その報告と補足をします。

トーク動画は後日公開されると聞いていますので、口頭で補足した内容などはそちらをご期待ください。

内容について

講演内容は今年2月に公開した記事 光遅い問題を克服してcomposerを10倍速くした話 - Mercari Engineering Blog をもう少し詳しく解説したものです。

基調講演ということだったので、Composer自体の細かい話をするよりも、なぜこんなことに時間を費やしてきたのか、自分より若いエンジニアに何か伝えるものがないか、というようなことを考えて、エモ全開の内容になりました。

改善活動だけを話すとComposerを貶す内容になってしまいます。詳しい事情も知らない人にDISの口実を与えるのも嫌だったので、そこはComposerは偉業なのだ、という内容も含めてバランスを取っています。

Composerプラグイン開発のノウハウやComposerのあまり知られていない機能、Packagistのミラーリングのノウハウなど、他にも話せることはあるのですが、それはまた別の機会にできればと思います。

時間も長かったので、伏線を作ってみたりとか、工夫する余地があって楽しかったです。

自分の原点

基調講演というのは、参加者全員がそれを聞いて、盛り上げてウオオオオってするものだと伝え聞きました。なので講演のお誘いを頂いたとき既に、話すことは自分の原点しかないと決まっていました。

私がプログラミングで何かを作ったのは、社会人になってからです。特別な教育を受けたわけでもなく、素早くコードを書くことも苦手で、才能はないんじゃないか、この先プログラマーとしてやっていけるのだろうか、という風にずっと自信が持てませんでした。

そんな時、書籍の「プログラミングPerl」のはじめにの一節を読んで、衝撃を受けました。ちょっと引用します。

最も大切なのは、すべてを学び終えないうちに、役に立つプログラムが書けるという点である。あなたは、Perlを「端っこ」から少しずつ学び始めることができる。あなたは赤ちゃん言葉でPerlのプログラムを書くことができる ―― 私たちはそれを笑ったりしないと約束しよう。 (中略) われわれは、言語公安警察にあなたを尾行させたりはしない。上司からクビにされないうちに仕事を片付けられれば、それは「正しい」Perlスクリプトなのだ。

それまでずっと、周りと自分を比較してウジウジしていた私は、プログラミング言語を作るようなスーパーエンジニアが、拙いコードを書いてもいいと言っていることに非常に感動しました。それこそ「君はヒーローになれる」と言われたような気がしたのです。「自分でも何かできるかもしれない」と思えて、ゆっくりだけどコードが書けるようになったのは、たぶんそれからです。

でも、クソコードしか書けない人がクソコードを書こうと言ったところで何も説得力がないし、勉強しろと叱られるだけです。 だからいつか誰もが認めるような成果を出して、「クソコードでいいのだ」と断言してやるのが私の夢でした。

基調講演で言いたい放題言えて、ちょっと夢が叶ったな、と思いました。コードの話にしてしまうとコードを書かずに解決する場合のことが抜け落ちてしまうので、「問題と向き合うこと」という風に言い換えました。

「問題と向き合っていて孤独に感じないのか?」

そうそう、会場からのこの質問に、若干うまく答えられなかった気がするので、補足しておきます。

問題がすぐ自分で解決できればいいんですが、自分ではどうしようもなく、他にだれも解決しようとしていない場合は孤独でつらいものです。そもそも、答えのない問題も多くあります。

なので、そういうときは仲間を探すといいです。勉強会やカンファレンスに出たり主催したりしてもよいでしょう。インターネットで同じ問題に苦しんでいる人がいないか探し、日本語圏で見つからなければ英語や他の言語でも探してみましょう。会社に話の通じる人がいなければ、いっそのこと転職に踏み切るのもいいかもしれません。

同じ問題で苦しんでいて、解決できなくても「これをなんとかしたい」とあきらめない声を聞くと、勇気が湧いてくるものです。一番良くないのは、感覚が麻痺して問題を問題だと認識できなくなったり、どうせ解けないと問題に慣れてしまうことだと思います。

残念ながら、カンファレンスでありがたい話を聞いても、何か技術書を読んでも、自分が抱えている問題が突然に解消されることはありません。納期の迫っている開発、なぜかたまに起こるエラー、もう辞めてしまった人の残した負債、DBに残された使われていないテーブル。たぶん、世の中にいっぱい問題はあるのでしょう。

問題の大きさにかかわらず、そこに居合わせた人が何かしないと解決しないはずです。別に自分自身で解決しなくても、助けを求める声を上げるだけでも何かのきっかけになるかもしれません。「これは問題だ」と断言するのは誰にでもできますが、英雄的な尊い行為です。

きっと、みんなが少しずつ自分の抱えている問題に向き合っていれば、世の中少しずつよくなるのだと思います。

プログラマーの三大美徳

f:id:shmorimo001:20160630182352p:plain:w100
SREチームの@shmorimoです。今日はプログラマーの三大美徳についてお話したいと思います。

プログラマーの三大美徳

みなさんはプログラマーの三大美徳ってご存知ですか? プログラミング言語Perlの作者である Larry Wall が↓で述べたのが最初とされています。

http://www.perl.com/pub/1998/08/show/onion.html

三大美徳として

  • 怠惰(laziness)
  • 短気(impatience)
  • 傲慢(hubris)

があげられています。

今回はそのうち怠惰(laziness)についてお話します。

怠惰(laziness)

怠惰といえば怠け者。怠け者といえば怠け者メガネ。怠け者メガネを使えば誰でも簡単に美徳を手にいれることができます。 f:id:shmorimo001:20160627175940j:plain:w240 f:id:shmorimo001:20160627175951j:plain:w240

この怠け者メガネを使うと視線は前方に向けたまま下方を見ることができます。
本来は寝転がってテレビを見るために開発されたようです。
この怠け者メガネを使ったプログラム開発について説明します。

レベル0

怠け者メガネを装着せずに作業します。
怠け者メガネの上下の視野は狭いのでマルチディスプレイが必要な作業時にはこうするしかありません。
視野の広い怠け者メガネの発売を心待ちにしましょう。

レベル1

怠け者メガネを着用し椅子に座り、リクライニングさせた背もたれに首を預けた姿勢です。
背中と首の重みが軽減されるため怠惰なプログラミングが可能です。
首の下に柔らかいクッションをいれるのがおすすめです。
これぐらいであればお堅い企業での使用も許されるのでは無いでしょうか。
f:id:shmorimo001:20160620154535j:plain:w300

レベル2

怠け者メガネを着用し長椅子に寝そべった姿勢です。
全身リラックスした姿勢での怠惰なプログラミングが可能です。
首の角度を調整するための柔らかいクッションを用意するといいでしょう。
イマドキのIT業界であれば長椅子の一つや二つは用意されていると思います。
ぜひとも活用しましょう。
f:id:shmorimo001:20160621164447j:plain:w300

レベル3

ErgoDoxなどの左右に分割されたキーボードを使用し畳などに寝転がった姿勢です。
レベル2に加えて肩と腕の力まで抜いた怠惰なプログラミングが可能です。
畳のままだと辛いのでオフトゥンを用意するとさらに快適になります。
雨の日やなんとなく仕事に行きたくない日の自宅作業時にベッドで使用されてもいいでしょう。
f:id:shmorimo001:20160620144635j:plain:w300

レベル3の集団利用

複数で寝転がってプログラミングを行います。
オフィス机や椅子などが必要ないので資金の乏しいベンチャー立ち上げ時には、このような利用がオススメかもです。
f:id:shmorimo001:20160630180130j:plain:w300
f:id:shmorimo001:20160630142130j:plain:w5

レベル4

体の比重よりも僅かに重く体温程度に設定されたプールに浮かんだ姿勢です。
体中の力が抜けすべての力をプログラミングに注ぎ込むことが可能です。
残念ながら未だに実現しておらず写真はありません。

まとめ

いかがだったでしょうか? このネタ記事が少しでもみなさんのお役に立てれば幸いです。
筆者は、複数画面が必要な業務はレベル0、集中したいときは短時間ならレベル1、じっくり取り組む時はレベル2と使い分けています。
新たな利用方法やテクニックがあれば教えてください。
また短気や傲慢を満たすアイテムの情報も絶賛募集中です!

おまけ

ErgoDoxの設置についても軽く触れたいと思います。

  • まず椅子の肘掛けを机の高さ程度に調整します。
    f:id:shmorimo001:20160630140859j:plain:w300

  • 楽な姿勢で深く椅子に腰かけ、肘掛けに肘をつき机に手をのせます。
    f:id:shmorimo001:20160630141020j:plain:w300

  • その手の位置にErgoDoxを設置します。
    f:id:shmorimo001:20160630174840j:plain:w300

この様にすれば腕の重みが軽減され肩も気持ちよく開くことができます。
キーボードに手をあわせるのではなく、手にキーボードをあわせてみてください。