ホームページ  >  記事  >  バックエンド開発  >  mysql プロキシの読み書き分離設定と php mysql 読み書き分離クラス

mysql プロキシの読み書き分離設定と php mysql 読み書き分離クラス

WBOY
WBOYオリジナル
2016-07-25 08:56:031220ブラウズ
  1. mysql-proxy
  2. –proxy-backend-addresses=narcissus:3306
  3. –proxy-backend-addresses=nostromo:3306
コードをコピー

3. データベースの読み取りと書き込みの分離、192.168.18 .11 0 Enter は書き込みを担当し、192.168.18.107 はデータの読み取りを担当します。 もちろん、データを読み取るためのサーバーを追加することもできます。

  1. mysql-proxy
  2. –proxy-backend-addresses=192.168.18.110:3306
  3. –proxy-read-only-backend-addresses=192.168.18.107:3306
コードをコピー

このメソッドは読み取りと書き込みを分離しません。 mysql-proxy はどれがスレーブサーバーに送信されるかを区別できないため、スクリプトを使用してそれらを制御する必要があります。4 番目の方法を参照してください。

4. Lua スクリプトは、接続と配布、クエリと返される結果セットを適切に制御できます。 Lua スクリプトを使用する場合は、-proxy-lua-script を使用してスクリプトの名前を指定する必要があります。 接続が生成されるまでスクリプトは読み取られません。つまり、スクリプトの変更後にサービスを再起動する必要はありません。 mysql-proxy –proxy-lua-script=rw-splitting.lua –proxy-backend-addresses=192.168.18.110:3306 –proxy-read-only-backend-addresses=192.168.18.107:3306

注: 1. プロキシの読み取り/書き込み分離メカニズムは、まず最初のいくつかのクエリをマスターに送信して接続を確立します。 マスターに送信されるクエリの数が接続プールの最小値を超えると、クエリの送信が開始されます

2. LAST_INSERT_ID をメインサーバーに送信することはできません。226 行目を次のように変更します。 elseif is_insert_id かつ token.token_name == “TK_FUNCTION” then

3. デフォルトの rw-splitting.lua を使用すると、proxy-command が見つからないというメッセージが表示されます。mysql-proxy のパスをシステム パスに設定し、共有ディレクトリで実行すると問題ありません。操作中に cmd を入力します。 次に、 C:toolsmysql-proxyshare を cd します。

