• Модуль: cluster
  • Путь к файлу: ~/bitrix/modules/cluster/classes/mysql/slave.php
  • Класс: CClusterSlave
  • Вызов: CClusterSlave::GetRandomNode
static function GetRandomNode()
{
	$slaves = static::GetList();
	if (empty($slaves))
	{
		return false;
	}

	//Exclude slaves from other cluster groups
	foreach ($slaves as $i => $slave)
	{
		$isOtherGroup = defined('BX_CLUSTER_GROUP') && ($slave['GROUP_ID'] != BX_CLUSTER_GROUP);
		if (
			defined('BX_CLUSTER_SLAVE_USE_ANY_GROUP')
			&& BX_CLUSTER_SLAVE_USE_ANY_GROUP === true
			&& $slave['ROLE_ID'] == 'SLAVE'
		)
		{
			$isOtherGroup = false;
		}

		if ($isOtherGroup)
		{
			unset($slaves[$i]);
		}
	}

	$found = false;
	while (true)
	{
		$total_weight = 0;
		foreach ($slaves as $i => $slave)
		{
			$total_weight += $slave['WEIGHT'];
			$slaves[$i]['PIE_WEIGHT'] = $total_weight;
		}

		$rand = ($total_weight > 0 ? mt_rand(1, $total_weight): 0);
		foreach ($slaves as $i => $slave)
		{
			if ($rand <= $slave['PIE_WEIGHT'])
			{
				if ($slave['ROLE_ID'] == 'SLAVE')
				{
					if (!static::IsSlaveOk($slave['ID']))
					{
						unset($slaves[$i]);
						continue 2;
					}
				}

				$found = $slave;
				break 2;
			}
		}
	}

	if (!$found || $found['ROLE_ID'] != 'SLAVE')
	{
		return false; //use main connection
	}

	return $found;
}