Project

General

Profile

MySQLReplication » History » Version 17

japoco romagnoli, 03/15/2013 04:03 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 16 japoco romagnoli
h3. --Master
6
7 2 japoco romagnoli
Si cominici con configurare il primo server MySQL esistente come master, anzitutto si fermi il servizio con:
8
9
<pre>
10
service mysql stop
11
</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
<pre>
16 4 japoco romagnoli
[...]
17
bind-address	= 0.0.0.0
18
[...]
19 3 japoco romagnoli
server-id = 1
20
log_bin = /var/log/mysql/mysql-bin.log
21
expire_logs_days = 10
22
max_binlog_size = 100M
23 6 japoco romagnoli
binlog_do_db = nome_database
24 1 japoco romagnoli
[...]
25 5 japoco romagnoli
</pre>
26
27
Se si dovesse ripartire da zero, cancelliamo eventuali vecchi file di log binario in modo tale che il server crei un log pulito 
28
a prova di errore.
29
30
<pre>
31
rm /var/log/mysql/mysql-bin.*
32
</pre>
33
34
si provveda poi a riavviare il server, in modo che prenda le nuove configurazioni:
35
36
<pre>
37 1 japoco romagnoli
service mysql start
38 6 japoco romagnoli
</pre>
39
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
GRANT REPLICATION SLAVE ON *.* TO '[nome_utente]'@'[indirizzo_ip_dello_slave]' IDENTIFIED BY '[password]';
44
FLUSH PRIVILEGES;
45
</pre>
46 7 japoco romagnoli
47
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
50
<pre>
51
USE nome_database
52
FLUSH TABLES WITH READ LOCK;
53
</pre>
54
55
Si potrà controllare lo stato del master con qualcosa del tipo:
56
57
<pre>
58
mysql> SHOW MASTER STATUS;
59
+------------------+----------+--------------+------------------+
60
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
61
+------------------+----------+--------------+------------------+
62
| mysql-bin.000013 |      106 |              | nome_database    |
63
+------------------+----------+--------------+------------------+
64
1 row in set (0.00 sec)
65
</pre>
66
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
<pre>
70
mysqldump -u root -p --opt nome_database > nome_database.sql
71
</pre>
72
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
<pre>
76
UNLOCK TABLES;
77
</pre>
78 15 japoco romagnoli
79 1 japoco romagnoli
80 16 japoco romagnoli
h3. --Slave
81 15 japoco romagnoli
82
83
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
<pre>
87 12 japoco romagnoli
[...]
88
tmpdir          = /var/tmp
89 6 japoco romagnoli
[...]
90
bind-address	= 0.0.0.0
91
[...]
92
server-id = 2
93
log_bin = /var/log/mysql/mysql-bin.log
94
expire_logs_days = 10
95
max_binlog_size = 100M
96
[...]
97 7 japoco romagnoli
</pre>
98
99 13 japoco romagnoli
Adesso possiamo riavviare il demone di MySQL anche sullo slave:
100
101
<pre>
102
service mysql restart
103
</pre>
104
105 7 japoco romagnoli
Adesso occorre creare un DB sullo slave con lo stesso nome di quello che vogliamo replicare: 
106
107
<pre>
108
mysqladmin -u root -p create nome_database
109
</pre>
110
111
a questo punto si può caricare il file di dump .sql direttamente sul database:
112
113
<pre>
114
mysql nome_database < nome_database.sql
115
</pre>
116
117
infine occorre impostare il server come slave passando anche i paramatri del master con cui interfacciarsi:
118 1 japoco romagnoli
119
<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
master_log_pos=xxx;
123 13 japoco romagnoli
START SLAVE;
124 11 japoco romagnoli
</pre>
125
126 17 japoco romagnoli
eventualmente si può controllare lo status dello slave da MySQL con:
127 11 japoco romagnoli
128 17 japoco romagnoli
<pre>
129
SHOW SLAVE STATUS;
130
</pre>
131 13 japoco romagnoli
132 17 japoco romagnoli
h2. Switching Slave to Master
133 11 japoco romagnoli
134 17 japoco romagnoli
Volendo cambiare il nostro server slave nel nuovo master su cui indirizzare i servizi che appoggiano sul database mysql replicato si deve prima di tutto andare a cambiare il file @/etc/mysql/my.cnf@ controllando che siano abilitate le opzioni di @log-bin@ e disabilitato tutto quello che riguarda i log del tipo @slave-updates@.
135
Si deve anche verificare che il @bind-address@ sia effettivamente impostato su @0.0.0.0@ permettendo così il raggiungimento della macchina dalla rete:
136 1 japoco romagnoli
137 17 japoco romagnoli
<pre>
138
[...]
139
bind-address	= 0.0.0.0
140
[...]
141
log_bin = /var/log/mysql/mysql-bin.log
142
expire_logs_days = 10
143
max_binlog_size = 100M
144
binlog_do_db = nome_database
145
[...]
146
</pre>
147 1 japoco romagnoli
148 17 japoco romagnoli
Si deve poi commentare tutto quello che riguarda il collegamento per la replicazione ad un (ormai defunto) server master:
149
150 1 japoco romagnoli
<pre>
151 17 japoco romagnoli
[...]
152
#master-host = nome_Master.Domain
153
#master-user = nome_utente_Master
154
#master-password =  nome_utente_Master
155
#master-connect-retry = 60 
156
#replicate-do-db = nome_database 
157
[...]
158
</pre>
159
160
A questo punto, entrando in MySQL, si può fermate il server slave e reimpostarlo come nuovo master:
161
162
<pre>
163
STOP SLAVE;
164
RESET MASTER;
165
</pre>
166
167
In caso esistano altri slave, questi dovranno essere reindirizzati al nuovo master con:
168
169
<pre>
170
CHANGE MASTER TO
171
MASTER_HOST='master_ip',
172
MASTER_USER='Id',
173
MASTER_PASSWORD='pswrd',
174
MASTER_LOG_FILE='mysql-bin.00000x',
175
MASTER_LOG_POS=xxx;
176
</pre>
177
178
Dobbiamo poi garantire tutti i permessi sul database con:
179
180
<pre>
181
GRANT ALL ON *.* TO '[nome_utente]'@'[indirizzo_ip_slave]' IDENTIFIED BY '[password]';
182
FLUSH PRIVILEGES;
183 1 japoco romagnoli
</pre>