static 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);
ob_end_clean();
}
$rs = $masterDB->Query("show master status", false, '', ['fixed_connection' => true]);
if ($arMasterStatus = $rs->Fetch())
{
ob_start();
$nodeDB = CDatabase::GetDBNodeConnection($arNode["ID"], true);
ob_end_clean();
if (is_object($nodeDB))
{
$rs = $nodeDB->Query("
CHANGE MASTER TO
MASTER_HOST = '".$DB->ForSQL($arNode["MASTER_HOST"])."'
,MASTER_USER = '".$DB->ForSQL($masterDB->DBLogin)."'
,MASTER_PASSWORD = '".$DB->ForSQL($masterDB->DBPassword)."'
,MASTER_PORT = ".$DB->ForSQL($arNode["MASTER_PORT"])."
,MASTER_LOG_FILE = '".$arMasterStatus["File"]."'
,MASTER_LOG_POS = ".$arMasterStatus["Position"]."
", false, '', ['fixed_connection' => true]);
if ($rs)
{
$rs = $nodeDB->Query("START SLAVE");
}
if ($rs)
{
$obNode = new CClusterDBNode;
$obNode->Update($node_id, ['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, '', ['fixed_connection' => true]);
if ($arMasterStatus = $rs->Fetch())
{
ob_start();
$nodeDB = CDatabase::GetDBNodeConnection($arNode["ID"], true);
ob_end_clean();
if (is_object($nodeDB))
{
$rs = $nodeDB->Query("STOP SLAVE", true, '', ['fixed_connection' => true]);
if($rs)
{
$rs = $nodeDB->Query("
CHANGE MASTER TO
MASTER_HOST = '" . $DB->ForSQL($arNode["MASTER_HOST"]) . "'
,MASTER_USER = '" . $DB->ForSQL($DB->DBLogin) . "'
,MASTER_PASSWORD = '" . $DB->ForSQL($DB->DBPassword) . "'
,MASTER_PORT = " . $DB->ForSQL($arNode["MASTER_PORT"]) . "
,MASTER_LOG_FILE = '" . $arMasterStatus["File"] . "'
,MASTER_LOG_POS = " . $arMasterStatus["Position"] . "
", false, '', ['fixed_connection' => true]);
}
if ($rs)
{
$rs = $nodeDB->Query("START SLAVE");
}
if ($rs)
{
$rs = $nodeDB->Query("show master status", false, '', ['fixed_connection' => true]);
if ($arMasterStatus = $rs->Fetch())
{
$rs = $DB->Query("STOP SLAVE", true, '', ['fixed_connection' => true]);
if ($rs)
{
$rs = $DB->Query("
CHANGE MASTER TO
MASTER_HOST = '" . $DB->ForSQL($match[1]) . "'
,MASTER_USER = '" . $DB->ForSQL($arNode["DB_LOGIN"]) . "'
,MASTER_PASSWORD = '" . $DB->ForSQL($arNode["DB_PASSWORD"]) . "'
,MASTER_PORT = " . $DB->ForSQL($match[2]) . "
,MASTER_LOG_FILE = '" . $arMasterStatus["File"] . "'
,MASTER_LOG_POS = " . $arMasterStatus["Position"] . "
", false, '', ['fixed_connection' => true]);
}
if ($rs)
{
$rs = $DB->Query("START SLAVE");
}
if ($rs)
{
$obNode = new CClusterDBNode;
$obNode->Update($node_id, ['MASTER_ID' => $master_id]);
$obNode->Update($master_id, ['MASTER_ID' => $node_id]);
CClusterDBNode::SetOnline($node_id);
CClusterSlave::AdjustServerID($arNode, $nodeDB);
}
}
}
}
}
}
}