Proporcioné enlaces a tutoriales. Solo tenga en cuenta que en Ubuntu, el archivo my.cnf está en /etc/mysql/my.cnf y no en /etc/my.cnf como en el tutorial de howtoforge. En mi configuración, no utilicé FLUSH TABLES WITH READ LOCK; en el maestro Si su servidor maestro tiene mucha actividad de escritura, es posible que deba bloquear sus tablas ejecutando ese comando antes de realizar una copia de seguridad. Si usa FLUSH TABLES WITH READ LOCK ;, luego de su copia de seguridad, querrá ejecutar UNLOCK TABLES. Si tiene algún problema, avíseme.
Aquí está el tutorial que encontré sobre cómo forjar, hecho para Redhat / CentOS:
http://www.howtoforge.com/mysql_database_replication
Otro tutorial que se veía bien para Ubuntu
http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/
Aquí está la configuración que utilicé:
En el servidor MASTER
Configure el servidor maestro:
vi /etc/mysql/my.cnf
[mysqld]
# bind-address = 127.0.0.1 (comment this out)
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
max_binlog_size = 100M
expire_logs_days = 1
Reiniciar MySQL:
/etc/init.d/mysql restart
Conéctese a la consola de mysql: mysql -u root -ppassword
Crear y otorgar permisos al usuario de replicación.
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';
Asegúrese de copiar esta información en algún lugar o dejarla visible
SHOW MASTER STATUS \G;
mysql> show master status \G;
File: mysql-bin.000001
Position: 100
Binlog_Do_DB:
Binlog_Ignore_DB:
mysql> quit
Volcar la base de datos a un archivo:
mysqldump -u root -p databasename > /tmp/databasename-backup.sql
Copie el volcado de la base de datos al servidor esclavo usando scp o use ftp si lo desea:
scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/
En el servidor SLAVE
Edite la configuración de mysql:
vi /etc/mysql/my.cnf
[mysqld]
# slave server configuration
server_id = 2
# this is optional, but I find it useful to specify where the relay logs go to control.
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M
Reiniciar MySQL: /etc/init.d/mysql restart
Restaurar la copia de seguridad:
mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql
Conéctese a MySQL:
mysql -u root -ppassword
stop slave;
# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;
start slave;
Ejecutar SHOW SLAVE STATUS\G
:
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: ipaddressmaster
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.0000001
Read_Master_Log_Pos: 100
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 1
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 17324288
Relay_Log_Space: 17324425
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.02 sec)
Luego, tenga en cuenta que la replicación puede fallar por varias razones. En el esclavo, puede monitorear el estado ejecutando el comando SHOW SLAVE STATUS \ G; O configurar un trabajo cron para monitorear el estado y enviar correos electrónicos si falla. Familiarícese con la salida de este comando. Si la replicación se ejecuta correctamente, debería ver "Slave_IO_State: esperando que el maestro envíe el evento".
Una vez que obtenga esta configuración correctamente, puedo proporcionarle un script para monitorear esa replicación.
Aquí hay un script para monitorear el registro de errores en MySQL. Si agrega la línea
[mysqld]
error de registro = /var/log/mysql/mysql.err
reiniciar mysql: /etc/init.d/mysql restart
Luego puede usar el siguiente script para monitorear el archivo de registro. Si el registro cambia de alguna manera, recibirá un correo electrónico notificándole que ocurrió un error en el servidor esclavo. Si desea que el registro de errores se verifique regularmente, deberá agregar este script a su crontab.
Aquí hay un script de muestra: /somepath/monitor_mysql_log.sh
#! /bin/sh
MAIL_TO="addressemail@something.com"
# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err
# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1
# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG
[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO
# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG
Para agregar a crontab.
Haga que el script sea ejecutable:
chmod +x /somepath/monitor_mysql_log.sh
Actualizar crontab:
crontab -e
* * * * * /somepath/monitor_mysql_log.sh
Y el script se ejecutará cada minuto.
El guión que proporcioné es un guión que acabo de armar rápidamente. Además, para que su servidor pueda enviar correos electrónicos, debe instalar algo como postfix o sendmail.