예제 #1
0
 function Delete($ID)
 {
     global $DB, $CACHE_MANAGER;
     $ID = intval($ID);
     $res = $DB->Query("select ID from b_cluster_dbnode WHERE ID=1 OR MASTER_ID = " . $ID, false, '', array('fixed_connection' => true));
     while ($ar = $res->Fetch()) {
         if (!CClusterSlave::Stop($ar["ID"])) {
             return false;
         }
     }
     if ($res) {
         $res = $DB->Query("DELETE FROM b_cluster_dbnode WHERE ID = " . $ID, false, '', array('fixed_connection' => true));
     }
     if (CACHED_b_cluster_dbnode !== false) {
         $CACHE_MANAGER->CleanDir("b_cluster_dbnode");
     }
     return $res;
 }
예제 #2
0
 function SlaveConnection()
 {
     if (!class_exists('cmodule') || !class_exists('csqlwhere')) {
         return null;
     }
     if (!CModule::IncludeModule('cluster')) {
         return false;
     }
     $arSlaves = CClusterSlave::GetList();
     if (empty($arSlaves)) {
         return false;
     }
     $max_slave_delay = COption::GetOptionInt("cluster", "max_slave_delay", 10);
     if (isset($_SESSION["BX_REDIRECT_TIME"])) {
         $redirect_delay = time() - $_SESSION["BX_REDIRECT_TIME"] + 1;
         if ($redirect_delay > 0 && $redirect_delay < $max_slave_delay) {
             $max_slave_delay = $redirect_delay;
         }
     }
     $total_weight = 0;
     foreach ($arSlaves as $i => $slave) {
         if (defined("BX_CLUSTER_GROUP") && BX_CLUSTER_GROUP != $slave["GROUP_ID"]) {
             unset($arSlaves[$i]);
         } elseif ($slave["ROLE_ID"] == "SLAVE") {
             $arSlaveStatus = CClusterSlave::GetStatus($slave["ID"], true, false, false);
             if ($arSlaveStatus['Seconds_Behind_Master'] > $max_slave_delay || $arSlaveStatus['Last_SQL_Error'] != '' || $arSlaveStatus['Last_IO_Error'] != '' || $arSlaveStatus['Slave_SQL_Running'] === 'No') {
                 unset($arSlaves[$i]);
             } else {
                 $total_weight += $slave["WEIGHT"];
             }
         } else {
             $total_weight += $slave["WEIGHT"];
         }
     }
     $found = false;
     foreach ($arSlaves as $slave) {
         if (mt_rand(0, $total_weight) < $slave["WEIGHT"]) {
             $found = $slave;
             break;
         }
     }
     if (!$found || $found["ROLE_ID"] != "SLAVE") {
         return false;
         //use main connection
     } else {
         ob_start();
         $conn = CDatabase::GetDBNodeConnection($found["ID"], true);
         ob_end_clean();
         if (is_object($conn)) {
             return $conn;
         } else {
             self::$arNodes[$found["ID"]]["ONHIT_ERROR"] = true;
             CClusterDBNode::SetOffline($found["ID"]);
             return false;
             //use main connection
         }
     }
 }
