Pokazywanie postów oznaczonych etykietą mysql. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą mysql. Pokaż wszystkie posty

poniedziałek, 18 sierpnia 2008

Replikacja mysql

Replikacja pozwala na stworzenie "lustrzanego odbicia" bazy (baz) danych, w czsie rzeczywistym (albo prawie rzeczywistym). Zreplikowaną bazę danych (slave) możemy wykorzystać jako backup (który w każdym momencie możemy wykorzystać jako podstawową bazę danych). Konfiguracja serwera slave polega na wpisaniu do pliku konfiguracyjnego hostu na którym znajduje się baza mysql działająca jako master, loginu i hasła użytkownika który ma prawo do replikacji oraz (opcjonalnie) bazwę bazy danych którą chcemy replikować.

Po stronie serwera mysql działającego jako master, należy założyć konto dla użytkownika który będzie wykorzystywany jako slave.

CREATE USER slave_user;
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'slave_host' IDENTIFIED BY 'slave_pass';
FLUSH PRIVILEGES;

W obu serwerach trzeba róznież ustawić server-id, który jest unikalnym identyfikatorem serwera w naszej sieci (najlepiej ustawić 1 dla master i kolejn0 (2,3...n) dla serwerów slave).

Pozostała konfiguracja polega na ustawieniu punktu od którego slave ma czytać zmiany w bazie danych master.

/* pobranie informacji o nazwie pliku logów oraz ostatniej pozycji w tym pliku - uruchamiamy na bazie master */

SHOW MASTER STATUS;

/* ustawiamy z którego pliku logów, oraz której pozycji ma czytać slave */
/* jeśli binlog jest pusty to trzeba podać slave-owi pusty string '' jako plik i pozycje */
CHANGE MASTER TO MASTER_HOST='master_host_name', MASTER_USER='slave_user', MASTER_PASSWORD='slave_pass', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position;

Ostatnią czynnością jest uruchomienie slave-a:

START SLAVE;

Można również startować selektywnie wątki replikacji:

START SLAVE SQL_THREAD;
START SLAVE IO_THREAD;

Jeśli nie jesteśmy pewni czy replikacja działa możemy sprawdzić jej stan na slave-ie za pomocą polecenia:

SHOW SLAVE STATUS\G

\G na końcu poda nam wynik w czytelniejszy sposób niż bez niego.

Aby zatrzymać działającego slave-a wystarczy wydać polecenie:

STOP SLAVE;

Czasami zachodzi potrzeba uruchomienia serwera mysq, skonfigurowanego jako slave z wyłączeniem opcji replikacji. Możemy to zrobić uruchamiając serwer mysql z opcją "--skip-slave"

mysqld --skip-slave

niedziela, 10 sierpnia 2008

mysql-proxy


Bardzo przydatny program. Generalnie jest to proxy które stoi pomiędzy serwerem mysql (mysqld) a klientem (mysql, php, python). Służy m.in. do analizy kodu sql wysyłanego do serwera, jego zmianie, filtrowaniu (gdy np. napiszemy CREAT zamiast CREATE skrypt lua może wykryć taką sytuację i poprawić kod), oraz do pisania rozmaitych macr.

http://www.oreillynet.com/pub/a/databases/2007/07/12/getting-started-with-mysql-proxy.html

Dzięki niemu możliwy jest load balancing ruchu pomiędzy klientami a nodami clustra mysql lub serwerem master/slave.

Opcje które umożliwią nam uruchomienie load-balancing-u to:

--proxy-read-only-backend-addresses= address:port of the remote slave-server (default: not set)
--proxy-backend-addresses= address:port of the remote backend-servers (default: 127.0.0.1:3306)

Szkoda tylko że nie ma prostego sposobu na załadowanie kilku takich skryptów, bo wraz z uruchomieniem demona mysql-proxy należy podać ścieżkę do skryptu który chcemy załadować.

$ mysql-proxy --proxy-lua-script=first_example.lua -D

Napisałem "prostego" bo znalazłem skrypt lua który umożliwia ładowanie kolejnych skryptów przez klienta mysql ( http://datacharmer.blogspot.com/2007/11/multiple-scripts-in-mysql-proxy.html). Wymieniony skrypt znajduje się także w katalogu /usr/share/doc/packages/mysql-proxy/examples/ ( SUSE 10.3). Czy nie powinno być opcji w uruchomieniu mysql-proxy która pozwoli na załadowanie kilku skryptów przy starcie demona?


Bardzo przydatna według mnie jest opcja wywoływania zewnętrznych programów przy pomocy skryptów lua. Przykładowy sktypt z możliwością uruchomienia dowolnej aplikacji shell-owej znajduje sie na forge.mysql.com (http://forge.mysql.com/tools/tool.php?id=79). W połączeniu z event schedulerem (http://dev.mysql.com/doc/refman/5.1/en/events.html) daje to nowe możliwości, możliwości które prawdopodobnie będę miał okazje wykorzystać.