MySQL プロキシの最も強力な機能の 1 つは、「読み取り/書き込み分割」を実現することです。基本原則は、マスター データベースにトランザクション クエリを処理させ、スレーブ データベースに SELECT クエリを処理させることです。データベース レプリケーションは、トランザクション クエリによって発生した変更をクラスター内のスレーブ データベースに同期するために使用されます。
Jan Kneschke は、「MySQL プロキシが R/W 分割を学習する」でこのテクニックと接続プールの問題を詳しく紹介しました:
読み取りと書き込みの分離を実現するには、接続プールが必要です。バックエンドへの認証された接続が開かれている場合にのみ、バックエンドに切り替えます。 MySQL プロトコルはハンドシェイクから始まります。クエリ/結果を返す段階に入ると、新しい接続を認証するには遅すぎます。正常に機能し続けるために、十分なオープン接続があることを確認する必要があります。
読み取りと書き込みの分離を実装するための LUA スクリプト:
- 读写分离 -- -- 发送所有的非事务性Select到一个从数据库 if is_in_transaction == 0 and packet:byte() == proxy.COM_QUERY and packet:sub(2, 7) == "SELECT" then local max_conns = -1 local max_conns_ndx = 0 for i = 1, #proxy.servers do local s = proxy.servers[i] -- 需要选择一个拥有空闲连接的从数据库 if s.type == proxy.BACKEND_TYPE_RO and s.idling_connections > 0 then if max_conns == -1 or s.connected_clients < max_conns then max_conns = s.connected_clients max_conns_ndx = i end end end -- 至此,我们找到了一个拥有空闲连接的从数据库 if max_conns_ndx > 0 then proxy.connection.backend_ndx = max_conns_ndx end else -- 发送到主数据库 end return proxy.PROXY_SEND_QUERY
注: この手法は、シャーディングなどの他のデータ分散戦略の実装にも使用できます。
上記は mysql の読み書き分離 (実践記事) の内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。