Php/docs/mysqlnd-ms.quickstart.failover

来自菜鸟教程
跳转至:导航、​搜索

故障转移

默认情况下,插件并不会在连接一个服务器失败的时候进行故障处理。这是为了防止 连接状态中的陷阱。 这里建议手动的对连接错误进行处理,你可以捕获这个错误,重新建立连接,执行的你的查询,如同下面展示的那样。

如果连接状态并不是由于你的操作引起的,你可以选择自动进行错误处理或者无视他。 通过配置可以实现,当 master 出现故障,可以在重新连接 master 之前,自动尝试连接 一台 slave 去自动处理故障,或者无视这个错误。因为 自动故障转移 并不是一个十分安全的方式,这里就不做过多讨论了,在 concepts section 中会有更多的说明。

Example #1 手动故障转移,可选自动

{
    "myapp": {
        "master": {
            "master_0": {
                "host": "localhost",
                "socket": "\/tmp\/mysql.sock"
            }
        },
        "slave": {
            "slave_0": {
                "host": "simulate_slave_failure",
                "port": "0"
            },
            "slave_1": {
                "host": "127.0.0.1",
                "port": 3311
            }
        },
       "filters": { "roundrobin": [] }
    }
 }

Example #2 手动故障转移

<?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()));$sql = "SELECT 1 FROM DUAL";/* error handling as it should be done regardless of the plugin */if (!($res = $link->query($sql))) {  /* plugin specific: check for connection error */  switch ($link->errno) {    case 2002:    case 2003:    case 2005:      printf("Connection error - trying next slave!\n");      /* load balancer will pick next slave */      $res = $link->query($sql);      break;    default:      /* no connection error, failover is unlikely to help */      die(sprintf("SQL error: [%d] %s", $link->errno, $link->error));      break;  }}if ($res) {  var_dump($res->fetch_assoc());}?>