Sponsors
A quick idea by Chris Rowe follow me @chrisrowe • Help spread the word and tweet about this site • What's the Epoch
SCRIPT mysql_MM.sh
#/bin/bash
# PRIMO SERVER
MM1=10.10.216.167
USER1=topolino
PASSWORD1=topolino
userDB="root"
pwdDB="toor"
# SECONDO SERVER
MM2=10.10.216.168USER2=paperino
PASSWORD2=paperino
userDB2="root"
pwdDB2="toor"
echo "SHOW MASTER STATUS;" > showmaster.sql
# CONFIGURAZIONE SERVER 15.1.1.1
filebin=`mysql -h $MM2 -u $userDB2 -p$pwdDB2 <showmaster.sql |grep -i mysql-bin|awk '{print $1}'`
position=`mysql -h $MM2 -u $userDB2 -p$pwdDB2 <showmaster.sql |grep -i mysql-bin|awk '{print $2}'`
cat > MMmysql.sql << DT
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='$MM2', MASTER_USER='$USER1', MASTER_PASSWORD='$PASSWORD1', MASTER_LOG_FILE='$filebin', MASTER_LOG_POS=$position;
START SLAVE;
DT
mysql -h $MM1 -u $userDB -p$pwdDB <MMmysql.sql
# CONFIGURAZIONE SERVER 15.1.1.3
filebin2=`mysql -h $MM1 -u $userDB -p$pwdDB <showmaster.sql|grep -i mysql-bin|awk '{print $1}'`
position2=`mysql -h $MM1 -u $userDB -p$pwdDB <showmaster.sql |grep -i mysql-bin|awk '{print $2}'`
cat > MMmysql2.sql << DT
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='$MM1', MASTER_USER='$USER1', MASTER_PASSWORD='$PASSWORD2', MASTER_LOG_FILE='$filebin2', MASTER_LOG_POS=$position2;
START SLAVE;
DT
mysql -h $MM2 -u $userDB2 -p$pwdDB2 <MMmysql2.sql
sleep 2
echo "SHOW SLAVE STATUS\G;" > showSlave.sql
date > mysqlMM.log
echo "CMD MYSQL PER $MM1">>mysqlMM.log
cat MMmysql.sql >> mysqlMM.log
echo "CMD MYSQL PER $MM2" >> mysqlMM.log
cat MMmysql2.sql >> mysqlMM.log
echo "" >> mysqlMM.log
mysql -h $MM2 -u $userDB2 -p$pwdDB2 <showSlave.sql>> mysqlMM.log
mysql -h $MM1 -u $userDB -p$pwdDB <showSlave.sql>> mysqlMM.log
rm showmaster.sql
rm MMmysql.sql
rm MMmysql2.sql
rm showSlave.sql
Su uno dei due server ho invce inserito nel crontab uno script bash che mi pubblica una pagina web con lo stato dei due server mysql multimaster (sempre che siano raggiugnibili!)
root@elsamu-zm:/home/domenico/Script# cat mysqlHTML.sh
#!/bin/bash
date > /var/www/mysql.html
echo "<br>" >> /var/www/mysql.html
fortune >> /var/www/mysql.html
echo "<br>" >> /var/www/mysql.html
echo " 15.1.1.1" >> /var/www/mysql.html
mysql -h 15.1.1.1 -u root -ptoor --html </home/domenico/Script/mysql_status.sql >> /var/www/mysql.html
echo " 15.1.1.3" >> /var/www/mysql.html
mysql -h 15.1.1.3 -u root -ptoor --html </home/domenico/Script/mysql_status.sql >> /var/www/mysql.html
E questo è lo script sql che contiene i 3 comandi utili per vedere lo stato dei multimaster
root@elsamu-zm:/home/domenico/Script# cat mysql_status.sql
SHOW MASTER STATUS;
SHOW PROCESSLIST;
SHOW SLAVE STATUS\G;
root@elsamu-zm:/home/domenico/Script#
Per iniziare fermiamo MYSQL, su LINUX con /etc/init.d/mysql stop mentre su WINDOWS dalla finestra SERIVZI
mysqld --skip-grant-tables --user=root &Nel caso di WINDOWS non inserire la e "
&" commerciale
mysql
USE mysql
UPDATE user
SET password=password("topolino“)
WHERE user=”root”;
flush privileges;
exit
pkill mysqldNel caso di WINDOWS basta premere CTRL C^ NELLA FINESTRA DOS
ps -ef|grep -i mysqld Verifichiamo che il demone mysql non sia attivo, a questo punto avviamolo.
/etc/init.d/mysql start
Ovviamente
Andiamo ad editare i file di configurazione dei server mysql e aggiungiamo queste entry:
Server 15.1.1.1 (EX SLAVE):
auto_increment_increment = 2
auto_increment_offset = 2
Server 15.1.1.3 (EX MASTER) :auto_increment_increment = 2
auto_increment_offset = 1 cosi facendo i file di configurazione saranno i seguenti:
SERVER 15.1.1.1
server-id = 2
auto_increment_increment = 2
auto_increment_offset = 2
master-host=15.1.1.3
master-user=repl_user
master-password=password
log-slave-updates
replicate-same-server-id = 0
master-connect-retry=60
replicate-do-db=invoicex
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
SERVER 15.1.1.3
server-id = 1
auto_increment_increment = 2
auto_increment_offset = 1
master-host=15.1.1.1
master-user=repl_user
master-password=password
log-slave-updates
replicate-same-server-id = 0
replicate-do-db=invoicex
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = invoicexAndiamo a creare l'utenza per la replica sul server 15.1.1.1:
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'dcrd1980';
Sempre dal server 15.1.1.3 restartiamo il demone mysql e andiamo a leggere su quale log sta scrivendo:
mysql -u root -p
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011 | 40827 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
Ora spostiamoci sul server 15.1.1.3 e attiviamo la replica:
CHANGE MASTER TO
MASTER_HOST='15.1.1.3',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000011',
MASTER_LOG_POS=40827;
START SLAVE
I server sono ora in modalità MULTIMASTER, possiamo scrivere su entrambi i DB e avremo sempre i dati aggiornati disponibili.
Procederemo configurando il servizio mysql dell'ufficio B come SLAVE e quello del notebook come MASTER, la connessione avverrà tramite VPN. In questo modo ovunque sia il notebook l'utente avrà sempre i dati aggiornati essendo lui il master, anche se non avrà a disposizione una connessione dati, quando il PC entrerà in VPN l'istanza SLAVE aggiornerà i dati rendedoli disponibili.
Per preparare i server sono necessarie le seguenti operazioni:
OPERAZIONI DA ESEUIRE SUL SERVER MASTER (IP VPN 15.1.1.3)
Aggiungere un utente con privilegi di replica, lanciando la query
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'replicauser'@'%' IDENTIFIED BY 'password';Per aumentare la sicurezza modificare il campo host (%) indicando un IP o un hostname specifico
attivare i log binari in my.cnf (ed eventualmente escludere o includere i db desiderati) e assicurarsi di indicare che il server sarà il master; le righe interessate sono le seguenti:
mysql -u root -p
[mysqld]
server-id = 1
log-bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 104857600
binlog-do-db = nomeDB
binlog-ignore-db = testbloccare le tabelle da scrittura per impedirne la modifica con la query
FLUSH TABLES WITH READ LOCK;NB: non disconnettere il client da cui si esegue questo comando, altrimenti il blocco da scrittura viene disabilitato. Questo passo è molto importante e serve per allineare i database prima di iniziare la replica vera e propria
fare una copia del database sorgente con mysqldump
sqldump nomeDB -u root -p > file_dump.sqlLanciare la query in un nuovo terminale e segnarsi la Posizione e il file di log in uso.
SHOW MASTER STATUS;risultato query:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000294 | 4905684 | invoicex | |
+------------------+----------+--------------+------------------+
1 row in set (0,00 sec)
Ora possiamo sbloccare il MASTER
UNLOCK TABLES;OPERAZIONI DA ESEGUIRE SULLO SLAVE (IP VPN 15.1.1.1)
Creare il database
mysql -u root -p
create database invoicex;Importare il database (o meglio i database) salvati con il seguente comando
mysql nomeDB -u root -p < file_dump.sqlVerificare che nel file my.cnf ci sia la entry "server-id=2"
CHANGE MASTER TO
MASTER_HOST='15.1.1.3',
MASTER_USER='replicauser',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000294',
MASTER_LOG_POS=4905684;
START SLAVE;Verificare il corretto funzionamento della configurazione con i comandi:
SHOW MASTER STATUS;
SHOW PROCESSLIST;
SHOW SLAVE STATUS\G;
Ora la replica è pronta, ogni qual volta si aggancia al MASTER preleva le informazioni per replicare i dati, ovviamente in raltime.
Questa soluzione non è adatta ad una grande mole di dati, attualmente il DB è usato per gestire un negozio.
Accedere alla macchina da dismettere e con lanciare il seguente comando:
mysqldump DB_da_spostare -u root -pPassword > file_DB_dump.sqlottenuto il dump del db ora copiamolo nel nuovo server:
scp file_DB_dump.sql root@10.10.0.120:/tmprimanendo sul server da dismettere lanciamo il seguete comando:
ssh root@10.10.0.120 " mysqladmin create DB_da_spostare -u root -pPassword; cd /tmp; mysql DB_da_spostare -u root -pPassword < file_DB_dump.sql"Facendo il riepilogo le operazioni sono le seguenti:
Dump del DB:
mysqldump DB_da_spostare -u root -pPassword > file_DB_dump.sqlCreazione database da importare:
mysqladmin create DB_da_spostare -u root -pPasswordImportazione database:
mysql DB_da_spostare -u root -pPassword < file_DB_dump.sql
Link and Search
|
Solo
lei ha quel che voglio |


