Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mysql] replikacja --> co zmienic w skrypcie
sraken666
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 24.07.2006

Ostrzeżenie: (0%)
-----


Juz za kilka dni bede wdrazal replikacje mysql'a bo otrzymamy nowy serwer.
Zalozmy kilka rzeczy, replikacja jest juz ustawiona, mam MASTER'a i SLAVE'a.

Czy musze teraz dostosowac skrypt ktory korzysta z tej bazy danych do replikacji?
Zalozmy ze uzywamy darmowego skryptu for dyskusyjnych phpbb.

Jest tam warstwa abstrakcji do operacji na bazie danych przykladowo $db->sql_query.
Teraz najwazniejsze, slyszalem ze trzeba dostosowac w tym przypadku ta warstwe (w innym przypadku poprostu zapytania) do SLAVE'a i osobno do MASTER'a.

1. Chodzi o to ze tylko czesc zapytan moze dzialac na SLAVE'ie prawda?
Do tego musze wybrac ktore, czyli wiekszosc selectow ale nie wszystkie, czemu? Jesli uzytkownik o nazwie "Janek" zarejestruje sie na MASTRZE a sekunde po tym bedzie sie chcial zarejestrowac uzytkownik rowniez o nazwie "Janek" na SLAVE'ie to wywali blad bo SLAVE zrobi SELECT nazwe usera z bazy i nieznajdzie bo jest opoznienie miedzy MASTER'em a SLAVE'em wiec przepusci dalej do INSERTA i bum blad...

Czyli musze przewidziec takie sytuacje i zmodyfikowac skrypt na SLAVE'ie do korzystania z tych zapytan tylko, ktore moga pozwolic sobie na opoznienie?
Przekierowac to zapytanie SELECT przy rejestracji ze SLAVE'a do MASTER'a?

2. Co musze jeszcze wiedziec o dostosowaniu skryptu do replikacji?

Pozdrawiam
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
artega
post
Post #2





Grupa: Zarejestrowani
Postów: 174
Pomógł: 42
Dołączył: 22.07.2007
Skąd: /dev/random

Ostrzeżenie: (0%)
-----


Cytat
1. Chodzi o to ze tylko czesc zapytan moze dzialac na SLAVE'ie prawda?

Możesz np. przekierować wszystkie operacje odczytu na slava a zapisu na mastera
W funkcji $db->sql_query na samym początku wstaw kod podobny do
  1. <?php
  2. class db
  3. {
  4.    //...
  5.  
  6.    function sql_query($query)
  7.    {
  8.        if (preg_match("/^s*(select) /i", $query))
  9.        {
  10.            mysql_query($query, $this->slave_connection)
  11.        }
  12.        else
  13.        {
  14.            mysql_query($query, $this->master_connection)
  15.        }
  16.  
  17.        // ...
  18.    }
  19.    
  20.    // ...
  21. }
  22. ?>

Cytat
2. Co musze jeszcze wiedziec o dostosowaniu skryptu do replikacji?

Przeszukaj mysqlperformanceblog.com i http://dev.mysql.com/doc/refman/5.1/en/replication.html
Warto zainteresować się też silnikiem czarnej dziury

Ten post edytował artega 12.10.2008, 19:31:45
Go to the top of the page
+Quote Post
sraken666
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 24.07.2006

Ostrzeżenie: (0%)
-----


Cytat(artega @ 12.10.2008, 20:14:35 ) *
Możesz np. przekierować wszystkie operacje odczytu na slava a zapisu na mastera


A nie będzie problemu wtedy z przykładem przedstawionym wyżej (rejestracja) to jest pytanie.

ten dev z mysqla przeczytałem już jakiś czas temu cały, tak jak i kilka innych stron ale nie wszystkie swoje wątpliwości rozwiałem
domyślam się że kilka rzeczy wyjdzie w praktyce dopiero

ten blackhole zbadam jeszcze ale raczej nie będzie to zastosowanie przydatne w moim przypadku

// Pisz poprawnie, bo zamknę temat. I nie wykręcaj się problemem z klawiaturą, ponieważ zmiana z i y zajmuje 30 sek. ~batman

Ten post edytował batman 14.10.2008, 10:11:18
Powód edycji: poprawiłem prawie każde słowo w poście ~batman
Go to the top of the page
+Quote Post
artega
post
Post #4





Grupa: Zarejestrowani
Postów: 174
Pomógł: 42
Dołączył: 22.07.2007
Skąd: /dev/random

Ostrzeżenie: (0%)
-----


Jeżeli chcesz mieć pewność, że czytasz "najbardziej aktualne" dane, odczytaj je z master'a. Ten wpis powinien wyjaśnić więcej.
Go to the top of the page
+Quote Post
sraken666
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 24.07.2006

Ostrzeżenie: (0%)
-----


Dzieki artega ten wpis pomogl mi sie upewnic.
batman sory za to ale niedalo sie tego poprawic poprzez shift + ctrl jak zazwyczaj sie da

co do:
Cytat
if (preg_match("/^s*(select) /i", $query))
{
mysql_query($query, $this->slave_connection)
}
else
{
mysql_query($query, $this->master_connection)
}


Zdecydowanie szybciej bedzie dzialal w ten sposob:

Cytat
$count = 0;
ireplace( 'select', 'select', $query, $count);
if ( $count == 1)
{
mysql_query($query, $this->slave_connection)
}
else
{
mysql_query($query, $this->master_connection)
}


a jeszcze szybciej:

Cytat
if ( (substr_count( strtolower($query), 'select', 0, 6)) == 1)
{
mysql_query($query, $this->slave_connection)
}
else
{
mysql_query($query, $this->master_connection)
}

Przy wykonywaniu tego kodu miliony razy dziennie bedzie roznica (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Optymalizacja rox.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 01:38