Q4M Microblogcon

4,510 views
4,456 views

Published on

Introduction and Tutorial of Q4M - a pluggable message queue for MySQL

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,510
On SlideShare
0
From Embeds
0
Number of Embeds
556
Actions
Shares
0
Downloads
21
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Q4M Microblogcon

  1. 1. Q4M a high-performance message queue for MySQL Cybozu Labs, Inc. Kazuho Oku
  2. 2. <ul><li>What is Q4M? </li></ul>
  3. 3. Introduction of Q4M <ul><li>Q4M stands for Queue for MySQL </li></ul><ul><ul><li>Q4M の意は「 Queue for MySQL 」 </li></ul></ul><ul><li>A pluggable storage engine of MySQL 5.1 </li></ul><ul><ul><li>MySQL 5.1 用のプラガブルストレージエンジン </li></ul></ul><ul><li>Access & administration by SQL </li></ul><ul><ul><li>SQL を用いたアクセスと管理 </li></ul></ul>
  4. 4. Design Goals of Q4M <ul><li>Robust ( 堅牢性 ) </li></ul><ul><ul><li>No data loss on OS crash or power failure </li></ul></ul><ul><ul><li>OS クラッシュや停電時にデータロスが発生しない </li></ul></ul><ul><li>Fast ( 高速性 ) </li></ul><ul><ul><li>Optimized for speed </li></ul></ul><ul><li>Flexible ( 柔軟性 ) </li></ul><ul><ul><li>Use of SQL for access and administration, including JOINs with other storage engines </li></ul></ul>
  5. 5. <ul><li>What is a Message Queue? </li></ul><ul><li>from Distributed Systems (Tanenbaum / Van Steen) </li></ul>
  6. 6. What is a Message Queue? <ul><li>Middleware for persistent asynchronous communication </li></ul><ul><ul><ul><li>持続的な非同期コミュニケーションのためのミドルウェア </li></ul></ul></ul><ul><li>A.k.a. Message-Oriented Middleware </li></ul><ul><ul><ul><li>別名 : MOM </li></ul></ul></ul>
  7. 7. Message Queue (cont.) <ul><li>MQ is an intermediate storage </li></ul><ul><ul><ul><li>MQ は中間的なストレージ </li></ul></ul></ul><ul><ul><li>vs. RDBMS (long-term persistent storage) </li></ul></ul><ul><ul><ul><li>vs. RDBMS ( 永続的なストレージ ) </li></ul></ul></ul><ul><li>Senders and/or receivers may go down </li></ul><ul><ul><li>送受信プロセスが任意に停止可能 </li></ul></ul>
  8. 8. Minimal Configuration of a MQ ( 最小構成 ) <ul><li>Senders and receivers access a single queue </li></ul><ul><ul><ul><li>送信プロセスと受信プロセスが同一のキューにアクセス </li></ul></ul></ul>Sender Receiver Queue
  9. 9. MQ and Relays <ul><li>Separate queue for sender and receiver </li></ul><ul><ul><ul><li>送信プロセスと受信プロセスが別個にキューをもつ </li></ul></ul></ul><ul><li>Messages relayed between queues </li></ul><ul><ul><ul><li>メッセージリレーでキュー間を接続 </li></ul></ul></ul>Sender Receiver Relay Queue Queue
  10. 10. Merits of Message Relays ( リレーの意義 ) <ul><li>Destination can be easily changed </li></ul><ul><ul><ul><li>宛先の変更が容易 </li></ul></ul></ul><ul><ul><li>Relays may transfer messages to different locations depending on the header </li></ul></ul><ul><ul><ul><li>ヘッダを見て転送先を変えるとか </li></ul></ul></ul><ul><li>Robustness against network failure </li></ul><ul><ul><ul><li>ネットワーク障害の影響を受けない </li></ul></ul></ul><ul><li>Logging and Multicasting, etc. </li></ul><ul><ul><ul><li>ロギングやマルチキャストが可能 </li></ul></ul></ul>
  11. 11. Message Brokers <ul><li>Transform (filter) messages within the relay agent </li></ul><ul><ul><ul><li>リレーエージェント内でメッセージの変換を行う </li></ul></ul></ul><ul><li>Publish / subscribe model </li></ul><ul><ul><li>Separation between logic and data transfer </li></ul></ul><ul><ul><ul><li>ロジックとデータ転送の分離 </li></ul></ul></ul>
  12. 12. Q4M as a Message Queue (MQ としての Q4M) <ul><li>Q4M (can) support all models </li></ul><ul><ul><ul><li>Q4M は全モデルに対応 ( 可能 ) </li></ul></ul></ul><ul><li>Message transfer by q4m-forward </li></ul><ul><ul><ul><li>メッセージ転送は q4m-forward で </li></ul></ul></ul><ul><li>APIs for routers and message brokers </li></ul><ul><ul><ul><li>ルータやメッセージブローカ用の API </li></ul></ul></ul><ul><ul><ul><li>Q4M-forward is built upon those APIs </li></ul></ul></ul><ul><ul><ul><ul><li>Q4M-forward は、それら API を使用して開発 </li></ul></ul></ul></ul>
  13. 13. <ul><li>Performance </li></ul>
  14. 14. Internal Architecture of Q4M <ul><li>Q4M maps queries from multiple threads to single I/O requests </li></ul><ul><ul><li>Q4M は複数スレッドからの SQL クエリを単一の I/O 処理にグループ化 </li></ul></ul><ul><li>Spawn multiple clients for maximum performance </li></ul><ul><ul><li>多数のクライアントを同時実行することで、パフォーマンスを最大限に発揮 </li></ul></ul>
  15. 15. Benchmark <ul><li>Troughput Test </li></ul><ul><ul><li>7,655 mess./sec. (avg. 256 bytes/mess.) </li></ul></ul><ul><ul><li>Linux 2.6; x86_64; Opteron 2218x2 </li></ul></ul><ul><ul><li>--with-sync=fdatasync --with-delete=msync </li></ul></ul>$ VAR_LENGTH=504 CONCURRENCY=50 MESSAGES=100000 DBI='dbi:mysql:test;mysql_socket=/tmp/mysql51.sock' DBI_USER=root MYSQL_SOCKET='/tmp/mysql51.sock' USE_C_CLIENT=1 t/05-multirw.t 1..4 ok 1 - check number of messages ok 2 - min value of received message ok 3 - max value of received message ok 4 - should have no rows in table Multi-reader-writer benchmark result: Number of messages: 100000 Number of readers: 50 Elapsed: 13.063 seconds Throughput: 7655.070 mess./sec.
  16. 16. Benchmark (cont.) <ul><li>No sync. to disk </li></ul><ul><ul><li>23,637 mess./sec. (256 bytes/mess.) </li></ul></ul><ul><ul><li>--with-sync=no --with-delete=msync </li></ul></ul>
  17. 17. <ul><li>Tutorial </li></ul>
  18. 18. Sending a Message <ul><li>INSERT into queue values (1,’Hello World!’); </li></ul>
  19. 19. Receiving a Message <ul><li>while (1) { </li></ul><ul><li>SELECT queue_wait(‘queue’);; </li></ul><ul><li>my @row = SELECT ROW * FROM queue; </li></ul><ul><li>or next; </li></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>SELECT queue_end(‘queue’);; </li></ul>
  20. 20. OWNER Mode and NON-OWNER Mode
  21. 21. OWNER Mode and NON-OWNER Mode (cont.) <ul><li>Within OWNER mode, only the owned row are visible </li></ul><ul><ul><ul><li>OWNER モードでは、所有中の行のみが見える </li></ul></ul></ul><ul><li>Within NON-OWNER mode, rows owned by other connections are invisible </li></ul><ul><ul><ul><li>NON-OWNER モードでは、他の接続が所有している行は見えない </li></ul></ul></ul>
  22. 22. Function for Entering OWNER Mode <ul><li>queue_wait </li></ul><ul><ul><li>Used to enter OWNER mode </li></ul></ul><ul><ul><ul><li>OWNER モードに ( 再 ) 切替するために使用 </li></ul></ul></ul><ul><ul><li>When called within OWNER mode, the owned row is deleted </li></ul></ul>
  23. 23. queue_wait <ul><li>Two forms </li></ul><ul><ul><ul><li>queue_wait(tbl_cond) </li></ul></ul></ul><ul><ul><ul><li>queue_wait(tbl_cond,[tbl_cond…,timeout]) </li></ul></ul></ul>
  24. 24. queue_wait(tbl_cond) <ul><li>Wait max. 60 seconds until any data becomes available on given table under given condition </li></ul><ul><ul><ul><li>最大 60 秒間、指定された条件に合致する行が指定されたテーブルに登録されるまでブロック </li></ul></ul></ul><ul><li>Returns 1 if successful, 0 if no data </li></ul><ul><ul><ul><li>成功すれば 1 、データがなければ 0 </li></ul></ul></ul><ul><li>Enters OWNER mode even if no data </li></ul><ul><ul><ul><li>データがない場合でも OWNER モードへ切り替わる </li></ul></ul></ul>
  25. 25. queue_wait(tbl_cond) <ul><li>Table name (and optionally condition) should be specified </li></ul><ul><ul><ul><li>テーブル名と ( オプションで条件 ) を指定 </li></ul></ul></ul><ul><li>Only numeric columns may be used within condition </li></ul><ul><ul><ul><li>条件節では数値型のカラムのみ使用可能 </li></ul></ul></ul><ul><ul><li>See queue_share_t::init_fixed_fields </li></ul></ul><ul><ul><li>tbl_cond ::= table [ “:” cond] </li></ul></ul>
  26. 26. queue_wait(tbl_cond) (cont.) <ul><li>SELECT queue_wait(‘table:v<3’); </li></ul>
  27. 27. queue_wait(tbl_cond,[tbl_cond…,timeout]) <ul><li>Accepts multiple tables and timeout </li></ul><ul><ul><li>複数のテーブルとタイムアウトを指定可能 </li></ul></ul><ul><li>Data searched from leftmost table to right </li></ul><ul><ul><ul><li>データは左端のテーブルから右方向に探索 </li></ul></ul></ul><ul><li>Returns table index (the leftmost table is 1) of the newly owned row </li></ul><ul><ul><ul><li>獲得した行の属するテーブルのインデックス ( 左端のテーブルが 1) を返す </li></ul></ul></ul>
  28. 28. Functions for Exiting OWNER Mode <ul><li>queue_end </li></ul><ul><ul><li>Deletes the owned row and exits OWNER mode </li></ul></ul><ul><ul><ul><li>所有中の行を削除して OWNER モードを脱出 </li></ul></ul></ul><ul><li>queue_abort </li></ul><ul><ul><li>Releases (instead of deleting) the owned row and exits OWNER mode </li></ul></ul><ul><ul><ul><li>所有中の行を非所有状態に変更して OWNER モードを脱出 </li></ul></ul></ul><ul><ul><li>Close of a MySQL connection does the same thing </li></ul></ul><ul><ul><ul><li>MySQL の接続切断時も同様 </li></ul></ul></ul>
  29. 29. Receiving a Message (revisited) <ul><li>while (1) { </li></ul><ul><li>SELECT queue_wait(‘queue’);; </li></ul><ul><li>my @row = SELECT ROW * FROM queue; </li></ul><ul><li>or next; </li></ul><ul><li>if (consume_row(@row) != SUCCESS) { </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  30. 30. Restrictions in SQL of Q4M <ul><li>No indexes </li></ul><ul><li>No UPDATE </li></ul><ul><ul><li>Why need UPDATE a queue row? </li></ul></ul><ul><ul><ul><li>キューのデータを UPDATE する必要なんてない </li></ul></ul></ul><ul><li>SELECT and DELETE are supported for queue administration </li></ul><ul><ul><ul><li>SELECT DELETE を使ってキューを管理可能 </li></ul></ul></ul><ul><ul><li>ex. select count(*) from queue; </li></ul></ul>
  31. 31. Why no Indexes Support? <ul><li>There is generally no reason to support indexes with mysql-based queues, since mysql cannot handle a large number of connections requesting data under various conditions </li></ul><ul><ul><ul><li>インデックスが必要になるほど多様な条件を指定して同時に購読できるほど、 mysql の同時接続数は大きくない </li></ul></ul></ul>
  32. 32. Why no Indexes Support? <ul><li>Instead use conditional subscription </li></ul><ul><ul><ul><li>Conditional subscription 機能を使うべき </li></ul></ul></ul><ul><li>Or route data after reading from Q4M </li></ul><ul><ul><ul><li>あるいは Q4M からデータを読んだ後にルーティングすべき </li></ul></ul></ul>
  33. 33. Configuration Options of Q4M <ul><li>--with-sync=no|fsync|fdatasync|fcntl </li></ul><ul><ul><li>Controls synchronization to disk, see --help for detail </li></ul></ul><ul><li>--enable-mmap </li></ul><ul><ul><li>Mmap’ed reads lead to higher throughput </li></ul></ul><ul><li>--enable-mmap-writes </li></ul><ul><ul><li>DELETEs commited using mmap(PROT_WRITE) and msync, recommended on linux>=2.6.20 if you need really high performance </li></ul></ul>
  34. 34. My Build Options <ul><li>On CentOS 5 (x86_64) </li></ul><ul><ul><li>./configure --prefix=/var/mq/mysql --with-mysql=/home/kazuho/install/mq/mysql-5.1.24-rc CFLAGS=’-O2 -g -Wall - fpic’ CXXFLAGS=’-O2 -g -Wall - fpic’ </li></ul></ul>
  35. 35. <ul><li>Applications of Q4M </li></ul>
  36. 36. Connecting Distant Servers <ul><li>Pathtraq uses Q4M queues and a relay to communicate with its content analysis service running in a different iDC </li></ul><ul><ul><ul><li>Pathtraq では、 Q4M キューとメッセージリレーを使用して、別の iDC にあるコンテンツ分析サービスと接続している </li></ul></ul></ul>Content Analysis Service Pathtraq DB MySQL conn. over SSL,gzip Queue Queue
  37. 37. User Notifications <ul><li>For sending notifications from web services </li></ul><ul><ul><ul><li>ウェブサービスでユーザ通知送信のために使用可能 </li></ul></ul></ul>DB App. Logic SMTP Agent IM Agent Queue(s)
  38. 38. Asynchronous Updates <ul><li>Asynchronous updates leads to faster response of web services </li></ul><ul><ul><ul><li>非同期更新に利用することでウェブサービスの応答性を向上可能 </li></ul></ul></ul>DB App. Logic DB Queue
  39. 39. Scheduling Web Crawlers <ul><li>Web crawlers with retry-on-error </li></ul><ul><ul><ul><li>リトライ機能つき Web クローラー </li></ul></ul></ul><ul><ul><ul><li>Example included in the Q4M distribution </li></ul></ul></ul>URL DB Spiders Re- scheduler Store Result Read URL If failed to fetch, store URL in retry queue Request Queue Retry Queue
  40. 40. Prioritized Task Scheduling <ul><li>Used for scheduling keyword analysis in Pathtraq </li></ul><ul><ul><ul><li>Pathtraq でキーワード解析のスケジューリングに使用 </li></ul></ul></ul><ul><ul><ul><li>High prio. for new content, low prio. for re-analysis </li></ul></ul></ul>Content & Keyword DB Request Queue Keyword Analyzer Store Keywords Read URL ID Read Content URL ID Prio 0 1 0
  41. 41. Prioritized Task Scheduling (cont.) <ul><li>select queue_wait(’queue:prio<0’, </li></ul><ul><li>’ queue:prio=0’,’queue:prio>0’); </li></ul><ul><li># ugly part of not having indexes support… </li></ul>Content & Keyword DB Request Queue Keyword Analyzer Store Keywords Read URL ID Read Content URL ID Prio 0 1 0

×