锟斤拷锟今级憋拷锟揭伙拷锟斤拷锟�

Note: 锟芥本锟斤拷锟斤拷

锟斤拷锟今级憋拷锟角达拷 1.2.0-alpha锟芥本锟斤拷锟斤拷模锟�mysqlnd_ms_set_qos() 锟斤拷 PHP 5.4.0 锟芥本锟斤拷始锟斤拷锟斤拷使锟矫★拷

锟斤拷同锟斤拷锟酵碉拷 MySQL 群锟斤拷锟结供锟剿o拷锟斤拷同锟侥凤拷锟斤拷锟斤拷锟斤拷锟揭伙拷锟斤拷约锟斤拷锟斤拷觳斤拷锟� MySQL 锟斤拷锟斤拷同锟斤拷 锟结供锟斤拷锟秸碉拷锟斤拷锟斤拷一锟斤拷锟皆o拷一锟斤拷锟斤拷锟斤拷锟斤拷锟角凤拷锟杰癸拷锟矫碉拷锟斤拷前锟斤拷锟斤拷锟捷★拷状态锟斤拷一锟斤拷锟斤拷 slave 锟角凤拷锟窖撅拷锟斤拷 master 锟斤拷取锟斤拷锟斤拷锟侥革拷锟铰★拷

使锟斤拷 MySQL 锟斤拷锟斤拷同锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫э拷裕锟斤拷锟斤拷栈锟斤拷锟斤拷锟斤拷莸锟揭伙拷锟斤拷浴锟饺伙拷锟斤拷锟� 状态锟斤拷锟斤拷锟角诧拷锟斤拷同锟斤拷锟侥★拷锟斤拷锟斤拷锟斤拷只锟斤拷指锟斤拷锟斤拷 slave 锟斤拷锟斤拷 master 锟斤拷锟接诧拷锟杰得碉拷锟斤拷锟斤拷锟斤拷锟捷★拷

锟斤拷 1.2.0 锟芥本锟斤拷始锟斤拷锟斤拷锟斤拷芄锟斤拷远锟斤拷慕锟斤拷锟� MySQL 锟斤拷锟斤拷同锟斤拷锟侥节点,锟斤拷锟斤拷锟� session 一锟斤拷锟斤拷 锟斤拷锟斤拷锟斤拷珊锟角匡拷锟揭伙拷锟斤拷锟揭拷锟絪ession 一锟斤拷锟斤拷锟斤拷指一锟斤拷锟酵伙拷锟剿匡拷锟皆讹拷取锟斤拷锟斤拷写锟斤拷锟斤拷锟捷o拷 锟斤拷锟斤拷锟酵伙拷锟剿匡拷锟杰诧拷锟杰匡拷锟斤拷锟斤拷锟斤拷写锟斤拷锟斤拷锟捷★拷锟斤拷强锟斤拷一锟斤拷锟斤拷要锟斤拷锟斤拷指锟斤拷锟叫客伙拷锟剿讹拷锟杰癸拷锟斤拷锟斤拷 锟斤拷锟斤拷锟斤拷锟叫客伙拷锟剿碉拷写锟斤拷锟斤拷锟捷★拷

Example #1 session 一锟斤拷锟皆o拷锟斤拷取写锟斤拷锟斤拷锟斤拷

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "127.0.0.1",
                "port": "3306"
            }
        }
    }
}

Example #2 Requesting session consistency

<?php
$mysqli 
= new mysqli("myapp""username""password""database");
if (!
$mysqli)
  
/* Of course, your error handling is nicer... */
  
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));

/* 使锟斤拷 master 锟斤拷啥锟叫达拷锟斤拷锟� */
if (!$mysqli->query("INSERT INTO orders(order_id, item) VALUES (1, 'christmas tree, 1.8m')")) {
   
/* Please use better error handling in your code */
  
die(sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));
}

/* 要锟斤拷 session 一锟斤拷锟皆o拷锟斤拷取写锟斤拷锟斤拷锟斤拷 */
if (!mysqlnd_ms_set_qos($mysqliMYSQLND_MS_QOS_CONSISTENCY_SESSION))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));

/* 锟斤拷锟窖★拷锟揭伙拷锟斤拷谋锟斤拷锟斤拷莸慕诘悖拷锟斤拷锟斤拷锟� master */
if (!$res $mysqli->query("SELECT item FROM orders WHERE order_id = 1"))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));

var_dump($res->fetch_assoc());

/* 锟斤拷锟截碉拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷状态锟斤拷锟斤拷锟斤拷戮锟斤拷锟斤拷锟� */
if (!mysqlnd_ms_set_qos($mysqliMYSQLND_MS_QOS_CONSISTENCY_EVENTUAL))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));

