Project

General

Profile

MySQLReplication » History » Version 16

japoco romagnoli, 03/15/2013 03:06 PM

1 1 japoco romagnoli
h1. Configurare la replicazione di MySQL
2 2 japoco romagnoli
3 2 japoco romagnoli
Occorrono almeno due installazioni indipendenti di MySQL, una macchina deve fare da master, le altre da slave. Prenderemo in considerazione solo il caso elementare di due macchine. Le due istanze devono essere configurate per essere raggiungibili via rete. In pratica si dice al master di creare un log binario con le operazioni che vengono eseguite in scrittura. Lo slave leggendo i file di log ripete le stesse operazioni su se stesso per “allinearsi”.
4 2 japoco romagnoli
5 16 japoco romagnoli
h3. --Master
6 16 japoco romagnoli
7 2 japoco romagnoli
Si cominici con configurare il primo server MySQL esistente come master, anzitutto si fermi il servizio con:
8 2 japoco romagnoli
9 2 japoco romagnoli
<pre>
10 2 japoco romagnoli
service mysql stop
11 2 japoco romagnoli
</pre>
12 3 japoco romagnoli
13 5 japoco romagnoli
A questo punto modifichiamo il file  @/etc/mysql/my.cnf@ del master per abilitare networking e scrittura del file di log binario, inserendo le seguenti configurazioni al posto di quelle correnti:
14 3 japoco romagnoli
15 3 japoco romagnoli
<pre>
16 4 japoco romagnoli
[...]
17 4 japoco romagnoli
bind-address	= 0.0.0.0
18 4 japoco romagnoli
[...]
19 3 japoco romagnoli
server-id = 1
20 3 japoco romagnoli
log_bin = /var/log/mysql/mysql-bin.log
21 3 japoco romagnoli
expire_logs_days = 10
22 3 japoco romagnoli
max_binlog_size = 100M
23 6 japoco romagnoli
binlog_do_db = nome_database
24 1 japoco romagnoli
[...]
25 5 japoco romagnoli
</pre>
26 5 japoco romagnoli
27 5 japoco romagnoli
Se si dovesse ripartire da zero, cancelliamo eventuali vecchi file di log binario in modo tale che il server crei un log pulito 
28 5 japoco romagnoli
a prova di errore.
29 5 japoco romagnoli
30 5 japoco romagnoli
<pre>
31 5 japoco romagnoli
rm /var/log/mysql/mysql-bin.*
32 5 japoco romagnoli
</pre>
33 5 japoco romagnoli
34 5 japoco romagnoli
si provveda poi a riavviare il server, in modo che prenda le nuove configurazioni:
35 5 japoco romagnoli
36 5 japoco romagnoli
<pre>
37 1 japoco romagnoli
service mysql start
38 6 japoco romagnoli
</pre>
39 6 japoco romagnoli
40 11 japoco romagnoli
Adesso andiamo a lavorare su MySQL per abilitare e settare la replica su uno slave definendo anche l'utente a cui dare l'accesso:
41 1 japoco romagnoli
42 8 japoco romagnoli
<pre>
43 8 japoco romagnoli
GRANT REPLICATION SLAVE ON *.* TO '[nome_utente]'@'[indirizzo_ip_dello_slave]' IDENTIFIED BY '[password]';
44 8 japoco romagnoli
FLUSH PRIVILEGES;
45 8 japoco romagnoli
</pre>
46 7 japoco romagnoli
47 7 japoco romagnoli
48 6 japoco romagnoli
Una volta attive le nuove configurazioni occorre trasferire i dati dal master allo slave per l'importazione iniziale, per questo una volta entrati sulla CLI di MySQL si seleziona il database da replicare e si bloccano le tabelle in scrittura per avere uno stato coerente dei dati:
49 6 japoco romagnoli
50 6 japoco romagnoli
<pre>
51 6 japoco romagnoli
USE nome_database
52 6 japoco romagnoli
FLUSH TABLES WITH READ LOCK;
53 6 japoco romagnoli
</pre>
54 6 japoco romagnoli
55 6 japoco romagnoli
Si potrà controllare lo stato del master con qualcosa del tipo:
56 6 japoco romagnoli
57 6 japoco romagnoli
<pre>
58 6 japoco romagnoli
mysql> SHOW MASTER STATUS;
59 6 japoco romagnoli
+------------------+----------+--------------+------------------+
60 6 japoco romagnoli
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
61 6 japoco romagnoli
+------------------+----------+--------------+------------------+
62 6 japoco romagnoli
| mysql-bin.000013 |      106 |              | nome_database    |
63 6 japoco romagnoli
+------------------+----------+--------------+------------------+
64 6 japoco romagnoli
1 row in set (0.00 sec)
65 6 japoco romagnoli
</pre>
66 6 japoco romagnoli
67 11 japoco romagnoli
A questo punto senza chiudere la shell di MySQL (per evitare di perdere il lock sulle tabelle), si apre una nuova shell ed esportiamo il database in un file @.sql@ da trasferire sul server slave:
68 6 japoco romagnoli
69 6 japoco romagnoli
<pre>
70 6 japoco romagnoli
mysqldump -u root -p --opt nome_database > nome_database.sql
71 6 japoco romagnoli
</pre>
72 6 japoco romagnoli
73 11 japoco romagnoli
una volta finita l'esportazione possiamo tornare sulla shell di MySQL per sbloccare il lock in lettura:
74 6 japoco romagnoli
75 6 japoco romagnoli
<pre>
76 6 japoco romagnoli
UNLOCK TABLES;
77 6 japoco romagnoli
</pre>
78 15 japoco romagnoli
79 1 japoco romagnoli
80 16 japoco romagnoli
h3. --Slave
81 15 japoco romagnoli
82 15 japoco romagnoli
83 15 japoco romagnoli
84 12 japoco romagnoli
Occorre agire come precedentemente fatto sul file @/etc/mysql/my.cnf@ dello slave al fine di configurarlo con un diverso @server-id@ e spostare @tmpdir@ su una directory diversa da quella di default in modo che il contenuto non corra il rischio di venire cancellato; bisogna infine metterlo in ascolto sull'indirizzo generico @0.0.0.0@:
85 1 japoco romagnoli
86 1 japoco romagnoli
<pre>
87 12 japoco romagnoli
[...]
88 12 japoco romagnoli
tmpdir          = /var/tmp
89 6 japoco romagnoli
[...]
90 6 japoco romagnoli
bind-address	= 0.0.0.0
91 6 japoco romagnoli
[...]
92 6 japoco romagnoli
server-id = 2
93 6 japoco romagnoli
log_bin = /var/log/mysql/mysql-bin.log
94 6 japoco romagnoli
expire_logs_days = 10
95 6 japoco romagnoli
max_binlog_size = 100M
96 6 japoco romagnoli
[...]
97 7 japoco romagnoli
</pre>
98 7 japoco romagnoli
99 13 japoco romagnoli
Adesso possiamo riavviare il demone di MySQL anche sullo slave:
100 13 japoco romagnoli
101 13 japoco romagnoli
<pre>
102 13 japoco romagnoli
service mysql restart
103 13 japoco romagnoli
</pre>
104 13 japoco romagnoli
105 7 japoco romagnoli
Adesso occorre creare un DB sullo slave con lo stesso nome di quello che vogliamo replicare: 
106 7 japoco romagnoli
107 7 japoco romagnoli
<pre>
108 7 japoco romagnoli
mysqladmin -u root -p create nome_database
109 7 japoco romagnoli
</pre>
110 7 japoco romagnoli
111 7 japoco romagnoli
a questo punto si può caricare il file di dump .sql direttamente sul database:
112 7 japoco romagnoli
113 7 japoco romagnoli
<pre>
114 7 japoco romagnoli
mysql nome_database < nome_database.sql
115 7 japoco romagnoli
</pre>
116 7 japoco romagnoli
117 7 japoco romagnoli
infine occorre impostare il server come slave passando anche i paramatri del master con cui interfacciarsi:
118 1 japoco romagnoli
119 1 japoco romagnoli
<pre>
120 13 japoco romagnoli
CHANGE MASTER TO master_host='nome_Master.Domain', master_user='nome_utente_Master', 
121 1 japoco romagnoli
master_port=3306, master_password='pw_utente_Master', master_log_file='mysql-bin.00000x', 
122 1 japoco romagnoli
master_log_pos=xxx;
123 13 japoco romagnoli
START SLAVE;
124 11 japoco romagnoli
</pre>
125 11 japoco romagnoli
126 11 japoco romagnoli
127 13 japoco romagnoli
128 13 japoco romagnoli
129 11 japoco romagnoli
130 11 japoco romagnoli
eventualmente si può controllare lo status dello slave da MySQL con:
131 11 japoco romagnoli
132 11 japoco romagnoli
<pre>
133 14 japoco romagnoli
SHOW SLAVE STATUS;
134 1 japoco romagnoli
</pre>