Maison développement back-end tutoriel php mysql Proxy读写分离配置与php mysql读写分离类

mysql Proxy读写分离配置与php mysql读写分离类

Jul 25, 2016 am 08:56 AM

  1. mysql-proxy \
  2. –proxy-backend-addresses=narcissus:3306 \
  3. –proxy-backend-addresses=nostromo:3306
复制代码

3、数据库读写分离,192.168.18.110负责写入,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、 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、proxy的读写分离机制是先把最初的几条查询发到master上建立连接, 当发送到master上的查询数超过连接池的最小值时开始把查询

2、LAST_INSERT_ID不能发送到主服务器上, 226 行修改为下面的就可以了 elseif not is_insert_id and token.token_name == “TK_FUNCTION” then

3、使用默认的rw-splitting.lua时,会提示找不到proxy-command,我把mysql-proxy的路径设置为系统路径,然后在 share目录下运行就一切Ok了,在运行中输入cmd,然 后cd C:\tools\mysql-proxy\share。

4、字符乱码 通过proxy连上数据库之后,查到的字符串始终是乱码,即便手工执行了set names ‘utf8′也没有效果。 解决办法,mysql server必须设置

  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 not connect to MySQL server');
  22. }
  23. } else {
  24. if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw)) {
  25. $halt && $this->halt('Can not connect to MySQL server');
  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("SET character_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);
  39. }
  40. }
  41. if($dbname) {
  42. $this->select_db($dbname);
  43. }
  44. }
  45. //连接一个只读的mysql数据库
  46. function connect_ro($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0){
  47. if($this->link_rw == null)
  48. $this->link_rw = $this->link;
  49. $this->link = null;
  50. //不产生halt错误
  51. $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false);
  52. if($this->link){
  53. //连接成功
  54. //echo "link ro sussess!
    ";
  55. $this->ro_exist = true;
  56. $this->link_ro = $this->link;
  57. if($this->cur_db){
  58. //如果已经选择过数据库则需要操作一次
  59. @mysql_select_db($this->cur_db, $this->link_ro);
  60. }
  61. }else{
  62. //连接失败
  63. //echo "link ro failed!
    ";
  64. $this->link = &$this->link_rw;
  65. }
  66. }
  67. //设置一系列只读数据库并且连接其中一个
  68. function set_ro_list($ro_list){
  69. if(is_array($ro_list)){
  70. //随机选择其中一个
  71. $link_ro = $ro_list[array_rand($ro_list)];
  72. $this->connect_ro($link_ro['dbhost'], $link_ro['dbuser'], $link_ro['dbpw']);
  73. }
  74. }
  75. function select_db($dbname) {
  76. //同时操作两个数据库连接
  77. $this->cur_db = $dbname;
  78. if($this->ro_exist){
  79. @mysql_select_db($dbname, $this->link_ro);
  80. }
  81. return @mysql_select_db($dbname, $this->link_rw);
  82. }
  83. function fetch_array($query, $result_type = MYSQL_ASSOC) {
  84. return mysql_fetch_array($query, $result_type);
  85. }
  86. function fetch_one_array($sql, $type = '') {
  87. $qr = $this->query($sql, $type);
  88. return $this->fetch_array($qr);
  89. }
  90. function query($sql, $type = '') {
  91. $this->link = &$this->link_rw;
  92. //判断是否select语句
  93. if($this->ro_exist && preg_match ("/^(\s*)select/i", $sql)){
  94. $this->link = &$this->link_ro;
  95. }
  96. $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
  97. 'mysql_unbuffered_query' : 'mysql_query';
  98. if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {
  99. $this->halt('MySQL Query Error', $sql);
  100. }
  101. $this->querynum++;
  102. return $query;
  103. }
  104. function affected_rows() {
  105. return mysql_affected_rows($this->link);
  106. }
  107. function error() {
  108. return (($this->link) ? mysql_error($this->link) : mysql_error());
  109. }
  110. function errno() {
  111. return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
  112. }
  113. function result($query, $row) {
  114. $query = @mysql_result($query, $row);
  115. return $query;
  116. }
  117. function num_rows($query) {
  118. $query = mysql_num_rows($query);
  119. return $query;
  120. }
  121. function num_fields($query) {
  122. return mysql_num_fields($query);
  123. }
  124. function free_result($query) {
  125. return mysql_free_result($query);
  126. }
  127. function insert_id() {
  128. return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
  129. }
  130. function fetch_row($query) {
  131. $query = mysql_fetch_row($query);
  132. return $query;
  133. }
  134. function fetch_fields($query) {
  135. return mysql_fetch_field($query);
  136. }
  137. function version() {
  138. return mysql_get_server_info($this->link);
  139. }
  140. function close() {
  141. return mysql_close($this->link);
  142. }
  143. function halt($message = '', $sql = '') {
  144. $dberror = $this->error();
  145. $dberrno = $this->errno();
  146. echo "
  147. MySQL Error
  148. Message: $message
  149. SQL: $sql
  150. Error: $dberror
  151. Errno.: $dberrno
";
  • exit();
  • }
  • }
  • ?>
  • 复制代码

    调用示例:

    1. /****************************************
    2. *** mysql-rw-php version 0.1
    3. *** http://bbs.it-home.org
    4. *** http://code.google.com/p/mysql-rw-php/
    5. *** code modify from class_mysql.php (uchome)
    6. ****************************************/
    7. require_once('mysql_rw_php.class.php');
    8. //rw info
    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 = new mysql_rw_php;
    23. //connect Master
    24. $DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);
    25. //Method 1: connect one server
    26. $DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]);
    27. //Method 2: connect one server from a list by rand
    28. $DB->set_ro_list($db_ro);
    29. //send to rw
    30. $sql = "insert into a set a='test'";
    31. $DB->query($sql);
    32. //send to ro
    33. $sql = "select * from a";
    34. $qr = $DB->query($sql);
    35. while($row = $DB->fetch_array($qr)){
    36. echo $row[a];
    37. }
    38. ?>
    复制代码


    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

    Outils d'IA chauds

    Undresser.AI Undress

    Undresser.AI Undress

    Application basée sur l'IA pour créer des photos de nu réalistes

    AI Clothes Remover

    AI Clothes Remover

    Outil d'IA en ligne pour supprimer les vêtements des photos.

    Undress AI Tool

    Undress AI Tool

    Images de déshabillage gratuites

    Clothoff.io

    Clothoff.io

    Dissolvant de vêtements AI

    AI Hentai Generator

    AI Hentai Generator

    Générez AI Hentai gratuitement.

    Article chaud

    R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Meilleurs paramètres graphiques
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Comment réparer l'audio si vous n'entendez personne
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Comment déverrouiller tout dans Myrise
    3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

    Outils chauds

    Bloc-notes++7.3.1

    Bloc-notes++7.3.1

    Éditeur de code facile à utiliser et gratuit

    SublimeText3 version chinoise

    SublimeText3 version chinoise

    Version chinoise, très simple à utiliser

    Envoyer Studio 13.0.1

    Envoyer Studio 13.0.1

    Puissant environnement de développement intégré PHP

    Dreamweaver CS6

    Dreamweaver CS6

    Outils de développement Web visuel

    SublimeText3 version Mac

    SublimeText3 version Mac

    Logiciel d'édition de code au niveau de Dieu (SublimeText3)

    Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

    Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

    Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

    L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

    Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

    Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

    12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

    Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

    Expliquez le concept de liaison statique tardive en PHP. Expliquez le concept de liaison statique tardive en PHP. Mar 21, 2025 pm 01:33 PM

    L'article traite de la liaison statique tardive (LSB) dans PHP, introduite dans PHP 5.3, permettant une résolution d'exécution de la méthode statique nécessite un héritage plus flexible. Problème main: LSB vs polymorphisme traditionnel; Applications pratiques de LSB et perfo potentiel

    Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Mar 28, 2025 pm 05:12 PM

    L'article examine l'ajout de fonctionnalités personnalisées aux cadres, en se concentrant sur la compréhension de l'architecture, l'identification des points d'extension et les meilleures pratiques pour l'intégration et le débogage.

    Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Mar 28, 2025 pm 05:11 PM

    L'article traite des fonctionnalités de sécurité essentielles dans les cadres pour se protéger contre les vulnérabilités, notamment la validation des entrées, l'authentification et les mises à jour régulières.

    See all articles