/* 锟斤拷锟窖★拷锟斤拷魏锟揭伙拷锟� slaver 锟斤拷锟斤拷锟斤拷锟铰撅拷锟斤拷锟捷的讹拷取 */
if (!$res $mysqli->query("SELECT item, price FROM specials"))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));
?>

锟斤拷锟今级憋拷锟斤拷员锟叫达拷诓锟斤拷锟斤拷锟斤拷锟斤拷锟侥硷拷锟叫o拷也锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷时使锟斤拷 mysqlnd_ms_set_qos() 锟借定锟斤拷 锟节凤拷锟斤拷锟叫o拷使锟斤拷锟斤拷锟斤拷锟斤拷锟角匡拷锟� session 一锟斤拷锟皆o拷直锟斤拷锟劫达拷通知锟侥变。 orders 锟斤拷锟叫碉拷 SELECT 锟斤拷锟斤拷锟角帮拷锟叫达拷锟绞癸拷玫锟� 锟斤拷锟斤拷锟斤拷执锟叫★拷锟斤拷写锟斤拷锟斤拷锟竭硷拷锟斤拷锟斤拷锟今级憋拷锟斤拷愿谋洹�

锟节达拷 orders 锟斤拷锟斤拷取锟斤拷锟斤拷锟皆后,恢革拷锟斤拷默锟较的凤拷锟今级憋拷 (锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷)锟斤拷 锟斤拷时锟斤拷锟斤拷锟街达拷锟窖★拷锟侥凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟劫憋拷锟斤拷锟狡o拷锟斤拷锟斤拷锟� specials 锟斤拷锟斤拷锟斤拷锟斤拷 SELECT 锟斤拷询锟斤拷锟斤拷一锟斤拷 slave 锟斤拷锟斤拷锟斤拷锟叫斤拷锟叫★拷

一锟斤拷锟铰碉拷锟斤拷锟� SQL hint锟侥癸拷锟杰o拷master_on_write 锟斤拷锟斤拷锟借定锟斤拷 锟节撅拷锟襟部凤拷锟斤拷锟斤拷锟� mysqlnd_ms_set_qos() 锟斤拷锟斤拷锟斤拷使锟矫o拷 使锟斤拷锟斤拷锟斤拷植锟皆革拷锟矫★拷

Example #3 Maximum age/slave lag

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "127.0.0.1",
                "port": "3306"
            }
        },
        "failover" : "master"
    }
}

Example #4 锟斤拷锟斤拷 slave 锟接筹拷

<?php
$mysqli 
= new mysqli("myapp""username""password""database");
if (!
$mysqli)
  
/* Of course, your error handling is nicer... */
  
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));

/* 锟斤拷 slave 锟接迟诧拷锟斤拷锟斤拷 4 锟诫,锟斤拷锟� Slave 锟斤拷取 */
$ret mysqlnd_ms_set_qos($mysqli,
         
MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL,
         
MYSQLND_MS_QOS_OPTION_AGE4);

if (!
$ret)
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));

/* 选锟斤拷一锟斤拷 slave锟斤拷锟斤拷锟斤拷锟斤拷没锟叫改憋拷 */
if (!$res $mysqli->query("SELECT item, price FROM daytrade"))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));


/* 锟街革拷默锟斤拷状态锟斤拷使锟斤拷锟斤拷锟叫碉拷 slave 锟斤拷 master */
if (!mysqlnd_ms_set_qos($mysqliMYSQLND_MS_QOS_CONSISTENCY_EVENTUAL))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));
?>

锟斤拷锟斤拷一锟斤拷锟皆凤拷锟今级憋拷锟斤拷锟绞癸拷锟揭伙拷锟斤拷锟窖★拷牟锟斤拷锟斤拷瓒拷锟斤拷锟斤拷锟斤拷锟斤拷映伲锟斤拷锟斤拷锟窖★拷锟� slave锟斤拷 锟斤拷锟斤拷瓒拷锟斤拷值锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� slave 锟斤拷 SHOW SLAVE STATUS锟斤拷 锟节凤拷锟斤拷锟叫o拷只锟斤拷锟斤拷锟斤拷 Slave_IO_Running=Yes, Slave_SQL_Running=Yes 锟斤拷 Seconds_Behind_Master <= 4 锟斤拷 slave 锟结被执锟斤拷锟斤拷锟� SELECT item, price FROM daytrade锟斤拷

