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; }
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 } } }
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); } } } } } } }
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; }
} $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;
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> '; }
/** * 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; }