예제 #3
0
 function SetOnLine($node_id, $master_id)
 {
     global $DB;
     $arNode = CClusterDBNode::GetByID($node_id);
     if (!is_array($arNode)) {
         return;
     }
     if ($arNode["ROLE_ID"] == "SLAVE") {
         if ($master_id == 1) {
             $masterDB = $DB;
         } else {
             ob_start();
             $masterDB = CDatabase::GetDBNodeConnection($master_id, true);
             $error = ob_get_contents();
             ob_end_clean();
         }
         $rs = $masterDB->Query("show master status", false, '', array('fixed_connection' => true));
         if ($arMasterStatus = $rs->Fetch()) {
             ob_start();
             $nodeDB = CDatabase::GetDBNodeConnection($arNode["ID"], true);
             $error = ob_get_contents();
             ob_end_clean();
             if (is_object($nodeDB)) {
                 $rs = $nodeDB->Query("\n\t\t\t\t\t\tCHANGE MASTER TO\n\t\t\t\t\t\t\tMASTER_HOST = '" . $DB->ForSQL($arNode["MASTER_HOST"]) . "'\n\t\t\t\t\t\t\t,MASTER_USER = '******'\n\t\t\t\t\t\t\t,MASTER_PASSWORD = '******'\n\t\t\t\t\t\t\t,MASTER_PORT = " . $DB->ForSQL($arNode["MASTER_PORT"]) . "\n\t\t\t\t\t\t\t,MASTER_LOG_FILE = '" . $arMasterStatus["File"] . "'\n\t\t\t\t\t\t\t,MASTER_LOG_POS = " . $arMasterStatus["Position"] . "\n\t\t\t\t\t", false, '', array('fixed_connection' => true));
                 if ($rs) {
                     $rs = $nodeDB->Query("START SLAVE");
                 }
                 if ($rs) {
                     $obNode = new CClusterDBNode();
                     $obNode->Update($node_id, array("MASTER_ID" => $master_id));
                     CClusterDBNode::SetOnline($node_id);
                     CClusterSlave::AdjustServerID($arNode, $nodeDB);
                 }
             }
         }
     } elseif ($arNode["ROLE_ID"] == "MASTER" && preg_match("/^(.+):(\\d+)\$/", $arNode["DB_HOST"], $match)) {
         $rs = $DB->Query("show master status", false, '', array('fixed_connection' => true));
         if ($arMasterStatus = $rs->Fetch()) {
             ob_start();
             $nodeDB = CDatabase::GetDBNodeConnection($arNode["ID"], true);
             $error = ob_get_contents();
             ob_end_clean();
             if (is_object($nodeDB)) {
                 $rs = $nodeDB->Query("STOP SLAVE", true, '', array('fixed_connection' => true));
                 if ($rs) {
                     $rs = $nodeDB->Query("\n\t\t\t\t\t\t\tCHANGE MASTER TO\n\t\t\t\t\t\t\t\tMASTER_HOST = '" . $DB->ForSQL($arNode["MASTER_HOST"]) . "'\n\t\t\t\t\t\t\t\t,MASTER_USER = '******'\n\t\t\t\t\t\t\t\t,MASTER_PASSWORD = '******'\n\t\t\t\t\t\t\t\t,MASTER_PORT = " . $DB->ForSQL($arNode["MASTER_PORT"]) . "\n\t\t\t\t\t\t\t\t,MASTER_LOG_FILE = '" . $arMasterStatus["File"] . "'\n\t\t\t\t\t\t\t\t,MASTER_LOG_POS = " . $arMasterStatus["Position"] . "\n\t\t\t\t\t\t", false, '', array('fixed_connection' => true));
                 }
                 if ($rs) {
                     $rs = $nodeDB->Query("START SLAVE");
                 }
                 if ($rs) {
                     $rs = $nodeDB->Query("show master status", false, '', array('fixed_connection' => true));
                     if ($arMasterStatus = $rs->Fetch()) {
                         $rs = $DB->Query("STOP SLAVE", true, '', array('fixed_connection' => true));
                         if ($rs) {
                             $rs = $DB->Query("\n\t\t\t\t\t\t\t\t\tCHANGE MASTER TO\n\t\t\t\t\t\t\t\t\t\tMASTER_HOST = '" . $DB->ForSQL($match[1]) . "'\n\t\t\t\t\t\t\t\t\t\t,MASTER_USER = '******'\n\t\t\t\t\t\t\t\t\t\t,MASTER_PASSWORD = '******'\n\t\t\t\t\t\t\t\t\t\t,MASTER_PORT = " . $DB->ForSQL($match[2]) . "\n\t\t\t\t\t\t\t\t\t\t,MASTER_LOG_FILE = '" . $arMasterStatus["File"] . "'\n\t\t\t\t\t\t\t\t\t\t,MASTER_LOG_POS = " . $arMasterStatus["Position"] . "\n\t\t\t\t\t\t\t\t", false, '', array('fixed_connection' => true));
                         }
                         if ($rs) {
                             $rs = $DB->Query("START SLAVE");
                         }
                         if ($rs) {
                             $obNode = new CClusterDBNode();
                             $obNode->Update($node_id, array("MASTER_ID" => $master_id));
                             $obNode->Update($master_id, array("MASTER_ID" => $node_id));
                             CClusterDBNode::SetOnline($node_id);
                             CClusterSlave::AdjustServerID($arNode, $nodeDB);
                         }
                     }
                 }
             }
         }
     }
 }
