Project

General

Profile

MySQLMulti » History » Version 6

Simone Piccardi, 12/15/2013 05:51 PM

1 2 Simone Piccardi
h1. Configurare istanze multiple di MySQL
2 1 Simone Piccardi
3 3 Simone Piccardi
In alcuni casi, ad esempio se si devono gestire una serie di repliche di database diversi su una singola macchina, può essere necessario lanciare più istanze di MySQL. Benché sia possibile duplicare gli script di avvio e la configurazione dell'istanza principale (quella installata e configurata direttamente dal pacchetto), questo comporta anche l'uso di diverse directory e file di configurazione. Ma con MySQL viene distribuito il programma @mysqld_multi@ il cui scopo è proprio quello di lanciare e gestire istanze multiple, utilizzando un solo file di configurazione.
4 1 Simone Piccardi
5 3 Simone Piccardi
Di default il programma usa come configurazione direttamente @/etc/mysql/my.cnf@, ma se si vuole mantenere separata la gestione dell'istanza principale rispetto a quelle gestite tramite @mysqld_multi@ si può fare ricorso ad un file qualunque, da indicare con l'opzione @--defaults-file@, nel nostro caso useremo @/etc/mysql-multi/my.cnf@. Per evitare errori, e semplificarsi la vita nello scrivere i comandi, abbiamo provveduto a definire un alias di shell in @.bashrc@ nella forma:
6
7
<pre>
8
alias mysqld_multi='mysqld_multi --defaults-file=/etc/mysql-multi/my.cnf'
9
</pre>
10
11 4 Simone Piccardi
Per poter lanciare istanze multiple ques10452te devono essere identificate nel file di configurazione con un numero (denominato GNR), da configurare in altrettante sezioni distinte del file di configurazione, introdotte da una voce nella forma @[mysqldN]@. Inoltre devono essere indicate le configurazioni specifiche di @mysqld_multi@ stesso in una sezione @[mysqld_multi]@, nel nostro caso il contenuto di questa sezione è:
12 3 Simone Piccardi
13
<pre>
14
[mysqld_multi]
15
mysqld = /usr/bin/mysqld_safe
16
mysqladmin = /usr/bin/mysqladmin
17
log = /var/log/multi_mysql.log
18
</pre>
19
20
Le configurazioni da applicare alle varie istanze aggiuntive sono identiche a quelle della sezione @[mysqld]@ di una installazione ordinaria, si tratta però di evitare l'uso degli stessi file e delle stesse directory, inoltre ogni istanza dovrà mettersi in ascolto su un indirizzo IP o su una porta diversa. Questo significa che si dovrà o usare la direttiva @port@ per indicare una diversa porta ad ogni istanza, o usare la direttiva @bind-address@ per specificare un indirizzo IP diverso (nel qual caso ovviamente si saranno dovuti assegnare indirizzi multipli alla propria scheda di rete). In quest'ultimo caso si deve tenere presente che non sarà più possibile per nessuna istanza usare l'indirizzo generico @0.0.0.0@ e che per ascoltare su @localhost@ occorrerà usare specificamente @bind-address=127.0.0.1@ e che questo sarà possibile per una sola istanza.
21
22 4 Simone Piccardi
Un esempio di configurazione di una istanza aggiuntiva lanciata con @mysqld_multi@ è il seguente, si noti come si sia usata la convenzione di aggiungere ai vari file e directory utilizzati il numero che identifica l'istanza stessa; si noti anche la presenza di una direttiva @skip-grant-tables@ che andrà rimossa completata la configurazione iniziale.
23 3 Simone Piccardi
24
<pre>
25
[mysqld1]
26
user            = mysql
27
pid-file        = /var/run/mysqld/mysqld1.pid
28
socket          = /var/run/mysqld/mysqld1.sock
29
basedir         = /usr
30
datadir         = /var/lib/mysql1
31
tmpdir          = /tmp
32
lc-messages-dir = /usr/share/mysql
33
log-error=/var/log/mysqld1.log
34
skip-external-locking
35
bind-address    = istanza1.miodominio.it
36
key_buffer              = 16M
37
max_allowed_packet      = 16M
38
thread_stack            = 192K
39
thread_cache_size       = 8
40
myisam-recover         = BACKUP
41
query_cache_limit       = 1M
42
query_cache_size        = 16M
43 1 Simone Piccardi
expire_logs_days        = 10
44 3 Simone Piccardi
max_binlog_size         = 100M
45 6 Simone Piccardi
# to be removed #
46
skip-grant-tables
47
# to be removed #
48 3 Simone Piccardi
</pre>
49
50 5 Simone Piccardi
Si ripeta la sezione precedente per le ulteriori istanze volute, inserendo altrettante anaologhe sezionie [mysqldN] con contenuto analogo ed un valore diverso per N. 
51 1 Simone Piccardi
52 5 Simone Piccardi
Una volta configurate le varie istanze occorre creare per ciascuna di esse il database iniziale di MySQL (@mysql@), questo nel caso dell'istanza precedente potrà essere effettuato con il comando:
53
54 1 Simone Piccardi
<pre>
55 5 Simone Piccardi
mysql_install_db --user=mysql --datadir=/var/lib/mysql1
56 3 Simone Piccardi
</pre>
57
58 5 Simone Piccardi
ripetendo eventualmente il comando per tutte le istanze successive. A questo punto si potranno avviare manualmente le istanze (si da per assunto che si stato creato l'alias descritto in precedenza) con:
59 3 Simone Piccardi
60 1 Simone Piccardi
<pre>
61
mysqld_multi start
62
</pre>
63
64 5 Simone Piccardi
A questo punto, come richiesto nelle istruzioni stampate da @mysql_install_db@, occorrerebbe impostare una password di accesso per l'utente @root@ dei database appena creati. La installazione però restringe l'accesso a @localhost@ ed all'hostname principale della macchina, per cui non è possibile accedervi usando un indirizzo IP diverso ed i comandi indicati da @mysql_install_db@ non funzionerebbero. 
65
66
Per questo è necessario far partire la prima volta il servizio con la direttiva @skip-grant-tables@, in modo di poter accedere comuqnue al database ed effettuare le correzioni necessarie rispetto a quanto installato da @mysql_install_db@. Pertanto una volta fatte partire le istanze ci si colleghi a ciascuna di esse con @mysql -h istanzaN.miodominio.it -u root@ e si eseguano i comandi:
67
68
<pre>
69
DROP DATABASE test;
70
use mysql
71
DELETE FROM user WHERE user='';
72
UPDATE user SET host='istanzaN.miodominio.it' WHERE host='nomemacchina';
73
UPDATE user SET Password=PASSWORD("passwordlungaecomplicata") WHERE User="root";
74
</pre>
75
76
A questo punto si potrà fermare l'esecuzione delle istanze aggiuntive, rimuovere l'opzione  @skip-grant-tables@ dal file di configurazione, e riavviare le stesse, collegandosi normalmente con la password impostata.