%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/cluster/classes/mysql/ |
| Current File : /home/bitrix/www/bitrix/modules/cluster/classes/mysql/dbnode_check.php |
<?php
IncludeModuleLangFile(__FILE__);
class CClusterDBNodeCheck extends CAllClusterDBNodeCheck
{
const OK = 1;
const WARNING = 0;
const ERROR = -1;
function MainNodeCommon($arMasterNode)
{
if($arMasterNode["ID"] == 1)
global $DB;
else
$DB = CDatabase::GetDBNodeConnection($arMasterNode["ID"], true);;
$result = array();
$is_ok = CCluster::checkForServers(1);
$result["server_count"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::WARNING,
"MESSAGE" => GetMessage("CLUSTER_SERVER_COUNT_CHECK"),
"WIZ_REC" => "",
);
$is_ok = !file_exists($_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/php_interface/after_connect.php");
$result["after_connect"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_AFTER_CONNECT_MSG"),
"WIZ_REC" => GetMessage("CLU_AFTER_CONNECT_WIZREC"),
);
$is_ok = !file_exists($_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/php_interface/after_connect_d7.php");
$result["after_connect_d7"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_AFTER_CONNECT_D7_MSG"),
"WIZ_REC" => GetMessage("CLU_AFTER_CONNECT_WIZREC"),
);
$arVariables = $this->GetServerVariables($DB, array(
"character_set_server" => "",
"character_set_database" => "",
"character_set_connection" => "",
"character_set_client" => "",
), 'character_set%');
$is_ok = $arVariables["character_set_server"] !== ""
&& $arVariables["character_set_server"] === $arVariables["character_set_database"]
&& $arVariables["character_set_database"] === $arVariables["character_set_connection"]
&& $arVariables["character_set_connection"] === $arVariables["character_set_client"]
;
$result["charset"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_CHARSET_MSG"),
"WIZ_REC" => GetMessage("CLU_CHARSET_WIZREC", array(
"#character_set_server#" => $arVariables["character_set_server"],
"#character_set_database#" => $arVariables["character_set_database"],
"#character_set_connection#" => $arVariables["character_set_connection"],
"#character_set_client#" => $arVariables["character_set_client"],
)),
);
$arVariables = $this->GetServerVariables($DB, array(
"collation_server" => "",
"collation_database" => "",
"collation_connection" => "",
), 'collation%');
$is_ok = $arVariables["collation_server"] !== ""
&& $arVariables["collation_server"] === $arVariables["collation_database"]
&& $arVariables["collation_database"] === $arVariables["collation_connection"]
;
$result["collation"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_COLLATION_MSG"),
"WIZ_REC" => GetMessage("CLU_COLLATION_WIZREC", array(
"#collation_server#" => $arVariables["collation_server"],
"#collation_database#" => $arVariables["collation_database"],
"#collation_connection#" => $arVariables["collation_connection"],
)),
);
return $result;
}
function MainNodeForReplication($arMasterNode)
{
if($arMasterNode["ID"] == 1)
global $DB;
else
$DB = CDatabase::GetDBNodeConnection($arMasterNode["ID"], true);;
$result = array();
$server_id = $this->GetServerVariable($DB, "server_id");
$is_ok = $server_id > 0;
$result["server_id"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_SERVER_ID_MSG", array("#server-id#" => $server_id)),
"WIZ_REC" => GetMessage("CLU_SERVER_ID_WIZREC"),
);
$log_bin = $this->GetServerVariable($DB, "log_bin");
$is_ok = $log_bin === "ON";
$result["log_bin"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_LOG_BIN_MSG", array("#log-bin#" => $log_bin)),
"WIZ_REC" => GetMessage("CLU_LOG_BIN_WIZREC"),
);
$skip_networking = $this->GetServerVariable($DB, "skip_networking");
$is_ok = $skip_networking === "OFF";
$result["skip_networking"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_SKIP_NETWORKING_MSG", array("#skip-networking#" => $skip_networking)),
"WIZ_REC" => GetMessage("CLU_SKIP_NETWORKING_WIZREC"),
);
$innodb_flush_log_at_trx_commit = $this->GetServerVariable($DB, "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($DB, "sync_binlog");
$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 = $DB->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 '".$DB->DBLogin."'@'%';")),
);
}
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::WARNING,
"MESSAGE" => GetMessage("CLU_SYNC_BINLOGDODB_MSG"),
"WIZ_REC" => GetMessage("CLU_SYNC_BINLOGDODB_WIZREC", array("#database#" => $DatabaseName)),
);
}
return $result;
}
function MainNodeForSlave()
{
global $DB;
$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;
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)+1;
$bIncIsOK = true;
foreach($arMasters as $node_id => $arNode)
{
$inc = $this->GetServerVariable($arNode["DB"], "auto_increment_increment");
if($inc != $auto_increment_increment)
{
$bIncIsOK = false;
$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;
$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(strlen($relay_log) <= 0)
{
$bRelayIsOK = 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"),
"WIZ_REC" => "",
);
}
$bSlaveUpdatesIsOK = true;
foreach($arMasters as $node_id => $arNode)
{
$log_slave_updates = $this->GetServerVariable($arNode["DB"], "log_slave_updates");
if($log_slave_updates !== 'ON')
{
$bSlaveUpdatesIsOK = false;
$result[$node_id."_log_slave_updates"] = array(
"IS_OK" => CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_LOG_SLAVE_UPDATES_MSG", array("#node_id#" => $node_id, "#log-slave-updates#" => $log_slave_updates)),
"WIZ_REC" => GetMessage("CLU_LOG_SLAVE_UPDATES_WIZREC", array("#value#" => 1)),
);
}
}
if($bSlaveUpdatesIsOK)
{
$result["_log_slave_updates"] = array(
"IS_OK" => CClusterDBNodeCheck::OK,
"MESSAGE" => GetMessage("CLU_LOG_SLAVE_UPDATES_OK_MSG"),
"WIZ_REC" => "",
);
}
return $result;
}
function SlaveNodeIsReplicationRunning($db_host, $db_name, $db_login, $db_password, $master_host=false, $master_port=false)
{
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))
{
//Check if replication is runnung
$rs = $nodeDB->Query("show slave status");
$ar = $rs->Fetch();
if($ar && strlen($ar["Slave_IO_State"]) > 0)
{
if($ar["Master_Host"] == $master_host && $ar["Master_Port"] == $master_port)
return $nodeDB;
else
return GetMessage("CLU_RUNNING_SLAVE");
}
else
{
return false;
}
}
else
{
return $error;
}
}
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(strlen($ar["Slave_IO_State"]) > 0)
{
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;
}
}
function SlaveNodeCommon($nodeDB)
{
$result = array();
global $DB;
$main_character_set_server = $this->GetServerVariable($DB, "character_set_server");
$main_collation_server = $this->GetServerVariable($DB, "collation_server");
$arCharset = $this->GetServerVariables($nodeDB, array(
"character_set_server" => "",
"character_set_database" => "",
"character_set_connection" => "",
"character_set_client" => "",
), 'character_set%');
$arCollation = $this->GetServerVariables($nodeDB, array(
"collation_server" => "",
"collation_database" => "",
"collation_connection" => "",
), 'collation%');
$is_ok = $main_character_set_server === $arCharset["character_set_server"]
&& $main_collation_server === $arCollation["collation_server"]
;
$result["master_charset"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_MASTER_CHARSET_MSG"),
"WIZ_REC" => GetMessage("CLU_MASTER_CHARSET_WIZREC", array(
"#character_set_server#" => $arCharset["character_set_server"],
"#collation_server#" => $arCollation["collation_server"],
)),
);
$is_ok = $arCharset["character_set_server"] !== ""
&& $arCharset["character_set_server"] === $arCharset["character_set_database"]
&& $arCharset["character_set_database"] === $arCharset["character_set_connection"]
&& $arCharset["character_set_connection"] === $arCharset["character_set_client"]
;
$result["charset"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_CHARSET_MSG"),
"WIZ_REC" => GetMessage("CLU_CHARSET_WIZREC", array(
"#character_set_server#" => $arCharset["character_set_server"],
"#character_set_database#" => $arCharset["character_set_database"],
"#character_set_connection#" => $arCharset["character_set_connection"],
"#character_set_client#" => $arCharset["character_set_client"],
)),
);
$is_ok = $arCollation["collation_server"] !== ""
&& $arCollation["collation_server"] === $arCollation["collation_database"]
&& $arCollation["collation_database"] === $arCollation["collation_connection"]
;
$result["collation"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_COLLATION_MSG"),
"WIZ_REC" => GetMessage("CLU_COLLATION_WIZREC", array(
"#collation_server#" => $arCollation["collation_server"],
"#collation_database#" => $arCollation["collation_database"],
"#collation_connection#" => $arCollation["collation_connection"],
)),
);
$arTestSQL = array(
0 => "drop table b_cluster_test",
"sql_create" => "create table b_cluster_test(column1 int)",
"sql_insert" => "insert into b_cluster_test (column1) values (1)",
"sql_select" => "select * from b_cluster_test",
"sql_update" => "update b_cluster_test set column1=2 where column1=1",
"sql_delete" => "delete from b_cluster_test where column1=2",
"sql_drop" => "drop table b_cluster_test",
);
$is_ok = true;
$sql_erorrs_list = "";
foreach($arTestSQL as $id => $sql)
{
$res = $nodeDB->Query($sql, true);
if(!$res && $id !== 0)
{
$is_ok = false;
$sql_erorrs_list .= "<br /> ".$sql.": ".$nodeDB->db_Error."\n";
}
}
$result["sql"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_SQL_MSG"),
"WIZ_REC" => GetMessage("CLU_SQL_WIZREC", array(
"#sql_erorrs_list#" => $sql_erorrs_list,
)),
);
$required_version = "5.0.0";
$slave_version = $this->GetServerVariable($nodeDB, "version");
$is_ok = version_compare($required_version, $slave_version) <= 0;
$result["version"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_SLAVE_VERSION_MSG", array(
"#slave-version#" => $slave_version,
"#required-version#" => $required_version,
)),
"WIZ_REC" => GetMessage("CLU_VERSION_WIZREC"),
);
return $result;
}
function SlaveNodeForReplication($nodeDB)
{
global $DB;
$result = array();
$main_server_id = intval($this->GetServerVariable($DB, "server_id"));
$node_server_id = intval($this->GetServerVariable($nodeDB, "server_id"));
$is_ok = $node_server_id > 0 && $main_server_id != $node_server_id;
if($is_ok)
{
$rsNodes = CClusterDBNode::GetList(array(), array(
"=SERVER_ID" => $node_server_id,
"!=MASTER_ID" => false,
));
$is_ok2 = !is_array($rsNodes->Fetch());
}
else
{
$is_ok2 = true;
}
$result["server_id"] = array(
"IS_OK" => $is_ok && $is_ok2? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_SERVER_ID_MSG", array("#server-id#" => $node_server_id)),
"WIZ_REC" => ($is_ok? "": GetMessage("CLU_SERVER_ID_WIZREC1"))." "
.($is_ok2? "": GetMessage("CLU_SERVER_ID_WIZREC2"))." "
.GetMessage("CLU_SERVER_ID_WIZREC")
,
);
$master_max_allowed_packet = $this->GetServerVariable($DB, "max_allowed_packet");
$slave_max_allowed_packet = $this->GetServerVariable($nodeDB, "max_allowed_packet");
$is_ok = $slave_max_allowed_packet >= $master_max_allowed_packet;
$result["max_allowed_packet"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::WARNING,
"MESSAGE" => GetMessage("CLU_MAX_ALLOWED_PACKET_MSG"),
"WIZ_REC" => GetMessage("CLU_MAX_ALLOWED_PACKET_WIZREC"),
);
$master_version = $this->GetServerVariable($DB, "version");
$slave_version = $this->GetServerVariable($nodeDB, "version");
$is_ok = version_compare($master_version, $slave_version) <= 0;
$result["slave_version"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::ERROR,
"MESSAGE" => GetMessage("CLU_VERSION_MSG", array(
"#slave-version#" => $slave_version,
"#master-version#" => $master_version,
)),
"WIZ_REC" => GetMessage("CLU_VERSION_WIZREC"),
);
$relay_log = $this->GetServerVariable($nodeDB, "relay_log");
$is_ok = strlen($relay_log) > 0;
$result["relay_log"] = array(
"IS_OK" => $is_ok? CClusterDBNodeCheck::OK: CClusterDBNodeCheck::WARNING,
"MESSAGE" => GetMessage("CLU_SLAVE_RELAY_LOG_MSG"),
"WIZ_REC" => GetMessage("CLU_RELAY_LOG_WIZREC"),
);
return $result;
}
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(strlen($relay_log) <= 0)
{
$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;
}
public static function GetServerVariables($DB, $arVariables, $db_mask)
{
if($db_mask)
$where = " like '".$DB->ForSQL($db_mask)."'";
else
$where = "";
$rs = $DB->Query("show variables ".$where, false, '', array("fixed_connection"=>true));
while($ar = $rs->Fetch())
{
if(array_key_exists($ar["Variable_name"], $arVariables))
$arVariables[$ar["Variable_name"]] = $ar["Value"];
}
return $arVariables;
}
function GetServerVariable($DB, $var_name)
{
$arResult = CClusterDBNodeCheck::GetServerVariables($DB, array($var_name => ""), $var_name);
return $arResult[$var_name];
}
}