Project

General

Profile

MySQLReplication » History » Version 14

japoco romagnoli, 03/15/2013 12:36 PM

1 1 japoco romagnoli
h1. Configurare la replicazione di MySQL
2 2 japoco romagnoli
3
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
5
Si cominici con configurare il primo server MySQL esistente come master, anzitutto si fermi il servizio con:
6
7
<pre>
8
service mysql stop
9
</pre>
10 3 japoco romagnoli
11 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:
12 3 japoco romagnoli
13
<pre>
14 4 japoco romagnoli
[...]
15
bind-address	= 0.0.0.0
16
[...]
17 3 japoco romagnoli
server-id = 1
18
log_bin = /var/log/mysql/mysql-bin.log
19
expire_logs_days = 10
20
max_binlog_size = 100M
21 6 japoco romagnoli
binlog_do_db = nome_database
22 1 japoco romagnoli
[...]
23 5 japoco romagnoli
</pre>
24
25
Se si dovesse ripartire da zero, cancelliamo eventuali vecchi file di log binario in modo tale che il server crei un log pulito 
26
a prova di errore.
27
28
<pre>
29
rm /var/log/mysql/mysql-bin.*
30
</pre>
31
32
si provveda poi a riavviare il server, in modo che prenda le nuove configurazioni:
33
34
<pre>
35 1 japoco romagnoli
service mysql start
36 6 japoco romagnoli
</pre>
37
38 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:
39 1 japoco romagnoli
40 8 japoco romagnoli
<pre>
41
GRANT REPLICATION SLAVE ON *.* TO '[nome_utente]'@'[indirizzo_ip_dello_slave]' IDENTIFIED BY '[password]';
42
FLUSH PRIVILEGES;
43
</pre>
44 7 japoco romagnoli
45
46 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:
47
48
<pre>
49
USE nome_database
50
FLUSH TABLES WITH READ LOCK;
51
</pre>
52
53
Si potrà controllare lo stato del master con qualcosa del tipo:
54
55
<pre>
56
mysql> SHOW MASTER STATUS;
57
+------------------+----------+--------------+------------------+
58
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
59
+------------------+----------+--------------+------------------+
60
| mysql-bin.000013 |      106 |              | nome_database    |
61
+------------------+----------+--------------+------------------+
62
1 row in set (0.00 sec)
63
</pre>
64
65 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:
66 6 japoco romagnoli
67
<pre>
68
mysqldump -u root -p --opt nome_database > nome_database.sql
69
</pre>
70
71 11 japoco romagnoli
una volta finita l'esportazione possiamo tornare sulla shell di MySQL per sbloccare il lock in lettura:
72 6 japoco romagnoli
73
<pre>
74
UNLOCK TABLES;
75
</pre>
76
77 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@:
78 1 japoco romagnoli
79
<pre>
80 12 japoco romagnoli
[...]
81
tmpdir          = /var/tmp
82 6 japoco romagnoli
[...]
83
bind-address	= 0.0.0.0
84
[...]
85
server-id = 2
86
log_bin = /var/log/mysql/mysql-bin.log
87
expire_logs_days = 10
88
max_binlog_size = 100M
89
[...]
90 7 japoco romagnoli
</pre>
91
92 13 japoco romagnoli
Adesso possiamo riavviare il demone di MySQL anche sullo slave:
93
94
<pre>
95
service mysql restart
96
</pre>
97
98 7 japoco romagnoli
Adesso occorre creare un DB sullo slave con lo stesso nome di quello che vogliamo replicare: 
99
100
<pre>
101
mysqladmin -u root -p create nome_database
102
</pre>
103
104
a questo punto si può caricare il file di dump .sql direttamente sul database:
105
106
<pre>
107
mysql nome_database < nome_database.sql
108
</pre>
109
110
infine occorre impostare il server come slave passando anche i paramatri del master con cui interfacciarsi:
111 1 japoco romagnoli
112
<pre>
113 13 japoco romagnoli
CHANGE MASTER TO master_host='nome_Master.Domain', master_user='nome_utente_Master', 
114 1 japoco romagnoli
master_port=3306, master_password='pw_utente_Master', master_log_file='mysql-bin.00000x', 
115
master_log_pos=xxx;
116 13 japoco romagnoli
START SLAVE;
117 11 japoco romagnoli
</pre>
118
119
120 13 japoco romagnoli
121
122 11 japoco romagnoli
123
eventualmente si può controllare lo status dello slave da MySQL con:
124
125
<pre>
126 14 japoco romagnoli
SHOW SLAVE STATUS;
127 1 japoco romagnoli
</pre>