mysql 프록시 읽기-쓰기 분리 구성 및 php mysql 읽기-쓰기 분리 클래스

WBOY
풀어 주다: 2016-07-25 08:56:03
원래의
1217명이 탐색했습니다.
  1. mysql-proxy
  2. –proxy-backend-addresses=narcissus:3306
  3. –proxy-backend-addresses=nostromo:3306
코드 복사

3. 데이터베이스 읽기와 쓰기가 분리되어 있으며, 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. 프록시의 읽기-쓰기 분리 메커니즘은 먼저 처음 몇 개의 쿼리를 마스터에 보내 연결을 설정하는 것입니다. 마스터로 전송된 쿼리 개수가 연결 풀의 최소값을 초과하면 쿼리가 시작됩니다

2. LAST_INSERT_ID를 메인 서버로 보낼 수 없습니다. 226번째 줄을 다음과 같이 변경하세요. elseif가 is_insert_id 및 token.token_name == "TK_FUNCTION"이 아니면

3. 기본 rw-splitting.lua를 사용하면 프록시 명령을 찾을 수 없다는 메시지가 표시됩니다. mysql-proxy 경로를 시스템 경로로 설정한 다음 Everything을 실행합니다. 작동 중 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. var $ro_exist = false;
  11. //읽기 전용 데이터베이스 연결
  12. var $link_ro = null
  13. //읽기-쓰기 데이터베이스 연결
  14. var $link_rw = null;
  15. function mysql_rw_php(){
  16. }
  17. function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE) {
  18. if($pconnect) {
  19. if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
  20. $halt && $this -> quit('MySQL 서버에 연결할 수 없습니다.')
  21. }
  22. } else {
  23. if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw) ) {
  24. $halt && $this->halt('MySQL 서버에 연결할 수 없습니다.')
  25. }
  26. }
  27. //읽기 전용 연결 실패
  28. if (!$this ->link && !$halt) return false
  29. //rw가 초기화되지 않은 경우 첫 번째 연결은 rw로 사용됩니다.
  30. if($this->link_rw == null)
  31. $ this->link_rw = $this->link;
  32. if($this->version() > '4.1') {
  33. if($this- >charset) {
  34. @mysql_query("SET Character_set_connection=$this->charset, Character_set_results=$this->charset, Character_set_client=binary", $this->link)
  35. }
  36. if($this- >version() > '5.0.1') {
  37. @mysql_query("SET sql_mode=''", $this->link)
  38. }
  39. }
  40. if($ dbname) {
  41. $this->select_db($dbname);
  42. }
  43. }
  44. //읽기 전용 mysql 데이터베이스 연결
  45. 함수 connect_ro($dbhost, $ dbuser, $dbpw, $dbname = '', $pconnect = 0){
  46. if($this->link_rw == null)
  47. $this->link_rw = $this ->link;
  48. $this->link = null;
  49. //정지 오류가 발생하지 않습니다
  50. $this->connect($dbhost, $dbuser, $dbpw, $dbname, $ pconnect, false)
  51. if($this->link){
  52. //연결 성공
  53. //echo "link ro sussess!
    "; ro_exist = true;
  54. $this->link_ro = $this->link;
  55. if($this->cur_db){
  56. //이미 데이터베이스를 선택했다면 한 번만 실행하세요
  57. @mysql_select_db($this- >cur_db, $this->link_ro)
  58. }
  59. }else{
  60. //연결 실패
  61. //echo "link ro failed!
    ";
  62. $ this->link = &$this->link_rw;
  63. }
  64. }
  65. //일련의 읽기 전용 설정 데이터베이스를 선택하고 그 중 하나에 연결
  66. function set_ro_list($ro_list){
  67. if(is_array($ro_list)){
  68. //중 하나를 무작위로 선택
  69. $link_ro = $ro_list[array_rand( $ro_list)];
  70. $this->connect_ro($link_ro[ 'dbhost'], $link_ro['dbpw'])
  71. }
  72. }
  73. function select_db($dbname) {
  74. // 동시 작업 두 개의 데이터베이스 연결
  75. $this->cur_db = $dbname;
  76. if($this->ro_exist){
  77. @mysql_select_db($dbname, $this->link_ro)
  78. }
  79. return @mysql_select_db($dbname, $this->link_rw)
  80. }
  81. function fetch_array($ query, $result_type = MYSQL_ASSOC) {
  82. return mysql_fetch_array($query, $result_type);
  83. }
  84. function fetch_one_array($sql, $type = '') {
  85. $qr = $this->query($sql, $type);
  86. return $this->fetch_array($qr)
  87. }
  88. 함수 쿼리($sql, $type = '' ) {
  89. $this->link = &$this-> ;link_rw;
  90. //문 선택 여부 결정
  91. if($this->ro_exist && preg_match ("/^(s *)select/i", $sql)){
  92. $this-> ;link = &$this->link_ro;
  93. }
  94. $func = $type == 'UNBUFFERED' && @function_exists ('mysql_unbuffered_query') ?
  95. 'mysql_unbuffered_query' : 'mysql_query';
  96. if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {
  97. $this->halt('MySQL 쿼리 오류', $sql )
  98. }
  99. $this->querynum
  100. return $query;
  101. function Affected_rows() {
  102. return mysql_affected_rows($this->link);
  103. }
  104. function error() {
  105. return (($this->link) ? mysql_error($this->link) : mysql_error());
  106. }
  107. function errno() {
  108. return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
  109. }
  110. 함수 결과($query, $row) {
  111. $query = @mysql_result($query, $row);
  112. $query를 반환합니다.
  113. }
  114. function num_rows($query) {
  115. $query = mysql_num_rows($query);
  116. $query를 반환합니다.
  117. }
  118. function num_fields($query) {
  119. return mysql_num_fields($query);
  120. }
  121. function free_result($query) {
  122. return mysql_free_result($query);
  123. }
  124. function insert_id() {
  125. return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
  126. }
  127. function fetch_row($query) {
  128. $query = mysql_fetch_row($query);
  129. $query를 반환합니다.
  130. }
  131. function fetch_fields($query) {
  132. return mysql_fetch_field($query);
  133. }
  134. function version() {
  135. return mysql_get_server_info($this->link);
  136. }
  137. function close() {
  138. return mysql_close($this->link);
  139. }
  140. function hang($message = '', $sql = '') {
  141. $dberror = $this->error();
  142. $dberrno = $this->errno();
  143. echo "
  144. MySQL 오류
  145. 메시지: $message
  146. SQL: $sql
    b>오류: $dberror
  147. 오류 번호.: $dberrno
";
  • 종료();
  • }
  • }
  • ?>
  • 复代码 调用示例:

    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 (uhome)
    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 = new mysql_rw_php;
    23. //커넥트 마스터
    24. $DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);
    25. //방법 1: 하나의 서버 연결
    26. $DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw] );
    27. //방법 2: 목록에서 하나의 서버를 rand로 연결
    28. $DB->set_ro_list($db_ro);
    29. //rw로 보내기
    30. $sql = "세트 a='test'에 삽입";
    31. $DB->query($sql);
    32. //ro로 보내기
    33. $sql = "select * from a";
    34. $qr = $DB->query($sql);
    35. while($row = $DB->fetch_array($qr)){
    36. echo $row[a];
    37. }
    38. ?>
    复代码

    원천:php.cn
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