3.5K Views
October 02, 17
スライド概要
JJUG ナイトセミナー 「メッセージングミドルウェア特集」のRabbitMQの発表資料です。
https://jjug.doorkeeper.jp/events/65028
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
実運用して分かったRabbitMQの 良いところ・気をつけること 2017年9月27日 祖父江 翔 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
自己紹介 祖父江 翔(そぶえ しょう) マーケティングソリューションズカンパニー開発本部 新卒入社7年目 配属されてからずっと広告関連の開発 入稿→アカウント→開発基盤 2 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
本日の内容 • Rabbit MQとは • 広告システム内でのRabbit MQ • • 導入前の課題 動機 • • • 構成 プロビジョニング 保守・運用 • 良いところ • 気をつけること • まとめ 3 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
RabbitMQとは Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
RabbitMQ RabbitMQ is the most widely deployed open source message broker. With more than 35,000 production deployments of RabbitMQ world-wide at small startups and large enterprises, RabbitMQ is the most popular open source message broker. RabbitMQ is lightweight and easy to deploy on premises and in the cloud. It supports multiple messaging protocols. RabbitMQ can be deployed in distributed and federated configurations to meet high-scale, high-availability requirements. トップページより引用 RabbitMQ - Messaging that just works, https://www.rabbitmq.com/ 5 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
要はRabbitMQとは • オープンソースのメッセージブローカー • 軽量でデプロイをオンプレミスでも クラウドでも利用可能 • 複数のメッセージプロトコル対応 • スタンドアローンでもクラスタでも構築可能 6 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
多言語サポート • 公式で用意されているのは Erlang, Java, C#のみ • Ruby, Python, PHPなど提供 Clients & Developer Tools, https://www.rabbitmq.com/devtools.html 7 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
PluginやAPI • Pluginが豊富 • • • 基本機能以外の付け足しが可能 プロトコルや認証機能の追加が可能 管理画面の導入で運用負荷の軽減も可能 • APIが用意されている • リソースやトラフィックの監視が可能 Plugins, https://www.rabbitmq.com/plugins.html 8 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
Management Plugin 9 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
広告システム内での Rabbit MQ Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
広告システム BEサーバ群 広告主が出稿 配信面 FE 広告配信システム 非同期化部分 11 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
RabbitMQ導入前の課題 • ブローカーのないキュー管理の仕組みを利用 接続の管理が面倒 • • • 12 接続設定の修正が職人芸(気軽にできない) ProducerとConsumerを気軽に追加できない Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
導入前(設定つらい…) BE APIサーバ 13 配信システム連携バッチ Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
キュー管理の仕組みに求めたこと • • • • PHPとJavaで同時に運用できること 耐障害性があること ConsumerやProducerを容易に追加できること スループットが高いこと • • 14 広告入稿のリクエストに耐えられること 処理単位でルーティングができること Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
RabbitMQを採用 • AMQPで動作する • クライアントライブラリがある • JavaでもPHPでも動作するため、並行期間を設けられる • クラスタを容易に構築できる • ブローカーのスケールアウトができる • ProducerとConsumerが容易に追加できる • トピックとキーでルーティングが可能 15 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
広告システム BEサーバ群 広告主が出稿 配信面 FE 16 Co p y rig ht © 2 0 1 7 広告配信システム Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
BEサーバ群の構成 BE APIサーバ 17 RabbitMQクラスタ (3台構成) Co p y rig ht © 2 0 1 7 配信システム連携バッチ Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
良いところ Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
言語が混在しても問題なく動作 • JavaからPHPへメッセージの受け渡し • 並行運用しても問題なく動作 19 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
耐障害性、クライアント設定 • クラスタのノードが1台ダウンしても サービス継続 • クライアントはRabbitMQクラスタを 接続先にすればいい 20 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
高いスループット • VM3台で1クラスタの構成 • vCPU: 8 • Mem: 16G • Disc: 120G • 1000万msg/dayをConsumerが処理 21 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
気をつけること Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
構成 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
LBを使った構成の罠 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
複数ノード構成なのでLBを配備してみた • HTTPサーバみたいに LB経由でバランシングする構成に BE APIサーバ RabbitMQクラスタ LB 25 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
メッセージが見つからない • システム内で整合性が取れない • ただ、何が消えたのかわからない • リカバリ頑張る、運用でカバー 26 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
LBを入れてリッチな構成にしたことが仇 • LBがセッション維持しない設定(変更不可) • LBがセッションを定期的に破棄していることが発覚 • JavaのRabbitMQクライアントで LBを使わなくてもクラスタを考慮した接続や 障害時の接続のリカバリが実装されていた 27 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
LBいらない • ノードを全部列挙する BE APIサーバ RabbitMQクラスタ Host1,Host2,Host3 28 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
プロビジョニング Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
クラスタ止まった Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
クラスタが応答しなくなった 大量のメッセージがあると応答しない PublishもConsumeもできない状態 処理が遅延してシステムが止まるような事態に… 31 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
原因その1: ディスクI/O メモリ上で扱わず すべてディスクに書き込む設定 (デフォルト) 設定変更してメモリで扱うように ※マスタ1台のみディスク、スレーブ2台をメモリ 信頼性よりパフォーマンスを重視した設定 32 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
ただし、通常はディスク推奨 A node can be a disk node or a RAM node. (Note: disk and disc are used interchangeably). In most cases you want all your nodes to be disk nodes; RAM nodes are a special case that can be used to improve the performance clusters with high queue, exchange, or binding churn. When in doubt, use disk nodes only. Clustering Guideより引用 →通常はディスクのみ、メモリは特殊ケース Clustering Guide: https://www.rabbitmq.com/clustering.html 33 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
原因その2:トラッフィク統計の設定 • Message ratesの設定(rates_mode) • 管理プラグインを入れるとデフォルトBasicモード • メッセージの転送レートを表示するための設定 • メッセージの流量を観測するには有用な設定 Management Plugin: https://www.rabbitmq.com/management.html 34 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
Message ratesの設定あり 35 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
Message ratesの設定なし 36 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
高スループット環境では無効にするべき • このオプションを無効にした途端に スループットが向上 • メトリック監視とパフォーマンスはトレードオフ • 公式でも Alternatively, the message rates can be disabled altogether. This can help get the best possible performance out of a CPU-bound server. Management Pluginより引用 Management Plugin: https://www.rabbitmq.com/management.html 37 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
保守・運用 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
無停止で バージョンアップする Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
サービス停止するわけにいかない • 24時間絶え間なく広告入稿のリクエスト • ミドルウェアのバージョンアップで サービス停止できない 40 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
切り替え Step1 旧RabbitMQクラスタ Consumer FE 41 BE Co p y rig ht © 2 0 1 7 広告配信システム Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
切り替え Step2 旧RabbitMQクラスタ Consumer FE 広告配信システム BE 新RabbitMQクラスタ 42 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
切り替え Step3 旧RabbitMQクラスタ FE BE メッセージを 捌き切る 広告配信システム Consumer 新RabbitMQクラスタ 43 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
切り替え Step4 旧RabbitMQクラスタ FE 広告配信システム BE Consumer 新RabbitMQクラスタ 44 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
ネットワーク パーティション Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
ネットワーク障害! • ある日、ネットワーク障害発生 • 管理画面開くと… 46 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
再起動するしかない • 公式のドキュメントによると… It may be simpler to stop the whole cluster and start it again; if so make sure that the first node you start is from the trusted partition. Clustering and Network Partitionsより引用 Clustering and Network Partitions: https://www.rabbitmq.com/partitions.html 47 Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
まとめ Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .
まとめ • 良いところ • • • 高スループット 耐障害性があり、クライアント設定はシンプル 多言語対応していて、混在でも並行運用可 • 気をつけること • • 49 特に高スループットが要求される場合は プロビジョニングに注意 公式ドキュメントは読み込むべし Co p y rig ht © 2 0 1 7 Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .