Carpe Diem

備忘録

Webサーバにおけるソケット周りの知識

概要

サーバサイドの仕事をしているとソケットという概念に遭遇すると思います。
ソケットを理解すると

  • TCPセッションの流れ
  • ulimitでnofileを上げないとコネクション増加した時のToo many open filesが出るのはなぜか
  • なぜサーバの待ち受けポートは1つで、クライアントのポートは接続するたびに新しいポートが必要なのか
  • unix domain socketはなぜファイルパスを指定するのか
  • Circusはなぜgraceful restartが可能なのか

といったことが分かるようになります。
今回そういったソケット周りの知識を理解するためにまとめます。

続きを読む

Go 1.11 で導入された ListenConfig を使って SO_REUSEPORT を利用する

概要

先日リリースされた1.11でソケットオプションを設定できるようになりました
これによってLinux 3.9から導入されたSO_REUSEPORTという、同じポートでbindすることが可能になる機能が利用可能になります。

環境

何が嬉しい?

一言で言うとGraceful Restartが可能になるという点です。

通常サーバプロセスを再起動するとその瞬間はリクエストを捌けなくなります。
Rolling updateのような事ができる環境であればいいですが、そうではない場合

  • a) Listenしているsocketのfile descriptorの複製
  • b) SO_REUSEPORTを使う

といった手段でデプロイ時に一時的に古いプロセスを残したまま新しいプロセスを起動し、起動完了後に古いプロセスを落とすといった形で実現する必要があります。
ただし a, b のような手段でないと bind error で新しいプロセスの方は起動できません。通常使用中のポートは別プロセスで利用できないからです。

今回リリースされたgolang 1.11では b を自前でサクッと対応できるようになります。

続きを読む

fluentdをローカルで簡単に検証する

概要

ローカルでサクッとfluentdの検証をしたい時に毎回調べ直していたのでメモ。

設定ファイル

fluentd.confという名前で設定を用意します。
forwardされたログをstdoutに出力します。

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match *.*>
  @type stdout
</match>
続きを読む

bindアドレスとadvertiseアドレス

概要

ConsulやVaultのクラスタ構成をしていると

  • bind address
  • advertise address

という2つのアドレスを設定する必要が出てきます。
この2つをしっかり理解しておかないとクラスタ構成で思わぬ落とし穴にハマったりするので今回はこれを紹介します。

bindアドレスって?

サーバを立ち上げる時に指定するアドレスです。
これまではふわっとした知識で

  • 127.0.0.1だとローカルからのみアクセスできる
  • 0.0.0.0だとどこからでもアクセスできる
  • Elasticsearchとかはデフォルトは127.0.0.1になってる

くらいの理解でした。

続きを読む

HashiCorp VaultのKVの基本的な使い方

概要

HashiCorp VaultのKey/Valueの基本的な使い方を紹介します。
このKey/Valueは少し前にv2が出ているため、v1と混同しないよう注意してください。

今回はKey/Valueのバージョン管理が可能なv2を想定して説明します。

環境

  • Vault v0.10.4
  • KV Secrets Engine v2
続きを読む

Consulクラスタをアップグレードした時に起きた問題と対応

概要

先日Consulクラスタのアップグレードをしたところちょこちょこ問題にぶち当たって解決に時間がかかったので、同じ症状に遭ったりした人用にメモ。

環境

  • Consul 1.1.0 -> 1.2.2
  • Ubuntu 16.04

問題背景

Consulはクライアントエージェントが追加されたり死んだりしても自動でjoin・leaveを行ってくれるので、サーバエージェントも同様に1台ずつAMIを更新すれば自動でjoin・leaveしてくれる&Key/Valueデータもレプリケーションを自動でやってくれるから問題ないはずと勝手に期待してやってみたのが問題でした。

続きを読む