Avatar billede kgp43 Nybegynder
04. maj 2006 - 20:05 Der er 10 kommentarer og
1 løsning

Select random server

Hejsa,

Jeg har to database servers i et cluster (master / slave).

Følgende query skal vælge en random server:
mysql_query('SELECT * WHERE 1=1', $mysql_rand);

Hvorimod denne skal vælge "master" serveren:
mysql_query('SELECT * WHERE 1=1', $mysql_rand);


Har prøvet en masse, men kan ikke få det til at virke.
Dette er hvad jeg har nu, men det virker ikke (får ingen fejl, men får intet output i mine queries):

$dbservers = array(
    array ("ip" => "xxx.xx.xx.xx", "login" => "root", "pass" => "password", "master" => true),
    array ("ip" => "xxx.xx.xx.xx", "login" => "root", "pass" => "password"),
);


foreach ($dbservers as $k=>$s)
{
    // Master
    if ($s["master"])
    {
        mysql_connect($s["ip"], $s["login"], $s["pass"]) or die(mysql_error());
        mysql_select_db("database");
    }
    // Slaves
    else
    {
        $dblinks[$k] = mysql_connect($s["ip"], $s["login"], $s["pass"]) or die(mysql_error());
        mysql_select_db("database", $dblinks[$k]);
    }

}

$rkey = array_rand($dblinks);
$mysql_rand = $dblinks[$rkey];
Avatar billede kgp43 Nybegynder
04. maj 2006 - 20:07 #1
agrrr, sorry.

Skulle selvfølgelig være:



Følgende query skal vælge en random server:
mysql_query('SELECT * WHERE 1=1', $mysql_rand);

Hvis inden "tvungen" connection er valg, så skal den connecte til "Master" serveren:
mysql_query('SELECT * WHERE 1=1');
Avatar billede kgp43 Nybegynder
04. maj 2006 - 20:35 #2
nogle forslag?
Avatar billede erikjacobsen Ekspert
04. maj 2006 - 21:12 #3
$master=mysql_connect($s["ip"], $s["login"], $s["pass"]) or die(mysql_error());
    og så
mysql_query('SELECT * WHERE 1=1',$master);
Avatar billede kgp43 Nybegynder
04. maj 2006 - 21:19 #4
Sådan her?


$dbservers = array(
    array ("ip" => "xxx.xx.xx.xx", "login" => "root", "pass" => "password", "master" => true),
    array ("ip" => "xxx.xx.xx.xx", "login" => "root", "pass" => "password"),
);


foreach ($dbservers as $k=>$s)
{
    // Master
    if ($s["master"])
    {
        $master=mysql_connect($s["ip"], $s["login"], $s["pass"]) or die(mysql_error());
        mysql_select_db("database");
    }
    // Slaves
    else
    {
        $dblinks[$k] = mysql_connect($s["ip"], $s["login"], $s["pass"]) or die(mysql_error());
        mysql_select_db("database", $dblinks[$k]);
    }

}

$rkey = array_rand($dblinks);
$mysql_rand = $dblinks[$rkey];
Avatar billede kgp43 Nybegynder
04. maj 2006 - 21:21 #5
Tror du misforstod mig,

Den skal kun connecte til Master hvis der ikke indsættes noget i querin.

Random = mysql_query('SELECT * WHERE 1=1', $mysql_rand);
Master = mysql_query('SELECT * WHERE 1=1');
Avatar billede erikjacobsen Ekspert
04. maj 2006 - 21:23 #6
Jeg har nok ikke forstået dig. Men hvad er problemet? Du vælger med andet argument til mysql_query hvilken connection der skal bruges.
Avatar billede kgp43 Nybegynder
04. maj 2006 - 21:34 #7
Jeg har to db servers i cluster, en som master og den anden som slave.

Har brug for en kode der vælger en tilfældig db server, når der indsættes $mysql_rand i en query. Hvis der ikke indsættes noget, så er det fordi der er tale om en UPDATE, INSERT eller DELETE query, som skal connecte direkte til Master serveren.

Håber dette gør det mere klart.

Har prøvet dette, men er ikke sikker på om det virker:

db.php:
<?
// Select a random connection for standard SELECT queries.
// The connection in the end is to the Master server, which is default.

$db_server = rand(1,2);

if($db_server == 1) {

    $server_ip = "xxx.xxx.xxx.xxx";
    $server_username = "root";
    $server_password = "password";
}

if($db_server == 2) {

    $server_ip = "xxx.xxx.xxx.xxx";
    $server_username = "root";
    $server_password = "password";
}

// Random DB server connection
$mysql_rand = mysql_connect ($server_ip,$server_username,$server_password) or die(mysql_error());

// Default connection to Master server
mysql_connect("xxx.xxx.xxx.xxx","root","password") or die(mysql_error());

// Select database
mysql_select_db ("database") or die(mysql_error());
?>

///////////////////////////////////////////////////////////////

Query der connecter til en tilfældig db server:
mysql_query('SELECT * WHERE 1=1', $mysql_rand);

Query der connecter til Master server:
mysql_query('SELECT * WHERE 1=1');
Avatar billede erikjacobsen Ekspert
04. maj 2006 - 21:41 #8
Men så er det jo bare at ændre de kald til mysql_query, der skal bruge masterserveren til at angive forbindelsen til masterserveren i andet argument.
Avatar billede kgp43 Nybegynder
04. maj 2006 - 21:54 #9
der tabte du mig lige
Avatar billede erikjacobsen Ekspert
04. maj 2006 - 22:06 #10
Vi snakker måske forbi hinanden - har det på fornemmelsen ;)

Hvis du vil bruge en bestemt server (dvs en bestemt connection), er den bedste og tydeligste måde at gøre det på, at skrive det i de relevante mysql_query kald.

Altså ikke noget med: mysql_query('SELECT * WHERE 1=1');

Men derimod: mysql_query('SELECT * WHERE 1=1',$master);

Hvor du har lagt den connection ind med (klip):

  if ($s["master"])
    {
        $master=mysql_connect($s["ip"], $s["login"], $s["pass"]) or die(mysql_error());
        mysql_select_db("database",$master);
    }
Avatar billede kgp43 Nybegynder
09. november 2008 - 18:31 #11
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester