mysqlの読み書き分離(実践編)

黄舟
リリース: 2016-12-17 14:20:53
オリジナル
912 人が閲覧しました

MySQL プロキシの最も強力な機能の 1 つは、「読み取り/書き込み分割」を実現することです。基本原則は、マスター データベースにトランザクション クエリを処理させ、スレーブ データベースに SELECT クエリを処理させることです。データベース レプリケーションは、トランザクション クエリによって発生した変更をクラスター内のスレーブ データベースに同期するために使用されます。

mysqlの読み書き分離(実践編)

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) に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!