-
- mysql-proxy
- –proxy-backend-addresses=narcissus:3306
- –proxy-backend-addresses=nostromo:3306
コードをコピー
3. データベースの読み取りと書き込みの分離、192.168.18 .11 0 Enter は書き込みを担当し、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 番目の方法を参照してください。
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サーバーを設定する必要があります
-
- 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->halt('Can 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("SETcharacter_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); ($dbname) {
- $this->select_db($dbname);
- }
- }
-
- //読み取り専用の mysql データベースに接続します
- function connect_ro($dbhost, $dbuser, $dbpw, $dbname = '' , $pconnect = 0) {
- if($this->link_rw == null)
- $this->link_rw = $this->link = null;
- //停止なしエラー
- $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false);
- if($this->link){
- //接続成功
- //echo "link ro sussess!
$this->ro_exist = true; - $this->link_ro = $this->link;
- if($this->cur_db){
- //データベースの場合選択されているため、操作が必要です Once
- @mysql_select_db($this->cur_db, $this->link_ro)
- }
- }else{
- //接続に失敗しました
- //echo "link ro failed!
$this- >link = &$this->link_rw;
- }
- }
-
- //一連の読み取り専用データベースを設定し、そのうちの 1 つに接続します
- function set_ro_list($ro_list){
- if(is_array($ro_list)){
- / /ランダムに 1 つを選択
- $link_ro = $ro_list[array_rand($ro_list)]
- $this->connect_ro($link_ro['dbhost'], $link_ro ['dbuser'], $link_ro['dbpw'] ; $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); }
-
- function query($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' ? (!($query = $sql, $ this->link)) && $type != 'SILENT' ) {
- $this->halt('MySQL クエリ エラー', $sql);
- $this->querynum++;
- return $query;
- }
-
- functionaffected_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());
- }
-
- 関数 result($query, $row) {
- $query = @mysql_result($query, $row);
- $query を返す;
- }
-
- 関数 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);
- }
-
- 関数 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 halt($message = '', $sql = '') {
- $dberror = $this->error();
- $dberrno = $this->errno();
- echo "
- MySQL エラー
- メッセージ: $message
- SQL
- エラー ;br>
- エラー: $dberrno
-
- exit();
- }
- }
- ?>
复制代
调用例:
-
- /*****************************************
- *** mysql-rw-php バージョン 0.1
- *** http://bbs.it-home.org
- *** http://code.google.com/p/mysql-rw-php/
- *** class_mysql.php (uchome) からコードを修正します
- ***************************************/
-
- 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 = 新しい mysql_rw_php;
-
- //マスターに接続します
- $DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);
-
- //方法 1: 1 つのサーバーに接続します
- $DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]);
-
- //方法 2: rand によりリストから 1 つのサーバーに接続します
- $DB->set_ro_list($db_ro);
-
- //rw に送信
- $sql = "セットに挿入 a='test'";
- $DB->クエリ($sql);
-
- //ro に送信
- $sql = "select * from a";
- $qr = $DB->クエリ($sql);
- while($row = $DB->fetch_array($qr)){
- echo $row[a];
- }
- ?>
复制發
|