Rafael Peláez

Rafael Peláez

Nov 18 / 7:03am

MySQL: hacer un “snapshot” del máster

by Rafa

Antiguo y abandonado blog de Ricardo Galli :-(

Wednesday 3/10/2007

MySQL: hacer un “snapshot” del máster

Filed under: Mis hacks, Trucos — gallir @ 16:23

Es una chorrada y bien conocida, aunque a mí me costó averiguar cuál es la solución más rápida y fiable –¿soy sólo yo el lento o también ocurre lo mismo a otros?–, así que aquí va por si a alguien le sirve.

MySQL funciona muy bien para mantener réplicas (slaves) de un servidor maestro (master), pero a veces hay algunos problemas:

  1. El comando LOAD DATA FROM MASTER desde la réplica no está recomendado.

  2. La base de datos es muy grande y toma mucho tiempo hacer el “mysqldump”, es mucho más rápido hacerlo con los mysqlhotcopy que sólo copia los ficheros.

  3. Antes de hacer el mysqldump (si se hace) hay que obtener el estado del “binlog” del servidor para indicarlo en la réplica.

La mejor opción es hacer copia de los ficheros de la base de datos con el mysqlhotcopy y además indicarle que grabe en una tabla el estado del “binlog”. Con esto tendremos una copia rápida de la base de datos en “producción” que nos servirá para iniciar fácilmente una nueva réplica y/o reparar una que haya perdido el sincronismo o coherencia con el máster (suele suceder).

Para ello primero hay que crear esa tabla (está documentado en perldoc mysqlhotcopy).

CREATE TABLE log_pos (
                 host            varchar(60) NOT null,
                 time_stamp      timestamp(14) NOT NULL,
                 log_file        varchar(32) default NULL,
                 log_pos         int(11)     default NULL,
                 master_host     varchar(60) NULL,
                 master_log_file varchar(32) NULL,
                 master_log_pos  int NULL,

                 PRIMARY KEY  (host)
               );

Yo creé esa tabla en la base de datos mysql del Menéame. Así para el Menéame tengo el siguiente comando que se ejecuta cada madrugada:

mysqlhotcopy -q --flushlog --noindices --record_log_pos=mysql.log_pos  
                    --addtodest  mysql meneame /backups/hotcopy/

El comando anterior sólo tarda unos 6-10 segundos para copiar todos los datos de la base de datos, sin los índices y ocupando sólo 800 MB (el .sql comprimido si se usase mysqldump ocupa 1.5 GB).

La opción --noindices indica que no copie los índices, ellos pueden ser luego regenerados con el mysqlcheck -rq.

La opción --record-log_pos es para indicar la base de datos y tabla dónde guardar la información del log del máster, es la que servirá para sincronizar las réplicas (en este caso le indico que copie las dos base de datos, mysql y meneame).

Los ficheros de backup se copiarán a /backups/hotcopy/mysql y /backups/hotcopy/meneame. En la tabla se guardarán datos como los siguientes:

| host             | time_stamp          | log_file         | log_pos | ...
+------------------+---------------------+------------------+---------+
| db.meneame.net   | 2007-10-03 11:01:37 | mysql-bin.000634 |      98 |

Para [re] iniciar una réplica sólo hay que copiar esos ficheros a [por ejemplo] /var/lib/mysql/meneame en el servidor correspondiente y:

  1. Detener el slave si está en marcha:

    slave stop;

  2. Mejor es detener también el mysql.

  3. Regenerar los índices con

    mysqlcheck -qr /var/lib/mysql/meneame/*.MYI

  4. Poner el propietario adecuado: para Debian,

    chown -R mysql.mysql /var/lib/mysql/meneame

    también es mejor poner los permisos adecuados:

    chmod 0660 /var/lib/mysql/meneame/*

  5. Arrancar el mysql e indicar el estado del máster (uso el ejemplo anterior):

    CHANGE MASTER TO MASTER_HOST='tu.master.com', MASTER_USER='tu_usuario', MASTER_PASSWORD='tu_password', MASTER_LOG_FILE='mysql-bin.000634', MASTER_LOG_POS=98;

  6. Arrancar el slave:

    SLAVE START

Ya está, con el comando sql show slave status deberías ver como se sincroniza.

Creo que esta opción es la mejor porque además que la copia es rápida, si la haces cada día tienes siempre una “imagen” lista para ser usada para recuperar o iniciar cualquier otro slave sin necesidad de detener la base de datos en producción.

Nota: si harás réplicas de un máster tendrás que habilitar la “conexión a la red”, así que no te olvides de poner las iptables, definir qué direcciones IP pueden conectarse al puerto del mysql y poner claves a los usuarios habilitados para replicar. Sino podrías tener una importante fuga de datos ;-)

-->

15 Comments

  1. Interesante, esta es una de esas tareas que tienen mil caminos para llegar a la misma solución. Esta es “bonita”, yo soy mas bruto y tiro más de tar :)

    Comment by Bor — Wednesday 3/10/2007 @ 17:28

  2. Yo como el comentario anterior también tiro de tar para crear las replicaciones, principalmente porque mysqlhotcopy no soporta tablas innodb qué son las que yo utilizo. Además para no tener que detener el master, creo los slaves a partir de un slave ya configurado.

    Lo que no entiendo es para que quieres hacer una imagen de la base de datos todos los días si ya tienes 2 o 3 servidores esclavos preparados para sustituir al master en cualquier momento.

    Comment by Borja — Wednesday 3/10/2007 @ 18:25

  3. Debe ser que los borjas somos muy brutos, exactamente lo mismo, tar de otra replica, scp y edicion de archivos para ajustarlos al nuevo hostname. :)

    Comment by Bor — Wednesday 3/10/2007 @ 20:34

  4. #1, #2, #3, ¿pero sóis cuidadosos de hacer el lock de lectura, y el “flush” de las tablas antes de hacer el tar o la copia? (el mysqlhotcopy hace todo eso).

    Comment by gallir — Wednesday 3/10/2007 @ 20:41

  5. Parando el mysql no hay problema:)

    En respuesta a #2, a pesar de tener varias replicas, viene bien hacer un dump, o hotcopy o lo que sea, yo saco una copia todos los dias del datacenter, hay que pensar en el peor de los casos y no vaya a ser que explote el centro de datos :)

    Comment by Bor — Wednesday 3/10/2007 @ 20:49

  6. > Parando el mysql no hay problema:)

    Ya, pero te imaginas parar así un sistema en producción. En el menéame me mandarían a la mierda enseguida y se escribiría en blogs que el sistema peta (como debería :roll: ).

    Comment by gallir — Wednesday 3/10/2007 @ 21:04

  7. Hombre! Pues claro, implementa un balanceo de querys como dios manda y problema resuelto :)
    Realmente tenemos una replica que no es consultada desde producción que es la que usamos para esto.

    Comment by Bor — Wednesday 3/10/2007 @ 21:12

  8. > Hombre! Pues claro, implementa un balanceo de querys como dios manda y problema resuelto :)

    Pero tenemos un sólo servidor para todo (mysql+apache/php), y espero que dure. La administración de diferentes servidores no me divierte demasiado, si es KISS extremo, pero me gusta más :-)

    Comment by gallir — Wednesday 3/10/2007 @ 21:22

  9. #5 En mi caso los servidores están distribuidos en diferentes zonas geográficas, de ahí que no viera la utilidad del dump :)

    #8 ¿Tienes dos servidores MySql en el mismo servidor?
    Es una solución que me he planteado en alguna ocasión para hacer un balanceo de carga y tener mayor tolerancia a errores en casos de recursos limitados, ¿funciona bien? ¿mejora el rendimiento?

    Aprovecho para recomendar un blog qué he descubierto hace poco http://www.mysqlperformanceblog.com/

    Comment by Borja — Wednesday 3/10/2007 @ 22:52

  10. > ¿Tienes dos servidores MySql en el mismo servidor?

    No, qué va. Tenemos otro servidor, en otro lugar, haciendo de réplica por si ocurre algún desastre en el proveedor actual. Además la usamos para hacer las consultas más complejas que bloquearían al principal (por el lock a toda las tablas que aplica el MyISAM).

    Sobre el mysqlperfomanceblog.com, lo sigo desde casi sus inicios. Los tíos son unos cracks (al menos uno de ellos trabajaba en mysql.com).

    Comment by gallir — Wednesday 3/10/2007 @ 22:58

  11. Para hacer un mysqldump cuando no se puede usar hotcopy (innodb) yo uso un servidor slave, paro (slave stop) y hago el dump. Para asegurar que ambos servidores están bien sincronizados existe mysqltoolkit. Bueno, la verdad es que las copias fuera del datacenter las hago así.

    No me digáis que no es seguro eso, que me da algo :)

    Comment by Fernando Serer — Thursday 4/10/2007 @ 9:36

  12. Ya que comentaris de buenos blogs sobre mysql, tb conozco ese desde los principios, hay otro que es tb genial, el del xaprb.
    http://www.xaprb.com/blog/
    Para vosotros que usais replicación tienen especial interes unos scripts con los que comprobar feacientemente que los datos de las replicas son identicos a los del master(via checksum), vamos, que un admin no se ha equivocado y se la liado a tirar updates ahi a lo tonto :) Tiene bastantes utilidades curiosas y muy utiles.

    Comment by Bor — Thursday 4/10/2007 @ 9:40

  13. Y alguien lo ha probado vía drbd, si funciona correctamente?

    Comment by KaMpA — Friday 5/10/2007 @ 18:23

  14. La verdad que es el mejor metodo para hacer backups en mysql, via slave.

    Utilizando innodb no hace falta regenerar los indices porque por si mismo los genera la lanzar el servidor, ademas aporta bloqueo por columna y esto facilita a la hora de hacer el dump. Aunque quiza sea más lento de acceso, ¿porque una solucion mixta de engines en tablas?

    Tambien, utlimamente en el planet de mysql (www.planetmysql.com) se ha estado hablando de mysqlpdump ( http://www.fr3nd.net/projects/mysqlpdump/ ) y conociendo la programador no tengo ninguna duda que tiene muy buena pinta.

    Comment by dani — Friday 5/10/2007 @ 23:42

  15. Yo para “replicar” los datos lo que suelo hacer es “on-the-fly” enviar un tar.gz de todo (es decir, código + caché -esto viene a ser importante, sin los modulos cache puedo tirarme unas dos horitas más para poner todo arriba- + mysql). Lo que si es que miedo me da como algo pete :-)

    Comment by xeon — Saturday 6/10/2007 @ 19:40

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress

Loading mentions Retweet

Filed under // dba gallir

Comments (0)

Nov 18 / 7:02am

mySQL DBA: How do you know when you need more memcache servers?

by Rafa

8 comments:

Chris Barber said...

So, what's wrong with classes? Are you talking about the old days of PHP4 or are you saying classes are bad in PHP5 too?

Thu Oct 09, 10:52:00 AM

Anonymous said...

I'm new to PHP and recently setup my local machine with PHP and MySQL for doing development. I was sort of stuck when I needed to post my work for the user to test and review. After looking around a bit I found a site that hosts PHP and MySQL apps. I was surprised that it was free - it seems they're offering the service at no cost until 2012. At that point they'll change over to a fee-based service. However, in the meantime, it's a great place to do anything from demo and sandbox right up to posting sites for real.

Their pitch is as follows:

"This is absolutely free, there is no catch. You get 350 MB of disk space and 100 GB bandwidth. They also have cPanel control panel which is amazing and easy to use website builder. Moreover, there is no any kind of advertising on your pages."

Check it out using this link:

http://www.000webhost.com/83188.html

Important: There's one catch in that you must make sure you visit the account every 14 days - otherwise the account is marked 'Inactive' and the files are deleted!!!

Thanks and good luck!

Sun Oct 12, 10:31:00 AM

sK said...

Great article, thanks!

But as a PHP programmer I just can't ignore one thing - your missuse of PHP constants.

$GLOBALS[cfg][disable_feature_memcache] - this makes PHP search for two constants: cfg and disable_feature_memcache. And throws two notices, which are probably ignored. First, these should be used as strings (eg. $GLOBALS['cfg']['disable_feature_memcache']) becouse "it is the right way" :) and secondly, it reduces the overhead of PHP searching for something that does not exist. This way you will surely get less CPU spikes you talk about from your PHP code.

Oh, and yes, I will be looking forward to reading about your opinion why objects/classes in PHP are bad.

Good luck!

Sun Oct 19, 03:59:00 AM

Dathan said...

@sk
Yea I'm lazy with constants in this fashion-I'll fix that up.

OO PHP programming is hard to trace. If a framework is not established, its very easy for multiple coders to create a huge spaghetti mess of methods that do nested inheritance, side affect public vars, and create unnecessary overhead.

I measured that each instance of PEAR DB.php has a 4K overhead. Which is huge, and directly attributed to the object!

Now, I've seen some really good OOP PHP classes and its actually been a pleasure working in that environment.

What I found to be the easiest methods of coding with multiple developers is procedural coding in PHP.

file_name.inc
function names are

file_name_Function(vars){}

So, anytime you reference a function you know where to debug it immediately.

Sun Oct 19, 01:26:00 PM

Anonymous said...

I'm new to PHP and recently setup my local machine with PHP and MySQL for doing development. I was sort of stuck when I needed to post my work

for the user to test and review. After looking around a bit I found a site that hosts PHP and MySQL apps. I was surprised that it was free -

it seems they're offering the service at no cost until 2012. At that point they'll change over to a fee-based service. However, in the

meantime, it's a great place to do anything from demo and sandbox right up to posting sites for real.

Their pitch is as follows:

"This is absolutely free, there is no catch. You get 350 MB of disk space and 100 GB bandwidth. They also have cPanel control panel which is

amazing and easy to use website builder. Moreover, there is not any kind of advertising on your pages."

Check it out using this link:

http://www.000webhost.com/83188.html

Important: There's one catch in that you must make sure you visit the account every 14 days - otherwise the account is marked 'Inactive' and

the files are deleted!!!

Thanks and good luck!

Thu Oct 30, 03:59:00 PM

sexy said...

情趣用品,情趣用品,情趣用品,情趣用品,情趣用品,情趣用品,情趣用品,情趣用品,情趣,情趣,情趣,情趣,情趣,情趣,情趣,情趣,按摩棒,跳蛋,充氣娃娃,情境坊歡愉用品,情趣用品,情人節禮物,情惑用品性易購

免費A片,AV女優,美女視訊,情色交友,免費AV,色情網站,辣妹視訊,美女交友,色情影片,成人影片,成人網站,A片,H漫,18成人,成人圖片,成人漫畫,情色網,日本A片,免費A片下載,性愛

A片,色情,成人,做愛,情色文學,A片下載,色情遊戲,色情影片,色情聊天室,情色電影,免費視訊,免費視訊聊天,免費視訊聊天室,一葉情貼圖片區,情色,情色視訊,免費成人影片,視訊交友,視訊聊天,視訊聊天室,言情小說,愛情小說,AIO,AV片,A漫,av dvd,聊天室,自拍,情色論壇,視訊美女,AV成人網,色情A片,SEX

情趣用品,A片,免費A片,AV女優,美女視訊,情色交友,色情網站,免費AV,辣妹視訊,美女交友,色情影片,成人網站,H漫,18成人,成人圖片,成人漫畫,成人影片,情色網


情趣用品,A片,免費A片,日本A片,A片下載,線上A片,成人電影,嘟嘟成人網,成人,成人貼圖,成人交友,成人圖片,18成人,成人小說,成人圖片區,微風成人區,成人文章,成人影城,情色,情色貼圖,色情聊天室,情色視訊,情色文學,色情小說,情色小說,臺灣情色網,色情,情色電影,色情遊戲,嘟嘟情人色網,麗的色遊戲,情色論壇,色情網站,一葉情貼圖片區,做愛,性愛,美女視訊,辣妹視訊,視訊聊天室,視訊交友網,免費視訊聊天,美女交友,做愛影片

av,情趣用品,a片,成人電影,微風成人,嘟嘟成人網,成人,成人貼圖,成人交友,成人圖片,18成人,成人小說,成人圖片區,成人文章,成人影城,愛情公寓,情色,情色貼圖,色情聊天室,情色視訊,情色文學,色情小說,情色小說,色情,寄情築園小遊戲,情色電影,aio,av女優,AV,免費A片,日本a片,美女視訊,辣妹視訊,聊天室,美女交友,成人光碟

情趣用品.A片,情色,情色貼圖,色情聊天室,情色視訊,情色文學,色情小說,情色小說,色情,寄情築園小遊戲,情色電影,色情遊戲,色情網站,聊天室,ut聊天室,豆豆聊天室,美女視訊,辣妹視訊,視訊聊天室,視訊交友網,免費視訊聊天,免費A片,日本a片,a片下載,線上a片,av女優,av,成人電影,成人,成人貼圖,成人交友,成人圖片,18成人,成人小說,成人圖片區,成人文章,成人影城,成人網站,自拍,尋夢園聊天室

Sun Nov 30, 12:19:00 AM

sex said...

徵信社
情趣用品
情趣用品
情趣用品
情趣
情趣


SM
充氣娃娃


SM
性感睡衣


免費視訊聊天室
aio交友愛情館
愛情公寓
情色貼圖
情色文學
情色小說
情色電影
情色論壇
成人論壇
辣妹視訊
視訊聊天室
情色視訊
免費視訊

免費視訊聊天
視訊交友網
視訊聊天室
視訊美女
視訊交友
ut聊天室
聊天室
豆豆聊天室
尋夢園聊天室
聊天室尋夢園
080聊天室
080苗栗人聊天室
女同志聊天室

上班族聊天室
小高聊天室


免費視訊聊天
免費視訊聊天室
免費視訊
ut聊天室
聊天室
豆豆聊天室 聊天室尋夢園
影音視訊聊天室


色情遊戲
寄情築園小遊戲
情人視訊網
辣妹視訊
情色交友

成人論壇
情色論壇
愛情公寓
情色
色情聊天室
色情小說
做愛
做愛影片
性愛


一葉情貼圖片區
情趣用品


辣妹視訊
美女視訊
視訊交友網
視訊聊天室
視訊交友
視訊美女

Thu Dec 25, 10:49:00 AM

Anonymous said...

A片,A片,成人網站,成人漫畫,色情,情色網,情色,AV,AV女優,成人影城,成人,色情A片,日本AV,免費成人影片,成人影片,SEX,免費A片,A片下載,免費A片下載,做愛,情色A片,色情影片,H漫,A漫,18成人

a片,色情影片,情色電影,a片,色情,情色網,情色,av,av女優,成人影城,成人,色情a片,日本av,免費成人影片,成人影片,情色a片,sex,免費a片,a片下載,免費a片下載

情趣用品,情趣用品,情趣,情趣,情趣用品,情趣用品,情趣,情趣,情趣用品,情趣用品,情趣,情趣

A片,A片,A片下載,做愛,成人電影,.18成人,日本A片,情色小說,情色電影,成人影城,自拍,情色論壇,成人論壇,情色貼圖,情色,免費A片,成人,成人網站,成人圖片,AV女優,成人光碟,色情,色情影片,免費A片下載,SEX,AV,色情網站,本土自拍,性愛,成人影片,情色文學,成人文章,成人圖片區,成人貼圖

情色文學,色情小說,色情,寄情築園小遊戲,AIO交友愛情館,情色電影,一葉情貼圖片區,色情遊戲

言情小說,情色論壇,色情網站,微風成人,成人電影,嘟嘟成人網,成人,成人貼圖,成人交友,成人圖片,18成人,成人小說,成人圖片區,微風成人區,成人網站,免費影片,色情影片,自拍,hilive,做愛,微風成人,微風論壇,AIO

Sun Jan 18, 09:55:00 AM

Post a Comment

Links to this post

Create a Link

Loading mentions Retweet

Filed under // dba

Comments (0)

Nov 18 / 7:01am

MySQL Performance Blog

by Rafa
Posted by peter | Planet MySQL

 

Couple of months ago there was a post by FreshBooks on getting great performance improvements by lowering table_cache variable. So I decided to investigate what is really happening here.

The "common sense" approach to tuning caches is to get them as large as you can if you have enough resources (such as memory). With MySQL common sense however does not always works - we've seen performance issues with large query_cache_size also sort_buffer_size and read_buffer_size may not give you better performance if you increase them. I found this also applies to some other buffers.
[read more...]

Loading mentions Retweet

Filed under // dba

Comments (0)