Microservicesの設定管理:なぜetcdが最良の選択肢なのか?

Database tutorial - IT technology blog
Database tutorial - IT technology blog

マイクロサービスシステム肥大化の悪夢

20個のマイクロサービスを管理していると想像してみてください。ある日突然、データベースのIPアドレスが変更されたり、重要なAPIキーを即座に更新する必要が出てきました。従来の方法では、各サービスにアクセスして.envファイルを修正し、20個すべてのコンテナを再起動しなければなりません。

このやり方は時間がかかるだけでなく、リスクも伴います。たった一つのサービスの更新を忘れるだけで、システム全体がダウンしてしまいます。私自身、クラスター内の一つのサービスの設定を更新し忘れたせいで、午前2時まで全設定ファイルをチェックし続けたという、苦い経験があります。それは決して心地よい体験ではありませんでした。

なぜMySQLやRedisは最適ではないのか?

この問題に直面したとき、多くの人がMySQLやRedisを使って設定を保存することを考えます。しかし、実際には多くの不都合が生じます。

  • MySQL/PostgreSQL: 手紙を運ぶのに大型トラックを使うようなものです。数行の設定を取得するためだけに何百もの接続を維持するのは、リソースの大きな無駄です。
  • Redis: 非常に高速ですが、デフォルトでは一貫性(Consistency)よりもパフォーマンスを優先します。設定管理において、一貫性は絶対です。サービスAが古い設定を受け取っている一方で、サービスBが新しい設定を受け取っているという状況は、絶対に避けなければなりません。
  • 物理ファイル: 数十台のサーバー間でファイルを同期させるのは、運用面で大きな負担となります。

etcd — 分散システムの「脳」

etcdは、これらの課題を根本的に解決するために生まれました。これはGoで書かれ、Raft合意アルゴリズムを使用した分散型Key-Valueストアです。すべてのノードでデータの整合性を保証します。ご存知でしょうか? etcdはKubernetesの心臓部であり、クラスターの状態をすべて保存している場所なのです。

etcdの最大の利点は、Watch機能です。サービスが「何か更新はある?」と何度も問い合わせる代わりに、変更があった瞬間にetcd側から通知をプッシュします。これにより、アプリケーションはほぼリアルタイムで設定を更新できます。

Linuxへのetcdインストールガイド

ここでは、Linux(Ubuntu/CentOS)にバイナリ版のetcdをインストールします。これは、Kubernetes上でより複雑な構成をデプロイする前に、etcdに慣れるための最も早い方法です。

# v3.5.0をダウンロード
ETCD_VER=v3.5.0
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}

rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz

# システムディレクトリに移動
sudo mv /tmp/etcd-download-test/etcd /usr/local/bin/
sudo mv /tmp/etcd-download-test/etcdctl /usr/local/bin/

etcd --versionコマンドでインストールを確認します。まずは試してみたい場合、以下のコマンドでシングルノードを起動できます。

etcd

この時、etcdはポート2379(クライアント用)と2380(ノード間通信用)で待機します。

etcdctlによるデータ操作

etcdctl

Share: