• Модуль: cluster
  • Путь к файлу: ~/bitrix/modules/cluster/classes/mysql/slave.php
  • Класс: CClusterSlave
  • Вызов: CClusterSlave::SetOnLine
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);
						}
					}
				}
			}
		}
	}
}