4.文字化け プロキシ経由でデータベースに接続した後、見つかった文字列は常に文字化けします。セット名「utf8」を手動で実行しても効果はありません。 解決策、mysqlサーバーを設定する必要があります

  1. class mysql_rw_php {
  2. //クエリ数
  3. var $querynum = 0;
  4. //現在の操作のデータベース接続
  5. var $link = null
  6. //文字セット
  7. var $charset; ;
  8. //現在のデータベース
  9. var $cur_db = '';
  10. //有効な読み取り専用データベース接続があるかどうか
  11. var $ro_exist = false
  12. //読み取り専用データベース接続
  13. var $link_ro = null;
  14. // データベース接続の読み取りおよび書き込み
  15. var $link_rw = null;
  16. function mysql_rw_php(){
  17. }
  18. function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $ halt = TRUE) {
  19. if($pconnect) {
  20. if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
  21. $halt && $this->halt('Can MySQL サーバーに接続しません');
  22. }
  23. } else {
  24. if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw)) {
  25. $halt && $this->halt( 'MySQL サーバーに接続できません');
  26. }
  27. }
  28. //読み取り専用接続に失敗しました
  29. if(!$this->link && !$halt) return false;
  30. //rw が初期化されていない場合、最初の接続は rw
  31. if($this->link_rw == null)
  32. $this->link_rw = $this->link;
  33. if($this->version() > ' 4.1') {
  34. if ($this->charset) {
  35. @mysql_query("SETcharacter_set_connection=$this->charset,character_set_results=$this->charset,character_set_client=binary", $this->link );
  36. }
  37. if ($this->version() > '5.0.1') {
  38. @mysql_query("SET sql_mode=''", $this->link); ($dbname) {
  39. $this->select_db($dbname);
  40. }
  41. }
  42. //読み取り専用の mysql データベースに接続します
  43. function connect_ro($dbhost, $dbuser, $dbpw, $dbname = '' , $pconnect = 0) {
  44. if($this->link_rw == null)
  45. $this->link_rw = $this->link = null;
  46. //停止なしエラー
  47. $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false);
  48. if($this->link){
  49. //接続成功
  50. //echo "link ro sussess! $this->ro_exist = true;
  51. $this->link_ro = $this->link;
  52. if($this->cur_db){
  53. //データベースの場合選択されているため、操作が必要です Once
  54. @mysql_select_db($this->cur_db, $this->link_ro)
  55. }
  56. }else{
  57. //接続に失敗しました
  58. //echo "link ro failed! $this- >link = &$this->link_rw;
  59. }
  60. }
  61. //一連の読み取り専用データベースを設定し、そのうちの 1 つに接続します
  62. function set_ro_list($ro_list){
  63. if(is_array($ro_list)){
  64. / /ランダムに 1 つを選択
  65. $link_ro = $ro_list[array_rand($ro_list)]
  66. $this->connect_ro($link_ro['dbhost'], $link_ro ['dbuser'], $link_ro['dbpw'] ; $dbname, $this->link_ro)
  67. }
  68. return @mysql_select_db($dbname, $this->link_rw);
  69. function fetch_array( $query, $result_type = MYSQL_ASSOC) {
  70. return mysql_fetch_array($ query, $result_type)
  71. }
  72. function fetch_one_array($sql, $type = '') {
  73. $qr = $this->query($sql) , $type);
  74. return $this->fetch_array( $qr); }
  75. function query($sql, $type = '') {
  76. $this->link = &$this->link_rw ;
  77. //選択文を判定する
  78. if($this- >ro_exist && preg_match ("/^(s*)select/i", $sql)){
  79. $this->link = &$this- >link_ro;
  80. }
  81. $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query')
  82. 'mysql_unbuffered_query' : 'mysql_query' ? (!($query = $sql, $ this->link)) && $type != 'SILENT' ) {
  83. $this->halt('MySQL クエリ エラー', $sql);
  84. $this->querynum++;
  85. return $query;
  86. }
  87. functionaffected_rows() {
  88. return mysql_affected_rows($this->link);
  89. }
  90. function error() {
  91. return (($this->link) ? mysql_error($this->link) : mysql_error());
  92. }
  93. function errno() {
  94. return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
  95. }
  96. 関数 result($query, $row) {
  97. $query = @mysql_result($query, $row);
  98. $query を返す;
  99. }
  100. 関数 num_rows($query) {
  101. $query = mysql_num_rows($query);
  102. $query を返す;
  103. }
  104. function num_fields($query) {
  105. return mysql_num_fields($query);
  106. }
  107. function free_result($query) {
  108. return mysql_free_result($query);
  109. }
  110. function insert_id() {
  111. return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
  112. }
  113. 関数 fetch_row($query) {
  114. $query = mysql_fetch_row($query);
  115. $query を返す;
  116. }
  117. function fetch_fields($query) {
  118. return mysql_fetch_field($query);
  119. }
  120. function version() {
  121. return mysql_get_server_info($this->link);
  122. }
  123. function close() {
  124. return mysql_close($this->link);
  125. }
  126. function halt($message = '', $sql = '') {
  127. $dberror = $this->error();
  128. $dberrno = $this->errno();
  129. echo "
  130. MySQL エラー
  131. メッセージ: $message
  132. SQL
  133. エラー ;br>
  134. エラー: $dberrno
  • exit();
  • }
  • }
  • ?>
  • 复制代

    调用例:

    1. /*****************************************
    2. *** mysql-rw-php バージョン 0.1
    3. *** http://bbs.it-home.org
    4. *** http://code.google.com/p/mysql-rw-php/
    5. *** class_mysql.php (uchome) からコードを修正します
    6. ***************************************/
    7. require_once('mysql_rw_php.class.php');
    8. //rw 情報
    9. $db_rw = array(
    10. 'dbhost'=>'bbs.it-home.org',
    11. 'dbuser'=>'jbxue',
    12. 'dbpw'=>'bbs. it-home.org',
    13. 'dbname'=>'test'
    14. );
    15. $db_ro = array(
    16. array(
    17. 'dbhost'=>'bbs.it-home.org:4306',
    18. 'dbuser'=>'jbxue',
    19. 'dbpw'=>'bbs. it-home.org'
    20. )
    21. );
    22. $DB = 新しい mysql_rw_php;
    23. //マスターに接続します
    24. $DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);
    25. //方法 1: 1 つのサーバーに接続します
    26. $DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]);
    27. //方法 2: rand によりリストから 1 つのサーバーに接続します
    28. $DB->set_ro_list($db_ro);
    29. //rw に送信
    30. $sql = "セットに挿入 a='test'";
    31. $DB->クエリ($sql);
    32. //ro に送信
    33. $sql = "select * from a";
    34. $qr = $DB->クエリ($sql);
    35. while($row = $DB->fetch_array($qr)){
    36. echo $row[a];
    37. }
    38. ?>
    复制發


    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。