예제 #4
0
 function OnPostForm()
 {
     $wizard =& $this->GetWizard();
     $group_id = intval($wizard->GetVar("group_id"));
     CClusterSlave::SetOnLine($this->arNode["ID"], 1);
     $this->OpenSite();
     $this->location = '/bitrix/admin/cluster_slave_list.php?lang=' . LANGUAGE_ID . '&group_id=' . $group_id;
 }
예제 #5
0
}
$cData = new CClusterDBNode();
$rsData = $cData->GetList(array("ID" => "ASC"), $arFilter);
if (!isset($_SESSION["SLAVE_LIST"])) {
    $_SESSION["SLAVE_LIST"] = array();
}
$rsData = new CAdminResult($rsData, $sTableID);
$Position = 0;
$bNote1Show = false;
$bHasMaster = false;
while ($arRes = $rsData->Fetch()) {
    $row =& $lAdmin->AddRow($arRes["ID"], $arRes);
    if ($arRes["ROLE_ID"] == "MASTER" || $arRes["ROLE_ID"] == "MAIN") {
        $bHasMaster = true;
    }
    $arSlaveStatus = CClusterSlave::GetStatus($arRes["ID"]);
    if (is_array($arSlaveStatus) && $arRes["STATUS"] == "OFFLINE") {
        CClusterDBNode::SetOnline($arRes["ID"]);
        $arRes["STATUS"] = "ONLINE";
    }
    if ($arRes["STATUS"] != "OFFLINE") {
        $uptime = CClusterDBNode::GetUpTime($arRes["ID"]);
    } else {
        $uptime = false;
    }
    if ($arRes["ID"] > 1) {
        $row->AddViewField("ID", '<a href="cluster_slave_edit.php?lang=' . LANGUAGE_ID . '&group_id=' . $arRes["GROUP_ID"] . '&ID=' . $arRes["ID"] . '">' . $arRes["ID"] . '</a>');
    }
    $Seconds_Behind_Master = 0;
    $Slave_IO_Running = 'Yes';
    $bHasSQLError = false;
예제 #6
0
    function OnPostForm()
    {
        $wizard =& $this->GetWizard();
        $group_id = intval($wizard->GetVar("group_id"));
        CClusterSlave::SetOnLine($this->arNode["ID"], $this->arMaster["ID"]);
        $this->OpenSite();
        echo '
		<script>
			top.window.location = \'/bitrix/admin/cluster_slave_list.php?lang=' . LANGUAGE_ID . '&group_id=' . $group_id . '\';
		</script>
		';
    }
예제 #7
0
 /**
  * Creates a new slave connection.
  *
  * @return bool|null|Connection
  * @throws \Bitrix\Main\Config\ConfigurationException
  */
 protected function createSlaveConnection()
 {
     if (!class_exists('csqlwhere')) {
         return null;
     }
     if (!Main\Loader::includeModule('cluster')) {
         return false;
     }
     $found = \CClusterSlave::GetRandomNode();
     if ($found !== false) {
         $node = \CClusterDBNode::GetByID($found["ID"]);
         if (is_array($node) && $node["ACTIVE"] == "Y" && ($node["STATUS"] == "ONLINE" || $node["STATUS"] == "READY")) {
             $parameters = array('host' => $node["DB_HOST"], 'database' => $node["DB_NAME"], 'login' => $node["DB_LOGIN"], 'password' => $node["DB_PASSWORD"]);
             $connection = $this->cloneConnection(self::DEFAULT_CONNECTION_NAME, "node" . $node["ID"], $parameters);
             $connection->setNodeId($node["ID"]);
             return $connection;
         }
     }
     return false;
 }