- Модуль: cluster
- Путь к файлу: ~/bitrix/modules/cluster/classes/mysql/dbnode_check.php
- Класс: CClusterDBNodeCheck
- Вызов: CClusterDBNodeCheck::SlaveNodeConnection
function SlaveNodeConnection($db_host, $db_name, $db_login, $db_password, $master_host=false, $master_port=false, $master_id = 1)
{
global $DB;
$node_id = "v99";
CClusterDBNode::GetByID($node_id, array(
"ACTIVE" => "Y",
"STATUS" => "ONLINE",
"DB_HOST" => $db_host,
"DB_NAME" => $db_name,
"DB_LOGIN" => $db_login,
"DB_PASSWORD" => $db_password,
));
ob_start();
$nodeDB = CDatabase::GetDBNodeConnection($node_id, true);
$error = ob_get_contents();
ob_end_clean();
if(is_object($nodeDB))
{
//Test if this connection is not the same as master
$bSkipSecondTest = false;
//1. Make sure that no replication is runnung
$rs = $nodeDB->Query("show slave status");
if($ar = $rs->Fetch())
{
if($ar["Slave_IO_State"] <> '')
{
if($ar["Master_Host"] != $master_host || $ar["Master_Port"] != $master_port)
return GetMessage("CLU_RUNNING_SLAVE");
else
$bSkipSecondTest = true; //The replication is OK
}
}
//2. Check if b_cluster_dbnode exists on node
if($nodeDB->TableExists("b_cluster_dbnode") && !$bSkipSecondTest)
{
//2.1 Generate uniq id
$uniqid = md5(mt_rand());
$DB->Query("UPDATE b_cluster_dbnode SET UNIQID='".$uniqid."' WHERE ID=1", false, '', array("fixed_connection"=>true));
$rs = $nodeDB->Query("SELECT UNIQID FROM b_cluster_dbnode WHERE ID=1", true);
if($rs)
{
if($ar = $rs->Fetch())
{
if($ar["UNIQID"] == $uniqid)
return GetMessage("CLU_SAME_DATABASE");
}
}
}
//3. Check master connect
if($master_host !== false && $master_port !== false)
{
$node_id = "v98";
if($master_id == 1)
{
CClusterDBNode::GetByID($node_id, array(
"ACTIVE" => "Y",
"STATUS" => "ONLINE",
"DB_HOST" => $master_host.":".$master_port,
"DB_NAME" => $DB->DBName,
"DB_LOGIN" => $DB->DBLogin,
"DB_PASSWORD" => $DB->DBPassword,
));
}
else
{
$node_id = $master_id;
}
ob_start();
$masterDB = CDatabase::GetDBNodeConnection($node_id, true);
$error = ob_get_contents();
ob_end_clean();
if(is_object($masterDB))
{
//3.1 Check if b_cluster_dbnode is the same as on master
if(!$masterDB->TableExists("b_cluster_dbnode"))
return GetMessage("CLU_NOT_MASTER");
//3.2 Generate uniq id
$uniqid = md5(mt_rand());
$DB->Query("UPDATE b_cluster_dbnode SET UNIQID='".$uniqid."' WHERE ID=1", false, '', array("fixed_connection"=>true));
$rs = $masterDB->Query("SELECT UNIQID FROM b_cluster_dbnode WHERE ID=1", true, '', array("fixed_connection"=>true));
if(!$rs)
return GetMessage("CLU_NOT_MASTER");
$ar = $rs->Fetch();
if(!$ar)
return GetMessage("CLU_NOT_MASTER");
if($ar["UNIQID"] != $uniqid)
return GetMessage("CLU_NOT_MASTER");
}
else
{
return GetMessage("CLU_MASTER_CONNECT_ERROR").$error;
}
}
return $nodeDB;
}
else
{
return $error;
}
}