ホームページ >データベース >mysql チュートリアル >mysql の読み取りと書き込みの分離 (基本)
基本原則は、マスター データベースにトランザクション クエリを処理させ、スレーブ データベースに SELECT クエリを処理させることです。データベース レプリケーションは、トランザクション クエリによって発生した変更をクラスター内のスレーブ データベースに同期するために使用されます。
Jan Kneschke は、この手法と接続プールの問題を「MySQL プロキシが R/W 分割を学習する」で詳しく紹介しました:
読み取りと書き込みの分離を実現するには、接続プールが必要です。バックエンドへの認証された接続が開かれている場合にのみ、バックエンドに切り替えます。 MySQL プロトコルはハンドシェイクから始まります。クエリ/結果を返す段階に入ると、新しい接続を認証するには遅すぎます。正常に機能し続けるために、十分なオープン接続があることを確認する必要があります。読み取りと書き込みの分離を実装するための
LUA スクリプト:
--読み取り-書き込みの分離
--
--すべての非トランザクション選択をスレーブ データベースに送信します
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) に注目してください。