• Модуль: cluster
  • Путь к файлу: ~/bitrix/modules/cluster/classes/mysql/dbnode_check.php
  • Класс: CClusterDBNodeCheck
  • Вызов: CClusterDBNodeCheck::SlaveNodeForMaster
function SlaveNodeForMaster($nodeDB)
{
	global $DB;
	$result = array();

	$arMasters = array();

	$cData = new CClusterDBNode;
	$rsData = $cData->GetList(
		array(//Order
			"ID" => "ASC",
		)
		,array(//Filter
			"=ROLE_ID" => array("MAIN", "MASTER"),
		)
	);
	while($arData = $rsData->Fetch())
		$arMasters[$arData["ID"]] = $arData;

	$arMasters["v99"] = array();//virtual connection must be alredy setup

	foreach($arMasters as $node_id => $arNode)
	{
		if($node_id == 1)
			$nodeDB = $DB;
		else
			$nodeDB = CDatabase::GetDBNodeConnection($node_id, true);
		$arMasters[$node_id]["DB"] = $nodeDB;
	}

	$auto_increment_increment = count($arMasters);
	$bIncIsOK = true;
	foreach($arMasters as $node_id => $arNode)
	{
		$inc = $this->GetServerVariable($arNode["DB"], "auto_increment_increment");
		if($inc != $auto_increment_increment)
		{
			$bIncIsOK = false;
			if($node_id == "v99")
				$result[$node_id."_auto_increment_increment"] = array(
					"IS_OK" => CClusterDBNodeCheck::ERROR,
					"MESSAGE" => GetMessage("CLU_AUTO_INCREMENT_INCREMENT_NODE_ERR_MSG", array("#value#" => $auto_increment_increment, "#current#" => $inc)),
					"WIZ_REC" => GetMessage("CLU_AUTO_INCREMENT_INCREMENT_WIZREC", array("#value#" => $auto_increment_increment)),
				);
			else
				$result[$node_id."_auto_increment_increment"] = array(
					"IS_OK" => CClusterDBNodeCheck::ERROR,
					"MESSAGE" => GetMessage("CLU_AUTO_INCREMENT_INCREMENT_ERR_MSG", array("#node_id#" => $node_id, "#value#" => $auto_increment_increment, "#current#" => $inc)),
					"WIZ_REC" => GetMessage("CLU_AUTO_INCREMENT_INCREMENT_WIZREC", array("#value#" => $auto_increment_increment)),
				);
		}
	}
	if($bIncIsOK)
	{
		$result["_auto_increment_increment"] = array(
			"IS_OK" => CClusterDBNodeCheck::OK,
			"MESSAGE" => GetMessage("CLU_AUTO_INCREMENT_INCREMENT_OK_MSG", array("#value#" => $auto_increment_increment)),
			"WIZ_REC" => "",
		);
	}

	$auto_increment_offset = array();
	$bIncIsOK = true;
	foreach($arMasters as $node_id => $arNode)
	{
		$offset = $this->GetServerVariable($arNode["DB"], "auto_increment_offset");
		$mod = $offset % $auto_increment_increment;

		if(array_key_exists($mod, $auto_increment_offset))
		{
			$bIncIsOK = false;
			if($node_id == "v99")
				$result[$node_id."_auto_increment_offset"] = array(
					"IS_OK" => CClusterDBNodeCheck::ERROR,
					"MESSAGE" => GetMessage("CLU_AUTO_INCREMENT_OFFSET_NODE_ERR_MSG", array("#current#" => $offset)),
					"WIZ_REC" => GetMessage("CLU_AUTO_INCREMENT_OFFSET_WIZREC", array("#current#" => $offset)),
				);
			else
				$result[$node_id."_auto_increment_offset"] = array(
					"IS_OK" => CClusterDBNodeCheck::ERROR,
					"MESSAGE" => GetMessage("CLU_AUTO_INCREMENT_OFFSET_ERR_MSG", array("#node_id#" => $node_id, "#current#" => $offset)),
					"WIZ_REC" => GetMessage("CLU_AUTO_INCREMENT_OFFSET_WIZREC", array("#current#" => $offset)),
				);
		}
		else
		{
			$auto_increment_offset[$mod] = $node_id;
		}
	}
	if($bIncIsOK)
	{
		$result["_auto_increment_offset"] = array(
			"IS_OK" => CClusterDBNodeCheck::OK,
			"MESSAGE" => GetMessage("CLU_AUTO_INCREMENT_OFFSET_OK_MSG", array("#value#" => $auto_increment_increment)),
			"WIZ_REC" => "",
		);
	}

	$bRelayIsOK = true;
	foreach($arMasters as $node_id => $arNode)
	{
		$relay_log = $this->GetServerVariable($arNode["DB"], "relay_log");
		if($relay_log == '')
		{
			$bIncIsOK = false;
			$result[$node_id."_relay_log"] = array(
				"IS_OK" => CClusterDBNodeCheck::ERROR,
				"MESSAGE" => GetMessage("CLU_RELAY_LOG_ERR_MSG", array("#node_id#" => $node_id, "#relay-log#" => $relay_log)),
				"WIZ_REC" => GetMessage("CLU_RELAY_LOG_WIZREC"),
			);
		}
	}
	if($bRelayIsOK)
	{
		$result["_relay_log"] = array(
			"IS_OK" => CClusterDBNodeCheck::OK,
			"MESSAGE" => GetMessage("CLU_RELAY_LOG_OK_MSG", array("#value#" => $auto_increment_increment)),
			"WIZ_REC" => "",
		);
	}

	$log_bin = $this->GetServerVariable($nodeDB, "log_bin");
	$is_ok =  $log_bin === "ON";
	$result["log_bin"] = array(
		"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
		"MESSAGE" => GetMessage("CLU_LOG_BIN_NODE_MSG", array("#log-bin#" => $log_bin)),
		"WIZ_REC" => GetMessage("CLU_LOG_BIN_WIZREC"),
	);

	$skip_networking = $this->GetServerVariable($nodeDB, "skip_networking");
	$is_ok =  $skip_networking === "OFF";
	$result["skip_networking"] = array(
		"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
		"MESSAGE" => GetMessage("CLU_SKIP_NETWORKING_NODE_MSG", array("#skip-networking#" => $skip_networking)),
		"WIZ_REC" => GetMessage("CLU_SKIP_NETWORKING_WIZREC"),
	);

	$innodb_flush_log_at_trx_commit = $this->GetServerVariable($nodeDB, "innodb_flush_log_at_trx_commit");
	//if($innodb_flush_log_at_trx_commit !== '1')
	{
		$is_ok = $innodb_flush_log_at_trx_commit === '1';
		$result["innodb_flush_log_at_trx_commit"] = array(
			"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::WARNING,
			"MESSAGE" => GetMessage("CLU_FLUSH_ON_COMMIT_MSG", array("#innodb_flush_log_at_trx_commit#" => $innodb_flush_log_at_trx_commit)),
			"WIZ_REC" => "",
		);
	}

	$sync_binlog = $this->GetServerVariable($nodeDB, "sync_binlog");
	//if($sync_binlog !== '1')
	{
		$is_ok = $sync_binlog === '1';
		$result["sync_binlog"] = array(
			"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::WARNING,
			"MESSAGE" => GetMessage("CLU_SYNC_BINLOG_MSG", array("#sync_binlog#" => $sync_binlog)),
			"WIZ_REC" => "",
		);
	}

	$DatabaseName = $DB->DBName;
	$is_ok = false;
	$rsBinLogs = $nodeDB->Query("show master status", true, '', array("fixed_connection"=>true));
	if(!$rsBinLogs)
	{
		$result["master_status"] = array(
			"IS_OK" => CClusterDBNodeCheck::ERROR,
			"MESSAGE" => GetMessage("CLU_MASTER_STATUS_MSG"),
			"WIZ_REC" => GetMessage("CLU_MASTER_STATUS_WIZREC", array("#sql#" => "GRANT REPLICATION CLIENT on *.* to 'user name'@'%';")),
		);
	}
	else
	{
		if($ar = $rsBinLogs->Fetch())
		{
			if($ar["Binlog_Do_DB"] === $DatabaseName)
				$is_ok = true;
		}
		while($ar = $rsBinLogs->Fetch())
				$is_ok = false;

		$result["binlog_do_db"] = array(
			"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
			"MESSAGE" => GetMessage("CLU_SYNC_BINLOGDODB_MSG"),
			"WIZ_REC" => GetMessage("CLU_SYNC_BINLOGDODB_WIZREC", array("#database#" => $DatabaseName)),
		);
	}

	return $result;
}