锟斤拷应锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷透锟斤拷锟斤拷执锟斤拷 SHOW SLAVE STATUS 锟斤拷锟筋。 锟轿何达拷锟斤拷锟斤拷锟� warning 锟侥凤拷式锟斤拷锟斤拷锟斤拷锟斤拷锟角达拷锟斤拷锟斤拷息锟斤拷锟结被锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫★拷 锟斤拷使锟斤拷锟叫碉拷 SHOW SLAVE STATUS 锟斤拷失锟斤拷锟剿o拷锟矫伙拷锟斤拷执锟斤拷锟斤拷锟斤拷也锟斤拷锟结被锟斤拷止锟斤拷 锟斤拷锟斤拷锟斤拷 master 锟斤拷为锟斤拷锟斤拷选锟斤拷然锟斤拷应锟矫诧拷锟斤拷要锟斤拷锟轿何碉拷锟斤拷锟斤拷

Note: 锟斤拷时锟酵伙拷锟斤拷锟侥诧拷锟斤拷

锟斤拷锟轿何筹拷锟斤拷目锟绞硷拷锟斤拷锟斤拷锟斤拷械锟� slave 锟斤拷锟斤拷 SHOW SLAVE STATUS 锟斤拷询锟斤拷锟斤拷一锟斤拷锟角筹拷锟斤拷时锟酵伙拷锟斤拷锟侥诧拷锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷MySQL 锟斤拷锟斤拷同锟斤拷锟斤拷群锟斤拷没锟斤拷 锟结供一锟斤拷锟酵伙拷锟剿达拷一锟斤拷锟斤拷锟侥匡拷锟斤拷锟斤拷锟斤拷取锟斤拷选锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 然锟斤拷锟斤拷没锟叫革拷锟斤拷锟斤拷效锟侥凤拷式锟斤拷取 slave 锟接迟★拷

锟斤拷注锟解,锟斤拷锟斤拷 SHOW SLAVE STATUS 锟侥革拷锟斤拷锟斤拷锟狡和诧拷锟斤拷说锟斤拷锟斤拷 锟斤拷慰锟� MySQl 锟侥参匡拷锟街册。

锟斤拷要锟斤拷止锟斤拷锟斤拷锟斤拷锟矫伙拷锟斤拷业锟斤拷锟斤拷锟斤拷映锟斤拷锟斤拷锟斤拷锟� slave 时锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟斤拷锟侥硷拷 锟斤拷锟斤拷锟借定 master 锟斤拷为锟斤拷锟较达拷锟斤拷锟斤拷锟矫伙拷锟� slave 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷么锟斤拷锟较达拷锟斤拷始锟斤拷锟斤拷锟斤拷 锟斤拷锟斤拷锟绞癸拷锟� master 去执锟斤拷锟斤拷洹�

锟斤拷锟矫伙拷锟� slave 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷没锟斤拷锟斤拷锟斤拷锟斤拷锟较达拷锟斤拷锟斤拷锟斤拷锟斤拷岜拷锟斤拷锟� 锟斤拷时锟斤拷锟斤拷洳伙拷岜恢达拷校锟斤拷锟斤拷掖锟斤拷锟斤拷锟较拷岜恍达拷锟斤拷锟斤拷拥锟斤拷小锟�

Example #5 锟斤拷锟斤拷锟矫癸拷锟较达拷锟斤拷

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "127.0.0.1",
                "port": "3306"
            }
        }
    }
}

Example #6 No slave within time limit

<?php
$mysqli 
= new mysqli("myapp""username""password""database");
if (!
$mysqli)
  
/* Of course, your error handling is nicer... */
  
die(sprintf("[%d] %s\n"mysqli_connect_errno(), mysqli_connect_error()));

/* 锟斤拷 slave 锟接迟诧拷锟斤拷锟斤拷 4 锟诫,锟斤拷锟� slave 执锟斤拷 */
$ret mysqlnd_ms_set_qos($mysqli,
         
MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL,
         
MYSQLND_MS_QOS_OPTION_AGE4);

if (!
$ret)
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));

/* Plugin picks any slave, which may or may not have the changes */
if (!$res $mysqli->query("SELECT item, price FROM daytrade"))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));


/* Back to default: use of all slaves and masters permitted */
if (!mysqlnd_ms_set_qos($mysqliMYSQLND_MS_QOS_CONSISTENCY_EVENTUAL))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

PHP Warning:  mysqli::query(): (mysqlnd_ms) Couldn't find the appropriate slave connection. 0 slaves to choose from. Something is wrong in %s on line %d
PHP Warning:  mysqli::query(): (mysqlnd_ms) No connection selected by the last filter in %s on line %d
[2000] (mysqlnd_ms) No connection selected by the last filter