-
- mysql-proxy
- –proxy-backend-addresses=narcissus:3306
- –proxy-backend-addresses=nostromo:3306
코드 복사
3. 데이터베이스 읽기와 쓰기가 분리되어 있으며, 192.168.18.107은 데이터 읽기를 담당합니다. 물론 서버도 추가할 수 있습니다. 데이터 읽기용.
-
- mysql-proxy
- –proxy-backend-addresses=192.168.18.110:3306
- –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 서버를 설정해야 합니다
-
- class mysql_rw_php {
- //쿼리 수
- var $querynum = 0
- //현재 작업 데이터베이스 연결
- var $link = null
- //문자 집합
- var $charset;
- //현재 데이터베이스
- var $cur_db = ''; 유효한 읽기 전용 데이터베이스 연결이 있습니다
- var $ro_exist = false;
- //읽기 전용 데이터베이스 연결
- var $link_ro = null
- //읽기-쓰기 데이터베이스 연결
- var $link_rw = null;
-
- function mysql_rw_php(){
- }
-
- function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $halt = TRUE) {
- if($pconnect) {
- if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
- $halt && $this -> quit('MySQL 서버에 연결할 수 없습니다.')
- }
- } else {
- if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw) ) {
- $halt && $this->halt('MySQL 서버에 연결할 수 없습니다.')
- }
- }
-
- //읽기 전용 연결 실패
- if (!$this ->link && !$halt) return false
-
- //rw가 초기화되지 않은 경우 첫 번째 연결은 rw로 사용됩니다.
- if($this->link_rw == null)
- $ this->link_rw = $this->link;
-
- if($this->version() > '4.1') {
- if($this- >charset) {
- @mysql_query("SET Character_set_connection=$this->charset, Character_set_results=$this->charset, Character_set_client=binary", $this->link)
- }
- if($this- >version() > '5.0.1') {
- @mysql_query("SET sql_mode=''", $this->link)
- }
- }
- if($ dbname) {
- $this->select_db($dbname);
- }
- }
-
- //읽기 전용 mysql 데이터베이스 연결
- 함수 connect_ro($dbhost, $ dbuser, $dbpw, $dbname = '', $pconnect = 0){
- if($this->link_rw == null)
- $this->link_rw = $this ->link;
- $this->link = null;
- //정지 오류가 발생하지 않습니다
- $this->connect($dbhost, $dbuser, $dbpw, $dbname, $ pconnect, false)
- if($this->link){
- //연결 성공
- //echo "link ro sussess!
"; ro_exist = true;
- $this->link_ro = $this->link;
- if($this->cur_db){
- //이미 데이터베이스를 선택했다면 한 번만 실행하세요
- @mysql_select_db($this- >cur_db, $this->link_ro)
- }
- }else{
- //연결 실패
- //echo "link ro failed!
";
- $ this->link = &$this->link_rw;
- }
- }
-
- //일련의 읽기 전용 설정 데이터베이스를 선택하고 그 중 하나에 연결
- function set_ro_list($ro_list){
- if(is_array($ro_list)){
- //중 하나를 무작위로 선택
- $link_ro = $ro_list[array_rand( $ro_list)];
- $this->connect_ro($link_ro[ 'dbhost'], $link_ro['dbpw'])
- }
- }
-
- function select_db($dbname) {
- // 동시 작업 두 개의 데이터베이스 연결
- $this->cur_db = $dbname;
- if($this->ro_exist){
- @mysql_select_db($dbname, $this->link_ro)
- }
- return @mysql_select_db($dbname, $this->link_rw)
- }
-
- function fetch_array($ query, $result_type = MYSQL_ASSOC) {
- return mysql_fetch_array($query, $result_type);
- }
-
- function fetch_one_array($sql, $type = '') {
- $qr = $this->query($sql, $type);
- return $this->fetch_array($qr)
- }
-
- 함수 쿼리($sql, $type = '' ) {
- $this->link = &$this-> ;link_rw;
- //문 선택 여부 결정
- if($this->ro_exist && preg_match ("/^(s *)select/i", $sql)){
- $this-> ;link = &$this->link_ro;
- }
- $func = $type == 'UNBUFFERED' && @function_exists ('mysql_unbuffered_query') ?
- 'mysql_unbuffered_query' : 'mysql_query';
- if(!($query = $func($sql, $this->link)) && $type != 'SILENT') {
- $this->halt('MySQL 쿼리 오류', $sql )
- }
- $this->querynum
- return $query;
-
- function Affected_rows() {
- return mysql_affected_rows($this->link);
- }
-
- function error() {
- return (($this->link) ? mysql_error($this->link) : mysql_error());
- }
-
- function errno() {
- return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
- }
-
- 함수 결과($query, $row) {
- $query = @mysql_result($query, $row);
- $query를 반환합니다.
- }
-
- function num_rows($query) {
- $query = mysql_num_rows($query);
- $query를 반환합니다.
- }
-
- function num_fields($query) {
- return mysql_num_fields($query);
- }
-
- function free_result($query) {
- return mysql_free_result($query);
- }
-
- function insert_id() {
- return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
- }
-
- function fetch_row($query) {
- $query = mysql_fetch_row($query);
- $query를 반환합니다.
- }
-
- function fetch_fields($query) {
- return mysql_fetch_field($query);
- }
-
- function version() {
- return mysql_get_server_info($this->link);
- }
-
- function close() {
- return mysql_close($this->link);
- }
-
- function hang($message = '', $sql = '') {
- $dberror = $this->error();
- $dberrno = $this->errno();
- echo "
- MySQL 오류
- 메시지: $message
- SQL: $sql
b>오류: $dberror
- 오류 번호.: $dberrno
-
";
- 종료();
- }
- }
- ?>
-
复代码
调用示例:
- /****************************************
- *** mysql-rw-php 버전 0.1
- *** http://bbs.it-home.org
- *** http://code.google.com/p/mysql-rw-php/
- *** 코드 수정 class_mysql.php (uhome)
- ********************************************에서*/
-
- require_once('mysql_rw_php.class.php');
-
- //rw 정보
- $db_rw = array(
- 'dbhost'=>'bbs.it-home.org',
- 'dbuser'=>'jbxue',
- 'dbpw'=>'bbs.it-home.org',
- 'dbname'=>'test'
- );
-
- $db_ro = array(
- array(
- 'dbhost'=>'bbs.it-home.org:4306',
- 'dbuser'=>'jbxue',
- 'dbpw'=>'bbs.it-home.org'
- )
- );
-
- $DB = new mysql_rw_php;
-
- //커넥트 마스터
- $DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);
-
- //방법 1: 하나의 서버 연결
- $DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw] );
-
- //방법 2: 목록에서 하나의 서버를 rand로 연결
- $DB->set_ro_list($db_ro);
-
- //rw로 보내기
- $sql = "세트 a='test'에 삽입";
- $DB->query($sql);
-
- //ro로 보내기
- $sql = "select * from a";
- $qr = $DB->query($sql);
- while($row = $DB->fetch_array($qr)){
- echo $row[a];
- }
- ?>
-
复代码
|